Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Gemeinsame Uses Klausel in allen Units (https://www.delphipraxis.net/73880-gemeinsame-uses-klausel-allen-units.html)

berens 25. Jul 2006 09:17


Gemeinsame Uses Klausel in allen Units
 
Hallo!

Ich versuche gerade bei meinem Projekt jede Komponente in eine eigene Unit zu machen. Da viele Forms dann später auf die einzelnen Komponenten zugreifen wird das später dann immer ne ziemliche Arbeit jede neue Komponente in jede Unit hinzuzufügen (weil die passende Unit wieder rauszusuchen wenn man gerade am Programmieren ist und die an die richtige (übersichtliche) Stelle bei Uses einzusetzen stört).

Gibt es also eine Möglichkeit, wie z.B. bei PHP (war das Include?) einfach an diese Stelle der Unit eine andere Datei hineinzuladen, wo z.B. alle Uses drinstehen?

Was passiert wenn dann dort eine Datei auf sich selbst verweist, wenn ihr eigener Unitname in ihrem Header steht.

Gibt's da ne ordentliche Methode?

mkinzler 25. Jul 2006 09:28

Re: Gemeinsame Uses Klausel in allen Units
 
Auzch Delphi kennt include
Delphi-Quellcode:
{$I <Dateiname> }

berens 25. Jul 2006 09:30

Re: Gemeinsame Uses Klausel in allen Units
 
Danke! Werd ich gleich mal ausprobieren.

Angel4585 25. Jul 2006 09:51

Re: Gemeinsame Uses Klausel in allen Units
 
Zitat:

Zitat von mkinzler
Auzch Delphi kennt include
Delphi-Quellcode:
{$I <Dateiname> }

was genau passiert bei diesem "Include"?
Ist das ein Ersatz für die "normale" Uses?
Was hat das für Vorteile gegenüber einer Uses?

Gibt es vllt irgendwo ein Tutorial dazu wo das erklärt ist? In der OH find ich leider nicht viel dazu.

fkerber 25. Jul 2006 09:54

Re: Gemeinsame Uses Klausel in allen Units
 
Hi!

Dieses Include bindet einfach an der Stelle, an der es steht, das ein, was in "Dateiname" steht.
Es ist also kein direkter Ersatz für die Uses, aber z.B. kann in dieser Datei dann die komplette Uses-Klausel drinstehen!


Ciao Frederic

Angel4585 25. Jul 2006 09:55

Re: Gemeinsame Uses Klausel in allen Units
 
wird das zur Laufzeit eingebunden oder vom Compiler?

fkerber 25. Jul 2006 09:55

Re: Gemeinsame Uses Klausel in allen Units
 
Hi!

Das erledigt der Compiler!


Ciao Frederic

mkinzler 25. Jul 2006 09:57

Re: Gemeinsame Uses Klausel in allen Units
 
Zitat:

was genau passiert bei diesem "Include"?
Eine andere Datei wird an Stelle von {$I..} in den Quelltext eingebunden.
Zitat:

Ist das ein Ersatz für die "normale" Uses?
Nein.
Zitat:

Was hat das für Vorteile gegenüber einer Uses?
Führt zu anderen Ergebnissen. Mit Uses kann man nurkomplette Units einbinden.

Angel4585 25. Jul 2006 09:59

Re: Gemeinsame Uses Klausel in allen Units
 
Wenn in dieser datei jetzt sowas wie

Delphi-Quellcode:
procedure Test;
begin
ShowMessage('Hello World');
end;
steht, kann ich dann diese Prozedur im Programm aufrufen?

mkinzler 25. Jul 2006 10:01

Re: Gemeinsame Uses Klausel in allen Units
 
So als wenn du sie direkt in die Unit geschrieben hättest.

fkerber 25. Jul 2006 10:02

Re: Gemeinsame Uses Klausel in allen Units
 
Hi!

Ja, wenn das Include dann über der Stelle des Aufrufs steht und dazu an einer Stelle, wo auch dein Code-Ausschnitt stehen könnte, dann klappt das!


Ciao, Frederic

Angel4585 25. Jul 2006 10:04

Re: Gemeinsame Uses Klausel in allen Units
 
könnte man das so umbiegen das man die Datei erst zur Laufzeit angibt und der Code dann ausgeführt wird?

mkinzler 25. Jul 2006 10:06

Re: Gemeinsame Uses Klausel in allen Units
 
Nein, weil der Compiler ja den Inhalt der includierten Datei vor dem Compilieren an die Position einfügt.

Angel4585 25. Jul 2006 10:06

Re: Gemeinsame Uses Klausel in allen Units
 
Habs grad in der Hilfe gefunden:

Zitat:

Anmerkungen
Die Parameter-Direktive $I weist den Compiler an, die angegebene Datei in die Compilierung aufzunehmen. Diese Datei wird direkt nach der Direktive {$I Dateiname} in den Text eingefügt. Die vorgegebene Namenserweiterung für die Datei ist .pas. Wenn die Datei ohne Verzeichnispfad angegeben wird, sucht Delphi die Datei in dem Verzeichnis, in dem auch das Modul liegt. Außerdem werden alle Verzeichnisse durchsucht, die im Eingabefeld Suchpfad der Registerkarte Verzeichnisse/Bedingungen im Dialogfeld Projekt/Optionen (oder mit der Option -I in der dccil-Kommandozeile) festgelegt wurden.

Wenn der Dateiname ein Leerzeichen enthält, schließen Sie ihn in halbe Anführungszeichen ein: {$I 'Meine Datei'}.

Für die Verwendung von Include-Dateien gilt eine Einschränkung: Sie können nicht in einem Anweisungsblock eingebunden werden. Dies liegt daran, dass zwischen den Schlüsselwörtern begin und end alle Anweisungen eines Anweisungsblocks aus derselben Quelldatei stammen müssen.

fkerber 25. Jul 2006 10:08

Re: Gemeinsame Uses Klausel in allen Units
 
Hi!

Das geht, wie der Name sagt, mit diesen Compiler-Switches nicht!
Um zur Laufzeit noch Code einzubinden gibt es andere Mittel und Wege (die man auch im Forum finden kann).

Sollten da noch Fragen sein, aber am besten einen neuen Beitrag anfangen, da das hier ja schon nichts mehr mit dem Ausgangsthema zu tun hat ;)


Ciao, Frederic

DP-Maintenance 25. Jul 2006 10:11

DP-Maintenance
 
Dieses Thema wurde von "sakura" von "Die Delphi-IDE" nach "Sonstige Fragen zu Delphi" verschoben.

Elvis 25. Jul 2006 10:21

Re: Gemeinsame Uses Klausel in allen Units
 
Zitat:

Zitat von berens
Gibt es also eine Möglichkeit, wie z.B. bei PHP (war das Include?) einfach an diese Stelle der Unit eine andere Datei hineinzuladen, wo z.B. alle Uses drinstehen?

Die Idee ist IMHO ziemlich krank. ;-)
Die einzige n 2 Stellen in denen includes sinn machen sind Stellen, die ein Defizit im Compiler selbst auszugleichen versuchen:
  1. Compiler versionsprüfungen
    der Präprozessor kann (zumindest in D7) keine Ausdrücke á la {$ifdef compilerversion < 170}
  2. Pseudo templates

Ich simuliere in native Delphi namespaces indem ich in einer Unit Aliases auf die Typen in den anderen Units aufliste. Auf die Art hat man seine Typen immer noch schön in einzelnen Units, aber braucht nur einen "Namespace" einzubinden um alle Typen benutzen zu können.
Bleistift (habe die Leerzeilen entfernt ;-) ):
Delphi-Quellcode:
unit uClass1;
interface
type
  Class1 = class
  end;
Delphi-Quellcode:
unit uClass2;
interface
type
  Class2 = class
  end;
Delphi-Quellcode:
unit MyClasses;
interface
uses
  uClass1,
  uClass2;
type
  Class1 = uClass1.Class1;
  Class2 = uClass2.Class2;
Delphi-Quellcode:
unit Babla;
interface
uses
  MyClasses;
type
  Class3 = class(Class2)
  end;

dataspider 25. Jul 2006 10:29

Re: Gemeinsame Uses Klausel in allen Units
 
Zitat:

Zitat von berens
Hallo!

Ich versuche gerade bei meinem Projekt jede Komponente in eine eigene Unit zu machen.

Hi berens,

bei der ganzen Diskussion weise ich dennoch darauf hin, dass es keinen Sinn macht, jede Komponente in eine eigene Unit zu verfrachten. Man kann sich die Delphi VCL schon als Vorlage benutzen.
So sollte man seine Komponenten in logischen Einheiten zusammenfassen.
Ich benutze z.B. die Namenskonventionen von Delphi und setzt nur 2 Buchstaben davor.
So habe ich alle Controls in rwControls.pas, alles für die Datenbank in rwDB.pas und allgemeine Routinen in rwSysUtils, Formularklassen und Routinen in rwForms etc.
Somit wird der Uses - Abschnitt wieder überschaubar und du vermeidest, dass deine Komponentenunits sich irgendwann unüberschaubar gegenseitig referenzieren.

Cu, Frank

Elvis 25. Jul 2006 10:58

Re: Gemeinsame Uses Klausel in allen Units
 
Zitat:

Zitat von dataspider
bei der ganzen Diskussion weise ich dennoch darauf hin, dass es keinen Sinn macht, jede Komponente in eine eigene Unit zu verfrachten. Man kann sich die Delphi VCL schon als Vorlage benutzen.
...
Somit wird der Uses - Abschnitt wieder überschaubar und du vermeidest, dass deine Komponentenunits sich irgendwann unüberschaubar gegenseitig referenzieren.

Du hast schon meinen Post gelesen, oder?
Diese übermüllten Units mit mehr als 10 oder gar 20 ( :shock: ) Typen finde absolut ekelerregend.
Sie sind immer größer als ein Monitor, das heißt man muss immer scrollen um einen Typen in seiner Gänze sehen zu können.
Wie zum Geier soll eine überschaubare uses-Clause unleserlichen Code rechtfertigen können? Vor allem wenn man (zumindest in native Delphi) das ganze mit enem ganz einfachen Trick umgehen kann? :gruebel:

dataspider 25. Jul 2006 11:07

Re: Gemeinsame Uses Klausel in allen Units
 
Zitat:

Zitat von Elvis
Du hast schon meinen Post gelesen, oder?
Diese übermüllten Units mit mehr als 10 oder gar 20 ( :shock: ) Typen finde absolut ekelerregend.
Sie sind immer größer als ein Monitor, das heißt man muss immer scrollen um einen Typen in seiner Gänze sehen zu können.
Wie zum Geier soll eine überschaubare uses-Clause unleserlichen Code rechtfertigen können? Vor allem wenn man (zumindest in native Delphi) das ganze mit enem ganz einfachen Trick umgehen kann? :gruebel:

Da ich mit dem ModelMaker CodeExplorer code, kann ich das mit der Unübersichtlichkeit nicht nachvollziehen.
Und - sorry - es ist sicher Geschmacksfrage. Aber ich möchte z.B. nicht zwischen hunderten von Units in der IDE navigieren, weil ich gerade mal ein Refactoring meiner Komponenten durchführe.
Und dein Trick ist für mich ein nicht notwendiger Mehraufwand.

Cu, Frank

berens 26. Jul 2006 11:01

Re: Gemeinsame Uses Klausel in allen Units
 
Nochmal zum Thema speziell mit dem Uses: Nachdem ich alle (Delphi!) Units mit der Include-Datei hinzufüge (System, Graphics, Forms etc) habe ich das Problem, dass der Compiler/Debugger wohl automatisch manche benötigten Units nochmal extra als "Interne" Uses hinzufügt (als nach Implementation)

Code:
implementation

uses Graphics;
Kann man das irgendwie deaktivieren, weil so bekomme ich bei jedem 3ten Compilieren die Fehlermeldung "Bezeichner redefiniert: xxxx"?

berens 26. Jul 2006 11:48

Re: Gemeinsame Uses Klausel in allen Units
 
Das Problem scheint mit der Codevervollständigung zu tun zu haben. Sobald ich z.B. ExtractFileName Autovervollständigen lasse steht implementation uses SysUtils; da...

Elvis 26. Jul 2006 11:56

Re: Gemeinsame Uses Klausel in allen Units
 
Weil includes hierfür Unsinn sind? Mach's so wie es vorgeschlagen haben und du bleibst bei StiNo Delphi Compilierung.

berens 26. Jul 2006 12:00

Re: Gemeinsame Uses Klausel in allen Units
 
Wenn ich das richtig verstehte müsste ich dann aber quasi wirklich jede einzelne Klasse aus jeder Unit ableiten bzw. neu deklarieren/definieren (?). Ich will ja wirklich nur die Standardunits von Delphi in all meinen Units einbinden.

Elvis 26. Jul 2006 12:03

Re: Gemeinsame Uses Klausel in allen Units
 
Zitat:

Zitat von berens
Wenn ich das richtig verstehte müsste ich dann aber quasi wirklich jede einzelne Klasse aus jeder Unit ableiten bzw. neu deklarieren/definieren (?). Ich will ja wirklich nur die Standardunits von Delphi in all meinen Units einbinden.

Das sind Aliase!
Sie sagen dem Compiler wo er den wirklichen Typen findet.

berens 26. Jul 2006 12:08

Re: Gemeinsame Uses Klausel in allen Units
 
Das meine ich ja. Ich muss also für _jeden_ Typ (entsprechend in jeder Unit) einen Alias erstellen? (Zur Erinnerung: Es geht hier um Systems, Graphics, Windows, Forms, Controls, ...)

Elvis 26. Jul 2006 13:21

Re: Gemeinsame Uses Klausel in allen Units
 
Zitat:

Zitat von berens
Das meine ich ja. Ich muss also für _jeden_ Typ (entsprechend in jeder Unit) einen Alias erstellen? (Zur Erinnerung: Es geht hier um Systems, Graphics, Windows, Forms, Controls, ...)

Au Kacke! :shock: Ich dachte, das waren nur Beispiel units.
Ganz am Anfang schriebst du dass *du* ganz gerne *deine* Typen auf jeweils eine Unit packst und dass dir das die uses Clause zu friemelig macht.

berens 26. Jul 2006 13:25

Re: Gemeinsame Uses Klausel in allen Units
 
Sorry ;)

Gut, ich denke mit den eigenen Komponenten kann ich eh abhaken. Aber gibts ne einfache Möglichkeit alle Delphiunits (bzw. die, die ich brauche) in all meinen Units einfach zu laden (ich weiss, ich vergess wieder eine die man doch dann mal wieder häufiger braucht (z.B. ShellApi), wie will ich nicht wieder nachher in X-Units per Hand eintragen, wenn ich da ShellExecute aufrufen will.

Tips dafür?

Soweit auf jedenfall schonmal Danke an alle die sich hier bisher geäußert haben :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:09 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