![]() |
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 |
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. |
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:
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.
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; |
Re: Reiter in einem TPageControl disabeln
Schau Dir mal diesen
![]() Gruß, teebee |
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 |
Re: Reiter in einem TPageControl disabeln
@jryan
Kannst Du dann bitte ein Feedback posten!? Würde mich sehr interessieren! :thuimb: |
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
![]() Dann wird die Caption schön "disabled" wie bei einem Button dargestellt
Delphi-Quellcode:
Mfg Frank
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; |
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? |
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