[gelöst] Invalidate in Komponente

Rund um die LCL und andere Komponenten
Antworten
wennerer
Beiträge: 191
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 19.3 Cinnamon, Lazarus Stable 2.0.10 r63673M FPC 3.2.0
CPU-Target: x86_64-linux-gtk2

[gelöst] Invalidate in Komponente

Beitrag von wennerer »

Hallo,
ich habe in einer Komponente einem Objekt verschiedene Eigenschaften zugewiesen. Die Eigenschaften kann ich nun im OI dem Objekt über ein Dropdown zuweisen. Wenn ich das Programm starte ändern sich die Eigenschaften.
Leider weiß ich aber nicht wie ich in dem Fall ein Invalidate auslösen kann damit sich das Objekt in der Komponente gleich ändert.
Ich mach das in etwa so:

Code: Alles auswählen

 
type
  TEigenschaften = (Eigenschaft1,Eigenschaft2,Eigenschaft3);
 
type
  TMeineKomponente = class(TGraphicControl)
  private
    FMeinObjekt                : TEigenschaften;
 
published
     property MeinObjekt               : TEigenschaften   read FMeinObjekt                         write FMeinObjekt;
 


Bei meinen anderen Eigenschaften kann ich eine Set Prozedure anlegen in der ich ein Invalidate rein schreib. Leider geht das hier wohl nicht.
Kann mir jemand weiter helfen wie man das macht?
Viele Grüße
Bernd
Zuletzt geändert von wennerer am Do 9. Apr 2020, 20:05, insgesamt 1-mal geändert.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 620
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Invalidate in Komponente

Beitrag von fliegermichl »

wennerer hat geschrieben:Hallo,
ich habe in einer Komponente einem Objekt verschiedene Eigenschaften zugewiesen. Die Eigenschaften kann ich nun im OI dem Objekt über ein Dropdown zuweisen. Wenn ich das Programm starte ändern sich die Eigenschaften.
Leider weiß ich aber nicht wie ich in dem Fall ein Invalidate auslösen kann damit sich das Objekt in der Komponente gleich ändert.
Ich mach das in etwa so:

Code: Alles auswählen

 
type
  TEigenschaften = (Eigenschaft1,Eigenschaft2,Eigenschaft3);
 
type
  TMeineKomponente = class(TGraphicControl)
  private
    FMeinObjekt                : TEigenschaften;
 
published
     property MeinObjekt               : TEigenschaften   read FMeinObjekt                         write FMeinObjekt;
 


Bei meinen anderen Eigenschaften kann ich eine Set Prozedure anlegen in der ich ein Invalidate rein schreib. Leider geht das hier wohl nicht.
Kann mir jemand weiter helfen wie man das macht?
Viele Grüße
Bernd


Natürlich geht das.

Code: Alles auswählen

 
private
 fMeinObjekt : TEigenschaften;
 procedure SetMeinObjekt(const aValue : TEigenschaften);
public
 procedure Invalidate;
 property MeinObjekt : TEigenschaften read fMeinObjekt write SetMeinObjekt;
end;
 
implementation
 
procedure TMeineKomponente.SetMeinObjekt(const aValue : TEigenschaften);
begin
 if MeinObjekt <> Value then
 begin
  fMeinObjekt := aValue;
  Invalidate();
 end;
end;
 

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 620
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Invalidate in Komponente

Beitrag von fliegermichl »

Oder hast du ein SET von TEigenschaften und willst deren Bestandteile in einzelnen Properties haben.
Dann geht das so:

Code: Alles auswählen

 
type
 TEigenschaft = (Eigenschaft1, Eigenschaft2, Eigenschaft3);
 TEigenschaften = set of TEigenschaft;
 
TMeineKomponente = class
private
 fEigenschaften : TEigenschaften;
 function    GetEigenschaft1 : boolean;
 procedure SetEigenschaft1(const Value : boolean);
public
 property Eigenschaft1 : boolean read GetEigenschaft1 write SetEigenschaft1;
 property Eigenschaft2...
end;
 
implementation
 
function TMeineKomponente.GetEigenschaft1 : boolean;
begin
 Result := (Eigenschaft1 in fEigenschaften);
end;
 
procedure TMeineKomponente.SetEigenschaft1(const Value : boolean);
begin
 if Value <> Eigenschaft1 then
 begin
  if Value then
   Include(fEigenschaften, Eigenschaft1)
  else
   Exclude(fEigenschaften, Eigenschaft1);
  Invalidate();
 end;
end;
 


Wenn man sehr viele solcher Eigenschaften hat, kann man sich auch der indizierten Methode bedienen:
Dabei nutzt man den Umstand, dass SET's intern nix anderes wie Integer sind.

Code: Alles auswählen

 
  TEigenschaft = (Eigenschaft1, Eigenschaft2, Eigenschaft3);
  TEigenschaften = set of TEigenschaft;
 
  { TMeineKomponente }
 
  TMeineKomponente = class
  private
    fEigenschaften : TEigenschaften;
    function  GetEigenschaft(Index : integer) : boolean;
    procedure SetEigenschaft(Index : integer; const aValue : boolean);
    procedure Invalidate;
  public
    property Eigenschaft1 : boolean index 0 read GetEigenschaft write SetEigenschaft;
    property Eigenschaft2 : boolean index 1 read GetEigenschaft write SetEigenschaft;
    property Eigenschaft3 : boolean index 2 read GetEigenschaft write SetEigenschaft;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TMeineKomponente }
 
function TMeineKomponente.GetEigenschaft(Index: integer): boolean;
begin
  Result := TEigenschaft(Index) in fEigenschaften;
end;
 
procedure TMeineKomponente.SetEigenschaft(Index: integer; const aValue: boolean
  );
begin
 if GetEigenschaft(Index) <> aValue then
 begin
   if aValue then
     Include(fEigenschaften, TEigenschaft(Index))
   else
     Exclude(fEigenschaften, TEigenschaft(Index));
 end;
 Invalidate;
end;
 
procedure TMeineKomponente.Invalidate;
begin
  // Macht hier nix
end;
 
 

wennerer
Beiträge: 191
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 19.3 Cinnamon, Lazarus Stable 2.0.10 r63673M FPC 3.2.0
CPU-Target: x86_64-linux-gtk2

Re: [gelöst ]Invalidate in Komponente

Beitrag von wennerer »

Hallo Fliegermichl,
vielen herzlichen Dank für deine ausführliche Erklärung.
Die erste Variante war das was ich schon seit Tagen probier und brauche. Mein Fehler war das ich der Prozedur keinen Wert mitgegeben habe. :cry:
Also Richtig:

Code: Alles auswählen

procedure SetEigenschaft1(const Value : boolean);

und nicht so:

Code: Alles auswählen

procedure SetEigenschaft1; 


Ich habe aber die Variante mit den Indexes auch mal getestet. Ist ja sehr elegant! Werde ich bestimmt noch mal brauchen.
Macht aber im OI Eigenschaft1 und Eigenschaft2 ... , benötige jetzt aber im OI Eigenschaft1 oder Eigenschaft2 .....
Es darf also nur eine Eigenschaft zuweisbar sein.
Viele Grüße
Bernd

wennerer
Beiträge: 191
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 19.3 Cinnamon, Lazarus Stable 2.0.10 r63673M FPC 3.2.0
CPU-Target: x86_64-linux-gtk2

Re: [gelöst] Invalidate in Komponente

Beitrag von wennerer »

Eine Frage hätte ich noch. Du machst hinter Invalidate eine leere Klammer ( ). Hat das eine besondere Bewandniss?
Gruß
Bernd

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 620
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: [gelöst] Invalidate in Komponente

Beitrag von fliegermichl »

wennerer hat geschrieben:Eine Frage hätte ich noch. Du machst hinter Invalidate eine leere Klammer ( ). Hat das eine besondere Bewandniss?
Gruß
Bernd


Eigentlich nicht, man erkennt aber sofort, daß eine Prozedur aufgerufen wird und nicht nur eine Variable.

wennerer
Beiträge: 191
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 19.3 Cinnamon, Lazarus Stable 2.0.10 r63673M FPC 3.2.0
CPU-Target: x86_64-linux-gtk2

Re: [gelöst] Invalidate in Komponente

Beitrag von wennerer »

Danke!

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2281
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.8, FPC 3.0.4)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: [gelöst] Invalidate in Komponente

Beitrag von m.fuchs »

fliegermichl hat geschrieben:
wennerer hat geschrieben:Eine Frage hätte ich noch. Du machst hinter Invalidate eine leere Klammer ( ). Hat das eine besondere Bewandniss?

Eigentlich nicht, man erkennt aber sofort, daß eine Prozedur aufgerufen wird und nicht nur eine Variable.

Wie ruft man eine Variable auf?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 620
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: [gelöst] Invalidate in Komponente

Beitrag von fliegermichl »

m.fuchs hat geschrieben:
fliegermichl hat geschrieben:
wennerer hat geschrieben:Eine Frage hätte ich noch. Du machst hinter Invalidate eine leere Klammer ( ). Hat das eine besondere Bewandniss?

Eigentlich nicht, man erkennt aber sofort, daß eine Prozedur aufgerufen wird und nicht nur eine Variable.

Wie ruft man eine Variable auf?


Ja da hab ich mich blöd ausgedrückt.
Wenn ich einer Variablen oder Property einen Wert zuweisen will, dann sehe ich sofort, daß diese Zuweisung durch einen Funktionsaufruf passiert.

Code: Alles auswählen

 
 a := b; // b ist eine Variable oder eine Property
 a := b(); // b ist eine Function
 


Ist halt einfach eine Angewohnheit von mir.

Antworten