![]() |
Setter Problem
Also es geht hier nicht um einen Hund... :)
Ich möchte einen Parameterstring ablegen und auf diese Parameter in der Form von Wertepaaren zugreifen (so ähnlich wie der ADO Verbindungsstring). Abgelegt wird der String in einer Stringliste, ich möchte jetzt allerdings gezielt nur die entsprechenden Propertys zur Verfügung stellen. Dazu habe ich mir ein Objekt gebastelt, das diese Propertys enthält.
Delphi-Quellcode:
Dieses Objekt verwende ich nun in einem weiteren Objekt.
TParameters = class(TObject)
private FParameters: TStrings; function GetParamString: String; procedure SetParamString(Value: String); function GetValue(const Name: string): string; procedure SetValue(const Name, Value: string); function GetValueFromIndex(const Index: Integer): string; procedure SetValueFromIndex(const Index: Integer; Value: string); function GetName(const Index: Integer): String; function GetCount: Integer; public constructor Create; destructor Destroy; property ParamString: String read GetParamString write SetParamString; property Value[const Name: String]: String read GetValue write SetValue; default; property ValueFromIndex[const Index: Integer]: String read GetValueFromIndex write SetValueFromIndex; property Name[const Index: Integer]: String read GetName; property Count: Integer read GetCount; end;
Delphi-Quellcode:
Funktioniert auch im Prinzip ganz gut. Ich kann wie gewünscht auf Parameters zugreifen. Allerdings soll bei einem Schreibzugriff auf Parameters der von TCustomItem geerbte FState geändert werden, was ich so machen wollte:
TUser = class(TCustomItem)
private FUserID: String; FParameters: TParameters; procedure SetUserID(Value: String); procedure SetParameters(Value: TParameters); public constructor Create(Collection: TCollection); override; destructor Destroy; procedure Assign(Source: TPersistent); override; property UserID: String read FUserID write SetUserID; property Parameters: TParameters read FParameters write SetParameters; end;
Delphi-Quellcode:
procedure TUser.SetParameters(Value: TParameters);
begin if FParameters.ParamString <> Value.ParamString then begin FParameters.ParamString := Value.ParamString; State := osModified; end; end; Blöderweise wird das allerdings nicht bearbeitet (ich hab einen Haltepunkt auf die if Abfrage), so dass ich nicht "bemerke" wenn ein Parameter geändert wird. Wie kann ich das hinkriegen? |
Re: Setter Problem
Hallo,
die Konstruktion selber ist das Problem: Zitat:
Delphi-Quellcode:
machst. Würde ich so nicht machen. Erzeugt auch ggf. Speicherlöcher :-)
MyUser.Parameters := NewParameters;
Was du willst, ist auf die Änderungen reagieren in TParameters. Dafür könntest du dir ein Ereignis OnChange deklarieren und dieses in TUser dann mit einer Ereignismethode verknüpfen. Du mußt dann aber auch in den entsprechenden Methoden von TParameter dafür sorgen das die Methode OnChange entsprechend ausgelößt wird.
Delphi-Quellcode:
Gruß, Chris
if Assigned(FOnChange) then FOnChange(<all deine Parameter die Du zur Auswertung benötigst>)
|
Re: Setter Problem
Oh. Bedeutet das, dass bei so einer Konstruktion:
Delphi-Quellcode:
die Setter-Methode nicht aufgerufen wird, wenn ich auf eine Eigenschaft, die von TStringList geerbt ist, zugreife sondern nur wenn ich der Property "Parameters" eine komplette StringList zuweise? Ist ja doof!
TTest = class(TObject)
private FParameters: TStrings; procedure SetParameters(Value: TStrings); public constructor Create; destructor Destroy; property Parameters: TStrings read FParameters write SetParameters; end; |
Re: Setter Problem
Zitat:
Delphi-Quellcode:
Aber ohne Garantie auf Funktion. Nur reingehackt :-)
type
TChangedProp = (cpWert1, cpWert2); TOnChange = procedure(Sender: TObject; ChangedProp: TChangedProp) of object; TMyClass = class private FWert1: Integer; FWert2: string; FOnChange: TOnChange; procedure SetWert1(Value: Integer); procedure SetWert2(Value: string); public property Wert1: Integer read FWert1 write SetWert1; property Wert2: string read FWert2 write SetWert2; property OnChange: TOnChange read FOnChange write FOnChange; end; implementation procedure TMyClass.SetWert1(Value: Integer); var WertChanged: Integer; begin WertChanged := FWert1 <> Value; FWert1 := Value; if WertChanged and Assigned(FOnChange) then FOnChange(Self, cpWert1); end; procedure TMyClass.SetWert2(Value: string); var WertChanged: Integer; begin WertChanged := FWert2 <> Value; FWert2 := Value; if WertChanged and Assigned(FOnChange) then FOnChange(Self, cpWert2); end; Gruß, Chris [edit] sollte ja auf of object sein :-)[/edit] |
Re: Setter Problem
Danke für die Information, ich habe verstanden und mache es jetzt so, dass ich beim Instantiieren von TParameters eine Referenz auf das Parent-Item übergebe und somit in den jeweiligen Setter-Routinen auf State zugreifen kann.
Delphi-Quellcode:
Sieht ganz gut aus jetzt...
constructor TParameters.Create(Item: TCustomItem);
begin inherited Create; FItem := Item; FParameters := TStringList.Create; end; procedure TParameters.SetValue(const Name: string; const Value: string); begin if FParameters.Values[Name] <> Value then begin FParameters.Values[Name] := Value; FItem.State := osModified; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz