Einzelnen Beitrag anzeigen

Benutzerbild von RWarnecke
RWarnecke

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

Auf Änderungen in einer TObjectList<T> reagieren

  Alt 19. Jun 2011, 10:14
Delphi-Version: 2010
Hallo zusammen,

in diesem Beitrag wurde ich darauf aufmerksam gemacht, warum ich die TObjectList nicht durch eine TObjectList<T> ersetze und mit Generics arbeite. Ich habe mir einige Tutorials durchgelesen und folgendes mal zusammengebaut :
Delphi-Quellcode:
type
  TModifyActionList = (lnNone, lnChange, lnDelete);
  TZahlungsart = class
  private
    FOnChange : TNotifyEvent;
    FModifyAction : TModifyActionList;
    FID : Integer;
    FZahlungsart : string;
    procedure SetID(Value: Integer);
    procedure SetZahlungsart(Value: string);
  public
    property ID : Integer read FID write SetID;
    property Zahlungsart : string read FZahlungsart write SetZahlungsart;
    property ModifyAction : TModifyActionList read FModifyAction write FModifyAction;
    property OnChange : TNotifyEvent read FOnChange write FOnChange;
  end;

var
  ZahlungsartList : TObjectList<TZahlungsart>;
  Zahlungsart: TZahlungsart;
  CounterDB: Integer;

procedure TForm3.Btn_1Click(Sender: TObject);
begin
  CounterDB := 0;
  L_1.Caption := 'Anzahl der Objekte in der Liste :' + IntToStr(ZahlungsartList.Count);
  Edt_1.Text := IntToStr(ZahlungsartList.Items[CounterDB].ID);
  Edt_2.Text := ZahlungsartList.Items[CounterDB].Zahlungsart;
end;

procedure TForm3.Edt_2Exit(Sender: TObject);
begin
  ZahlungsartList.Items[CounterDB].ModifyAction := lnChange;
  ZahlungsartList.Items[CounterDB].Zahlungsart := Edt_2.Text;
  ZahlungsartList.Items[CounterDB].ModifyAction := lnNone;
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
  ZahlungsartList := TObjectList<TZahlungsart>.Create;
  if not UniCon_1.Connected then
    UniCon_1.Connect;
  with UniQuery_1 do
  begin
    SQL.Text := 'SELECT * FROM Zahlungsarten;';
    Open;
    while not Eof do
    begin
      Zahlungsart := TZahlungsart.Create;
      Zahlungsart.OnChange := ZahlungsartChange;
      Zahlungsart.ID := FieldByName('ID').AsInteger;
      Zahlungsart.Zahlungsart := FieldByName('Zahlungsart').AsString;
      ZahlungsartList.Add(Zahlungsart);
      Next;
    end;
    Close;
  end;
end;

procedure TForm3.SBtn_1Click(Sender: TObject);
begin
  CounterDB := CounterDB - 1;
  Edt_1.Text := IntToStr(ZahlungsartList.Items[CounterDB].ID);
  Edt_2.Text := ZahlungsartList.Items[CounterDB].Zahlungsart;
end;

procedure TForm3.SBtn_2Click(Sender: TObject);
begin
  CounterDB := CounterDB + 1;
  Edt_1.Text := IntToStr(ZahlungsartList.Items[CounterDB].ID);
  Edt_2.Text := ZahlungsartList.Items[CounterDB].Zahlungsart;
end;

procedure TForm3.ZahlungsartChange;
begin
  with UniQuery_1 do
  begin
    SQL.Text := 'UPDATE OR INSERT INTO Zahlungsarten (ID, Zahlungsart) VALUES (:ID, :Zahlungsart) MATCHING (ID);';
    ParamByName('ID').AsInteger := ZahlungsartList.Items[CounterDB].ID;
    ParamByName('Zahlungsart').AsString := ZahlungsartList.Items[CounterDB].Zahlungsart;
    Execute;
  end;
end;

{ TZahlungsart }

procedure TZahlungsart.SetID(Value: Integer);
begin
  FID := Value;
  if (Assigned(FOnChange)) and (FModifyAction = lnChange) then
    FOnChange(Self);
end;

procedure TZahlungsart.SetZahlungsart(Value: string);
begin
  FZahlungsart := Value;
  if (Assigned(FOnChange)) and (FModifyAction = lnChange) then
    FOnChange(Self);
end;
Da ich noch am Anfang stehe mit Generics, habe ich noch Fragen :

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 ?
2.) Wie realisiere ich es, dass das OnChange-Event bei neuen Datensätzen ausgelöst wird ?
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 ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat