![]() |
Bei TList, Record auf Datenänderung reagieren
Hallo zusammen,
ich habe diesen Teil des ![]()
Delphi-Quellcode:
Das funktioniert alles soweit nach dem Tutorial. Nun stelle ich mir die Frage, wie kann ich jetzt auf Änderung in den Daten reagieren um diese Änderung dann in eine Datenbank zu schreiben ?
type
PGesellschaftsname = ^TGesellschaftsname; TGesellschaftsname = record StammNr : Integer; Gesellschaftername : string; Zeichnungskapital : Double; ZweiteZahlung : TDateTime; ZahlenderBetrag : Double; end; var Gesellschafter : PGesellschaftsname; GesellschafterListe : TList; |
Re: Bei TList, Record auf Datenänderung reagieren
|
Re: Bei TList, Record auf Datenänderung reagieren
Moin Moin Ralph,
danke erstmal für Deine Antwort. Nur verstehe ich noch nicht ganz wie mir das Beispiel weiterhelfen soll, da ich kein Grid habe, sondern nur verstreute Werte in der Anwendung. Diese verstreuten Werte sind lediglich nur in Editfeldern oder ListViews untergebracht. |
Re: Bei TList, Record auf Datenänderung reagieren
Hi,
wie wär's, wenn Du statt des Records eine Class mit Properties und Gettern und Settern verwendest, und dann ein OnChange Event implementierst ? Gruss |
Re: Bei TList, Record auf Datenänderung reagieren
Zitat:
Edit: Ok, jetzt weiß ich was Du meinst. Ich habe dabei nur ein Problem, wie verbinde ich eine Klasse mit TList, da ich durch die TList ja auch mehrere Werte speichern kann. Bei einer Klasse kann ich das ja so ohne weitere ja nicht oder ? Und dann kommt das zweite Problem, ich habe noch nie ein OnChange Event geschrieben. |
Re: Bei TList, Record auf Datenänderung reagieren
Zitat:
Bei Records wird im Allgemeinen nur DIREKT der wert geändert und es gibt keine Möglichkeit über eine Änderung informiert zu werden (außer wenn den Speicherbereich sperrt, wo man sich bei Zugriff eine Systemexception auslösen lassen kann, welche man dann passend behandelt ... ist aber nicht grad optimal). Alternativ kann man seit Delphi 2006 / TDE auch Records mit Properties versehen und hätte so dann den nötigen Einstiegspunkt, um sowas wie OnChange zu implementieren. |
Re: Bei TList, Record auf Datenänderung reagieren
Hi,
Das geht dann (fast) genauso, wie mit deinem Record. Du erstellst doch mehrere Records (z.B. mit Getmem) und fügst sie der Liste hinzu. Erstelle stattdessen mehrere Instanzen der Klasse und füge sie der Liste hinzu.
Delphi-Quellcode:
und wenn es zum Aufräumen kommt, nicht vergessen die Objekte der Liste freizugeben. Nur nicht mit FreeMem, sondern mit Free.
type
tMyClass = class private FWert: integer; FOnChange: tNotifyEvent; procedure SetWert(Value:integer); function GetWert:integer; public property Wert: integer read GetWert write SetWert; property OnChange: tNotifyEvent read FOnChange write FOnChange; end; procedure tMyClass.SetWert(Value:integer); begin FWert := Value; if Assigned(FonChange) then FOnChange(Self); end; function tMyClass.GetWert:integer; begin result := FWert; end; ... aClass := tMyClass.Create; aClass.OnChange := WertAenderung; aList.Add(aClass); ... procedure tMyForm.WertAenderung(Sender:tObject); begin showmessage('aha es hat sich was geändert'); end; P.S. Jetzt kommen gleich wieder die Einwände eine TOjectList zu nehmen, weil man das dann der Liste überlassen kann, aber es geht hier um das Verständnis und nicht um die Eleganz. :D |
Re: Bei TList, Record auf Datenänderung reagieren
Hallo Thomas,
danke erstmal für Deine ausführliche Antwort. Ich werde mir jetzt mal Dein Beispiel zu gemüte führen und ausprobieren. Zitat:
|
Re: Bei TList, Record auf Datenänderung reagieren
Hallo Rolf,
naeher betrachtet geht es in dem Link ja um eine TList, dass Daten fuer ein Grid gespeichert werden ist eigentlich nebensaechlich. Um ueber Aenderungen informiert zu werden, wird fuer TList ein OnChange-Event implementiert. Aber es gibt ja nun schon einige andere Hinweise, die den gleichen / einen aehnlichen Weg aufzeigen. |
Re: Bei TList, Record auf Datenänderung reagieren
Ich habe das ganze jetzt mal umgebaut und ausprobiert nach dem Vorschlag von Thomas. Das mit dem Eintrag der Daten funktioniert so weit. Meine Deklaration sieht jetzt so aus :
Delphi-Quellcode:
Nur kapiere ich das irgendwie mit dem Pointern noch nicht. Wie kann ich jetzt einen Wert aus der Klasse TGesellschaftsname auslesen ? Ich habe das vorher mit dem Record so gemacht :
type
TGesellschaftsname = class private FOnChange : TNotifyEvent; FStammNr : Integer; FGesellschaftername : string; FZeichnungskapital : Double; FZweiteZahlung : TDateTime; FZahlenderBetrag : Double; procedure SetStammNr(Value: Integer); procedure SetGesellschaftername(Value: String); procedure SetZeichnungskapital(Value: Double); procedure SetZweiteZahlung(Value: TDateTime); procedure SetZahlenderBetrag(Value: Double); function GetStammNr:Integer; function GetGesellschaftername:String; function GetZeichnungskapital:Double; function GetZweiteZahlung:TDateTime; function GetZahlenderBetrag:Double; public property StammNr : Integer read GetStammNr write SetStammNr; property Gesellschaftername : string read GetGesellschaftername write SetGesellschaftername; property Zeichnungskapital : Double read GetZeichnungskapital write SetZeichnungskapital; property ZweiteZahlung : TDateTime read GetZweiteZahlung write SetZweiteZahlung; property ZahlenderBetrag : Double read GetZahlenderBetrag write SetZahlenderBetrag; property OnChange : TNotifyEvent read FOnChange write FOnChange; end; var Gesellschafter : TGesellschaftsname; GesellschafterListe : TList;
Delphi-Quellcode:
Nur mit der Klasse bekomme ich jetzt eine EAccessViolation. Wen ich jetzt hinten das Zeichen ^ weglasse passiert garnichts. Genauso mit dieser Zeile :
TGesellschaftsname(GesellschafterListe[LV_Gesellschaftsform.Selected.Index]^).Gesellschaftsname
Delphi-Quellcode:
Was mache ich hier falsch ?
TGesellschaftsname(GesellschafterListe.Items[LV_Gesellschaftsform.Selected.Index]).Gesellschaftername
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:26 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-2025 by Thomas Breitkreuz