Delphi-PRAXiS
Seite 1 von 3  1 23      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:05 Uhr.
Seite 1 von 3  1 23      

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