Autor Beitrag
mb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 185



BeitragVerfasst: Di 10.02.04 15:26 
Hi!

PageControls sind echt faszinierend. Also ich habe mal gesucht, und das Problem scheint auch in diesem Forum schon aufgetreten zu sein - aber keine Lösung...

Das Problem: Ich möchte einzelne Seiten in einem PageControl deaktivieren. Und zwar so, dass man die Reiter bzw. Buttons / FlatButtons noch sieht, die sollen aber "Enabled := False" sein, d.h.: man soll sie nicht anklicken können.

Die Möglichkeit alle Controls auf einem TabSheet zu disabeln habe ich probiert... ja, aber das ist nicht ganz das, was ich will.

Kennt jemand eine Möglichkeit? Kann man irgendwie an die Buttons als Control (TObject oder so) ran kommen?

Könnte man dann auch die Buttons gleich im XP-Style zeichnen? (Ich verwende gerade flatButtons)

_________________
Gruß,
MB
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Di 10.02.04 18:07 
Hallo

um zu verhindern, das ein user eine Seite nicht anklicken kann, gugg dir onchanging des Pagecontrols an.

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
mb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 185



BeitragVerfasst: Mi 11.02.04 03:02 
Ja, diese Möglichkeit ist mir bekannt, aber in meinem Fall zu kompliziert. Außerdem würde ich es ja gern so haben, dass die Buttons (Tabs) wirklcích "disabled" (also praktisch "grayed") dargestellt werden und gar nicht anklickbar sind...

_________________
Gruß,
MB
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Mi 11.02.04 12:02 
Hallo

im DG gabs einen ähnlichen Thread, und es hat mich jetzt mal genauer interessiert.
Ich habs jetzt mal so probiert:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
  TForm1 = class(TForm)
   ...
  private
    { Private-Deklarationen }
    AltePagecontrolSeite: integer;
...

procedure TForm1.PageControl1DrawTab(Control: TCustomTabControl;
  ATabIndex: Integer; const Rect: TRect; Active: Boolean);
//bitte Tabindex in Deklaration mit ATabindex auswechseln, sonst überschneidung mit Pagecontrol.tabindex. Deklaration in Tform nicht vergessen
//ownerDraw des pagecontrols auf true setzen
begin
  with control as TPageControl do
    begin
      //jede zweite Seite "disablen"
      if odd(Atabindex) then
        begin
          canvas.Brush.Style := bssolid;
          canvas.font.Color  := clBtnHighlight;
          canvas.TextOut(rect.left+6,rect.top+5,Pages[ATabindex].Caption);

          //text in anderer Farbe wieder drüberzeichnen (1 Pixel nach links oben versetzt)
          canvas.Brush.Style := bsclear;
          canvas.font.Color  := clBtnShadow;
          canvas.TextOut(rect.left+5,rect.top+4,Pages[ATabindex].Caption);
        end
       else
        begin
          //sonst normal zeichnen
          canvas.Brush.Style := bssolid;
          canvas.font.Color  := clbtntext;
          canvas.TextOut(rect.left+6,rect.top+5,Pages[ATabindex].Caption);
        end;
    end;
end;

procedure TForm1.PageControl1Changing(Sender: TObject;
  var AllowChange: Boolean);
begin
  AltePagecontrolSeite:=(sender as TPageControl).ActivePageIndex;
end;

procedure TForm1.PageControl1Change(Sender: TObject);
//Selektieren einer Seite verhindern.
begin
  with sender as TPageControl do
    begin
      //jede zweite Seite "disablen"
      if odd(ActivePageIndex) then ActivePageIndex:=AltePagecontrolSeite;
    end;
end;

Ich bin mir zwar mit der Farbwahl nicht sicher, aber aussehen tuts erstmal :).

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
mb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 185



BeitragVerfasst: Mi 11.02.04 14:44 
Ok, danke!!!

Das sieht nach einer Lösungsmöglichkeit aus. Ich werd's mal probieren.

_________________
Gruß,
MB
johakbb
Hält's aus hier
Beiträge: 15

Win 7
Delphi 2010, C#, ASP.NET, VS2010
BeitragVerfasst: Fr 22.10.10 20:41 
Super, danke für den guten Tipp! Der Thread ist zwar schon etwas älter, aber für Delphi2010 habe ich auch keine bessere Methode gefunden, scheint immer noch aktuell zu sein.
Allerdings gabs bei mir in der "enabled"-Darstellung kleine Fehler: die weiße Linie, die die "hinteren" Tabs vom Vordergrund abtrennen soll, lief auch beim aktiven Tab durch, so dass dieser wie nach hinten gestellt wirkte. Außerdem war der schwarze Text etwas ausgefranst, wie doppelt, aber nicht genau übereinander. Durch ein Neubefüllen des Hintergrunds mit FillRect lies sich das beheben, also:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
    //enabled: normal zeichnen
    canvas.Brush.Style := bsSolid;
    canvas.Font.Color  := clBtnText;
    canvas.FillRect(rect);
    canvas.TextOut(rect.left+6,rect.top+5,Pages[ATabindex].Caption);


Vielleicht hilft das jemandem.
Gruß, johakbb