Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Functions Unitübergreifen implementieren


tacl - Fr 16.07.10 11:24
Titel: Functions Unitübergreifen implementieren
Hi nochmal, da bin ich schon wieder. ;-)

Folgendes Problem hat sich noch aufgetan, vielleicht hat jemand eine Lösung für mich:
Ich habe folgende Unit geschrieben, die mir verschiedene Kern-Programmteil-Klassen in mein Projekt instantiiert:


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:
unit core.api;

interface

uses
  SysUtils,
  core.config,
  core.errorhandler;

var
  Config: TConfig;
  Errorhandler: TErrorhandler;


implementation

Initialization

  config := TConfig.Create;
  errorhandler := TErrorhandler.Create;

finalization

  config.Free;
  errorhandler.Free;

end.


Ich würde nun gerne eine weitere Unit in diese Unit core.api einbinden, die einige functions enthält.
Soweit kein Problem. Diese Functions sollen jedoch auch in den Units verfügbar sein, die core.api einbinden.
Gibt es eine Möglichkeit der Einbindung, ohne jede Function nocheinmal deklarieren zu müssen?

Danke und Gruß
Patrick


Bergmann89 - Fr 16.07.10 11:48

Hey,


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
unit MeineUnit;

interface

function MeineFunktion(i: Integer): Integer;

implementation

function MeineFunktion(i: Integer): Integer;
begin
  result := i;
end;

end.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
unit MeineAndereUnit;

interface

uses
  MeineUnit;

implementation

procedure IrgendeineProzedur;
var i: Integer;
begin
  i := MeineFunktion(5);
end;

end.


MfG Bergmann


elundril - Fr 16.07.10 11:53

Ich glaube du hast ihn falsch verstanden bergmann89. Er meint sowas hier:

Unit A bindet Unit B ein. Unit B bindet Unit C ein. Nun möchte er das er auch von Unit A auf die Methoden in Unit C zugreifen kann.

Frage, warum bindest du nicht einfach die Unit C, wie sie in meinem Beispiel heißt, auch in Unit A ein?

lg elundril


tacl - Fr 16.07.10 12:10

Danke für die Richtigstellung @elundril. :)

Mein Problem ist, dass der ganze Projektkern sich mittlerweile auf 27 Units (bzw. Teilprojekte) beläuft,
wovon ca. 15 in jedem noch so kleinen Formular eingebunden werden müssen. Die Arbeit möchte ich mir sparen,
und die Fehleranfälligkeit aufgrund versehentlich vergessener Units verringern.

Viele Grüße
Patrick


Hidden - Fr 16.07.10 12:32

Hi -

Ich denke, Delphi ist mit Absicht so aufgebaut, dass immer alle Units neu genannt werden müssen. Wenn uses dem #include entsprechen würde, könntest du dir zwar ein klein wenig Arbeitsaufwand ersparen, dafür würden aber ab und zu schwerer nachvollziehbare Fehler auftauchen.

So, wie du es jetzt deklariert hast, kannst du imho aus units, die core.api einbinden über deine globalen Objekte auf Methoden von TConfig/TErrorHandler zugreifen, auch wenn du core.config und core.errorhandler nicht einbindest.
So könntest du es auch mit deiner dritten Unit machen: Die Prozeduren und Funktionen zu Methoden eines Objektes machen, und davon dann in core.api ein Objekt erzeugen.
Die einzige "bequeme" Lösung setzt du also bereits um. :nixweiss:

Ich würde mir die Tastenkürzel für schnellen Unitwechsel/etc. heraussuchen, und eben schnell in allen nötigen Units die zusätzliche Unit einbinden.
Alternative mit neuerem Delphi: Strg F9, springt zum Fehler. Rechtsklick, Refactoring: Unit finden und einbinden(gibt es leider keinen Shortcut).
(Refactoring existiert glaube ich seit 2006, also in D7 noch nicht(?))

lg,


tacl - Fr 16.07.10 13:50

Hi!

Dann werde ich das ganze wohl weiter über die Einbindung der entsprechenden Unit machen,
und soviele Units wie möglich zusammenfassen.

Manchmal gibts eben auch Dinge, die man nicht wirklich elegant lösen kann. :)
Refactoring nutze ich auch, mittlerweile. Ist gut gemacht, wie ich finde.

Gruß
Patrick


Flamefire - Fr 16.07.10 14:28

oder du versuchst es ebn über ein include. auch mit delphi kann man was einbinden. das dürfte dann ähnlich wie #include in c++ wirken: Der text wird einfach da eingefügt.
wennde dort dies uses reinnimmst, könnte es klappen (vl, glaubs aber ne wirklich ;-) )


Martok - Fr 16.07.10 14:58

user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
oder du versuchst es ebn über ein include. auch mit delphi kann man was einbinden. das dürfte dann ähnlich wie #include in c++ wirken: Der text wird einfach da eingefügt.
wennde dort dies uses reinnimmst, könnte es klappen (vl, glaubs aber ne wirklich ;-) )


Och, doch. Das geht:

unit.pas
1:
2:
3:
interface

uses Windows, SysUtils, Classes, {$I coreunits.inc};


coreunits.inc
1:
core.types,core.api,core.whatever                    


Das Problem ist nur, dass die Codevervollständigung zumindest von D2006 und früher das nicht verstanden hat, und dann die entsprechenden Units nicht geparst hat.
Hatte ich so in einem Projekt, das prinzipbedingt eine Main-Unit von ingesamt >8000LOC hat, die aber sauber auf includes verteilt sind. Codevervollständigung ist da nicht, muss man sich merken wie eine bestimmte Funktion heißt.


tacl - Fr 16.07.10 15:19

Die Lösung ist perfekt! Das funktioniert zumindest in Delphi 2010 1a.
Vielen Dank!


Patrick


BenBE - Fr 16.07.10 23:25

Och, Code über {$I} einbinden geht schon seit D4 supi; allerdings nicht in der Uses (da gab's mal ne Beschränkung, dass der {$I}-Block eine Anweisung für sich sein musste.