Siehe auch in der Onlinehilfe unter: Delphi-Hilfe Inhalt Object-Pascalreferenz Datentypen... Strukturierte Typen Record-TypenIn der folgenden unit wird gezeigt, wie mit dem durch einen Record definierten Typ Tperson Variabeln deklariert und verwendet werden. Zum Beispiel:
nachbar.name := 'Maier'; //string nachbar.vorname := 'Hans'; //string nachbar.Geburtsjahr := 1982; //integer oder kürzer with nachbar do Begin name := 'Maier'; vorname := 'Hans'; Geburtsjahr := '1982' End;Diese Konstruktion gilt auch für die später zu behandelnden Klassen.
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end;
type Tperson = record name: string; vorname: string; Geburtsjahr: integer; End; |
//Neu! //Ein record mit 3 Feldern |
var Form1: TForm1; implementation {$R *.DFM} procedure Showperson(person: Tperson); begin showmessage(person.name+ ',' + person.vorname + ' ' + IntToStr(person.geburtsjahr)); end; function liesperson:Tperson; begin result.name := form1.edit1.Text; result.vorname := form1.edit2.Text; result.Geburtsjahr := StrToInt(form1.edit3.text); end; procedure schreibperson(person:Tperson); begin form1.Memo1.lines.add(person.name); form1.Memo1.lines.add(person.vorname); form1.Memo1.lines.add(intToStr(person.Geburtsjahr)); end; procedure TForm1.Button1Click(Sender: TObject); var person: TPerson; begin person := liesperson; showperson(person); schreibperson(Person); end; end.Die folgenden Funktionen verwenden with und tun genau dasselbe wie oben:
procedure Showperson(person: Tperson); begin with person do showmessage(name+ ',' + vorname + ' ' + IntToStr(geburtsjahr)); end; function liesperson:Tperson; begin with result do Begin name := form1.edit1.Text; vorname := form1.edit2.Text; Geburtsjahr := StrToInt(form1.edit3.text); End; end; procedure schreibperson(person:Tperson); begin with form1.memo1.lines do Begin add(person.name); add(person.vorname); add(intToStr(person.Geburtsjahr)); End; end;
-» In der Vektorrechnung ergibt sich für die Gerade (x Ortsvektor) -» 2 0 -» 2 g: x = (-1) + t·(1) für t = 4 x =( 3) 5 4 21Dies wird in einem Programm (siehe Anhang am Ende der Aufgabe) algorithmisch mit Hilfe des Typs "Tvektor" berechnet. Das Programm ist noch verbesserungswürdig.
a) Schreibe eine Funktion für die Addition von Vektoren. function vektoraddition(a,b:Tvektor):Tvektor; begin //Hier sind ca. 3 Zeilen einzufügen end; b) Schreibe eine Funktion für die S-Multiplikation von Vektoren function SMultiplikation(t:real; a:Tvektor):Tvektor; begin //Hier sind ca. 3 Zeilen einzufügen end; c) Mit den Funktionen von Teil a) und b) läßt sich die Funktion "BerechnePunkt" vereinfachen. Wie sieht die Funktion aus ? function BerechnePunkt(stuetzvektor,Richtungsvektor: Tvektor; t:real):TVektor; begin //Eine Zeile genügt end; d) Die Funktion für die Wertzuweisung wird vorgeben: function vektor(x1,x2,x3:real): Tvektor; begin result.x1 := x1; result.x2 := x2; result.x3 := x3; end;Mit einer Prozedur "Zeige" kann man noch "showmessage(...)" auslagern. Wie lässt sich damit das Hauptprogramm vereinfachen?
procedure TForm1.Button1Click(Sender: TObject); var stuetzvektor,Richtungsvektor,Ortsvektor:Tvektor; t: real; begin //Zwei Zeilen für Zuweisung Stuetzvektor und Richtungsvektor t := 4; Ortsvektor := BerechnePunkt(stuetzvektor,Richtungsvektor,t); Zeige(Ortsvektor); end; ——————————————————————— Anhang Unit1 ——————————————————————— unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; type Tvektor = record x1: real; x2: real; x3: real; End; var Form1: TForm1; implementation {$R *.DFM} function BerechnePunkt(stuetzvektor,Richtungsvektor: Tvektor; t:real):TVektor; begin result.x1 := stuetzvektor.x1 + t*Richtungsvektor.x1; result.x2 := stuetzvektor.x2 + t*Richtungsvektor.x2; result.x3 := stuetzvektor.x3 + t*Richtungsvektor.x3; end; procedure TForm1.Button1Click(Sender: TObject); var stuetzvektor,Richtungsvektor,Ortsvektor:Tvektor; t: real; begin stuetzvektor.x1 := 2; stuetzvektor.x2 := -1; stuetzvektor.x3 := 5; Richtungsvektor.x1 := 0; Richtungsvektor.x2 := 1; Richtungsvektor.x3 := 4; t := 4; Ortsvektor := BerechnePunkt(stuetzvektor,Richtungsvektor,t); Showmessage('Der Vektor hat die Koordinaten x1= ' + FloatToStr(Ortsvektor.x1) + ' x2= ' + FloatToStr(Ortsvektor.x2) + ' x3= ' + FloatToStr(Ortsvektor.x3)); end;Lösung
type TPoint = record X: Integer; Y: Integer; end;Im folgenden Beispiel verwenden wir einen sehr nützlichen Record, um Eigenschaften von Dateien auszulesen.
TSearchRec = record Time: Integer; Size: Integer; Attr: Integer; Name: TFileName; //... end;Im folgenden Beispiel kann man dann alle Dateinamen im Verzeichnis "C:\" mit Zusatzangaben auslesen. (Es genügt Findfirst/Findnext/Findclose/DatetToStr nur oberflächlich zu studieren.)
procedure VerzeichnisEinlesen(dir:string); var SR: TSearchRec; begin if dir[length(dir)]<>'\' then dir:=dir+'\'; with Form1 do begin memo1.lines.Clear; memo1.WordWrap := false; memo1.Font.name := 'Courier New'; if FindFirst(dir+'*.*',faAnyFile,SR)=0 then Begin repeat memo1.lines.add(sr.name+ ' ' + IntToStr(sr.size)+ ' ' + DateToStr(sr.Time)); until FindNext(SR)<>0; FindClose(SR); //Nach jedem findfirst nötig, um sr freizugeben! End; end; end; procedure TForm1.Button1Click(Sender: TObject); //benötigt uses FileCtrl var dir: string; begin VerzeichnisEinlesen('c:\'); {oder mit einer nützlichen Prozedur (mit uses FileCtrl); if SelectDirectory('Ordner wählen, dann OK klicken','',dir) then VerzeichnisEinlesen(dir);} end;