Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Record Properties (https://www.delphipraxis.net/183993-record-properties.html)

FAM 18. Feb 2015 12:56

Delphi-Version: 5

Record Properties
 
Hallo Zusammen,

ich habe einen eigenen Datentypen über record definiert.

Delphi-Quellcode:
  TRedundancyLivedataResult = record
  private
    FAppTime: String;
    FOpcTime: string;
    procedure SetRedundanyLivedataAppTime(const Value: String);
    procedure SetRedundanyLivedataOpcTime(const Value: String);
  public
    property AppTime: String read FAppTime write SetRedundanyLivedataAppTime;
    property OpcTime: string read FOpcTime write SetRedundanyLivedataOpcTime;
  end;
diesen Benutze ich in einer Klasse

Delphi-Quellcode:
 TViewModel = class(TModel)
  private
...

    FConsoleHandler: TConsoleHandler;

    FRedundancyLivedata: TRedundancyLivedataResult;

    property RedundanyLivedata: TRedundancyLivedataResult
      read FRedundancyLivedata write SetRedundancyLivedata;
...

procedure TViewModel.SetRedundancyLivedata(const Value
  : TRedundancyLivedataResult);
begin
FRedundancyLivedata := Value;
end;

...
Im Haupt-Programm
Delphi-Quellcode:
// Daten ins Model schreiben
FViewModel.RedundanyLivedata.AppTime := Result.AppTime;
dann wird intern das ausgeführt, mein Problem ist wie komme ich aus den Record-Setter
Delphi-Quellcode:
TRedundancyLivedataResult.SetRedundanyLivedataAppTime
zurück zur "Parent-Klasse"
Delphi-Quellcode:
TViewModel
um auf dessen Member-Vars zurückzugreifen (z.B. FConsoleHandler)



Delphi-Quellcode:
procedure TRedundancyLivedataResult.SetRedundanyLivedataAppTime
  (const Value: String);
begin

  // Nur wenn sich die Daten geändert haben
  if (FAppTime <> Value) then
  begin
    // Neue Daten speichern
    FAppTime := Value;


// An dieser Stelle möchte gerne auf Members aus der Klasse (TViewModel) zugreifen
// TViewModel.FConsoleHandler <- geht logischerweise nicht


  end;
end;

Sir Rufo 18. Feb 2015 13:04

AW: Record Properties
 
Wenn du deine Delphi-Version nicht im Profil angegeben hast, dann setze doch bitte in den Threads die Version richtig. Delphi 5 ist ja wohl nicht richtig.

Oder meinst du, wir führen hier jeder einzeln für alle Mitglieder (die es nicht schaffen ihre Version korrekt zu kommunizieren) ein Versions-Verzeichnis auf das wir dann zurückgreifen können. :roll:
(Ich definitiv nicht)

Kann doch nicht so schwer sein ...

FAM 18. Feb 2015 13:07

AW: Record Properties
 
Ok, sorry gemacht.

Delphi XE Enterprise

himitsu 18. Feb 2015 13:15

AW: Record Properties
 
Und nein, du kannst das gleich ganz vergessen.

Dein Record kommt aus einem Property (Getter) und ist somit nur eine Kopie, also selbst wenn du über die Property im Record die Schreibschutzprüfung "umgehst", bringt das nichts, da diese Änderungen niemals zurückgespeichert werden.

Einzige Lösungen:
  • Kein Record, sondern eine Klasse.
  • Der Getter muß in dem Record einen "versteckten" Zeiger auf die Originaldaten (das Feld) enthalten, aber besser doch ein Callback-Zeiger für eine Funktion in TViewModel, welche die Änderung in ihr Feld schreibt.

Bjoerk 18. Feb 2015 13:22

AW: Record Properties
 
Zitat:

Zitat von FAM (Beitrag 1290357)
Delphi-Quellcode:
// Daten ins Model schreiben
FViewModel.RedundanyLivedata.AppTime := Result.AppTime;

Das zum Beispiel verschwindet schon mal im Nirwana. :wink:

FAM 18. Feb 2015 13:38

AW: Record Properties
 
danke für den hinweis

mache es jetzt ansatzweise so...

Delphi-Quellcode:

  TViewModel = class(TModel)

  private type

    TRedundancyLivedataResult = class
    private
      FConsoleHandler: TConsoleHandler;
      FAppTime: String;
      FOpcTime: string;
      procedure SetRedundanyLivedataAppTime(const Value: String);
      procedure SetRedundanyLivedataOpcTime(const Value: String);
    public
      property AppTime: String read FAppTime write SetRedundanyLivedataAppTime;
      property OpcTime: string read FOpcTime write SetRedundanyLivedataOpcTime;
    end;

  private

    FRedundancyLivedata: TRedundancyLivedataResult;

  // constructor TViewModel.Create;
constructor TViewModel.Create(const EventHandler: TEventHandler;
  const ConsoleHandler: TConsoleHandler);
begin
  inherited Create;

// hier könnte ich jetzt die Membervars mitübegeber?  z.b. TRedundancyLivedataResult.Create(EventHandler)

  FRedundancyLivedata := TRedundancyLivedataResult.Create;

// die könnte ich dann hier verwenden, richtig?

procedure TViewModel.TRedundancyLivedataResult.SetRedundancyLivedataAppTime
  (const Value: String);
So funktioniert es:

Delphi-Quellcode:
 



  TViewModel = class(TModel)

    FRedundancyLivedata: TRedundancyLivedataResult; // (see @TRedundancyLivedataResult = class)
...
    property RedundanyLivedata: TRedundancyLivedataResult
      read FRedundancyLivedata write FRedundancyLivedata;
...

implementation

  // constructor TViewModel.Create;
constructor TViewModel.Create(const EventHandler: TEventHandler;
  const ConsoleHandler: TConsoleHandler);
begin
...

FRedundancyLivedata := TRedundancyLivedataResult.Create(self);

...
end;

{ TViewModel.TRedundancyLivedataResultTest }

constructor TViewModel.TRedundancyLivedataResult.Create
  (const parent: TViewModel);
begin
  FParentModel := parent;
end;

procedure TViewModel.TRedundancyLivedataResult.SetRedundancyLivedataAppTime
  (const Value: String);
begin
FParentModel.FooBar := 1; // Membervarriable aus der Hauptklasse
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:00 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