![]() |
Bei Control.Hide verwaist die Scrollbar wenn VCL-Styles aktiv
Hallo!
Wenn man ein TListBox auf folgende Weise erzeugt und steuert, bleibt eine "verwaiste" Scrollbar auf dem Bildschirm zurück, wenn die VCL-Styles aktiviert sind:
Delphi-Quellcode:
Das selbe Problem hat CnPack wenn in der Delphi-IDE das dunkle Farbschema aktiviert ist und man das Prozedur-/Funktions-Dropdown auf- und zuklappt. Das Problem besteht NICHT, wenn ich in den Projekteinstellungen -> Anwendung -> Erscheinungsbild als Standardstil "Windows" einstelle.
var
MyListBox: TListBox; TForm1.Create(Sender: TObject); begin MyListBox:= TListBox.Create(Self); MyListBox.Parent:= Self; end; TForm1.Button1Click(Sender: TObject); begin MyListBox.Show; end; TForm1.Button2Click(Sender: TObject); begin MyListBox.Hide; // <-- ListBox verschwindet, ihre vertikale Scrollbar bleibt sichtbar end; EDIT: Wie ich grad festgestellt habe, muss zusätzlich noch die ListBox den Eingabefokus haben wenn sie mit .Hide ausgeblendet wird, damit der Fehler auftritt. Grüße Cody |
AW: Bei Control.Hide verwaist die Scrollbar wenn VCL-Styles aktiv
Ich habe die Lösung gerade selber gefunden bzw. eher ein Workaround:
Delphi-Quellcode:
var
MyListBox: TListBox; TForm1.Create(Sender: TObject); begin MyListBox:= TListBox.Create(Self); MyListBox.Parent:= Self; end; TForm1.Button1Click(Sender: TObject); begin MyListBox.StyleElements:= [seFont, seClient, seBorder]; MyListBox.Show; end; TForm1.Button2Click(Sender: TObject); begin MyListBox.StyleElements:= []; MyListBox.Hide; end; |
AW: Bei Control.Hide verwaist die Scrollbar wenn VCL-Styles aktiv
[Lernen] Wofür steht der Befehl "MyListBox.Parent := Self;", also was bewirkt das? [/Lernen]
[EDIT] Zitat:
[/EDIT] |
AW: Bei Control.Hide verwaist die Scrollbar wenn VCL-Styles aktiv
Also mit dem Create(ParentControl) reiht man eine TControl-Instanz in die Liste der Childcontrols einer Delphi-Klasse ein. Damit brauchst du z.B. kein separates .Free mehr machen sondern dein dynamisch erzeugtes Control wird zusammen mit dem ParentControl freigegeben.
Mit WinControl.Parent:= OtherWinControl weist man seinem visuellen, von TWinControl abgeleiteten Control basierend auf dem WindowHandle sein Elternelement zu. Ersteres bezieht sich also auf das Speichermanagement von Delphi-Klassen, letzteres macht Windows plausibel, dass sich das dynamisch erzeugte Control als Unterelement im ParentControl befindet. Das wirkt sich u.a. auf die grafischen Koordinaten aus (siehe ScreenToClient und ClientToScreen) |
AW: Bei Control.Hide verwaist die Scrollbar wenn VCL-Styles aktiv
Hmm..
Zitat:
Bei Create(AOwner: TComponent) wird kein 'TControl' sondern ein 'TComponent' als Owner = Eigentümer angegeben. Das dadurch erzeugte Object kann simple als nicht Visuelles Objekt direkt von TComponent oder auch ein abgeleitets TControl/TWinControl sein. Dieses wird in der Owner Component in der Liste der Components eingetragen und würde, wie richtig geschrieben beim Free des Owners automatisch ebenfalls geFreet ;) werden. Ob der Owner nun eine nicht visuelle Component oder ein TControl/TWinControl ist egal, da auch TControl von TComponent abgeleitet ist. (Hoffe, das EB das nicht in Delphi XEs übern Haufen geschmissen hat ;) ) |
AW: Bei Control.Hide verwaist die Scrollbar wenn VCL-Styles aktiv
Owner <> Parent
Bei Windowscontrols ist das selbe Control für beides zuständig, nicht aber bei der VCL. Hier ist in den meisten Fällen die Form der Owner und Parent ein untergeordnetes Control, z.B. ein Panel o.ä. |
AW: Bei Control.Hide verwaist die Scrollbar wenn VCL-Styles aktiv
Hmm..
Zitat:
Sprich es wird eine Baumstruktur im Designer erzeugt (Anzeigbar, wenn DFM im Textmode angeschaut wird ;) ). Der Designer macht hier ein Create(Owner) und Parent := Owner.... Dies hat dann den Vorteil, wenn ich Programmtechnisch das Panel zerstöre, auch alle darauf liegenden geFreet werden ;). |
AW: Bei Control.Hide verwaist die Scrollbar wenn VCL-Styles aktiv
Der Parent ist das (Win)Control, das für die Darstellung seiner Kindkomponenten zuständig ist, der Owner ist die Komponente, die für die Speicherverwaltung seiner Kindkomponenten zuständig ist. Bei zusammengeklickten Formularen in der IDE ist der Owner üblicherweise das Formular.
|
AW: Bei Control.Hide verwaist die Scrollbar wenn VCL-Styles aktiv
Zitat:
|
AW: Bei Control.Hide verwaist die Scrollbar wenn VCL-Styles aktiv
[Lernen] Beendet. [/Lernen]
Vielen Dank für die vielen Meinungen und Klarstellungen zu diesem Sub-Thema. Das hat mir sehr geholfen es besser zu verstehen und für die Zukunft so umzusetzen! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:21 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