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 TScrollbox erkennt Aktualisierung im Clientbereich nicht (https://www.delphipraxis.net/79142-tscrollbox-erkennt-aktualisierung-im-clientbereich-nicht.html)

berens 17. Okt 2006 02:08


TScrollbox erkennt Aktualisierung im Clientbereich nicht
 
Hallo allesamt!

Ich bin mal wieder am Verzweifeln!

Folgende Situation:
TForm mit eine TScrollbox oder TLMDScrollbox enthalten. Darin ein TPanel mit einem TPanel, welches wiederum mehrere TPanels enthalten kann (dynamisch geladen). Alle Objekte in abgeleitet von den genannten Klassen. Alle Objekte alTop.

Auf gut Deutsch: Ein Bereich (TScrollbox) in dem mehrere Bereiche enthalten sind (z.B. TPanel1; Parent=TScrollbox). Der eine spezielle Bereich enthält eine Komponente (Panel2; Parent=Panel1), welche die restlichen Panels (Panel-n; Parent=Panel2) enthält (vergleichbar einer TListbox; ich brauche jedoch viele Zusatzinformationen zu den einzelnen Einträgen - die wird alles über eine TComponentList geregelt, die Panels werden entsprechend den Datensätzen einer Datenbank geladen).

Problem:
Nach dem Laden gehen die Einträge über die untere Kante der Scrollbox hinaus. Nun sollte das Scrollen anfangen - tut es aber nicht (TScrollbox = Balken nicht zu sehen, TLMDScrollbox = Balken gibt an, dass die volle Fläche zur Zeit betrachtet wird, aber: beim Klick auf den "Nach Unten" Knopd der TLMDScrollbar kann ich tatsächlich nach unten scrollen!). Nachdem ich -mit der Maus per Hand- das komplette Formular einen Pixel größer gemacht habe funktioniert alles. Ich kann scrollen.

* Das Formular hat kein OnResize Event o.ä.
* Wenn ich die Komponente auf einem Beispielform platziere, funktioniert es auch...

Ergo ein sporadisch auftretender Fehler von dem ich Euch leider in keinster Weise sagen kann, wie man ihn reproduzieren kann.

* Kann das jemand logisch erklären?

* Kann ich mit einer WinApi wie-auch-immer die Aktion auslösen, die auch durch das Größen-Ändern des Formulars oder das "Nach-Unten-Klicken" auf die TLMDScrollbox ausgelöst wird?

Vielen Dank für baldige Antworten!

TStringlist 17. Okt 2006 23:10

Re: TScrollbox erkennt Aktualisierung im Clientbereich nicht
 
Hallo, vorausgesetzt ich habe dich richtig verstanden, dann sollte das VertScrollBar.Range die für dich in dieser Sache interessante Property sein. Normalerweise wird die schon automatisch eingestellt. Allerdings nicht immer, dann muss man das eigenhändig tun.

berens 17. Okt 2006 23:51

Re: TScrollbox erkennt Aktualisierung im Clientbereich nicht
 
Range scheint tatsächlich das Problem zu lösen :)

Nun bleibt nur noch die Frage, ob es nicht doch irgendwie möglich ist, "Range" automatisch neu berechnen zu lassen. Weil ich wollte jetzt nicht immer alle Komponenten per Hand durchzählen um dem "untersten" Punkt zu ermitteln, der dann (abzüglich öhm. Scrollbox.Height (?)) die Range ist...

Ich habe momentan ein "Workaround" indem ich unter die betroffene Komponente noch eine mit alTop setze und die in FormActivate mal kurz sichtbar mache, dann wieder unsichtbar. Das klappt auch.

Danke für die Tip TStringList!

TStringlist 18. Okt 2006 07:36

Re: TScrollbox erkennt Aktualisierung im Clientbereich nicht
 
Zitat:

Zitat von berens
Nun bleibt nur noch die Frage, ob es nicht doch irgendwie möglich ist, "Range" automatisch neu berechnen zu lassen. Weil ich wollte jetzt nicht immer alle Komponenten per Hand durchzählen um dem "untersten" Punkt zu ermitteln, der dann (abzüglich öhm. Scrollbox.Height (?)) die Range ist...

...in einer jeden solchen Situation wäre dann aber immer wieder nur ein Aufruf von z.B. folgender Procedure nötig:

Delphi-Quellcode:
procedure getScrollBoxRange(AScrollBox : TScrollBox);
var I, RangeMin : integer;
begin
  RangeMin := AScrollBox.ClientHeight;
  with AScrollBox do
    for I := 0 to ControlCount-1 do
      if (Controls[I] is TWinControl) then
        with Controls[I] as TWinControl do
          if Top + Height > RangeMin then
            RangeMin := Top + Height;
  AScrollBox.VertScrollBar.Range := RangeMin +10; // +10 = SpacePuffer
end;

edit: Schönheitskorrektur im Code

berens 18. Okt 2006 08:27

Re: TScrollbox erkennt Aktualisierung im Clientbereich nicht
 
Hey cool, das sieht doch seeehr brauchbar aus. Probier ich gleich mal aus. Vielen Dank!


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:11 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