Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Bei TList, Record auf Datenänderung reagieren (https://www.delphipraxis.net/145234-bei-tlist-record-auf-datenaenderung-reagieren.html)

RWarnecke 27. Dez 2009 10:07


Bei TList, Record auf Datenänderung reagieren
 
Hallo zusammen,

ich habe diesen Teil des Tutorial durchgelesen und auch gleich umgesetzt. Dabei habe ich folgende Deklaration :
Delphi-Quellcode:
type
  PGesellschaftsname = ^TGesellschaftsname;
  TGesellschaftsname = record
    StammNr           : Integer;
    Gesellschaftername : string;
    Zeichnungskapital : Double;
    ZweiteZahlung     : TDateTime;
    ZahlenderBetrag   : Double;
  end;

var
  Gesellschafter     : PGesellschaftsname;
  GesellschafterListe : TList;
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 ?

taaktaak 27. Dez 2009 10:22

Re: Bei TList, Record auf Datenänderung reagieren
 
Moin Moin Rolf,
ich denke, ich habe diese Anforderung auch schon mal gehabt.Hier wurde mir geholfen

RWarnecke 27. Dez 2009 10:29

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.

thkerkmann 27. Dez 2009 10:35

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

RWarnecke 27. Dez 2009 10:37

Re: Bei TList, Record auf Datenänderung reagieren
 
Zitat:

Zitat von thkerkmann
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

Hä und wie macht man das ? Hast Du dazu auch ein Tutorial ? Weil ich habe das bis jetzt noch nicht so bewusst gemacht.

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.

himitsu 27. Dez 2009 10:57

Re: Bei TList, Record auf Datenänderung reagieren
 
Zitat:

Zitat von thkerkmann
wie wär's, wenn Du statt des Records eine Class mit Properties und Gettern und Settern verwendest, und dann ein OnChange Event implementierst ?

Man benötigt erstmal einen Einstiegspunkt, wo man auf eine Änderung reagieren kann.

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.

thkerkmann 27. Dez 2009 11:01

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:
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;
und wenn es zum Aufräumen kommt, nicht vergessen die Objekte der Liste freizugeben. Nur nicht mit FreeMem, sondern mit Free.

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

RWarnecke 27. Dez 2009 11:10

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:

Zitat von thkerkmann
... aber es geht hier um das Verständnis und nicht um die Eleganz. :D

Genau darum geht es.

taaktaak 27. Dez 2009 15:06

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.

RWarnecke 27. Dez 2009 16:00

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:
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;
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 :
Delphi-Quellcode:
TGesellschaftsname(GesellschafterListe[LV_Gesellschaftsform.Selected.Index]^).Gesellschaftsname
Nur mit der Klasse bekomme ich jetzt eine EAccessViolation. Wen ich jetzt hinten das Zeichen ^ weglasse passiert garnichts. Genauso mit dieser Zeile :
Delphi-Quellcode:
TGesellschaftsname(GesellschafterListe.Items[LV_Gesellschaftsform.Selected.Index]).Gesellschaftername
Was mache ich hier falsch ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:26 Uhr.
Seite 1 von 3  1 23      

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