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 Bei Control.Hide verwaist die Scrollbar wenn VCL-Styles aktiv (https://www.delphipraxis.net/195819-bei-control-hide-verwaist-die-scrollbar-wenn-vcl-styles-aktiv.html)

Codehunter 28. Mär 2018 17:30

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:
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;
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.

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

Codehunter 28. Mär 2018 17:46

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;

KodeZwerg 1. Apr 2018 17:25

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:

Use the Parent property to get or set the parent of this control. The parent of a control is the control that contains the control. For example, if an application includes three radio buttons in a group box, the group box is the parent of the three radio buttons, and the radio buttons are the child controls of the group box.
Deswegen frage ich, weil doch ein "MyListBox:= TListBox.Create(Self);" das bereits beinhaltet das der Control der Form zugewiesen ist.
[/EDIT]

Codehunter 1. Apr 2018 22:50

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)

HolgerX 2. Apr 2018 09:28

AW: Bei Control.Hide verwaist die Scrollbar wenn VCL-Styles aktiv
 
Hmm..

Zitat:

Zitat von Codehunter (Beitrag 1397840)
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.

Kleine Korrektur:
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 ;) )

mkinzler 2. Apr 2018 09:34

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.ä.

HolgerX 2. Apr 2018 09:50

AW: Bei Control.Hide verwaist die Scrollbar wenn VCL-Styles aktiv
 
Hmm..

Zitat:

Zitat von mkinzler (Beitrag 1397854)
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.ä.

Ist es nicht so, dass der Owner (und Parent) = das Control ist, in welchem ich im Designer das neue Control ablege.
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 ;).

DeddyH 2. Apr 2018 10:19

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.

Codehunter 2. Apr 2018 10:24

AW: Bei Control.Hide verwaist die Scrollbar wenn VCL-Styles aktiv
 
Zitat:

Zitat von HolgerX (Beitrag 1397855)
Ist es nicht so, dass der Owner (und Parent) = das Control ist, in welchem ich im Designer das neue Control ablege.
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....

Nur ist es im obigen Beispiel nicht per Designer erzeugt sondern dynamisch zur Laufzeit. Und da musst eben den Parent noch separat zuweisen. Es gibt zwar auch die Methode CreateParented aber damit hatte ich in der Vergangenheit Probleme beim Speichermanagement, weshalb ich das nicht mehr verwende.

KodeZwerg 2. Apr 2018 11:22

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 04:19 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