Siehe auch in der Onlinehilfe unter:
Delphi-Hilfe
Inhalt
Object-Pascalreferenz
Datentypen...
Strukturierte Typen
Record-Typen
In 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 21
Dies 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;