Frage: ScrollBars bei zur Laufzeit erstellten Komponenten

Rund um die LCL und andere Komponenten
Antworten
Framercy
Beiträge: 4
Registriert: So 29. Jun 2008, 22:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Frage: ScrollBars bei zur Laufzeit erstellten Komponenten

Beitrag von Framercy »

Bei zur Laufzeit erzeugten Komponenten sind diese im Parent nicht automatisch scrollbar.
Sobald der sichtbare Bereich ausgefüllt ist würde ich gerne mittels Scrollbars den Hintergrund scrollen aber das funzt halt nicht automatisch bei Forms oder Scrollboxen.
Wie komme ich am einfachsten daran?

Ich habe zur Veranschaulichung ein Projekt mit hochgeladen.


LG
Fram
Dateianhänge
published.zip
(3.38 KiB) 66-mal heruntergeladen

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Die problembeschreibung ist für mich nicht ganz klar. Was meinst du mit "Im Parent Scrollbar ?" Wenn die Komponenten keione eigenen Scrollbars haben, kannst du eine TScrollbox drunetrsetzen und es sollte funktionieren.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

@Christian anhand des Beispieles wird es klar ;)

Ich habs gerade mal verglichen, beim zur Designtime erstellen Form geht es ja, und das neue hat exakt die selben Eigenschaften gesetzt. Ich könnte mir fast vorstellen, es handelt sich hier um einen Bug.
Johannes

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Was willst du genau erreichen?
Bei mir geht das z.B. so (GTK2 getestet)

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var aPanel:TPanel;
begin
aPanel:=TPanel.Create(self);
aPanel.Parent:=ScrollBox1;
aPanel.Top:=200;
aPanel.Width:=400;
aPanel.Align:=alTop;
aPanel.Color:=clred;
aPanel.Caption:='Panel_'+inttostr(ComponentCount);
end;
Ausserdem hast du ein grobes Durcheinander bei den Konstruktoren
z.B:
new (Newpanel) ;
Newpanel^ := TPanel.create(MyForm^);

Das hier reicht völllig (kein new und kein ^):
Newpanel := TPanel.create(MyForm);

Die Dereferenzierung (^) macht FPC automatisch bei Klassen, ist also nur überflüssige Tipparbeit.

Framercy
Beiträge: 4
Registriert: So 29. Jun 2008, 22:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Beitrag von Framercy »

@Theo
Ich habe halt wild rumprobiert mit allen möglichen Komponenten und dementsprechend munter die Bezeichner gewechselt....
Danke für den Hint mit der Dereferenzierung - ich programmiere noch nicht so lange in Pascal...

Gtk2 kompiliert grad bei mir nicht - aber ich brauche es eh für win32 Widgetset, und da gehts leider nicht...

@Christian
Vielleicht habe ich mich dumm ausgedrückt....
Ich meine: wenn ich Pannels zur Laufzeit zu einem Form oder einer Scrollbox hinzufüge und der sichtbare Bereich des Forms oder der Scrollbox ausgefüllt ist,
dann sollte es meiner Meinung nach möglich sein den Inhalt des Forms oder Scrollbox zu scrollen oder zu verschieben, um die dann nicht sichtbaren Controls anzuzeigen.


LG
Fram

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Probier mal sowas, das geht bei mir auch auf win32 / Wine:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var aPanel:TPanel;
begin
aPanel:=TPanel.Create(self);
aPanel.Parent:=ScrollBox1;
aPanel.Width:=400;
aPanel.Height:=50;
aPanel.Top:=aPanel.Height*fPanelsCount;
aPanel.Left:=0;
inc(fPanelsCount);
aPanel.Caption:='Panel_'+inttostr(fPanelsCount);
end;
fPanelscount ist ein integer Feld von Form1.

Die Scrollbox hat aber schon ihre Tücken.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

@Framercy

Schon sehr komisch was du da in deinem testprojekt machst. Du setzt Autoscroll überall auf false und wunderst dich das keine Scrollbars auftauchen. Auch der Sinn und Zweck von diesem Childsizing erschliesst sich mir nicht. Kaum entfernt man den ganzen "Quatsch" schon funktionierts problemlos.
Dateianhänge
Neuer Ordner (2).zip
Ich hab das mal etwas aufgeräumt.
(3.76 KiB) 56-mal heruntergeladen
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Framercy
Beiträge: 4
Registriert: So 29. Jun 2008, 22:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Beitrag von Framercy »

Christian hat geschrieben:@Framercy

Schon sehr komisch was du da in deinem testprojekt machst. Du setzt Autoscroll überall auf false und wunderst dich das keine Scrollbars auftauchen. Auch der Sinn und Zweck von diesem Childsizing erschliesst sich mir nicht. Kaum entfernt man den ganzen "Quatsch" schon funktionierts problemlos.
Nö nix geht da - bei Dir liegen die erzeugten Panels alle übereinander - und sie sollen geordnet nebeneinander in einer 5er-Reihe angeordnet werden. Sind 5 Panels nebeneinander soll eine neue Reihe geöffnet werden. Solange bis keine Datensätze mehr aus meiner Tabelle kommen.
in die Panels kommen noch ein paar textfelder für Name Telefon usw...
Also macht der "Quatsch" schon zumindest Teilweise Sinn....
Ohne:

Code: Alles auswählen

ChildSizing.Layout := cclLeftToRightThenTopToBottom;
      ChildSizing.ControlsPerLine := 5;
kein erwünschtes Verhalten.
Den Rest habe ich einfach mal so eingestellt weil ich dieses SizingVerhalten der Childs auch so benötige...

Was Autoscroll:=false angeht so ist auch das eine gewollte Einstellung da ich die Scrollbars von Anfang an sehen möchte...
Ich habe mich auch nicht gewundert wo die Scrollbars sind - sondern warum sie nicht arbeiten....

@theo

Danke irgendwie muss ich das Problem ja dann auf soeinem Wege in den Griff bekommen..
Gibts da eigendlich in Pascal eine Standart- Methode oder Prozedur um an die Anzahl der Steuerelemente inerhalb einer Scrollbox zu kommen? - Ich schau mal was es da so gibt.


LG
Fram

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Trotsdem versteh ich den ChildSizing kram nicht.
Du musst doch nur Top der Panels setzen, dann geht das auch.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Framercy
Beiträge: 4
Registriert: So 29. Jun 2008, 22:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Beitrag von Framercy »

Christian hat geschrieben:Trotsdem versteh ich den ChildSizing kram nicht.
Du musst doch nur Top der Panels setzen, dann geht das auch.
Jo - wenn das sorherum auch funzt werde ich das probieren....


LG
Fram

Antworten