AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Auf Änderungen in einer TObjectList<T> reagieren
Thema durchsuchen
Ansicht
Themen-Optionen

Auf Änderungen in einer TObjectList<T> reagieren

Ein Thema von RWarnecke · begonnen am 19. Jun 2011 · letzter Beitrag vom 25. Jun 2011
 
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, 11: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:58 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