Autor |
Beitrag |
tacl
Hält's aus hier
Beiträge: 13
WinXP, Linux, OS/2
Delphi2/2010 Prof., FoxPro, C++
|
Verfasst: Fr 16.07.10 11:24
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
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Fr 16.07.10 11:48
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
tacl 
Hält's aus hier
Beiträge: 13
WinXP, Linux, OS/2
Delphi2/2010 Prof., FoxPro, C++
|
Verfasst: 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
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: 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.
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,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
tacl 
Hält's aus hier
Beiträge: 13
WinXP, Linux, OS/2
Delphi2/2010 Prof., FoxPro, C++
|
Verfasst: 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
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: 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
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Fr 16.07.10 14:58
Flamefire hat folgendes geschrieben : | 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.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
tacl 
Hält's aus hier
Beiträge: 13
WinXP, Linux, OS/2
Delphi2/2010 Prof., FoxPro, C++
|
Verfasst: Fr 16.07.10 15:19
Die Lösung ist perfekt! Das funktioniert zumindest in Delphi 2010 1a.
Vielen Dank!
Patrick
_________________ Patrick
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|