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 TPanel Visible := True wirkt nicht in TabSheet OnShow (https://www.delphipraxis.net/199607-tpanel-visible-%3D-true-wirkt-nicht-tabsheet-onshow.html)

Graf Gustav 5. Feb 2019 22:11

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:
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;
Hat jemand eine Erklärung oder sogar einen guten Rat?

blawen 6. Feb 2019 06:00

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:
procedure TForm1.Button1Click(Sender: TObject);
begin
  panel1.Visible := True;
end;

procedure TForm1.TabSheet1Show(Sender: TObject);
begin
  Showmessage('Hallo');
  panel1.Visible := True;
end;
Persönlich benutze ich das PageControlChange, die Problematik bleibt aber dieselbe.
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;

v2afrank 6. Feb 2019 06:04

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

blawen 6. Feb 2019 06:36

AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
 
Zitat:

Zitat von v2afrank (Beitrag 1424779)
Ich hatte jetzt nur Delphi2006 zur Hand, aber da funktioniert es

Jein, in diesem Beispiel ist das Panel nicht im Tabsheet, sondern auf der Form.
Sobald es im Tabsheet abgelegt wird, tritt besagtes "Problem" auf.

v2afrank 6. Feb 2019 06:37

AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
 
Ups, hast Recht. Nicht aufgepasst

ConnorMcLeod 6. Feb 2019 07:37

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;

Moombas 6. Feb 2019 07:55

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:
procedure TForm1.PageControl1Change(Sender: TObject);
begin
  if Pagecontrol1.ActivePage = Tabsheet2 then
    Panel1.Show
  else
    Panel1.Hide;
end;
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!?

v2afrank 6. Feb 2019 08:16

AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
 
Zitat:

Zitat von Moombas (Beitrag 1424791)
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.

Ist aber nicht richtig. Das Showevent wird sehr wohl ausgelöst. Setz einfach mal die Fenstercaption und Du wirst sehen es wird ausgelöst

Moombas 6. Feb 2019 08:23

AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
 
Zitat:

Zitat von v2afrank (Beitrag 1424793)
Zitat:

Zitat von Moombas (Beitrag 1424791)
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.

Ist aber nicht richtig. Das Showevent wird sehr wohl ausgelöst. Setz einfach mal die Fenstercaption und Du wirst sehen es wird ausgelöst

Hast du recht, dann verstehe ich das Verhalten auch nicht.

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:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Panel1.Show;
end;

procedure TForm1.TabSheet2Show(Sender: TObject);
begin
  Panel1.Show;
end;
Wird beim einblenden des Tabsheet der Button versteckt (sowie auch alle anderen Komponenten auf dem Sheet)!? (Ein Druck auf den Button hat keinen Effekt)
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:
procedure TForm1.TabSheet2Show(Sender: TObject);
begin
  Panel1.Visible := True;
end;
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.

v2afrank 6. Feb 2019 08:27

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

Graf Gustav 6. Feb 2019 08:40

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.

ConnorMcLeod 6. Feb 2019 08:44

AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
 
Gut zu wissen!

Moombas 6. Feb 2019 08:46

AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
 
@graf gustav: Warum nicht einfach so, wie ich bereits schrieb:
Delphi-Quellcode:
procedure TForm1.PageControl1Change(Sender: TObject);
begin
  if Pagecontrol1.ActivePage = Tabsheet2 then
    Panel1.Show
  else
    Panel1.Hide;
end;
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?

v2afrank 6. Feb 2019 08:53

AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
 
Da finde ich aber die startprocedure wie blawen Sie vorgeschlagen hat besser.

Moombas 6. Feb 2019 08:59

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.

Andreas L. 6. Feb 2019 09:01

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;

v2afrank 6. Feb 2019 09:24

AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
 
Auch mit meinem Beispielprojekt ?


Vergiss es das war ja falsch

Moombas 6. Feb 2019 09:35

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;

Andreas L. 6. Feb 2019 10:15

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.

Moombas 6. Feb 2019 10:26

AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
 
Zitat:

Zitat von Andreas L. (Beitrag 1424821)
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.

Weil das Tabsheet als default visible = false beim start hat. Ansonsten macht es ja auch keinen Sinn! Du stellst ja das visible auf false im Objektinspector damit das Panel (oder was auch immer) beim Programmstart NICHT sichtbar ist. Nun willst du aber das beim Programmstart es über das Show-Event doch sichtbar wird. Das beißt sich.

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.

Andreas L. 6. Feb 2019 10:43

AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
 
Zitat:

Zitat von Moombas (Beitrag 1424826)
Weil das Tabsheet als default visible = false beim start hat. Ansonsten macht es ja auch keinen Sinn! Du stellst ja das visible auf false im Objektinspector damit das Panel (oder was auch immer) beim Programmstart NICHT sichtbar ist. Nun willst du aber das beim Programmstart es über das Show-Event doch sichtbar wird. Das beißt sich.

Das ist mir klar.

Zitat:

Zitat von Moombas (Beitrag 1424826)
Ich glaube das es WaD (Works as designed)

Das denke ich auch. Macht auch keinen Sinn ein onShow-Event zu feuern wenn das TabSheet bereits sichtbar ist.

Moombas 6. Feb 2019 10:46

AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
 
Zitat:

Zitat von Andreas L. (Beitrag 1424828)
Zitat:

Zitat von Moombas (Beitrag 1424826)
Ich glaube das es WaD (Works as designed)

Das denke ich auch. Macht auch keinen Sinn ein onShow-Event zu feuern wenn das TabSheet bereits sichtbar ist.

Nein, es macht keinen Sinn das Panel per default auszublenden, das Sheet beim Start als "Startsheet" anzuzeigen und sich dann zu beschweren, dass das Panel beim Programmstart nicht eingeblendet wird, obwohl es im onShow-Event gezeigt werden soll.

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.

Andreas L. 6. Feb 2019 10:51

AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
 
Zitat:

Zitat von Moombas (Beitrag 1424830)
Einzige Ausnahme, es gibt Abhängigkeiten aber dann setze ich die Abhängigkeitsprüfung eher in das OnCreate-Event und nicht ins onShow-Eevent.

Das sehe ich genau so :thumb:

Graf Gustav 6. Feb 2019 12:24

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.

Moombas 6. Feb 2019 12:36

AW: TPanel Visible := True wirkt nicht in TabSheet OnShow
 
Zitat:

Zitat von Graf Gustav (Beitrag 1424848)
@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.

Ich habe mich dabei auf folgendes bezogen:
Zitat:

Zitat von v2afrank (Beitrag 1424811)
Auch mit meinem Beispielprojekt ?

Beispielprojekt in diesem Falle das von v2afrank!

@Graf Gustav: Aber dennoch funktioniert es wie in Beitrag #18 geschrieben (funktionierendes Beispielprojekt im Anhang).
Weitere Hinweise in den folgenden Beiträgen:
Zitat:

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(erst beim Umblättern AUF das entsprechende Tabsheet!) ".visible := true" setzen.
Ggf. in eine Procedure gepackt, wenn du diese Prüfung an mehreren stellen nutzen musst.


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