![]() |
TPanel Visible := True wirkt nicht in TabSheet OnShow
Liste der Anhänge anzeigen (Anzahl: 1)
Ich bin erstaunt, dass ich das noch nie bemerkt habe.
(Und auch keinen Workaround finde...) Der Effekt ist jetzt in 10.1 Berlin aufgetreten, aber ein Versuch mit D5 unter Win7 zeigt dasselbe Ergebnis. Um was es geht, steht ja schon im Titel: Ein TPanel auf einem Tabsheet, mit Visible := False statisch erzeugt, soll in der OnShow-Ereignisroutine des Tabsheets sichtbar werden. Wird es aber nicht. Der Versuch, nach Abschluss der OnShow-Routine die Sichtbarkeit herzustellen. funktioniert nur, wenn vorher das nicht sichtbare Panel nochmal ein Visible := False bekommt.
Delphi-Quellcode:
Hat jemand eine Erklärung oder sogar einen guten Rat?
procedure TForm1.TabSheet1Show(Sender: TObject);
begin Panel1.Visible := True; // bewirkt nichts end; procedure TForm1.Button1Click(Sender: TObject); begin Panel1.Visible := False; // nur wenn das vorher aufgerufen wird, Panel1.Visible := True; // wird das Panel sichtbar. end; |
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
TabShow1 wird nur bei einem PageControl1Change ausgelöst und die gewünschte Funktionsweise funktioniert erst nach einem Pagewechsel.
Beim drücken des Buttons funktioniert es eigentlich wie gewollt.
Delphi-Quellcode:
Persönlich benutze ich das PageControlChange, die Problematik bleibt aber dieselbe.
procedure TForm1.Button1Click(Sender: TObject);
begin panel1.Visible := True; end; procedure TForm1.TabSheet1Show(Sender: TObject); begin Showmessage('Hallo'); panel1.Visible := True; end; Aus diesem Grund starte ich das Formular meistens mit einer Startprocedure und initialisiere das ganze nach meinen Bedürfnissen;
Delphi-Quellcode:
procedure TForm1.PageControl1Change(Sender: TObject);
begin if PageControl1.ActivePage = TabSheet1 then Action1Execute(Self); end; procedure start; begin Action1Execute(Self); end; |
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hatte jetzt nur Delphi2006 zur Hand, aber da funktioniert es
|
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
Zitat:
Sobald es im Tabsheet abgelegt wird, tritt besagtes "Problem" auf. |
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
Ups, hast Recht. Nicht aufgepasst
|
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
Ich kann den Effekt reproduzieren. Als Workaround habe ich es im FormShow zusätzlich eingebaut:
Delphi-Quellcode:
procedure TfrmTesterMain.FormShow(Sender: TObject);
begin Panel1.Visible := (PageControl1.ActivePage = TabSheet1); end; |
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
Es ist ganz logisch, da das Show-Event nur ausgelöst wird, wenn der Tab "wieder eingeblendet" wird (Tabsheet.show). Wenn ich das gleiche auf z.B. onMouseActivate lege und in die leere Fläche Klicke wird der Code ausgeführt.
Das Problem liegt also nicht darin, das das Panel im Sheet liegt, sondern die Art und Weise des Aufrufs. Du kannst das ganze so "umgehen":
Delphi-Quellcode:
Wenn so etwas für mehrere Seiten gemacht werden muss, kannst du anstatt if auch case nutzen. Mir stellt sich nur noch die Frage nach dem Sinn, da das Panel doch nur sichtbar ist, wenn die Seite auch angezeigt wird oder übersehe ich da etwas!?
procedure TForm1.PageControl1Change(Sender: TObject);
begin if Pagecontrol1.ActivePage = Tabsheet2 then Panel1.Show else Panel1.Hide; end; |
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
Zitat:
|
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
Zitat:
Und ich ergänze das Phänomen: Wenn ich in dem Tabsheet, in dem das Panel liegt, auch einen Button einfüge, der sichtbar ist und folgenden Code beinhalten:
Delphi-Quellcode:
Wird beim einblenden des Tabsheet der Button versteckt (sowie auch alle anderen Komponenten auf dem Sheet)!? (Ein Druck auf den Button hat keinen Effekt)
procedure TForm1.Button1Click(Sender: TObject);
begin Panel1.Show; end; procedure TForm1.TabSheet2Show(Sender: TObject); begin Panel1.Show; end; Kommentiere ich nun das Show-Event aus, bleiben alle Komponenten Sichtbar und der Button funktioniert (blendet das Panel ein). Nutze ich nun anstatt ".show" folgendes:
Delphi-Quellcode:
Funktioniert es einwandfrei! Warum es bei dir jedoch so nicht funktioniert, kann ich dir nicht sagen. Auch war für mich bisher ".visible := True" = ".show" bzw ".visible := False;" = ".hide". Da scheint es auch noch Unterschiede zu geben.
procedure TForm1.TabSheet2Show(Sender: TObject);
begin Panel1.Visible := True; end; |
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
Ganz interessant ist ja auch dass die Eigenschaft visible des Panles wirklich gesetzt wird. Kann man gut im Button1Click abfragen
|
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
Danke euch für die Hinweise.
Entscheidend ist der Pagewechsel. Denn ausgelöst wird das TabShow-Ereignis durchaus initial, die Visible-Anweisung wird auch durchlaufen, das Panel ändert auch seinen Visible-Status, es bewirkt nur nichts. (Auch kein ProzessMessages und kein Repaint etc. hilft...) Es schaudert mich zwar ein bisschen, aber das ist mein Workaround: PageControl bekommt eine zweites (der Ordnung halber ist es dann die erste) TabSheet mit TabVisible = False, das ist die ActivePage beim Start. In dem OnShow-Ereignis des Fensters wird dann ActivePage auf 1 gesetzt. Dann gehts. |
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
Gut zu wissen!
|
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
@graf gustav: Warum nicht einfach so, wie ich bereits schrieb:
Delphi-Quellcode:
Dann brauchst du kein zusätzliches Tabsheet oder ähnliches. Und bei mir hats ja im Test funktioniert, hast du mal ein Projekt nur mit den Komponenten gemacht zum Testen?
procedure TForm1.PageControl1Change(Sender: TObject);
begin if Pagecontrol1.ActivePage = Tabsheet2 then Panel1.Show else Panel1.Hide; end; |
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
Da finde ich aber die startprocedure wie blawen Sie vorgeschlagen hat besser.
|
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
Im Endeffekt muss es jeder selber wissen, viele Wege führen nach Rom. Nichts desto Trotz funktioniert bei mir das Einblenden des Panels wenn man mit ".visible" arbeitet im onShow Event Problemlos.
|
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
Ich kann den Fehler nicht reproduzieren. Das Panel wird im OnShow sichtbar. Getestet in Delphi 2009 Pro und Turbo Delphi 2006 Pro.
Delphi-Quellcode:
TForm1 = class(TForm)
PageControl1: TPageControl; Button1: TButton; TabSheet1: TTabSheet; TabSheet2: TTabSheet; Panel1: TPanel; procedure TabSheet2Show(Sender: TObject); procedure Button1Click(Sender: TObject); ... procedure TForm1.Button1Click(Sender: TObject); begin panel1.Visible := False; panel1.Visible := True; end; procedure TForm1.TabSheet2Show(Sender: TObject); begin panel1.Visible := True; end; |
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
Auch mit meinem Beispielprojekt ?
Vergiss es das war ja falsch |
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
Liste der Anhänge anzeigen (Anzahl: 1)
Zu deinem Beispiel Projekt:
1. Liegt das Panel nicht im Sheet -> korrigiert 2. Packe mal eine zweite Seite zum Pagecontrol hinzu 3. Wechsel die Seiten und siehe da, das Panel erscheint! Siehe Anhang. Und wenn man das Panel per Button ein-/ausblenden möchte geht (nur als Beispiel) folgendes:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin if Panel1.Visible = True then Panel1.Visible := False else Panel1.Visible := True; end; |
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
Ich hab jetzt nochmal was ausprobiert. Wenn das Panel auf dem TabSheet liegt das beim Start der Anwendung sichtbar ist. Wird das Panel tatsächlich nicht sichtbar.
|
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
Zitat:
Ich glaube das es WaD (Works as designed) ist, da beim Seitenwechsel der ".visible := True;" korrekt ausgeführt ist und dein Problem nur beim Programmstart besteht, was du aber mit deiner Einstellung im Objektinspektor selber ABSICHTLICH so eingestellt hast!? Fazit: Willst du das das Panel sofort sichtbar ist bei Programmstart: Visible per default auf True setzen (oder z.B. beim onCreate-Event einblenden, wenn es Abhängigkeiten dafür gibt). Willst du das Panel während der Laufzeit einblenden: z.B. beim onShow-Event ".visible := true" setzen. |
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
Zitat:
Zitat:
|
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
Zitat:
Einzige Ausnahme, es gibt Abhängigkeiten aber dann setze ich die Abhängigkeitsprüfung eher z.B. in das OnCreate-Event und nicht ins onShow-Event (was im übrigen auch Fehlerfrei funktioniert). Ggf. in eine Predure gepackt, wenn ich diese Prüfung an mehreren stellen nutzen muss. |
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
Zitat:
|
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
@Moombas: Mein Delphi-Code in meinem Startbeitrag ist das Beispielprojekt.
Und da habe ich 1 PageControl mit 1 Tabsheet. Ein PageControl-Changeevent findet da nicht statt. Zu der weiteren Diskussion will ich mich nicht äußern; Das Abdriften von der sachlichen Ebene in die Besserwisserei scheint wohl überall beliebt zu sein. |
AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
Zitat:
Zitat:
@Graf Gustav: Aber dennoch funktioniert es wie in Beitrag ![]() Weitere Hinweise in den folgenden Beiträgen: Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 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