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/)
-   -   TStatusbar auf TFrame (https://www.delphipraxis.net/155486-tstatusbar-auf-tframe.html)

taaktaak 26. Okt 2010 07:09

TStatusbar auf TFrame
 
Moin, Moin

Zur Gliederung größerer Projekte nutze ich gern die Möglichkeiten von Frames. So habe ich derzeit direkt auf dem Basis-Form vier Frames, die abwechselnd sichtbar sind und unterschiedliche Arbeitsbereiche verfügbar machen. Jeder Frame besitzt eine eigene Statusbar. So weit so gut.

Leider reagiert die auf dem Frame placierte Statusbar nicht korrekt, wenn das Basis-Form maximiert wird: Der Size-Grip wird leider nicht entfernt und ist weiter benutzbar, das hat dann fatale Folgen für die Statusbar wenn der Anwender den Size-Grip nutzt.

Meine Versuche, den VCL-Source zu überprüfen, warum die Statusbar nicht auf die Maximierung reagiert, wenn diese auf einem Frame placiert ist und eine Korrektur zu finden, sind leider erfolglos.

Hat jemand eine Idee oder sogar eine Lösung?

nahpets 26. Okt 2010 07:34

AW: TStatusbar auf TFrame
 
Hallo,

habe gerade kein Delphi verfügbar, aber gibt es da nicht eine Eigenschaft bei der Statusbar, mit der man die Sichtbarkeit des Sizegrips beeinflussen kann?

Sowas in der Art: SizeGrip := True / False;
Vorgabe ist da wohl True.

Edit: Nachsatz: Wenn ich Frames benutze, bekommen die zur Laufzeit immer Align := alClient gesetzt, wenn sie nur einzeln auf dem Formular sichtbar sein sollen, ansonsten entsprechend den übrigen sichtbaren Komponenten auch mal alLeft oder alRight...

Bummi 26. Okt 2010 07:35

AW: TStatusbar auf TFrame
 
Hi ich kann den Effekt unter Delphi 2010 nicht nachvollziehen. Wie wäre es den Statusbar zu disablen?

taaktaak 26. Okt 2010 08:31

AW: TStatusbar auf TFrame
 
Vielen Dank für die ersten Antworten!

@ nahpets
SizeGrip - true/false wirken sich zur Laufzeit nicht aus. Die Idee, die Maximierung selbst zu erkennen und je nach Status den SizeGrip an-/auszuschalten hatte ich auch schon; funktioniert aber leider nicht.
Align - muss in meinem Anwendungsfall auf alClient eingestellt sein. Andere Einstellungen haben aber auf das Fehlverhalten keine Auswirkung.

@ Bummi
Das deaktivieren der Statusbar ist tatsächlich eine mögliche Notlösung; so kann der Anwender zumindest keinen Unsinn mit dem SizeGrip anrichten. Leider ist dieser aber natürlich weiterhin sichtbar. Ein "übermalen" des Grips im OnDraw() ist nicht möglich, da dieser offenbar automatisch nach dem OnDraw() des Panels gezeichnet wird.
Interessant, dass dieses Verhalten unter D2010 nicht auftritt. Der Source ist also offenbar verändert worden. Aber an welcher Stelle und in welcher Weise...

nahpets 26. Okt 2010 11:37

AW: TStatusbar auf TFrame
 
Hallo,

was ich daran nicht verstehe ist:

Benutze die gleiche Delphiversion, also 7 Prof.

Habe mehrere Programme mit Frames. Die Frames haben jeweils mehrere Statusbars, bei keiner ist das SizeGrip sichtbar, sondern nur das der Statusbar, die direkt auf dem Formular liegt (Autohint = True).

Was ich allerdings nicht mache ist: Mehrere Frames gleichzeitig auf ein Formular setzen. Hier nehme ich als Container immer ein PageControl und schalte hier ggfls. die einzelnen Reiter auf sichtbar oder unsichtbar.

ChrisE 26. Okt 2010 11:43

AW: TStatusbar auf TFrame
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo taaktaak,

soweit ich sehen konnte verwendest du Delphi 7. Unter Delphi 2007 ist das verhalten reproduzierbar.

Testprojekt mit einem MainForm und zwei Frames. Mainform hat einen Button (Align = alTop) und zwei Frames. Beide Frames haben einen Statusbar mit SizeGrip = TRUE. Im Create des MainForms werden beide Frames auf alClient gesetzt und eins unsichtbar geschaltet. Beim Click auf den Button wird das andere Frame sichtbar geschaltet und das erst unsichtbar (oder andersrum ;-) ). Beim Maximieren des Hauptformulars tritt der von Dir beschriebene Fehler auf.

Gruß, Chris

P.S.:

Hab das Testprogramm mal angehängt

taaktaak 26. Okt 2010 13:14

AW: TStatusbar auf TFrame
 
Auf eine zusätzliche Statusbar direkt auf dem Form habe ich bisher verzichtet, nur die Frames besitzen jeweils eine eigene Statusbar - so wie ChrisE dies auch unter D2007 nachgestellt hat.

Da dieser Ansatz zumindest augenblicklich eine Sackgasse zu sein scheint, versuche ich es jetzt (zunächst natürlich nur in einem Testprogramm) genau anders herum: Nur das Basis-Form besitzt eine Statusbar; diese wird an eine passende Property des jeweiligen Frames "übergeben" und von diesem jeweils individuell benutzt. Dadurch erhöht sich aber der Verwaltungsaufwand: Es will mir nicht gelingen die jeweils vorher genutzte Statusbar zu sichern und bei "Verlassen" des Frames wieder zu rekonstruieren. Weder Statusbar.Assign() noch Read-/WriteComponent() funktionieren. Abhilfe sind bisher eigene Botschaften, die die Aktivierung/Deaktivierung der Frames programmweit verkünden und die das Neuzeichenen der Statusbar veranlassen. Leider wird das Ganze dadurch ein klein wenig unübersichtlich.

Na schau'n wir mal...

ChrisE 26. Okt 2010 13:44

AW: TStatusbar auf TFrame
 
Hallo taaktaak,

als kleine Anregung. Lass die Statusbars weiterhin in den Frames. Nur wenn ein Frame vom Mainform aktiv geschaltet wird, könntest du bei jedem Frame eine Methode aufrufen GetStatusBar und diesen dann dem MainForm zuordnen (Parent). Vorher natürlich den alten Statusbar wieder per ResetStatusBar des "alten" Frames zurückgeben.

Gruß, Chris

taaktaak 26. Okt 2010 14:01

AW: TStatusbar auf TFrame
 
Hallo Chris,
das ist eine interessante Idee!
Danke, werd' ich heute Abend mal testen...

taaktaak 27. Okt 2010 07:52

AW: TStatusbar auf TFrame
 
So hab's ausprobiert:
Den Parent zu setzen ist tatsächlich die Lösung!
Chris, vielen Dank für den Tip
:hi:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:33 Uhr.

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