[Delphi] Komponente aktualisieren

pcw

Lt. Commander
Registriert
Juli 2001
Beiträge
1.676
Ich hab eine selbstgeschriebene Komponente (c1) vom Typ TCustomControl und eine weitere (c2) vom Typ TPersistent.
c2 ist Attribut von c1.

Wenn ich jetzt aber ein Attribut von c2 änder - was Auswirkungen auf das Aussehen von c1 hätte - zeichnet sich c1 weder zur Entwurfs- noch zur Laufzeit neu.

die write-Methode setC2 der property zu c2 wird übrigens auch nicht aufgerufen, soweit ich das erkennen konnte.

Wie bringe ich also jetzt c1 dazu, sich bei der Änderung eines Attributwertes von c2 neu zu zeichnen?
 
c1.Repaint bzw. c1.Refresh wenn ich ned etwas übersehen habe ;)
 
Öhm c2 weiss von c1 nix, also kann ich aus c2 raus auch nicht c1 aufrufen^^

öhm vereinfacht sieht das ganze so aus:

Code:
type
  TC2 = class(TPersistent)
    private
      Fattr:Integer;
      procedure setAttr(Value:Integer);
    published
      property attr:Integer read Fattr write setAttr;
  end;

  TC1 = class(TCustomComponent)
    private
      Fc2:TC2;
      procedure setC2(Value:TC2);
    published
      property c2:TC2 read Fc2 write setC2;
  end;

Und wenn ich jetzt halt C1.c2:=1; mache, soll c1 auch neu gezeichnet werden. Allerdings wird in dem Fall nichtmal C1.setC2 aufgerufen^^.
 
Naja das C1 aktualisiert wird muss dann explizid in der Methode setC2 mit gemacht werden.
Das die Methode nicht aufgerufen wird ist allerdings etwas seltsam.

Wenn jetzt C2 nicht über setC2 geändert wird, also direkt auf C2 gearbeitet wird, musst du entweder C1 in C2 bekannt machen oder ein neutrales Eventsystem implementieren an das sich C1 anmelden kann. In beiden Fällen muss dann immer mit einer Methode gearbeitet werden, welche die Eigenschaft in C2 neu setzt und
C1 direkt oder über das Eventsystem neu zeichnen lässt.
 
Zuletzt bearbeitet:
Also ich hab C2 jetzt noch einen FOwner verpasst, den Constructor um entsprechtendes Attribut erweitert und bei den ganzen Settern FOwner.Invalidate aufrufen lassen.
Jetzt läuft alles, wie es soll :-)
 
Hast du rausgefunden warum das setC2 nicht aufgerufen wurde ?
 
Weil c2 sich nie verändert hat, sondern nur ne EIgenschaft von C2 ^^ denke ich zumindest.
 

Ähnliche Themen

Zurück
Oben