Einzelnen Beitrag anzeigen

Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.837 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

Re: Vorteile eines Records gegenüber einer eigenen Klasse?

  Alt 2. Feb 2005, 14:35
Records gab es schon in Turbo Pascal 3.0
Damals war Pascal noch nicht objektorientiert.

Das änderte sich erst mit der Version Turbo Pascal 5.5
Der Unterschied zwischen TP5 und 5.5 waren eigentlich nur eine Hand voll Schlüsselwörter.
Eines davon war "object"

Trotzdem haben Records noch ihre Daseinsberechtigung.
Es gibt viele Dinge die mit einem Record einfach zu erledigen sind.

Aber auch komplexe Aufgeben wie Delphi-Referenz durchsuchenVariante Teile in Records lassen leicht darstellen:
Delphi-Quellcode:
type
  TPerson = record
  FirstName, LastName: string[40];
  BirthDate: TDate;
  case Citizen: Boolean of
    True: (Birthplace: string[40]);
    False: (Country: string[20];
            EntryPort: string[20];
            EntryDate, ExitDate: TDate);
  end;
oder wenn man wissen will, wie z.B. ein Extended intern im Speicher abgelegt ist, kann man das einfach erledigen:
Delphi-Quellcode:
...
type
  myReal = record
             case Boolean of
               True: (Zahl: Extended); // Extended belegt intern 10 Bytes
               False: (Speicher: array[0..9] of Byte);
            end;
...
procedure TForm1.Button1Click(Sender: TObject);
var
  r: myReal;
  i: Integer;
  s: string;
begin
  // Zahl zuweisen
  r.Zahl := 7.5;

  // Speicher, der von Zahl belegt wird hexadezimal ausgeben
  s := '';
  for i := 0 to 9 do
  begin
    s := s + IntToHex(r.Speicher[i], 2) + ' ';
  end;
  Label1.Caption := s;
end;
...
Delphi 7 Hilfe
...Wie bereits erwähnt, erfüllen variante Teile noch eine zweite Aufgabe. Sie können dieselben Daten so behandeln, als würden sie zu unterschiedlichen Typen gehören. Dies gilt auch in den Fällen, in denen der Compiler eine Typumwandlung nicht zulässt. Wenn beispielsweise das erste Feld einer Variante einen 64-Bit-Real-Typ und das erste Feld einer anderen Variante einen 32-Bit-Integer-Wert enthält, können Sie dem Real-Feld einen Wert zuweisen und anschließend die ersten 32 Bits als Integer-Wert verwenden (indem Sie sie beispielsweise an eine Funktion übergeben, die einen Integer-Parameter erwartet).


Records können ja auch Objekte enthalten:
Delphi-Quellcode:
...
type
  TFormRec = record
    MainForm: TForm1;
    ClientForm: TForm1;
    blabla: string;
  end;

var
  FormRec: TFormRec;
...
procedure TForm1.Button3Click(Sender: TObject);
begin
  FormRec.MainForm := TForm1.Create(Application);
  FormRec.ClientForm := TForm1.Create(Application);
  FormRec.MainForm.Color := clRed;
  FormRec.ClientForm.Color := clBlue;
  FormRec.MainForm.Show;
  FormRec.ClientForm.Show
end;
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat