Einzelnen Beitrag anzeigen

Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#3

AW: Auf Änderungen in einer TObjectList<T> reagieren

  Alt 19. Jun 2011, 13:21
1.) Ist das soweit schon mal richtig oder gibt es da noch Verbesserungen ? Wenn ja, was kann man im allgemeinen verbessern und auch in Bezug auf mehrere TObjectList<TKlassenname>.Create's ?
Du solltest einen neuen Typ TZahlungsartList = TObjectList<TZahlungsart>; deklarieren.
In wie weit soll mir das helfen ?

2.) Wie realisiere ich es, dass das OnChange-Event bei neuen Datensätzen ausgelöst wird ?
Überschreibe in TZahlungsartList die Methode Notify, dann kannst du auf die verschiedenen Ereignisse reagieren. Das gilt übrigens auch für den nicht-generischen Ansatz.
Das heißt also ich kann die TObjectList<TZahlungsart> genauso behandeln wie eine nicht generische ObjectList ?

3.) In meiner alten Konstelation hatte ich noch eine extra Procedure für das Löschen eines Datensatzes, wie mache ich das hier in diesem Beispiel ?
Wie hast du es bisher gemacht?
Ich habe das bis jetzt folgendermaßen gemacht :
Delphi-Quellcode:
  TZahlungsartObjListe = class(TObjectList)
  private
    FOnChange : TZahlungsartListeAddEvent;
    FModifyAction : TModifyActionList;
    FNewRecord : Boolean;
    procedure DeleteRecord(Klasse: TZahlungsart);
  protected
    function getItem(Index: Integer): TZahlungsart; virtual;
    procedure setItem(Index: Integer; Objekt: TZahlungsart); virtual;
    procedure Notify(Ptr: Pointer; Action: TListNotification); override;
  public
    function Add(Objekt: TZahlungsart): Integer; virtual;
    function NewRecord(Objekt: TZahlungsart): Integer; virtual;
    function Remove(Objekt: TZahlungsart): Integer; virtual;
    function IndexOf(Objekt: TZahlungsart): Integer; virtual;
    procedure Insert(Index: Integer; Objekt: TZahlungsart); virtual;
    property Items[index: Integer]: TZahlungsart read getItem write setItem; default;
    property ModifyAction : TModifyActionList read FModifyAction write FModifyAction;
    property OnChange: TZahlungsartListeAddEvent read FOnChange write FOnChange;
  end;

{ TZahlungsartObjListe }

function TZahlungsartObjListe.Add(Objekt: TZahlungsart): Integer;
begin
  FNewRecord := False;
  Result := inherited Add(Objekt);
end;

procedure TZahlungsartObjListe.DeleteRecord(Klasse: TZahlungsart);
begin
  with DM_Main.UniQuery_Zahlungsart do
  begin
    SQL.Text := 'DELETE FROM Zahlungsarten WHERE ID = :ID AND Zahlungsart = :Zahlungsart;';
    ParamByName('ID').AsInteger := Klasse.FID;
    ParamByName('Zahlungsart').AsString := Klasse.FZahlungsart;
    Execute;
  end;
end;

function TZahlungsartObjListe.getItem(Index: Integer): TZahlungsart;
begin
  Result := TZahlungsart(inherited Items[Index]);
end;

function TZahlungsartObjListe.IndexOf(Objekt: TZahlungsart): Integer;
begin
  Result := inherited IndexOf(Objekt);
end;

procedure TZahlungsartObjListe.Insert(Index: Integer;
  Objekt: TZahlungsart);
begin
  inherited Insert(Index, Objekt);
end;

function TZahlungsartObjListe.NewRecord(Objekt: TZahlungsart): Integer;
begin
  FNewRecord := True;
  Result := inherited Add(Objekt);
end;

procedure TZahlungsartObjListe.Notify(Ptr: Pointer; Action: TListNotification);
begin
  if (Assigned(FOnChange)) and (FNewRecord) and (Action <> lnDeleted) then
  begin
    FNewRecord := False;
    FOnChange(Self, TZahlungsart(Ptr));
  end;
  if (FModifyAction = lnDelete) then
  begin
    DeleteRecord(TZahlungsart(Ptr));
  end;
  inherited Notify(Ptr, Action);
end;

function TZahlungsartObjListe.Remove(Objekt: TZahlungsart): Integer;
begin
  Result := inherited Remove(Objekt);
end;

procedure TZahlungsartObjListe.setItem(Index: Integer;
  Objekt: TZahlungsart);
begin
  inherited Items[Index] := Objekt;
end;
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat