Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Record in for-schleife (https://www.delphipraxis.net/203079-delphi-record-schleife.html)

ig66 10. Jan 2020 14:35

Delphi-Version: 10 Seattle

Delphi Record in for-schleife
 
Hallo,

ich habe folgende Frage, suche bereits schon seit einiger Zeit, bin aber nicht fündig geworden.
Ich möchte ein Rekord z.B. wie folgt:
Type
TtestRecord = record
Test1 = String[10];
Test2 = String[20];
Test3 = String[50];
Test4 = String[50];
Weitere 20…
End;

Ich möchte diese in einem String zusammenführen um sie dann in einer Datenbank abzulegen.
In einer for schleife muss ich jeden einzelnen mit Namen ansprechen z.B.

For i = 0 to High(testRecord) do
Begin
Str := Str + testRecord[i].test1;
Str := Str + testRecord[i].test2;
Usw.
End;
Kann man hier nicht so etwas anwenden?
For i = 0 to High(testRecord) do
begin
For n = 0 to testRecord_Feldanzahl do
Begin
Str := Str + testRecord[i][n];
End;
Str := Str + sLineBreaker;
End;

Fertig?

Neutral General 10. Jan 2020 15:10

AW: Delphi Record in for-schleife
 
Da geht vllt. mit RTTI. System.RTTI -> TRTTIContext

Der schöne Günther 10. Jan 2020 15:16

AW: Delphi Record in for-schleife
 
Ich weiß nicht ob du dir mit deinen Shortstrings wirklich einen Gefallen tust, weil du könntest ja auch einfach ein String-Array nehmen.

Aber falls du das wirklich behalten willst kannst du deinem Record einen Indexer verpassen:

Delphi-Quellcode:
type
   TTestRecord = record
      Test1: String[10];
      Test2: String[20];
      Test3: String[30];

      private function getThings(index: Integer): String;
      public property Things[index: Integer]: String read getThings; default;
   end;

{ TTestRecord }

function TTestRecord.getThings(index: Integer): String;
begin
   case index of
      0:   Result := Test1;
      1:   Result := Test2;
      2:   Result := Test3;
   else
      Result := String.Empty; // oder EArgumentOutOfRangeException werfen
   end;
end;
Dann kann man z.B. sagen

Delphi-Quellcode:
procedure p();
var
   test: TTestRecord;
   index: Integer;
   text: String;
begin
   test.Test1 := 'Hallo';
   test.Test2 := 'Welt';
   test.Test3 := 'Delphi';

   text := String.Empty;
   for index := 0 to Pred(3) do
      text := text + test[index];
   WriteLn(text);

   readln;
end;

Neutral General 10. Jan 2020 15:18

AW: Delphi Record in for-schleife
 
Kurz zusammengebastelt:
Delphi-Quellcode:
uses
  System.RTTI;

type
  TTestRecord = record
    Test1: String[10];
    Test2: String[20];
    Test3: String[50];
    Test4: String[50];
  End;

procedure TForm1.FormCreate(Sender: TObject);
var testRec: TTestRecord;
    rtti: TRttiContext;
    typ: TRttiType;
    field: TRttiField;
    recAsString: AnsiString;
begin
  testRec.Test1 := 'Hallo';
  testRec.Test2 := 'Welt';
  testRec.Test3 := 'und';
  testRec.Test4 := 'so';

  rtti := TRttiContext.Create;
  try
    typ := rtti.GetType(TypeInfo(TTestRecord));

    recAsString:= '';
    for field in typ.GetFields() do
      recAsString := recAsString + PShortString(NativeUInt(@testRec) + NativeUInt(field.Offset))^;

    ShowMessage(String(recAsString));
  finally
    rtti.Free;
  end;
end;
Dafür muss dein Record aber zu 100% aus ShortStrings bestehen.

ig66 10. Jan 2020 15:35

AW: Delphi Record in for-schleife
 
Besten Dank an euch,

Der schöne Günther, da hast du vollkommen recht ich mache es mir nur komplizierter als es ist:) ich folge deinem Rat und benutze einfach ein
String Array.

DenkDirNix 10. Jan 2020 15:47

AW: Delphi Record in for-schleife
 
Da Du mit den guten alten short-strings arbeitest ginge auch folgendes:

Code:
  var s: ansistring;
      size: word;

  size := sizeOf( ttestRecord );
  SetLength( s, size );
  move( testRecord.Test1[0], s[0], size )
Allerdings hast Du das Längenbyte jedes Strings mit drin und die Linebreaks fehlen.

Neutral General 10. Jan 2020 15:51

AW: Delphi Record in for-schleife
 
Teste das mal. Das funktioniert nicht. (Aus mehreren Gründen)

EmWieMichael 10. Jan 2020 16:55

AW: Delphi Record in for-schleife
 
Zu dem Record (als "Packed" definiert) benötigt man eine zweite Struktur zur Definition der Felder des Records, z. B. ein Array, bei dem jedes Element Typ und Länge eines Feldes angibt. Mit den Informationen kann man dann die Position eines Feldes im Record berechnen und die Daten per Move auslesen.
Nutze ich zum Handling mit Datensätzen von Datenbanken.

Neutral General 10. Jan 2020 17:03

AW: Delphi Record in for-schleife
 
Zitat:

Zitat von EmWieMichael (Beitrag 1454887)
Zu dem Record (als "Packed" definiert) benötigt man eine zweite Struktur zur Definition der Felder des Records, z. B. ein Array, bei dem jedes Element Typ und Länge eines Feldes angibt. Mit den Informationen kann man dann die Position eines Feldes im Record berechnen und die Daten per Move auslesen.
Nutze ich zum Handling mit Datensätzen von Datenbanken.

Das, nur in weniger umständlich, mache ich oben in meinem Code per RTTI.

EmWieMichael 11. Jan 2020 07:13

AW: Delphi Record in for-schleife
 
Zitat:

Zitat von Neutral General (Beitrag 1454888)
Das, nur in weniger umständlich, mache ich oben in meinem Code per RTTI.

Das stimmt, für das Problem des TE ist Deine Lösung einfacher. Für meine Anforderungen wäre RTTI vermutlich nicht das Richtige, da ich a) weitere Informationen zu einzelnen Record-Feldern benötige und b) mehr als 40 Record-Typen als typlose Records an zig verschiedene Funktionen übergebe.
Ich muss allerdings zugeben, mich in der vergangenen Viertelstunde das erste Mal mit RTTI 'beschäftigt' zu haben...:oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:59 Uhr.
Seite 1 von 2  1 2      

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