Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - codes in unit aufteilen bzw ordnen
noobie123 - Di 12.05.09 12:55
Titel: codes in unit aufteilen bzw ordnen
hallo,
mein nickname ist hier programm ;)
mein project ist mittlerweile über 15 seiten lang und wird langsam ein wenig unübersichtlich.
ich wollte mal fragen ob ich irgendwie mein code strukturieren kann.
also ich habe ca. 10 buttons und 10 groupboxen. in diesen 10 grouboxen kann man sehr viel machen.
und für jeden button in dieser groupbox würde ich gerne eine extra unit verwenden.
hab mir schon einige sachen im netz angeschaut aber nur was mit prozeduren gefunden.
ist für mich nichts, da sich 1. nichts wiederholt und 2. die übergabe von strings mir zu umständlich ist (für eine einmalige ausführung).
also bis jetzt 1 Formular = 1 unit (über 15 seiten)... wie umgeht ihr das?
(extra formulare wollte ich aus optischen gründen nicht.
mfg
BenBE - Di 12.05.09 13:10
Also 15 Seiten und lang??? (vgl. GeSHi sind knapp 5000 LOC; eine Datei, da kommen noch ~150 weitere Dateien mit 30kLOC dazu, das sind aber reine Daten).
Mögliche Lösungen könnten hier durchaus auch Frames sein.
Auch die genannte Verwendung von OOP wäre eine Idee.
Ansonsten gibt es oftmals auch durchaus Programmierkonzepte, bei denen es soweit geht, dass in einem Eventhandler außer ein bis zwei Aufrufen von Funktionen nichts mehr steht (mach ich durchaus öfters). Auch das Zusammenfassen von ähnlichem Code kann viel bringen.
Was ist Dir bei der Übergabe von Strings zu kompliziert?
noobie123 - Di 12.05.09 13:37
hi,
hab mir das mal mit den frames angeschaut.
das ist ja eigentlich mal ne tolle sache.
zwar dachte ich eher an mehrere units für ein formular, aber so ist es auch nicht schlecht.
ich danke euch!
jaenicke - Di 12.05.09 15:28
Das allerwichtigste ist vor allem, dass du die Komponenten alle benennst, das macht es schon einmal übersichtlicher.
Dann gehört in die Unit zu dem Formular nur das was direkt mit der Oberfläche zu tun hat. Alle weiteren Funktionen kann man in weitere Units und ggf. Klassen auslagern und aus den Ereignishandlern des Formulars nur aufrufen.
Dude566 - Di 12.05.09 16:50
Wie kann ich denn z.B. eine Prozedur in eine extra Unit schreiben ohne ein Formular, und dann muss ich natürlich mit der 1. Unit auch auf die Procedure zugreifen können.
jaenicke - Di 12.05.09 17:11
Du erstellst eine neue Unit und bindest diese in die uses-Klausel deines Formulars ein. Danach kannst du alles aus der Unit benutzen, was dort oberhalb von implementation deklariert wurde. Meistens ist es sinnvoll vieles in Objekte statt einzelne Prozeduren zu unterteilen. Ein kleines Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| unit XYZ;
interface
uses SysUtils;
type TTest = class private FContents: Integer; public constructor Create(AValue: String); overload; constructor Create(AValue: Integer); overload; property Contents: String read GetContents; end;
function GetAnswerToLifeUniverseAndEverything: String;
implementation
function GetAnswerToLifeUniverseAndEverything: String; begin Result := '42'; end;
constructor TTest.Create(AValue: String); overload; begin FContents := StrToInt(AValue); end;
constructor TTest.Create(AValue: Integer); overload; begin FContents := AValue; end;
function TTest.GetContents: String; begin Result := IntToStr(FContents); end; |
Und dann kannst du das benutzen in deiner Formularunit:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| unit Main;
interface
uses ..., XYZ;
type TfrmMain = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ButtonXClick(Sender: TObject); private FMyTest: TTest; public end;
implmentation
procedure TfrmMain.FormCreate(Sender: TObject); begin FMyTest := TTest.Create('40'); end;
procedure TfrmMain.FormDestroy(Sender: TObject); begin FMyTest.Free; end;
procedure TfrmMain.ButtonXClick(Sender: TObject); begin ShowMessage(FMyTest.Contents); ShowMessage(GetAnswerToLifeUniverseAndEverything()); end; |
Ich hoffe ich habe mich nicht vertippt, aber das ist ja nur ein Beispiel.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!