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/)
-   -   Nach TSplitter Nutzung verschwindet die Komponente (https://www.delphipraxis.net/177467-nach-tsplitter-nutzung-verschwindet-die-komponente.html)

Popov 7. Nov 2013 22:00

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;

himitsu 7. Nov 2013 23:02

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.

Popov 7. Nov 2013 23:31

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.

Perlsau 7. Nov 2013 23:34

AW: Nach TSplitter Nutzung verschwindet die Komponente
 
Zitat:

Zitat von himitsu (Beitrag 1235011)
Sind da wirklich zwei Komponenten Links ausgerichtet?

Kann ich mir auch nicht vorstellen: Bei Linksausrichtung nimmt die Komponente den gesamten linken Rand ihres Parents ein. Daher sollte pro Container immer nur eine darin befindliche Komponente pro Richtung ausgerichtet sei. Aber auch Links- und Top-Ausrichtung beißen sich: Versucht man, eine Komponente oben auszurichten, während eine andere bereits links ausgerichtet ist, wird letztere "gestaucht". Top und Bottom scheinen Vorrang vor Left und Right zu haben. Bei Splitter-Einsatz empfehle ich ebenfalls, stets nur eine Komponente pro Splitter-Seite zu platzieren.

Medium 7. Nov 2013 23:41

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.

Popov 7. Nov 2013 23:53

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.

Volker Z. 8. Nov 2013 00:18

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ß

Namenloser 8. Nov 2013 01:14

AW: Nach TSplitter Nutzung verschwindet die Komponente
 
Zitat:

Zitat von Popov (Beitrag 1235018)
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.

Das Geflacker gibt es auch auf modernen Rechnern noch, aber man kann es zum Teil verhindern, indem man im OnFormCreate csOpaque zum ControlStyle der problemverursachenden Controls hinzufügt:

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 01:52 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