Neuzeichnen des Owners aus Subitem anstoßen

Rund um die LCL und andere Komponenten
Antworten
musicones
Beiträge: 35
Registriert: Di 8. Sep 2009, 09:13
OS, Lazarus, FPC: Win 10 (L 1.6.2 FPC 3.0.0)
CPU-Target: 64Bit

Neuzeichnen des Owners aus Subitem anstoßen

Beitrag von musicones »

Hallo,

ich arbeite gerade an einer einfachen Sidebar Komponente. Ich habe bereits meine eigene Panel und Button Komponenten erstellt
und somit etwas Erfahrung beim Schreiben von Komponenten in fpc erlangt.

Ich habe meine Panel-Komponente abgeleitet und nenne sie jetzt Sidebar.
Diese habe ich um die Eigenschaft Items erweitert. Diese ist vom Grundtyp TCollection abgeleitet
und die Items sind vom Grundtyp TCollectionItem abgeleitet.
Das Ergebnis ist, dass ich im Objektinspektor Items mit eigenen Eigenschaften verwalten kann.

Das OnPaint der Sidebar zeichnet die Sidebar (inherted das Panel) und darüber die einzelnen Items,
dessen Eigenschaften ich aus der Items Collection erhalte. An sich sehr einfach und cool.

Mein Problem ist aber jetzt, dass ich nicht weiß wie ich das Panel neuzeichnen soll, wenn ich eine Eigenschaft
in der Item-Property im Objektinspektor ändere.
Einfachstes Beispiel. Ich ändere die Höhe des Items von 50 auf 30. Das Panel muss sich mit dem Wert neuzeichnen.

Ich habe bereits versucht mir die Sidebar als Owner vom Type TCustomControl zu merken und dann Invalidate
aufzurufen, dass hat leider nicht funktioniert.

Was ist grundsätzlich der korrekteste Weg aus einem SubItem heraus den Parent neuzuzeichnen?

Ist mein Ansatz das komplette Zeichnen im Sidebar Paint zu machen überhaupt korrekt?
Alternativ könnte man evtl. das Zeichnen der Items im Bereich der Items machen, da aber
die TCollectionItems ja keine COntrols darstellen haben sie auch kein OnPaint etc.
Dann müsste man ggf. Ein Collection mit Items für den Objektinspektor haben und
eine als Controls, was die tatsächlichen Controls darstellt. Dies erscheint mir aber
ein wenig zu umständlich, als dass es der normale Weg wäre.

Für Vorschläge bin ich dankbar.

Gruß
Antonio

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Neuzeichnen des Owners aus Subitem anstoßen

Beitrag von Socke »

musicones hat geschrieben:Ich habe meine Panel-Komponente abgeleitet und nenne sie jetzt Sidebar.
Diese habe ich um die Eigenschaft Items erweitert. Diese ist vom Grundtyp TCollection abgeleitet
und die Items sind vom Grundtyp TCollectionItem abgeleitet.
Das Ergebnis ist, dass ich im Objektinspektor Items mit eigenen Eigenschaften verwalten kann.

Das OnPaint der Sidebar zeichnet die Sidebar (inherted das Panel) und darüber die einzelnen Items,
dessen Eigenschaften ich aus der Items Collection erhalte. An sich sehr einfach und cool.
Laut Dokumentation (siehe unten) müsste wohl eher in der Methode Paint gezeichnet werden.

Vielleicht hilft dir die Dokumentation der Klasse TPanel und deren Elternklassen weiter. Ich habe da spontan die Eigenschaft "FullRepaint" gefunden. Ansonsten sind die Methoden Invalidate, Repaint und Update die richtigen Methoden.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

musicones
Beiträge: 35
Registriert: Di 8. Sep 2009, 09:13
OS, Lazarus, FPC: Win 10 (L 1.6.2 FPC 3.0.0)
CPU-Target: 64Bit

Re: Neuzeichnen des Owners aus Subitem anstoßen

Beitrag von musicones »

Hallo,

erstes Problem ist soweit gelöst.

Die TCollection hält den Owner (hab ich als TCustomControl), aber mit Getter-Methode: GetOwner: TPersistent
TCollectionItem hält die Collection selbst.

Also habe ich eine Set-Methode für die Eigenschaften, die das Neuzeichnen des Controls anstoßen sollen:

Code: Alles auswählen

 
procedure TMyCollectionItem.SetColor(Value: TColor);
begin
  if (FColor <> Value) then
  begin
    FColor := Value;
    TCustomControl(Collection.Owner).Invalidate;
  end;
end; 
Also doch eher einfach, wenn man das weiß.

Aktuell ist aber das Problem:

Ich habe im CollectionItem ein BorderSpacing vom Typ TControlBorderSpacing eingefügt, siehe hier:

Code: Alles auswählen

 
procedure TMyCollectionItem.SetBorderSpacing(Value: TControlBorderSpacing);
begin
  if (FBorderSpacing <> Value) then
  begin
    FBorderSpacing := Value;
    TCustomControl(Collection.Owner).Invalidate;
  end;
end;
 
Da passiert aber leider nichts.

Jemand eine Idee wie ich da Vorgehen müsste?

Danke und Gruß
Antonio

musicones
Beiträge: 35
Registriert: Di 8. Sep 2009, 09:13
OS, Lazarus, FPC: Win 10 (L 1.6.2 FPC 3.0.0)
CPU-Target: 64Bit

Re: Neuzeichnen des Owners aus Subitem anstoßen

Beitrag von musicones »

Neue Ausgangssituation:

Code: Alles auswählen

 
procedure TCollectionItem.SetBorderSpacing(Value: TControlBorderSpacing);
begin
  if (BorderSpacing.Around <> Value.Around) or
     (BorderSpacing.Top <> Value.Top) or
     (BorderSpacing.Bottom <> Value.Bottom) then
  begin
    FBorderSpacing := Value;
    TCustomControl(Collection.Owner).Invalidate;
  end;
end;  
 
Ich habe das mal so umgestellt.
Wenn ich jetzt einen der abgefragten Werte ändere, dann wird das Control auch neugezeichnet.

Problem aber, es wird nur neugezeichnit wenn ich im PropertyEditor das Item wechsel.
Bei den anderen Eigenschaften reicht es aus, den neuen Wert einzutragen und mit Return zu bestätigen.

Jemand dazu eine Idee?

Nochmals Danke und Gruß
Antonio

Antworten