![]() |
Nach TSplitter Nutzung verschwindet die Komponente
Auch wenn ich das Problem mit einen kleinem Aufwand reparieren kann, ist es doch ärgerlich, weil es immer wieder passiert.
Es geht drum, dass wenn man eine mit Align ausgerichtete Komponente mit einem Splitter auf Null Breite oder Höhe zusammen drückt, die Komponente danach sozusagen verschwindet. Zieht man den Splitter wieder zurück, ist die Komponente weg. Natürlich ist sie nicht weg, aber sie wechselt die Reihenfolge, d. h. sie wechselt auf die andere Seite vom Splitter und behält ihre Null Breite oder Höhe. Das passiert aber nur wenn davor eine andere Komponente ist. Ist davor keine Komponente, passiert das nicht. Vielleicht ist das schwer zu verstehen, hier ein Beispiel. Beispiel erstellt vier links ausgerichtete Komponenten: Panel, ListBox, Splitter, Memo. Schiebt man den Splitter gegen das Panel, ist danach ListBox "weg". Die Frage ist wie kann man das vermeiden?
Delphi-Quellcode:
uses
ExtCtrls, StdCtrls; procedure TForm1.FormCreate(Sender: TObject); begin with TPanel.Create(Self) do begin Parent := Self; Align := alLeft; Width := 100; Caption := 'Panel'; end; with TListBox.Create(Self) do begin Parent := Self; Align := alLeft; Width := 100; Left := 101; Items.Add('ListBox'); end; with TSplitter.Create(Self) do begin Parent := Self; Align := alLeft; Left := 201; end; with TMemo.Create(Self) do begin Parent := Self; Align := alClient; Lines.Add('Memo'); end; end; |
AW: Nach TSplitter Nutzung verschwindet die Komponente
Sind da wirklich zwei Komponenten Links ausgerichtet?
Bei einem Splitter besser je nur eine Komponente je Ausrichrungsrichtung verwenden. In diesem Fall vermutlich ListBox, Memo und Splitter nochmal in ein alClient-Panel rein. (oder die beiden alLeft-Kompoenten in ein alLeft-Panel rein) Versuch auch mal die Komponenten in einer anderen Reihenfolge zu erstellen, also den Splitter zuletzt, und schau was da passiert. |
AW: Nach TSplitter Nutzung verschwindet die Komponente
Das es mit einer einzigen ausgerichteten Komponente ohne Probleme funktioniert, weiß ich. Es ist aber nun mal so wie es ist. Entweder kleistere ich die das Fenster mit Panels zu, was ich aber aus bestimmten Gründen vermeiden will, oder man kann es irgendwie hinkriegen, dass die Reihenfolge erhalten bleibt.
|
AW: Nach TSplitter Nutzung verschwindet die Komponente
Zitat:
|
AW: Nach TSplitter Nutzung verschwindet die Komponente
Um solchen Problemen aus dem Weg zu gehen, bin ich auch dazu übergegangen nach Möglichkeit immer jeweils links/rechts bzw. oberhalb/unterhalb eines Spiltters immer zunächst ein Panel zu setzen, und erst danach darin die weiteren Komponenten zu platzieren. Meist versehe ich die Panels auch noch mit einer MinWidth/Height, und wenn nötig zum Ausblenden eine kleine Ableitung von TPanel mit einem [x] bzw. [<<] oben rechts. Oder gleich docked Forms, je nach Fall.
|
AW: Nach TSplitter Nutzung verschwindet die Komponente
Ok, jetzt sind die Rechner etwas schneller. Vielleicht kann ich inzwischen meine Skepsis vergessen und es von Neuem versuchen. Aber ich kann mich erinnern wie ich mal ein Fenster aus vier übereinander liegenden Panel-Schichten erstellt haben (damals auch wegen mehrerer Splitter). Jedes Mal wenn ich damals das Fenster vergrößert habe, gab es eine mächtige Flackerei. Das Ganze nur wegen der Panele. Seit der Zeit bin ich etwas sparsam mit übereinender angeordneten Panelen.
Das Problem ist, dass Panele erst gezeichnet werden, dann die Panele darüber, dann die darüber und zuletzt z. B. das Memo. Das kann flackern bei zu vielen Panelen. Allerdings sind die Computer inzwischen schneller. Wenn es nicht anders geht oder niemand eine Lösung kennt, muss ich in den sauren Apfel beißen. |
AW: Nach TSplitter Nutzung verschwindet die Komponente
Hallo,
also ich mache das im Normalfall auch immer so, wie es die Kollegen hier angemerkt bzw. beschrieben haben (entsprechend mit geschachtelten Panels arbeiten). Du kannst aber durchaus mehrere Controls mit alLeft und 'nem Splitter dazwischen auf ein Form legen (Du muss nur AutoSnap auf False und MinSize auf 1 setzen). Dann kannst Du mittels Splitter das links liegende Control sozusagen auf Null wegschieben - beim Aufzeihen läuft die Breite des Controls wieder mit. Gruß |
AW: Nach TSplitter Nutzung verschwindet die Komponente
Zitat:
Delphi-Quellcode:
MyComponent.ControlStyle := MyComponent.ControlStyle + [csOpaque]
Das verhindert, dass jedes mal erst noch der Hintergrund neu gezeichnet wird (was nämlich das Flackern verursacht). Auch die Eigenschaft DoubleBuffered auf True zu setzen kann helfen. (Seit ich Lazarus verwende, muss ich mir solche Gedanken übrigens gar nicht mehr machen, da flackert von vornherein nie etwas.) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 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 by Thomas Breitkreuz