AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Nach TSplitter Nutzung verschwindet die Komponente

Ein Thema von Popov · begonnen am 7. Nov 2013 · letzter Beitrag vom 8. Nov 2013
Antwort Antwort
Popov
(Gast)

n/a Beiträge
 
#1

Nach TSplitter Nutzung verschwindet die Komponente

  Alt 7. Nov 2013, 22:00
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#2

AW: Nach TSplitter Nutzung verschwindet die Komponente

  Alt 7. Nov 2013, 23:02
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

AW: Nach TSplitter Nutzung verschwindet die Komponente

  Alt 7. Nov 2013, 23:31
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.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#4

AW: Nach TSplitter Nutzung verschwindet die Komponente

  Alt 7. Nov 2013, 23:34
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.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: Nach TSplitter Nutzung verschwindet die Komponente

  Alt 7. Nov 2013, 23:41
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#6

AW: Nach TSplitter Nutzung verschwindet die Komponente

  Alt 7. Nov 2013, 23:53
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.
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#7

AW: Nach TSplitter Nutzung verschwindet die Komponente

  Alt 8. Nov 2013, 00:18
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ß
Volker Zeller
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Nach TSplitter Nutzung verschwindet die Komponente

  Alt 8. Nov 2013, 01:14
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:

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.)
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:34 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