Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Code Splitten


uranop - Di 14.07.09 07:07
Titel: Code Splitten
argh es is früh am morgen und ich habe bestimmt Kaffemangel,
wie immer halt xD

eehm Frage ....

Wenn ich nen Code der fix und fertig ist in z.b. php gebastelt habe dann schneide ich den raus und mach den mit include wieder in das projekt rein.

hier mit delphi tut das ja über units funzen wenn ich den aufbau so verstanden habe.

was ich nun nicht so wirklich raffe, ist...
warum ich nicht einfach nen codeblock nehmen kann, diesesn in block.pas als unit speicher und als uses einbinden kan ...
immer gibts gemecker und gemaule seitens der etw umgebung ...

Gibt mir mal bitte einer nen tritt wo hin und sacht wie das eben für doofe funzt : P


Danke

<< Kaffe machen geht


ene - Di 14.07.09 07:53

Moin,

rehbraun bitte ;) Was du in der Unit brauchst musst du auch per uses einbinden. Schau dir mal das hier [http://www.delphi-treff.de/sprachen/object-pascal/programmaufbau/] und das hier [http://www.epinasoft.com/delphikurs/dkk_units_libs.html] an. Dort wird auch erklärt, worin der Unterschied besteht.


BenBE - Di 14.07.09 08:08

.5OT: Units von Delphi und Includes von PHP sind nicht identisch. Was unter Delphi äquivalent wäre, wäre die Compiler-Direktive {$I}; dann darf die eingebundene Datei aber keine Unit sein.

Beispiel: Bei Aufruf der index.php wäre folgendes:


hello.php
1:
<?= "Hello World!\n"; ?>                    


include
1:
2:
3:
4:
5:
<?php
include "hello.php";
echo "Ich bin hier!\n";
include "hello.php";
?>


in Delphi (in etwa; gibt da in Delphi paar Einschränkungen) zu diesem hier äquivalent:


hello.inc
1:
WriteLn('Hello World!');                    


index.dpr
1:
2:
3:
4:
5:
6:
7:
8:
9:
program index;

{$APPTYPE CONSOLE}

begin
    {$I 'hello.inc'}
    WriteLn('Ich bin hier');
    {$I 'hello.inc'}
end.


(Die Einschränkung liegt bei Delphi darin, dass jede eingebundene Datei einen für sich abgeschlossenen Block bildet und in der übergeordneten Datei keinen Block unterbrechen darf.)

Ein adequates Projekt mit Units wäre:


hello.pas
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
Unit Hello;

interface

procedure SayHello;

implementation

Procedure SayHello;
begin
    WriteLn('Hello World!');
end;

end.


index.dpr
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
program index;

{$APPTYPE CONSOLE}

uses Hello;

begin
    SayHello;
    WriteLn('Ich bin hier');
    SayHello;
end.


uranop - Di 14.07.09 08:13

Allright,

demzufolge muss ich nun also hergehen und die unzähligen labels buttons checkboxen etc aus der main.pas raus kopieren in eine neue. wenn ich das so richtigverstanden habe.

incl natuerlich der im main pas eingebundenen anderen units .

na mal sehen ob das was wird

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.


ene - Di 14.07.09 08:24

Ähm watt? Die Steuerlemente gehören auch in die Unit des Formulars. Wenn du dich in einer anderen Unit darauf beziehen willst, kannst du die Formunit im Uses einbinden und dich dann über den Alias der Klasse drauf beziehen.

Oder du übergibst der Funktion(?) in der neuen Unit die Inhalte als Variable und weißt den Rückgabewert dem entsprechenden Steuerelement zu.


uranop - Di 14.07.09 08:28

naach .. BenBE hat mir das richtige aufgezeigt.

nach dem ich ganz in sich funktionierende Blöcke "outsource" klappt das wunderbar mit mit den include datein.

Danke vielmals das hat geholfen.

....
Und hierdrin sind schoen fein saeuberlich aufgeteilt ca 2200 Zeilen verschwunden
Funktioniert einwandfrei


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
// ######### Rechner Einstellungen
{$I 'pcstuff.inc'}
// ######### Allgemeines
{$I 'allg.inc'}
// ######### Dienste, Registry XR
{$I 'services.inc'}
// ######### Environment
{$I 'environment.inc'}
// ######### SMS
{$I 'sms.inc'}
// ######### RUD 4 ALL
{$I 'rud4all.inc'}


BenBE - Di 14.07.09 10:00

Und das ist genau das, was man in Delphi NICHT tun sollte ;-)

Schreib Dir aus diesen Include-Files am besten UNABHÄNGIGE Units, die die Funktionen unabhängig von irgendwelchen Formularelementen kapseln (Model --> Control --> View) und binde dann diese separaten Units ein. Daher auch in meinem vorigen Post der Hinweis 0.5OT --> Off Topic ;-)


uranop - Di 14.07.09 10:46

ja meister : )

wenn ich dazu komme. ich musste nun erstmal Platz schaffen. die Fleißarbeit muss ich eh daheim machen.
Dazu kommt man hier in der Arbeit nicht.