AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Kontrolle, ob eine Variable im Record geändert wurde.
Thema durchsuchen
Ansicht
Themen-Optionen

Kontrolle, ob eine Variable im Record geändert wurde.

Ein Thema von bernau · begonnen am 24. Feb 2015 · letzter Beitrag vom 25. Feb 2015
Antwort Antwort
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#1

Kontrolle, ob eine Variable im Record geändert wurde.

  Alt 24. Feb 2015, 12:42
Mal wieder Brainstorming

Gegeben ist ein Record (Beispiel - Kann auch irgend eine andere Datenstruktur sein)

Delphi-Quellcode:
type
  TMeinDatenRecord = record
    Nachname:String;
    Vorname:String;
    Geb:TDatetime;
    IrgendeineNummer:integer;
  end;
Der Datenrecord wird mit Daten gefüllt und somit in einen Ausgangszustand versetzt. Dann soll dieser Record einer Procedure übergeben werden. Dort können einzelne Felder geändert werden.

Wie finde ich nun am bessten (und ohne grossen Aufwand) heraus, welches Feld geändert wurde? Kann natürlich eine Kopie des Records anlegen und diesen dann vergleichen.

Oder sollte ich lieber Objekte verwenden und dort ein ChangeFlag im Setter setzen?

Oder kann ich mir einen Typen deklarieren, den ich wie einen Standardtypen verwenden kann aber erweiterte funktionen hat. In folgender Art:

Delphi-Quellcode:
var
  MyString:TStringExtended;
begin
  MyString.IsNull := true; // Kein Inhalt
  MyString:='Ein Text';
  IstGeaendert := MyString.IsChanged;
end;
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Kontrolle, ob eine Variable im Record geändert wurde.

  Alt 24. Feb 2015, 12:46
Ist eine Lösung für diesen Record in einer Bearbeitungsfunktion gesucht oder ein genereller Ansatz für eine komplette Anwendung.

Diese Unterscheidung ist nicht unwichtig.

Für eine lokale Prüfung würde ich eine Kopie anlegen und vergleichen.
Wenn Du eine Lösung für viele Records/Daten in einem gesamten Projekt suchst, reicht das natürlich nicht.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#3

AW: Kontrolle, ob eine Variable im Record geändert wurde.

  Alt 24. Feb 2015, 12:48
Vier Minuten für die Antwort. Bin immer wieder erstaunt.

Es geht um den Grundsätzlichen Ansatz. Es wird viele verschiedene Recordtypen (bzw. Datenstrukturen) geben.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Kontrolle, ob eine Variable im Record geändert wurde.

  Alt 24. Feb 2015, 12:51
Mach doch einfach keine direkten Variablen sondern Properties. Das Setzen der Property setzt ein "was Changed"-Flag auf True das du abfragen kannst.

Delphi-Quellcode:
program Project22;

{$APPTYPE CONSOLE}

{$R *.res}

uses System.SysUtils;

type
   TMyRecord = record
      strict private var
         FSomeName:   String;
         FIsChanged:   Boolean;
      strict private
         function GetSomeName(): String;
         procedure SetSomeName(const Value: String);

      public
         function isChanged(): Boolean;
         procedure resetChangedFlag();
         property SomeName: String read GetSomeName write SetSomeName;
   end;

{ TMyRecord }

function TMyRecord.GetSomeName(): String;
begin
   Result := FSomeName;
end;

function TMyRecord.isChanged(): Boolean;
begin
   Result := FIsChanged;
end;

procedure TMyRecord.resetChangedFlag();
begin
   FIsChanged := False;
end;

procedure TMyRecord.SetSomeName(const Value: String);
begin
   if Value.Equals(FSomeName) then Exit;
   FIsChanged := true;
   FSomeName := Value;
end;

var
   myRecord: TMyRecord;
begin
  try
   Write('record is changed: '); WriteLn( myRecord.isChanged() );
   myRecord.SomeName := 'Hallo Welt';
   Write('record is changed: '); WriteLn( myRecord.isChanged() );
   myRecord.resetChangedFlag();
   Write('record is changed: '); WriteLn( myRecord.isChanged() );
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  readln;
end.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Kontrolle, ob eine Variable im Record geändert wurde.

  Alt 24. Feb 2015, 12:57
Mit den neueren Delphis bin ich nicht so fit, aber es soll doch da in der Zwischenzeit so etwas wie Record-Methoden geben, dann baust Du Dir einen Setter, der das Edited-Flag setzt und gut ist.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Kontrolle, ob eine Variable im Record geändert wurde.

  Alt 24. Feb 2015, 13:01
Ja, hatte eh keinen Mittagsschlaf gemacht heute.


Dann bist Du mit Klassen auf jeden Fall besser bedient.
Über Getter und Setter kannst Du dann auf die realen gespeicherten Daten gehen.
Auch kannst Du dort auf Änderungen reagieren und Abonnenten über Änderungen informieren (Stichwort: Databinding oder MVVM).
Sind alle Daten die gesamte Projektlaufzeit im Speicher verfügbar oder brauchst Du so etwas wie einen ORM?

Du musst Dir halt genau überlegen, wie Du arbeiten und was Du erreichen willst. Es gibt da mit Sichheit mehrere mögliche Ansätze.

Wer soll denn eigentlich erfahren, dass etwas geändert wurde (sicher die GUI-Controls, oder?) und können das auch mehere Konsumenten sein?
Wenn z.B. Formular1 die Darstellung aktualisiert hat und IsChanged zurück setzt, dann kann Formular2 die Änderung nicht mehr erkennen.

Also da muss man wohl genau wissen, was Du im Detail umsetzen willst.

Vielleicht kannst Du Dir ja bei meinem ssFramework oder bei DSharp schon mal Anregungen holen...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#7

AW: Kontrolle, ob eine Variable im Record geändert wurde.

  Alt 24. Feb 2015, 13:36
Mit den neueren Delphis bin ich nicht so fit, aber es soll doch da in der Zwischenzeit so etwas wie Record-Methoden geben, dann baust Du Dir einen Setter, der das Edited-Flag setzt und gut ist.
Siehe dein Vorredner

Ja, seit Delphi 2006 / Turbo Delphi.
Und das strict kam noch ein bissl später.

http://geheimniswelten.de/sonstiges/delphi-compiler/
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Kontrolle, ob eine Variable im Record geändert wurde.

  Alt 24. Feb 2015, 14:47

schäm!

K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#9

AW: Kontrolle, ob eine Variable im Record geändert wurde.

  Alt 25. Feb 2015, 10:03
Die Antwort vom Schönen Günter ist wohl das Besste für mich.

Ich denke, so werde ich es verwenden.

Delphi-Quellcode:
program DataRecord;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TDataItemString = record
    private
      fValue: string;
      fChanged: boolean;
      fIsNull: Boolean;
      procedure SetValue(const Value: string);
      procedure SetIsNull(const Value: Boolean);
    public
      property Value: string read FValue write SetValue;
      property IsNull: Boolean read FIsNull write SetIsNull;
      function Changed: Boolean;
      procedure ResetChanged;
  end;

  TDataAdresse = record
    nachname: TDataItemString;
    Vorname: TDataItemString;
    Strasse: TDataItemString;
    procedure ResetChanged;
    function RecordChanged: boolean;
  end;

  { TDataItemString }

function TDataItemString.Changed: Boolean;
begin
  Result := fChanged;
end;

procedure TDataItemString.ResetChanged;
begin
  fChanged := False;
end;

procedure TDataItemString.SetIsNull(const Value: Boolean);
begin
  FIsNull := Value;
end;

procedure TDataItemString.SetValue(const Value: string);
begin
  if fIsNull or (not SameStr(Value,fValue)) then
    begin
      FValue := Value;
      fChanged := True;
      fIsNull := False;
    end;
end;

{ TDataAdresse }

function TDataAdresse.RecordChanged: boolean;
begin
  Result :=
    nachname.Changed or
    Vorname.Changed or
    Strasse.Changed;
end;

procedure TDataAdresse.ResetChanged;
begin
  nachname.ResetChanged;
  Vorname.ResetChanged;
  Strasse.ResetChanged;
end;

var
  lataAdresse: TDataAdresse;

begin
  lataAdresse.nachname.Value := 'Meier';
  lataAdresse.Vorname.Value := 'Hans';
  lataAdresse.Strasse.Value := 'Hauptstr';
  lataAdresse.ResetChanged;
  lataAdresse.Vorname.Value := 'Peter';
end.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Antwort Antwort


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 20:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz