Programmteile auslagern

Hi Leute!

Ich hab eins, zwei mal bei grösseren TP Programmen (Spielen meist) gesehen, dass sie aus meheren .PAS dateien bestehen!
Ich wollte daher mal fragen, ob es möglich ist, Teile eines Programmes, zum BEispiel Procedures in eine zweite datei auszulagern und dann mit einem Befehl im ersten Programm zu laden?!
Also dass ich im Endeffekt:

  1. einen kürzeren Quelltext an sich in der datei erreiche und

  2. auch mit anderen Programmen auf diese Procedures zurückgreifen kann

Es geht mir also nicht darum einfach eine TExtdatei anzeigen zu lassen, sondern halt eine .PAS in eine .PAS einzubinden!
Kann mir da jemand helfen!

Hi Christoph,

Du kannst sogenannte UNITs erzeugen. Hierbei werden Prozeduren in andere Dateien (UNIT) ausgelagert und als Bibliotheken verwendet. Eine UNIT kann mehrere Prozeduren beinhalten.
Die UNIT wird in der USES-Zeile des Hauptprogrammes mit angegeben (wie CRT z.B.)
Danach kannst Du mit den darin enthaltenen Prozeduren arbeiten, als wären es interne Prozeduren.

Die UNITs müssen für sich selber compiliert und in das Gesamtprojekt gelinkt werden.

Die Hilfe von Borland-Pascal dürfte Dir im Großen und Ganzen weiterhelfen. … oder Du meldest Dich bei mir.

Gruß RaRo

Hi RaRo!

danke schonmal für die schnelle HIlfe!

Aber könntest du mir noch sagen, wie und als was für ne sdatei ich die UNIT´s abspeichern muss und mit welchen BEfehlen etc. ich sie dann aufrufr, also wie ich sie bei USES deklarieren muss?!

Danke nochmal im Vorraus


Christoph

Aber könntest du mir noch sagen, wie und als was für ne sdatei
ich die UNIT´s abspeichern muss und mit welchen BEfehlen etc.
ich sie dann aufrufr, also wie ich sie bei USES deklarieren
muss?!

Du musst sie ganz normal als .pas Datei speichern und compilieren. Bei uses musst du glaube ich den Namen verwenden die du bei der Unit-Pas hinter unit angegeben hast benutzen.
z.B.
Unit-Datei: unit beispiel2

HauptDatei: uses beispiel2

Bin mir aber nicht mehr sicher, brauchte das schonb lange nicht mehr.

Mario

Aber könntest du mir noch sagen, wie und als was für ne sdatei
ich die UNIT´s abspeichern muss und mit welchen BEfehlen etc.
ich sie dann aufrufr, also wie ich sie bei USES deklarieren
muss?!

Hallo Christoph,

die Antwort wird jetzt ein wenig länger ausfallen.
UNITs sind als Sourcecode normale „.pas“-Dateien. Wenn Du sie umwandelst (Empfehlung: permanent auf Platte ablegen), entstehen „.tpl“-Dateien.

UNITs sind wie folgt aufgebaut:

UNIT ; {dieser Name muß in der USES des HP auftauchen}

INTERFACE {in diesem Bereich stehen alle Anweisungen, die auch dem rufenden Programm bekannt sein sollen}

USES …; {alle UNITs, die die Routine selber benötigt; das können wiederum eigene Routinen sein}
CONST …;
TYPE …;
VAR …; {diese Dinge, wie gehabt / global verfügbar}
{ab jetzt kommen die Procedure- und Functionköpfe; z.B.}
PROCEDURE WriteChristoph;
bei Arbeit mit Parametern, müssen diese in den Köpfen mit angegeben werden}

IMPLEMANTATION {dieser Bereich ist für das rufende Programm „unsichtbar“, enthält aber alle Statements}
CONST …;
TYPE …;
VAR …; {UNIT-lokale Vereinbarungen}

{ab jetzt kommen die eigentlichen Routinen, bei unserem Bsp}
PROCEDURE WriteChristoph;
BEGIN
WriteLn(‚Hallo Christoph‘);
END;
{im letzten Bereich folgen Anweisungen, die immer zu Beginn der UNIT ausgeführt werden sollen. Falls nicht benötigt, ist END dennoch zwingend}
BEGIN
ClrScr;
END.

==========================
Praxisbeispiel für eine UNIT:

unit dateien;

interface

uses Crt,Dos;

type
STRING100 = STRING[100];
STRING50 = STRING[50];
STRING20 = STRING[20];
STRING4 = STRING[4];

inst = Record
INr : BYTE;
InstitutName : STRING100;
InstitutStr : STRING50;
InstitutOrt : STRING50;
InstitutPlz : LongInt;
InstitutGeschl : STRING4;
InstitutPartner : STRING50;
END;

hof = Record
FNr : BYTE;
FriedhofName : STRING50;
END;

bes = Record
BesuchArt : STRING50;
BesuchPreis : REAL;
END;

muse = Record
MusikPreis : REAL;
END;

rdn = Record
RedeArt : STRING50;
RedePreis : REAL;
END;

rdnSftl = Record
SchriftlichPreis : REAL;
END;

einn = Record
EinnahmeMonat : WORD;
EinnahmeJahr : WORD;
END;

rech = Record
RechnungNummer : LongInt;
InstitutNummer : BYTE;
RedeTag : WORD;
RedeMonat : WORD;
RedeJahr : WORD;
VerstorbenerV : STRING50;
VerstorbenerN : STRING50;
HB : BYTE;
M : CHAR;
ArtRede : BYTE;
Preis : REAL;
RHaken : CHAR;
END;

ann = Record
NummerInstitut : BYTE;
Friedhofnummer : BYTE;
Name : STRING50;
Vorname : STRING50;
AngehoerigerN : STRING50;
AngehoerigerV : STRING50;
Str : STRING50;
Plz : LongInt;
Ort : STRING50;
Telefon : STRING20;
Besuch : BYTE;
BesuchTag : WORD;
BesuchMonat : WORD;
BesuchJahr : WORD;
BesuchStunde : WORD;
BesuchMinute : WORD;
GrabTag : WORD;
GrabMonat : WORD;
GrabJahr : WORD;
GrabStunde : WORD;
GrabMinute : WORD;
Rede : BYTE;
RedeSchriftlich : CHAR;
Music : CHAR;
VHaken : CHAR;
END;
VAR
pfad : STRING;
f0 : FILE OF BYTE;
f1 : FILE OF inst;
f2 : FILE OF hof;
f3 : FILE OF bes;
f4 : FILE OF muse;
f5 : FILE OF rdn;
f6 : FILE OF einn;
f7 : FILE OF rech;
f8 : FILE OF ann;
f9 : FILE OF rdnSftl;
institut : inst;
friedhof : hof;
besuch : bes;
musik : muse;
reden : rdn;
einnahme : einn;
rechnung : rech;
annahme : ann;
schriftl : rdnSftl;

Procedure DateiOeffnen(laufwerk:CHAR);
PROCEDURE abbruch;

Implementation

Procedure DateiOeffnen(laufwerk:CHAR);

begin
pfad := laufwerk + ‚:\REDNER\INSTITUT.DAT‘;
Assign(f1,pfad);
{$I-}
Reset(f1);
{$I+}
IF IOResult 0 THEN
Rewrite(f1);
pfad := laufwerk + ‚:\REDNER\FRIEDHOF.DAT‘;
Assign(f2,pfad);
{$I-}
Reset(f2);
{$I+}
IF IOResult 0 THEN
Rewrite(f2);
pfad := laufwerk + ‚:\REDNER\BESUCH.DAT‘;
Assign(f3,pfad);
{$I-}
Reset(f3);
{$I+}
IF IOResult 0 THEN
Rewrite(f3);
pfad := laufwerk + ‚:\REDNER\MUSIK.DAT‘;
Assign(f4,pfad);
{$I-}
Reset(f4);
{$I+}
IF IOResult 0 THEN
Rewrite(f4);
pfad := laufwerk + ‚:\REDNER\REDE.DAT‘;
Assign(f5,pfad);
{$I-}
Reset(f5);
{$I+}
IF IOResult 0 THEN
Rewrite(f5);
pfad := laufwerk + ‚:\REDNER\EINNAHME.DAT‘;
Assign(f6,pfad);
{$I-}
Reset(f6);
{$I+}
IF IOResult 0 THEN
Rewrite(f6);
pfad := laufwerk + ‚:\REDNER\RECHNUNG.DAT‘;
Assign(f7,pfad);
{$I-}
Reset(f7);
{$I+}
IF IOResult 0 THEN
Rewrite(f7);
pfad := laufwerk + ‚:\REDNER\ANNAHME.DAT‘;
Assign(f8,pfad);
{$I-}
Reset(f8);
{$I+}
IF IOResult 0 THEN
Rewrite(f8);
pfad := laufwerk + ‚:\REDNER\SCHRIFT.DAT‘;
Assign(f9,pfad);
{$I-}
Reset(f9);
{$I+}
IF IOResult 0 THEN
Rewrite(f9);
CLOSE(f1);
CLOSE(f2);
CLOSE(f3);
CLOSE(f4);
CLOSE(f5);
CLOSE(f6);
CLOSE(f7);
CLOSE(f8);
CLOSE(f9);
SetFAttr(f3,HIDDEN);
SetFAttr(f4,HIDDEN);
SetFAttr(f5,HIDDEN);
SetFAttr(f6,HIDDEN);
SetFAttr(f7,HIDDEN);
SetFAttr(f8,HIDDEN);
SetFAttr(f9,HIDDEN);
end;

PROCEDURE abbruch;

VAR
f0 : FILE OF BYTE;
eins : BYTE;

BEGIN
ASSIGN(f0,‚abbruch.dat‘);
{$I-}
RESET(f0);
{$I+}
IF IOResult 0 THEN
Rewrite(f0);
Write(f0,eins);
Close(f0);
END;

end.

==========================
Praxisbeispiel für den Aufruf einer UNIT:

Program Steuerung;

uses Crt, dateien

VAR
taste : CHAR;
i : WORD;

BEGIN
TextBackground(white);
ClrScr;
dateioeffnen(‚c‘); { dateien.tpu }
END.

========================

Uffz, das war jetzt sicher ‚ne ganze Menge und ich hoffe, in der Schnelle sind nicht zuviele Fehler unterlaufen.
Versuch‘ es einfach mal und viel Glück damit.

Gruß RaRo