Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi prozeduren in seperate unit auslagern (wie?) (https://www.delphipraxis.net/13480-prozeduren-seperate-unit-auslagern-wie.html)

Praktikant 19. Dez 2003 11:43


prozeduren in seperate unit auslagern (wie?)
 
Mein Hauptformular ist inzwischen sehr unübersichtlich geworden, weshalb ich dachte ich lagere functionen aus.

Habe eine unit 'Anmeldung' erzeugt und da meine prozeduren reinverschoben.
Bei uses dannn noch im Hauptmenu mein Anmeldung eingetragen und in der unit anmeldung mein uses Hauptform = Hauptmenu.

Sieht dann so aus:
Delphi-Quellcode:
unit Anmeldung;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Menus, StdCtrls, ExtCtrls, DBTables, Db, Grids, DBGrids;

  type
  TAnmeldung = class(TForm)      //darf man das so als TForm schreiben?!
    procedure Benutzerlogout;
    procedure ButtonLogin;
    procedure ButtonKWabbrechen;
  end;
implementation

uses Hauptmenu, UnitAuditTrail;
Aber wie kann ich nun von meinem Hauptformular (Hauptmenu) auf die prozeduren in der Unit Anmeldung zugreifen??

Bringt immer ne Syntax Fehlermeldung wenn ich dann auf ne Prozedur zugreifen will.

Smokey 19. Dez 2003 12:00

Re: prozeduren in seperate unit auslagern (wie?)
 
huhu!

Hat denn deine Unit Anmeldung auch Komponenten?
Oder sind da nur reine Funktionen drin?

Wenn es nur ne reine Codesammlung ohne Komponenten ist, mach am besten keine TForm draus, sondern ne stinknormale Unit.

Wenn du dann im "Hauptform" die separate Unit nur im Implementationsteil brauchst, reicht dein Verweis auf die neue Unit im USES-Teil unterhalb Implementation.

Benutzen allerdings Funktionen deines Hauptformulars Datentypen oder sonst was aus der Unit, musst du sie im Oberen Teil der Unit angeben.

Dann einmal die Separate Unit abspeichern und du kannst auf die Funktionen zugreifen ohne Probleme.

Hat die neue Unit Komponenten und muss also als TFORM deklariert sein, dann musst du logischerweise
ein create gemacht haben und kannst auf die funktionen über den variablennamen der Form Anmeldung zugreifen (zB. frm_Anmeldung.meinefunktion)

Phoenix 19. Dez 2003 12:05

Re: prozeduren in seperate unit auslagern (wie?)
 
Das war der falsche Ansatz. Du kannst die Methoden zu einer Klasse (in dem Moment gehören ja z.B. alle Methoden deines Menus dennuch zum Form) nicht in eine andere Unit auslagern.

Du musst z.B. nur den Implementation - Teil Deiner Unit in eine eigene Datei auslagern (z.B. mainmenu.pas) und diesen dann unter implementation anstelle des uses - Teil mit {$I mainmenu.pas} einbinden.

Dann klappt das auch.

Hier mal ein Beispiel:
Unit1.pas:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    procedure CheckBox1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
{$I TForm1.pas} // <-- hier der include

end.
TForm1.pas:
Delphi-Quellcode:
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
   //do nothing
end;

Praktikant 19. Dez 2003 12:09

Re: prozeduren in seperate unit auslagern (wie?)
 
del *.*

da war jmd. schneller.
Ok, danke - werde mal probieren ob ich es hinbekomme :stupid:

@phoenix: danke, Nachbar (Rav rulez 8) )

Hmm, also habe jetzt so mein Hauptform ergänzt.
Nun bringt er aber die Fhelermeldung, dass er eine Deklaration erwartet aber uses findet (in der ausgelagerten pas).

Praktikant 22. Dez 2003 07:35

Re: prozeduren in seperate unit auslagern (wie?)
 
Moin,
also hab noch immer dasselbe Prob, dass ich die prozeduren nicht zum laufen bekomme, wenn ich diese ausgelagert und mit {x.pas} einbinde.
Kommt immer die Fehlermeldung, dass er eine Deklaration erwartet aber uses findet (in der ausgelagerten pas).

Muss diese anders aufgebaut sein, bzw. darf ich diese pas als unit erstellen?

scp 22. Dez 2003 07:44

Re: prozeduren in seperate unit auslagern (wie?)
 
Nein, du darfst diese .pas nicht als unit erstellen. Am Anfang muss die .pas komplett leer sein und dann brauchst du nur deine gewünschten proceduren dort einfügen.

Also ohne unit, uses, interface, implementation usw.

Praktikant 22. Dez 2003 08:01

Re: prozeduren in seperate unit auslagern (wie?)
 
ok, habe jetzt ein textfile erstellt und da meine prozeduren eingefügt. Dann als anmeldung.pas (unit) gespeichert. Aber ich schätze jetzt bin ich wieder gleich weit?!

Also wie genau jetzt :?

scp 22. Dez 2003 08:11

Re: prozeduren in seperate unit auslagern (wie?)
 
Jetzt kannst du die .pas ganz normal mit Delphi öffnen und deine prozeduren einfügen. Dann musst du nur noch
Delphi-Quellcode:
{$I Anmeldung.pas}
wie oben im Beispiel in die "alte" Unit eintragen.

fenni 22. Dez 2003 08:16

Re: prozeduren in seperate unit auslagern (wie?)
 
Hallo Praktikant,

deine anmeldung.pas ist ja keine Unit, sondern "nur" eine Datei, die Quelltext enthält. Dieser wird mit

Delphi-Quellcode:
{$I Anmeldung.pas}
eingebunden. Eine richtige Unit hat ein interface und wird auch als solche im Projekt eingefügt (mit uses).

MfG
fenni

Praktikant 22. Dez 2003 08:46

Re: prozeduren in seperate unit auslagern (wie?)
 
Das {$I Anmeldung\Anmeldung.pas} hatte ich bereits gemacht, aber ich habe wieder die Fehlermeldung (beim compilen), dass eine unit erwartet aber procedure gefunden wurde.

roderich 22. Dez 2003 09:09

Re: prozeduren in seperate unit auslagern (wie?)
 
einen implementation-Teil zu includen finde ich haarsträubend.
würde lieber drüber nachdenken, wie man den Source sauber aufteilen könnte in Unterprozeduren bzw. Unterklassen.

btw. wenn du es unbedingt machen willst, dann verwende als Extension für die Include-Datei .inc statt .pas, dann sollte es gehen. Würde ich aber wie gesagt sowieso nie machen...

Roderich

Praktikant 22. Dez 2003 09:45

Re: prozeduren in seperate unit auslagern (wie?)
 
nö, geht nicht :(

scp 22. Dez 2003 10:06

Re: prozeduren in seperate unit auslagern (wie?)
 
Du haste wahrscheinlich noch einen Eintrag in der dpr stehen, der muss weg. Gucke mal unter Ansicht -> Units dann den Namen des Projekts (der dpr) wählen und auf OK licken.

Die Zeile
Delphi-Quellcode:
Anmeldung in 'Anmeldung.pas'
muss weg.

choose 22. Dez 2003 10:20

Re: prozeduren in seperate unit auslagern (wie?)
 
Zitat:

Zitat von Praktikant
nö, geht nicht :(

Hallo Praktikant,

ich möchte mich der Meinung von Roderich anschließen: Übersichtlichkeit von Programmstrukturen lässt sich auch in Programmiersprachen erreichen, die ohne einen Präprozessor auskommen. Wenn der Code Deines Programms zu unübersichtlich ist, deutet dies auf einen unbedachten Entwurf hin. Du solltest deshalb in Erwägung ziehen, den Code zu refaktorieren und einen modularisierten Entwurf anstreben. Auf diese Weise kannst Du auch weiterhin die vielen Vorteile der Delphi-IDE verwenden (zB <Strg>+<Klick> oder <Strg>+<Shift>+<CurUp> oder den Explorer), ohne dass die IDE ihren Dienst verweigert, weil sie nicht in mit den Includefiles arbeitet...

Praktikant 22. Dez 2003 10:32

Re: prozeduren in seperate unit auslagern (wie?)
 
Zitat:

Zitat von scp
Du haste wahrscheinlich noch einen Eintrag in der dpr stehen, der muss weg. Gucke mal unter Ansicht -> Units dann den Namen des Projekts (der dpr) wählen und auf OK licken.

Die Zeile
Delphi-Quellcode:
Anmeldung in 'Anmeldung.pas'
muss weg.

Genau das war's! danke, jetzt geht's endlich :-D


@choose und roderich:
Schlicht gesagt bin ich da einfach noch etwas überfordert, habe im September angefangen Delphi zu programmieren, im Rahmen meines Praktikums. Naja, und ich bin mir sicher, dass mein Programm sicherlich viel strukturierter und programmtechnisch besser sein könnte oder gar sollte.
Aber wenn ich da lese "Du solltest deshalb in Erwägung ziehen, den Code zu refaktorieren und einen modularisierten Entwurf anstreben" verstehe ich nur noch Bahnhof :stupid:

Deswegen lasse ich es nun einfach mal so wie es funktioniert.

Es ist ja nicht so dass es richtig unübersichtlich ist, nur eben viele Zeilen weswegen ich dachte ich lagere das ein wenig aus.


Trotzdem danke :hi:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz