![]() |
Delphi-Version: 10.4 Sydney
Kann man units irgendwie bundeln?
Hi,
ich weiß gerade nicht, ob ich ein Designfehler in meiner Struktur habe, oder ob ich mir einfach die richtige Begrifflichkeit fehlt. Ich erkläre euch mal, was ich gerne erreichen würde. Ich habe ein Package (bpl) nennen wir es mal "Tools.bpl". In dem Package sind viele verschiedene Units, z.B. - Tools.system1.way1 - Tools.system1.way2 - Tools.system2.way1 - Tools.systems.general ..... In Summe brauche ich in der Entwicklung, welche dieses Package nutzt, eigentlich so gut wie immer alle Units. Die einzelnen Units habe ich nur erstellt, damit ich die einzelnen Parts besser wieder finde. Kann man jetzt z.B. einfach eine Unit Tools erstellen, die man in der Zielentwicklung rein zieht, die dann alle anderen Units enthält? Wisst ihr was ich meine? Ich hoffe ich hab mich einigermaßen verständlich ausgedrückt :oops: Gruß PJM |
AW: Kann man units irgendwie bundeln?
Du könntest die Sachen die du brauchst in einer Alias-Unit (richtiger Begriff?) zusammenfassen:
Delphi-Quellcode:
Dann brauchst du nur noch DeineToolsAliasUnit einfügen.
unit DeineToolsAliasUnit;
interface uses Tools.system1.way1, Tools.system1.way2, Tools.system2.way1, Tools.systems.general; type TSystem1Way1 = Tools.system1.way1.TSystem1Way1; TSystem1Way2 = Tools.system1.way2.TSystem1Way2; TSystem2Way1 = Tools.system2.way1.TSystem2Way1; TMyLittleHelperClassesAndConstsEtc = Tools.systems.general.TMyLittleHelperClassesAndConstsEtc; implementation end. Vgl. Vcl.Graphics:
Delphi-Quellcode:
Definition für TColors steckt in System.UITypes.
...
clBlack = TColors.Black; clMaroon = TColors.Maroon; clGreen = TColors.Green; clOlive = TColors.Olive; clNavy = TColors.Navy; ... |
AW: Kann man units irgendwie bundeln?
Zitat:
Also so z.B.
Delphi-Quellcode:
unit Tools.systems.general;
interface function HashFile(FilePathName: string): string; implementation uses System.Classes, System.SysUtils, System.Hash, System.IOUtils, System.Win.Registry, Winapi.Windows; function HashFile(FilePathName: string): string; var Hash: THashMD5; fileBytes: TBytes; begin fileBytes := Tfile.ReadAllBytes(FilePathName); Hash.Reset; Hash.update(fileBytes); Result := Hash.HashAsString; end; end. |
AW: Kann man units irgendwie bundeln?
Zitat:
Delphi-Quellcode:
THashTools.HashFile(...);
|
AW: Kann man units irgendwie bundeln?
jaenicke war schneller
|
AW: Kann man units irgendwie bundeln?
Ich glaube, irgendwie stelle ich mich heute ganz doof dran.
Ich hab jetzt mal grob zusammengefasst, wie die 2 Lösungen zusammengefasst aussehen würden. Soll natürlich dann auf 2 Units verteilt werden.
Delphi-Quellcode:
Jetzt bekomme ich bei dem Aufruf von Aliaskalsse.Hashfile folgende Meldung:
unit Tools.systems.general;
interface type Ttools = class public function HashFile(FilePathName: string): string; end; type AliasKlasse = Ttools; function HashFile(FilePathName: string): string; implementation uses System.Classes, System.SysUtils, System.Hash, System.IOUtils, System.Win.Registry, Winapi.Windows; function Ttools.HashFile(FilePathName: string): string; var Hash: THashMD5; fileBytes: TBytes; begin fileBytes := Tfile.ReadAllBytes(FilePathName); Hash.Reset; Hash.update(fileBytes); Result := Hash.HashAsString; end; procedure main; begin AliasKlasse.HashFile('DummyString'); end; E2076 Diese Form des Methodenaufrufs ist nur für Klassenmethoden erlaubt Ich strukturiere auch gern mein Projekt um, wenn das so zu fummelig ist, oder wie bekommt ihr das mit den Uses in den Griff? |
AW: Kann man units irgendwie bundeln?
Nicht
Delphi-Quellcode:
, sondern
function
Delphi-Quellcode:
.
class function
|
AW: Kann man units irgendwie bundeln?
Du hast eine Instanz-Methode gebaut und versuchst sie über die Klasse aufzurufen,
obwohl es dafür eine Variable/Instanz (mit Create vorher) benötigt.
Delphi-Quellcode:
Aber würdest du es als KlassenMethode oder statische Klassenmethode bauen, dann ginge es (wenn außerhalb der Methode, von der Klasse nichts Anderes verwendet wird),
V := AliasKlasse.Create;
V.HashFile('DummyString'); V.Free; // natürlich noch mit try-finally drumrum wobei es da auch egal ist, ob Klasse oder Record.
Delphi-Quellcode:
type
//Ttools = record Ttools = class public function HashFile1(FilePathName: string): string; // Self=Objectinstanz class function HashFile2(FilePathName: string): string; // Self=Klassentyp class function HashFile2(FilePathName: string): string; static; // hier ohne den sonst unsichtbaren impliziten Self-Parameter end; Wer will, kann auch moch mit abstract, final und Co. an der Klasse rumspielen. Früher hatte ich abstract benutzt, um im Compiler schon eine Meldung zu bekommen, bei Klassen die garnicht instantiiert werden sollen müssen ... inzwischen nehme ich sowieso record dafür. weil siehe Note: :cry: ![]() ![]() Denn dem Record ist alles egal, ob Typ oder Variable. Bei einer Klasse muß man, für eine Klassenmethode (ohne static), den Typ oder eine instantiierte Variable benutzen, sonst knallt es, weil nicht der Typ der Variable, sondern der Typ in der Instanz benutzt wird. Der Alias wäre hier auch nicht nötigt, denn kannst ja direkt TTools benutzen. Und bei solchen AliasUnits ala #2 aufpassen, dass man z.B. Typen aus Parametern und Property nicht vergisst weiterzuleiten, sowie nötige Konstanten und bei Sets/Enums auch jeden einzelnen Wert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:47 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