![]() |
kann man alle wichtigen Funktionen auslagern ?
Hallo Delphifans,
ist es möglich, die verschiedenen, selbstgeschriebenen Funktionen in einer eigenen Datei unterzubringen? Habe schon mal in einem Buch gewälzt, da steht aber nichts drin, ausser das man in Units sowas machen kann, leider kein Beispiel. Gibt es noch eine andere Möglichkeit, seinen Code etwas zu strukturieren. In der Zwischenzeit hat mein Programm (eine Unit) über 3000 Zeilen und ich wollte einige Funktionen und Proceduren auslagern. Leider krieg ich das nicht hin - ohne ein Bombardement von Fehlern. Das Programm funktioniert ja, aber ich bin halt ein bischen ein Perfektionist und da würde ich gerne, die Sache etwas verbessern. Vielleicht hat einer von euch Profis einen guten Tipp für mich. Wäre wirklich sehr dankbar für einen Hinweis oder ein kleines Beispiel. vielen Dank und schöne Grüsse LingNeu |
Re: kann man alle wichtigen Funktionen auslagern ?
Einfach Funktionen in eiegene Unit auslagern und diese dann unter Uses einbinden.
Mit welchen Fehlern wist du bombardiert? |
Re: kann man alle wichtigen Funktionen auslagern ?
Unit ist genau das richtige Stichwort.
Mal ein Beispiel, wie Du die Prozeduren Test1, Test2 und den Typ TTest in eine Unit schreibst (Name der Unit musst Du noch selbst festlegen, heißt hier als Beispiel: NameDeinerUnit):
Delphi-Quellcode:
Diese Unit (Dateiname: NameDeinerUnit.pas) muss dann in das aktuelle Verzeichnis (wo das Projekt ist, in dem du die Unit nutzen willst), oder in das Verzeichnis C:\Programme\Borland\<DelphiVersion>\Lib, falls du diese Unit in Zukunft immer zur Verfügung haben möchtest, für mehrere Projekte.
unit NameDeinerUnit;
interface uses //alle Units die für diese Unit gebraucht werden type TTest = ... ... end; procedure Test1(...); procedure Test2(...); implementation //ggf. kommt hier noch was von TTest hin procedure Test1(...); begin //hier der Code end; procedure Test2(...); begin //hier der Code end; end. Um diese Unit dann in deinem aktuellen Projekt nutzen zu können, musst du sie bei deinem Projekt (dort in der Unit, in der die andere Unit verwendet werden soll) unter uses auflisten, etwa so:
Delphi-Quellcode:
Grüße, Martin
unit Unit1;
interface uses {hier steht schon einiges}, NameDeinerUnit; {...} |
Re: kann man alle wichtigen Funktionen auslagern ?
@mkinzler
Es kommt immer "undefinierter Bezeichner: Dauer"
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Label1: TLabel; Button1: TButton; Label2: TLabel; Label3: TLabel; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation uses unit2; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin //rest label3.Caption := Dauer(now); end;
Delphi-Quellcode:
unit Unit2;
interface function Dauer(ADate: TDateTime): string; implementation function Dauer(ADate: TDateTime): string; //rest end; |
Re: kann man alle wichtigen Funktionen auslagern ?
Hi,
Du die Unit2 hier einschreiben
Delphi-Quellcode:
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Unit2; // <-- Hier |
Re: kann man alle wichtigen Funktionen auslagern ?
@C.Schoch
danke für Deinen Hinweis. Ich habe unter den uses die Unit2 reingesetzt. Jetzt geht die Sache. Kann man noch was machen, weil noch eine Unbekannte Funktion angemahnt wurde. Die war in der Funktion Dauer (DecodeDate) Erst als ich die Zeile Uses mit den Angaben von der Unit1 reingesetzt habe, funktionierte die Sache richtig. Mein Frage wäre, wie kann ich feststellen, welche uses-Eintragung ich brauche, da ich momentan alle von der Unit1 eingefügt habe. Vermutlich ist die DecodeDate in der SysUtils drin. Gibt es keine Möglichkeit auf diese Angaben zu verzichten, damit es trotzdem funktiont, auch wenn nur in der Unit1 die Angaben sind. Jetzt sind sozusagen in beiden Units unter uses die gleichen Eintragungen - ist das richtig ? Besten Dank nochmals
Delphi-Quellcode:
unit Unit2;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; function Dauer(ADate: TDateTime): string; implementation function Dauer(ADate: TDateTime): string; //rest z.B. DecodeDate() end; |
Re: kann man alle wichtigen Funktionen auslagern ?
Du solltest die Unit SysUtils in Dein Unit2 einbinden.
Dann brauchst Du nicht die Unit1 in die Unit2 einbinden. Grüße Klaus |
Re: kann man alle wichtigen Funktionen auslagern ?
Zu der Uses-Klausel in der eigenen Unit noch ein kleiner Tipp: Wenn du wirklich nicht weißt, in welcher Unit die gesuchte Prozedur oder Funktion steht, kannst du einfach alle Units eines Standardprojekts (solange sie in den Standardunits mit Sicherheit enthalten sind, da muss man halt schauen) in deine Unit reinschreiben (uses-Klausel) und dann knall einfach wieder die nicht benötigten Units raus.
|
Re: kann man alle wichtigen Funktionen auslagern ?
Hallo zusammen,
zu diesem Thema habe ich auch noch eine Frage. In meiner Anwendung habe ich ein Formular mit unterschiedlichen Komponenten Edit, Button usw. In Abhängigkeit der Verarbeitung müssen die Komponenten enabeld oder disabled werden. Diese Routinen blähen mein Main ziemlich auf und ich möchte sie in eine eigene unit auslagern, wegen der Übersicht. Wie kann ich in dieser unit die in der Form1 festgelgten Komponenten ansprechen? Also: In der Unit1 von Form1 befindet sich ein Edit1-Feld. In MeinUnit ist die procedure InaktivMachen in der ich Edit1.Enabled := false; setzen möchte. MeinUnit kennt natürlich das Edit1-Feld aus Form1-Unit1 nicht und da liegt mein Problem. Für baldige Hilfe bin ich sehr dankbar. |
Re: kann man alle wichtigen Funktionen auslagern ?
Hi,
du musst lediglich in den uses ein Formular (hier: Form1) einbinden und kannst dann mit
Delphi-Quellcode:
darauf zugreifen.
Form1.Edit.Enabled := true;
|
DP-Maintenance
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Es geht um Delphi. |
Re: kann man alle wichtigen Funktionen auslagern ?
Form1.Edit1 und wenn Du viele Komponenten hast die Enabled werden sollen schau Dir mal FindComponent an vieleicht hilft Dir das.
|
Re: kann man alle wichtigen Funktionen auslagern ?
Eigentlich gehört genau dieser Code (Handling vom Userinterface) auf das Form. Und nur dahin. Und eigentlich auch nur dieser Code. Businesslogik gehört hingegen genau nicht aufs Form. Also würde ich eher diese Auslagern.
|
Re: kann man alle wichtigen Funktionen auslagern ?
Hallo Matze,
ich hatte vergessen zu sagen, daß ich das schon versucht hatte, leider aber die Fehlermeldung bekam, daß die Datei Form1.DCU nicht gefunden werden kann. Auf meinem ganzen PC befindet sich diese geforderte Datei nicht !! Habe ich vielleicht falsche Bibliothekseinstellungen oder Compiler-Options? Gruß Christoph |
Re: kann man alle wichtigen Funktionen auslagern ?
Zitat:
BTW. Die Bezeichnung Form1 ist sehr (un-)sinnig. |
DP-Maintenance
Dieses Thema wurde von "SirThornberry" von "Sonstige Fragen zu Delphi" nach "Object-Pascal / Delphi-Language" verschoben.
|
Re: kann man alle wichtigen Funktionen auslagern ?
Nein Form1.pas ist nicht vorhanden. Beim Speichern habe ich CAF0012 vor die Namen und das Projekt gestellt mein Verzeichnis sieht wie folgt aus:
Datentr„ger in Laufwerk C: hat keine Bezeichnung Seriennummer des Datentr„gers: 0A58-13F7 Verzeichnis von C:\Programme\Borland\Delphi5\Projects\CAF0001 . <DIR> 15.03.07 11:54 . .. <DIR> 15.03.07 11:54 .. CAF000~1 DOF 1.258 20.03.07 10:12 CAF0012Project1.dof CAF000~1 PAS 15.200 20.03.07 12:13 CAF0012Unit1.pas CAF000~1 DFM 5.418 20.03.07 12:42 CAF0012Unit1.dfm CAF000~1 DPR 498 20.03.07 10:12 CAF0012Project1.dpr CAF000~1 CFG 544 20.03.07 10:12 CAF0012Project1.cfg CAF000~1 RES 876 17.03.07 14:00 CAF0012Project1.res CAF000~1 ~PA 15.553 20.03.07 10:13 CAF0012Unit1.~pas CAF000~1 ~DF 5.418 20.03.07 9:32 CAF0012Unit1.~dfm CAF000~2 PAS 492 15.03.07 13:09 CAF0012Unit2.pas CAF000~2 DFM 1.767 15.03.07 13:00 CAF0012Unit2.dfm CAF000~1 ~DP 461 17.03.07 13:09 CAF0012Project1.~dpr CAF000~3 PAS 3.645 20.03.07 12:17 CAF0012Unit3.pas CAF000~3 DFM 3.468 19.03.07 16:17 CAF0012Unit3.dfm CAF000~2 ~PA 3.998 20.03.07 10:30 CAF0012Unit3.~pas CAF000~2 ~DF 3.468 19.03.07 16:17 CAF0012Unit3.~dfm CAF000~4 PAS 1.362 20.03.07 12:20 CAF0012Upro.pas CAF000~3 ~PA 611 20.03.07 10:36 CAF0012Upro.~pas 17 Datei(en) 64.037 Bytes 2 Verzeichnis(se) 8.214,97 MB frei |
Re: kann man alle wichtigen Funktionen auslagern ?
Hallo zusammen, bitte nicht mehr weitersuchen, ich bin ja blö...
Wenn ich selbst den Namen ändere muß ich auch den geänderten Namen für die Form angeben. Vielen Dank für Eure Unterstützung. Christoph |
Re: kann man alle wichtigen Funktionen auslagern ?
Zitat:
Delphi-Quellcode:
DAS hier:
procedure TMeinUnit.InaktivMachen(aEdit: TEdit);
begin aEdit.Enabled := not aEdit.Enabled; //--nur als Beispiel end; //-- Aufruf aus JEDER x-beliebigen Form mit InaktivMachen(Edit1); Zitat:
Anderes Beispiel, wo du Unit-übergreifend (um das mal so zu nennen) MeinUnit einsetzen kannst:
Delphi-Quellcode:
{geht zur nächsten Control, wenn ENTER gedrückt wurde}
{--Aufruf bspw. im EditKeyPress: p_TabOnEnter(Self,Key) ->Self ist autom. die Form auf der sich das Edit befindet} procedure p_TabOnEnter(const AForm: TForm; var AKey: Char); begin if AKey = #13 then if AForm <> nil then begin AForm.Perform(WM_NextDlgCtl, 0, 0); AKey := #0; end; end; |
Re: kann man alle wichtigen Funktionen auslagern ?
Hallo zusammen,
nun hatte ich schon fast gedacht eine gute Routine für die Betätigung der Entertaste zu erhalten. Es ist schon geraume Zeit her, als ich mich mit diesem Thema beschäftigt habe. Mein damaliges Problem war: Immer dann, wenn ich aus einem EditField in das nächste mit 'Enter' wollte gibt es einen System-Beep. Um den Anwender nicht zu verwirren sollte dieser Beep nicht auftreten. Ich habe alles mögliche probiert, doch den Beep konnte ich nicht verhindern. Hat denn da jemand eine Lösung? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz