Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Reiter in einem TPageControl disabeln (https://www.delphipraxis.net/19747-reiter-einem-tpagecontrol-disabeln.html)

jryan 8. Apr 2004 09:13


Reiter in einem TPageControl disabeln
 
Hallo allerseits!

ich habe folgendes Problem:

In einer Applikation mit einem TPageControl und mehreren TTabSheet's in diesem Control sollen die Tabsheets in Abhängigkeit von den Benutzerrechten bzw. von programminternen Abhängigkeiten enabled bzw. disabled werden. Dabei stelle ich mir das Ergebnis so vor, das eine disabled Registerseite im Tabsheet zwar noch sichtbar ist aber die Caption wie bei einem disableden TButton-Object aussieht. Beim klicken auf ein solches Register, soll die Seite dann nicht angezeigt werden.

Meine bisherigen Lösungsvarianten, welche leider NICHT das gewünschte Verhalten erzeugen waren:

Variante 1:
Setzen der Enabled-Eigenschaft des ensprechenden Tabsheets als eigentlich naheliegenste Variante. Dies führt aber leider nur dazu, das der Benutzer die im Tabpage vorhanden Steuerelemente nicht mehr ansprechen (den Focus darauf setzen) kann. Die eigentliche Tabsheet war aber weiterhin anzeigbar.

Variante 2:
Setzen der TabVisible-Eigenschaft --> Dabei ist aber leider der Karteireiter nicht mehr sichtbar!

Hat jemand von euch einen guten Tip???

MfG
-jryan

alcaeus 8. Apr 2004 09:33

Re: Reiter in einem TPageControl disabeln
 
Füge für jedes TabSheet eine Routine für das OnEnter-Ereignis ein. Darin fragst du die Enabled-Eigenschaft des Senders ab. Ist diese False, so kannst du:
- Bei allen Komponenten auf dem TabSheet Visible auf False setzen
- Ein Panel anzeigen, das vor allen Komponenten angezeigt wird, und diese somit unsichtbar macht.

Durch eine dieser beiden Methoden kann der Anwender die Komponenten nicht mehr sehen.

Sharky 8. Apr 2004 09:35

Re: Reiter in einem TPageControl disabeln
 
Hai jryan,

Zum "Anzeigen" ob der Reiter "enabled" ist kannst Du das OnDrawTab Ereigniss benutzen.
z.B:
Delphi-Quellcode:
procedure TForm1.PageControl1DrawTab(Control: TCustomTabControl;
  TabIndex: Integer; const Rect: TRect; Active: Boolean);
const
 _sTabCaptions : array [0..1] of string = ('Stammdaten','Ansprechpartner');
begin
 if (Tab_is_enabled) then // hier muss deine Bedingung abgefragt werden.
 begin
   PageControl1.Canvas.Brush.Color := cllime;
 end
 else
 begin
   PageControl1.Canvas.Brush.Color := clSilver;
 end;
 Control.Canvas.FillRect(Rect);
  //Beim selber Zeichnen muss auch die Caption gezeichnet werden
 Control.Canvas.TextOut(Rect.Left+2,Rect.Top+2,_sTabCaptions[TabIndex]);
end;
Um zu verhindern das die TabSeite geöffnet wird verwendest Du einfach das OnChanging Ereigniss. Dort kansst Du verhinden das eine TabSeite geöffnet wird.

teebee 8. Apr 2004 09:37

Re: Reiter in einem TPageControl disabeln
 
Schau Dir mal diesen Link an, dort findest Du den Quelltext für eine Pagecontrol-Komponente von Peter Below, die das kann, was Du willst.

Gruß, teebee

jryan 8. Apr 2004 09:49

Re: Reiter in einem TPageControl disabeln
 
@all,
Danke für die schnelle Hilfe!

Ich denke ich werde mal sehen wie die erweiterte Komponente von Peter Belows funktioniert!

MfG
-jryan

Kevin 8. Apr 2004 10:02

Re: Reiter in einem TPageControl disabeln
 
@jryan
Kannst Du dann bitte ein Feedback posten!? Würde mich sehr interessieren! :thuimb:

Keldorn 8. Apr 2004 18:18

Re: Reiter in einem TPageControl disabeln
 
Hallo den link habe ich mir jetzt nicht ganz genau angeguugt, sieht aber anders aus wie meins. Bei DF und DG gabs mal nen ähnlichen thread dazu http://www.delphi-forum.de/viewtopic...ht=pagecontrol
Dann wird die Caption schön "disabled" wie bei einem Button dargestellt

Delphi-Quellcode:
  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;
Mfg Frank

triangulum 21. Jul 2006 08:16

Re: Reiter in einem TPageControl disabeln
 
Salü,

habe jetzt auch diese Lösung angewendet, um inaktive Tabs grau darzustellen.

Problem:

das OnDrawTab - Ereignis wird nur dann ausgelöst, wenn man irgendwo auf das PageControl1 clickt.

Der Tab-Status kann/soll sich aber bereits ändern, wenn man aus einem Menü oben eine Datei lädt z.B. werden z.B. einige Tabs mit ausgelesenen Infos gefüllt und sollen sofort schwarz beschriftet sein. Dies erfolgt aber nicht, sondern nur nach Klicken auf eines der (noch grauen) Tab-Titel!

Wie könnte man das OnDrawTab - Ereignis auch "künstlich" auslösen, z.B. im Rahmen eines Menüereignisses wie Open File ?

Oder sonstwie das PageControl redrawen?

Keldorn 21. Jul 2006 21:01

Re: Reiter in einem TPageControl disabeln
 
Hallo

erzwing mal das neuzeichnen mit pagecontrol.repaint.

Mfg Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz