Wie TCustomControl.ClientHeight beobachten? [gelöst]

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Wie TCustomControl.ClientHeight beobachten? [gelöst]

Beitrag von RSE »

Bei meiner eigenen Komponente darf die ClientHeight nicht unter meine eigene Eigenschaft ItemHeight fallen. SetClientHeight kann ich ja leider nicht überschreiben. Wie bemerke ich Änderungen an ClientHeight, auch wenn sich Height nicht ändert (z.B. beim Einblenden der Scrollbalken)?
Zuletzt geändert von RSE am So 15. Nov 2009, 14:53, insgesamt 1-mal geändert.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Wie TCustomControl.ClientHeight beobachten?

Beitrag von Hitman »

Wärs nicht sinnvoller, dafür die bereits vorhandenen Constraints zu nutzen? ;)

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Wie TCustomControl.ClientHeight beobachten?

Beitrag von RSE »

Constraints für ClientHeight? Wenn ich mich nicht ganz schlimm irre, gelten die Constraints für Height und Width und nicht für ClientHeight und ClientWidth. Genau da liegt mein Problem, wenn plötzlich eine Scrollbar oder so auftaucht, die den Unterschied zwischen Height und ClientHeight vergrößert, muss ich die Constraints erneut entsprechend anpassen, damit die ClientHeight nie zu klein wird. Wenn ich die Constraints anpasse, werde ich ggf. auch die Height anpassen, daraufhin wird OnResize ausgelöst und dabei kann ggf. das Fenster, in dem sich meine Komponente befindet, angepasst werden. Fehlend in dieser Kette ist lediglich ein DoOnClientResize oder sowas zum Überschreiben.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

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

Re: Wie TCustomControl.ClientHeight beobachten?

Beitrag von theo »

Bei mir (GTK2) TScrollbox wird auch ein resize event aufgerufen, wenn sich der Inhalt ändert.

Bsp. Ich habe eine TScrollBox mit einem Panel drin:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Panel1.Width=200 then  Panel1.Width:=900 else  Panel1.Width:=200
end;
 
procedure TForm1.ScrollBox1Resize(Sender: TObject);
begin
  Caption:=Inttostr(ScrollBox1.ClientHeight);
end;


Die Wert (Caption) ändert sich, wenn ich den Inhalt (Panel) grösser mache sodass die Scrollbars erscheinen.
Ist das nicht, was du möchtest?

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Wie TCustomControl.ClientHeight beobachten?

Beitrag von RSE »

Hm, nicht ganz, glaube ich. So wie du es beschrieben hast, habe ich zumindest noch nicht gearbeitet.
Beispiel:
Meine Komponente ist ursprünglich 80 Pixel hoch. Da ist ClientHeight also 80. Auf dieser Grundlage berechne ich Constraints.MinHeight auf z.B. 30, damit ClientHeight mindestens 30 groß ist. Jetzt wird ein Border hinzugefügt. Das benötigt rundherum an jeder Kante z.B. 2 Pixel, d.h. Height bleibt gleich, aber ClientHeight schrumpft von ehemals 80 auf 76. Ob dabei Resize aufgerufen wird, werde ich heute abend mal testen. Jedenfalls müsste ich in diesem Moment Constraints.MinHeight auf 34 setzen, damit ClientHeight immernoch die 30 nicht unterschreiten kann. Optimalerweise müsste mein Eingriff natürlich passieren, wenn die neuen Werte bereits berechnet, aber noch nicht übernommen wurden, damit ich ggf. die Height neu setzen kann, bevor es flimmert. Ich habe selbst noch nicht probiert wann genau und ob Resize aufgerufen wird etc.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Wie TCustomControl.ClientHeight beobachten?

Beitrag von RSE »

Resize wird auch bei Änderung von ClientHeight oder ClientWidth aufgerufen. Ich habe meinen Code jetzt direkt vor "inherited Resize;" eingebaut, klappt wunderbar.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Antworten