AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kann man units irgendwie bundeln?

Ein Thema von fisipjm · begonnen am 13. Okt 2022 · letzter Beitrag vom 13. Okt 2022
Antwort Antwort
fisipjm

Registriert seit: 28. Okt 2013
251 Beiträge
 
#1

Kann man units irgendwie bundeln?

  Alt 13. Okt 2022, 07:38
Delphi-Version: 10.4 Sydney
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

Gruß
PJM
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Kann man units irgendwie bundeln?

  Alt 13. Okt 2022, 08:04
Du könntest die Sachen die du brauchst in einer Alias-Unit (richtiger Begriff?) zusammenfassen:

Delphi-Quellcode:
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.
Dann brauchst du nur noch DeineToolsAliasUnit einfügen.

Vgl. Vcl.Graphics:
Delphi-Quellcode:
...
  clBlack = TColors.Black;
  clMaroon = TColors.Maroon;
  clGreen = TColors.Green;
  clOlive = TColors.Olive;
  clNavy = TColors.Navy;
...
Definition für TColors steckt in System.UITypes.
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
251 Beiträge
 
#3

AW: Kann man units irgendwie bundeln?

  Alt 13. Okt 2022, 08:27
Du könntest die Sachen die du brauchst in einer Alias-Unit (richtiger Begriff?) zusammenfassen:

Delphi-Quellcode:
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.
Dann brauchst du nur noch DeineToolsAliasUnit einfügen.

Vgl. Vcl.Graphics:
Delphi-Quellcode:
...
  clBlack = TColors.Black;
  clMaroon = TColors.Maroon;
  clGreen = TColors.Green;
  clOlive = TColors.Olive;
  clNavy = TColors.Navy;
...
Definition für TColors steckt in System.UITypes.
Danke für den Tipp, das müsste mit Klassen gut klappen. Wie mache ich das denn mit Funktionen und Prozeduren, die einfach nur global in der Implementierung stehen? Kann ich die irgendwie durchreichen? Die sind ja nicht teil einer Klasse.
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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.332 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Kann man units irgendwie bundeln?

  Alt 13. Okt 2022, 08:35
Danke für den Tipp, das müsste mit Klassen gut klappen. Wie mache ich das denn mit Funktionen und Prozeduren, die einfach nur global in der Implementierung stehen? Kann ich die irgendwie durchreichen? Die sind ja nicht teil einer Klasse.
Pack sie in eine Klasse (als Klassenmethoden). Das macht das Handling ohnehin viel einfacher, weil man direkt sieht, wo die Methoden herkommen.

THashTools.HashFile(...);
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.337 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Kann man units irgendwie bundeln?

  Alt 13. Okt 2022, 08:38
jaenicke war schneller
Peter
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
251 Beiträge
 
#6

AW: Kann man units irgendwie bundeln?

  Alt 13. Okt 2022, 09:48
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:
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;
Jetzt bekomme ich bei dem Aufruf von Aliaskalsse.Hashfile folgende Meldung:
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?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.332 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Kann man units irgendwie bundeln?

  Alt 13. Okt 2022, 10:13
Nicht function , sondern class function .
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#8

AW: Kann man units irgendwie bundeln?

  Alt 13. Okt 2022, 10:18
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:
V := AliasKlasse.Create;
V.HashFile('DummyString');
V.Free; // natürlich noch mit try-finally drumrum
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),
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:
https://docwiki.embarcadero.com/RADS...i)#Class_Types
http://delphiprogrammingdiary.blogsp...lasses-in.html

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (13. Okt 2022 um 10:37 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:06 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