Einzelnen Beitrag anzeigen

DevLinus

Registriert seit: 25. Apr 2017
26 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Verstehe das Verhalten der Records nicht.

  Alt 6. Dez 2017, 07:31
Hallo zusammen,
geben ist Folgender Quellcode. An der Stelle wo CompareMem aufgerufen wird müssten die Records eigentlich Identisch sein. Die Methode gibt mir aber False zurück. Wenn ich die beiden Records auswerte scheinen alle Records gleich zu sein und KFMKey ist = 'XXX 148060'.

Nach dem ich es ein paar mal Debuggt habe, entschloss ich mich die Daten in eine Datei zu schreiben um zu prüfen ob die Binär gleich sind. Das Ergebniss ist das in der Datei jeweils der erste Wert steht und nicht der Neue. Dann habe ich noch folgende beiden Zeilen hinzugefügt und in der Datei wird es als XXX Test6001 gepseichert.
Code:
  lRec.SampleRecordInside.KfmKey := 'XXX 14806001';
  lRec.SampleRecordInside.KfmKey := 'XXX Test';
Muss ich die Record Felder Fillcharn? Ist dies das normale Verhalten? Wie Säubere ich das Recordfeld?

Code:
 
  TKFMKey = string[16];

  TSampleRecord = record
    Count : byte;
    KfmKey : TKFMKey;
  end;


  TOtherSampleRecord = record
    Count : byte;
    PaIsolatorKey : TKFMKey;
    PtIsolatorKey : TKFMKey;
  end;

  TMyRec = record
    aBoolean : boolean;
    KfmKey : TKFMKey;
    OtherSampleRecord : array[1..5] of TOtherSampleRecord;
    SampleRecordInside : TSampleRecord;
    SampleRecordOutside : TSampleRecord;
    SampleRecordMiddle : TSampleRecord;
    res : array[1..50] of byte;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn2Click(Sender: TObject);
var
  lRec : TMyRec;
  lRec2 : TMyRec;
  lStream : TFileStream;
  lStream2: TFileStream;
begin
  FillChar(lRec, sizeof(TMyRec),0);
  FillChar(lRec2, sizeof(TMyRec),0);
  lRec.KfmKey := 'XXX 14806001';
  lRec2.KfmKey := 'XXX 14806002';
  lRec.KfmKey := 'XXX 148060';
  lRec2.KfmKey := 'XXX 148060';

  if CompareMem(@lRec, @lRec2,SizeOf(TMyRec)) then // Müssten gleich sein sind sie aber nicht
    ShowMessage('Juhu')
  else
    ShowMessage('Fuck');
  lRec.SampleRecordInside.KfmKey := 'XXX 14806001';
  lRec.SampleRecordInside.KfmKey := 'XXX Test';
  ShowMessage(lRec.KfmKey);
  ShowMessage(lRec2.KfmKey);

  // Speichern der Testeinträge
  lStream := TFileStream.Create('C:\temp\test1a.dat',fmCreate);
  lStream.WriteBuffer(lRec,SizeOF(TMyRec));
  lStream.Free;
  lStream2 := TFileStream.Create('C:\temp\test2a.dat',fmCreate);
  lStream2.WriteBuffer(lRec2,SizeOF(TMyRec));
  lStream2.Free;
end;
Gruß,
DevLinus

Geändert von DevLinus ( 6. Dez 2017 um 07:50 Uhr)
  Mit Zitat antworten Zitat