AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Bei Control.Hide verwaist die Scrollbar wenn VCL-Styles aktiv

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

Ein Thema von Codehunter · begonnen am 28. Mär 2018 · letzter Beitrag vom 2. Apr 2018
Antwort Antwort
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
1.767 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

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

  Alt 28. Mär 2018, 17:30
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
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber.

Geändert von Codehunter (28. Mär 2018 um 17:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
1.767 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

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

  Alt 28. Mär 2018, 17:46
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;
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
2.263 Beiträge
 
Delphi 2010 Professional
 
#3

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

  Alt 1. Apr 2018, 17:25
[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]
Gruß vom KodeZwerg
Wenn ein unerwarteter Fehler aufgetreten ist, frage ich mich immer, welche Fehler erwartet wurden...

Geändert von KodeZwerg ( 1. Apr 2018 um 20:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
1.767 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

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

  Alt 1. Apr 2018, 22:50
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)
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
727 Beiträge
 
Delphi 6 Professional
 
#5

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

  Alt 2. Apr 2018, 09:28
Hmm..

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 )
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.208 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

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

  Alt 2. Apr 2018, 09:34
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.ä.
Markus Kinzler
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
727 Beiträge
 
Delphi 6 Professional
 
#7

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

  Alt 2. Apr 2018, 09:50
Hmm..

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 .
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
26.763 Beiträge
 
Delphi 10.3 Rio
 
#8

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

  Alt 2. Apr 2018, 10:19
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
1.767 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

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

  Alt 2. Apr 2018, 10:24
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.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
2.263 Beiträge
 
Delphi 2010 Professional
 
#10

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

  Alt 2. Apr 2018, 11:22
[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!
Gruß vom KodeZwerg
Wenn ein unerwarteter Fehler aufgetreten ist, frage ich mich immer, welche Fehler erwartet wurden...
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf