AGB  ·  Datenschutz  ·  Impressum  







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

Unit "dynamisch" einbinden

Ein Thema von ernschd · begonnen am 31. Jul 2014 · letzter Beitrag vom 1. Aug 2014
Antwort Antwort
ernschd

Registriert seit: 16. Jan 2008
165 Beiträge
 
Delphi XE8 Professional
 
#1

Unit "dynamisch" einbinden

  Alt 31. Jul 2014, 15:12
Delphi-Version: 2007
Folgendes Problem:
Ich habe eine Unit „Les“:
Delphi-Quellcode:
Unit Les;

Procedure LeseDatei(Name: String);
begin
   AssignFile(Name…
end;
Dann gibt es die Unit „LesSQL“:
Delphi-Quellcode:
Unit LesSQL;

Procedure LeseDatei(Name: String);
begin
   Sql := „SELECT * FROM `Name`…
end;
Die Methodenaufrufe der Unit LesSQL wurden aus Gründen der Kompatibilität identisch mit denen der Les erstellt. Die beiden Dateien sollten auch so erhalten bleiben.
Bislang wurden die Units immer je nach Anwendungsfall eingebunden und kompiliert.

Nun gibt es eine neue Klasse „TLese“ als Wrapper, die den Zugriff auf die Les/LesSQL-Units vereinfacht:
Delphi-Quellcode:
// LeseDatei aufrufen.
Function TLese.getDatei: Boolean;
Ich hätte nun gerne eine Möglichkeit, je nach Anwendungsfall die passende Unit in der Klasse TLese einzubinden (z.B. mittels Parameter im Konstruktor).
Gibt es hierfür eine Lösung? Vielleicht per Compiler-Direktive?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Unit "dynamisch" einbinden

  Alt 31. Jul 2014, 15:16
Könnte man durch bedingte Compilierung lösen

Delphi-Quellcode:
uses
   ...,
{$IFDEF USE_SQL} LesSQL{$ELSE}Les{$ENDIF}, ...
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Unit "dynamisch" einbinden

  Alt 31. Jul 2014, 15:18
Aber das funktioniert nur zur Designtime und nicht durch Konstruktor-Parameter oder ähnliches.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Unit "dynamisch" einbinden

  Alt 31. Jul 2014, 18:53
Schlagworte wären hier Bridge Pattern oder Abstract Factory
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Unit "dynamisch" einbinden

  Alt 31. Jul 2014, 19:02
Soweit ich das verstehe ist doch das eigentliche Problem, dass Delphi es nicht erlaubt, eine "Unit an sich" zu referenzieren- Es gibt keinen Typ dafür. Somit kann man nicht dynamisch sagen "Unit A" oder "Unit B".

Da beide Units doch schon so schön aufgebaut sind, wäre es doch eigentlich die geringste Arbeit, die beiden endlich in eine Klasse mit gemeinsamer Schnittstelle zu packen, oder?
Alternativ je eine Klasse (wieder mit gemeinsamer Schnittstelle) als Fassade für eine Unit wenn man die alte Unit-Struktur noch woanders verwenden möchte.
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Unit "dynamisch" einbinden

  Alt 31. Jul 2014, 19:43
Du kannst die Funktionen in Les und LesSQL in Klassen auslagern. Zum Beispiel kannst du hier auch auf Vererbung zurückgreifen.

Delphi-Quellcode:
unit LesBase;

interface

type
  TLesBase = class
  public
    function LeseDatei(Name: String): String; virtual; abstract;
  end;

  TLesBaseClass = class of TLesBase;

implementation

end.
Delphi-Quellcode:
unit Les;

interface

uses
  LesBase;

type
  TLes = class(TLesBase)
  public
    function LeseDatei(Name: String): String; override;
  end;

implementation

function TLes.LeseDatei(Name: String): String;
begin
  ...
end;

end.
Delphi-Quellcode:
unit LesSQL;

interface

uses
  LesBase;

type
  TLesSQL = class(TLesBase)
  public
    function LeseDatei(Name: String): String; override;
  end;

implementation

function TLesSQL.LeseDatei(Name: String): String;
begin
  ...
end;

end.
Und in dem Wrapper kannst du dann im Constructor die entsprechende Les-Klasse übergeben.

Delphi-Quellcode:
unit Lese;

interface

uses
  LesBase;

type
  TLese = class
    constructor Create(ALesClass: TLesBaseClass);
    destructor Destroy; override;
  private
    FLesClass: TLesBaseClass;
  public
    function getDatei: Boolean;
  end;

implementation

constructor TLese.Create(ALesClass: TLesBaseClass);
begin
  FLesClass := ALesClass.Create;
end;

destructor TLese.Destroy;
begin
  FLesClass.Free;
  inherited;
end;

function TLese.getDatei: Boolean;
begin
  Result := Length(FLesClass.LeseDatei('...') > 0);
end;

end.
Anwendung:
Delphi-Quellcode:
unit Form1;

interface

...

implementation

uses
  Lese, Les, LesSQL;

...

procedure TForm1.Button1Click(Sender: TObject);
var
  LesClass: TLesBaseClass;
begin
  case FUseClass of
    clLes:
      LesClass := TLes;
    clLesSQL:
      LesClass := TLesSQL;
  end;
  FLese := TLese.Create(LesClass);
  try
    if FLese.getDatei then
      ShowMessage('Juhu! \o/')
    else
      ShowMessage('Oh Noes! D:');
  finally
    FLese.Free;
  end;
end;

...

end.
Ungetestet. Aber das Prinzip sollte klar sein.

Geändert von nuclearping (31. Jul 2014 um 19:53 Uhr)
  Mit Zitat antworten Zitat
ernschd

Registriert seit: 16. Jan 2008
165 Beiträge
 
Delphi XE8 Professional
 
#7

AW: Unit "dynamisch" einbinden

  Alt 1. Aug 2014, 11:54
So weit mal vielen Dank an alle

Ich schaue mir mal an, wie ich das umsetzen kann.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Unit "dynamisch" einbinden

  Alt 1. Aug 2014, 13:08
Soweit ich das verstehe ist doch das eigentliche Problem, dass Delphi es nicht erlaubt, eine "Unit an sich" zu referenzieren- Es gibt keinen Typ dafür. Somit kann man nicht dynamisch sagen "Unit A" oder "Unit B".
Über Packages (und eigentlich wieder Klassen/Interfaces) wäre das möglich.
Ich würde das aber nicht empfehlen das dynamisch darüber zu machen.

Ebenfalls wäre ein reine DLL möglich die jeweils die gleichen exportierten Funktionen hat.
Windows Vista - Eine neue Erfahrung in Fehlern.
  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 04:13 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