![]() |
Re: Bei TList, Record auf Datenänderung reagieren
So sieht mein Versuch aus. Nur leider schaffe ich es nicht,
Delphi-Quellcode:
Das ChangeEvent wird nicht ausgeführt, wenn ich einen Wert ändere. Wenn ich NewRecord ausführe, dann wird das Change-Event ausgeführt, aber in Obj stehen keine Werte aus der Klasse. Kann mir da jemand bitte weiterhelfen, denn ich weiß nichtmehr weiter.
TGesellschafterChangeEvent = procedure(Sender: TObject; Obj: TGesellschaftsname) of object;
TGesellschafterObjListe = class(TObjectList) private FOnChange : TGesellschafterChangeEvent; protected function getItem(Index: Integer): TGesellschaftsname; virtual; procedure setItem(Index: Integer; Objekt: TGesellschaftsname); virtual; public function Add(Objekt: TGesellschaftsname): Integer; virtual; function NewRecord(Objekt: TGesellschaftsname): Integer; virtual; function Remove(Objekt: TGesellschaftsname): Integer; virtual; function IndexOf(Objekt: TGesellschaftsname): Integer; virtual; procedure Insert(Index: Integer; Objekt: TGesellschaftsname); virtual; property Items[index: Integer]: TGesellschaftsname read getItem write setItem; default; property OnChange: TGesellschafterChangeEvent read FOnChange write FOnChange; end; {...} procedure TMainForm.GesellschafterListeChange(Sender: TObject; Obj: TGesellschaftsname); begin with DM_Main.UniQuery_Temp do begin SQL.Text := 'EXECUTE PROCEDURE SP_NEW_GESELLSCHAFTER (:stammnr, :name, :B1, :B2, :D2);'; ParamByName('StammNr').AsInteger := Obj.StammNr; ParamByName('Name').AsString := Obj.Gesellschaftername; ParamByName('B1').AsFloat := Obj.Zeichnungskapital; ParamByName('B2').AsFloat := Obj.ZahlenderBetrag; ParamByName('D2').AsDateTime := Obj.ZweiteZahlung; Execute; end; end; {...} function TGesellschafterObjListe.Add(Objekt: TGesellschaftsname): Integer; begin Result := inherited Add(Objekt); end; function TGesellschafterObjListe.getItem(Index: Integer): TGesellschaftsname; begin Result := TGesellschaftsname(inherited Items[Index]); end; function TGesellschafterObjListe.IndexOf(Objekt: TGesellschaftsname): Integer; begin Result := inherited IndexOf(Objekt); end; procedure TGesellschafterObjListe.Insert(Index: Integer; Objekt: TGesellschaftsname); begin inherited Insert(Index, Objekt); end; function TGesellschafterObjListe.NewRecord(Objekt: TGesellschaftsname): Integer; begin Result := inherited Add(Objekt); if Assigned(FOnChange) then FOnChange(Self, Objekt); end; function TGesellschafterObjListe.Remove(Objekt: TGesellschaftsname): Integer; begin Result := inherited Remove(Objekt); end; procedure TGesellschafterObjListe.setItem(Index: Integer; Objekt: TGesellschaftsname); begin inherited Items[Index] := Objekt; if Assigned(FOnChange) then FOnChange(Self, Objekt); end; |
Re: Bei TList, Record auf Datenänderung reagieren
Wozu ist denn alles als virtual deklariert?
Bringt zu diesem Zeitpunkt eh nix mehr. Wird auch überall TGesellschafterObjListe verwendet und nicht TObjectList/TList? TList kennt deine Änderungen ja nicht. Ich würde eher Notify über schreiben und dort das OnChange-Event auslösen, da kommen alle Meldungen (hinzugefügt/gelöscht) vorbei.
Delphi-Quellcode:
protected
procedure Notify(Ptr: Pointer; Action: TListNotification); override; |
Re: Bei TList, Record auf Datenänderung reagieren
Zitat:
ich kann Dir leider nicht ganz folgen mit dem Notify. Kannst Du mir das bitte mal an einem praktischen Beispiel erklären ? |
Re: Bei TList, Record auf Datenänderung reagieren
TObjectList nutzt dieses z.B. um Objekte freizugeben
Delphi-Quellcode:
du überschreibst es und macht z.B. sowas
procedure TObjectList.Notify(Ptr: Pointer; Action: TListNotification);
begin if OwnsObjects then if Action = lnDeleted then TObject(Ptr).Free; inherited; end;
Delphi-Quellcode:
PS: OnChange reagiert so nur auf Änderungen der Liste,
procedure TGesellschafterObjListe.Notify(Ptr: Pointer; Action: TListNotification);
begin if (Action = lnAddted) and Assigned(FOnChange) then FOnChange(Self, TGesellschaftsname(Ptr)); inherited; end; wenn auch z.B. auf Änderungen/Zuweisungen in/an .Zeichnungskapital reagert werden soll, dann muß dieses in TGesellschaftsname abgefangen und an die TGesellschafterObjListe weitergereicht werden. |
Re: Bei TList, Record auf Datenänderung reagieren
Zitat:
Zitat:
|
Re: Bei TList, Record auf Datenänderung reagieren
Zitat:
Delphi-Quellcode:
if Assigned(FList) then
FList.DoChange(Self);
Delphi-Quellcode:
procedure TGesellschafterObjListe.DoChange(Sender: TGesellschaftsname);
begin if Assigned(FOnChange) then FOnChange(Self, Sender); end; procedure TGesellschafterObjListe.Notify(Ptr: Pointer; Action: TListNotification); begin if Action = lnAddted then DoChange(TGesellschaftsname(Ptr)); inherited; end; |
Re: Bei TList, Record auf Datenänderung reagieren
Ich habe doch nochmal eine Frage zu Notify. Ich habe die Procedure genau so geschrieben wie Du in Deinem Beitrag. Wenn ich jetzt in dem ChangeEvent die Werte mitprotokollieren, sind alle Werte aus der Klasse leer. Entferne ich die Abfrage auf die Action, dann bekomme ich in dem Protokoll erst die leeren Werte angezeigt und danach dann die Werte die ich eingefügt habe in umgekehrter Reihenfolge. Also den letzten zuerst u.s.w. Kann man das noch irgendwie bereinigen ?
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:22 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