Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Unterschiedliche Units für Debug und Release (https://www.delphipraxis.net/209134-unterschiedliche-units-fuer-debug-und-release.html)

davtix 31. Okt 2021 11:46

Unterschiedliche Units für Debug und Release
 
Kennt jemand einen Weg wie unterschiedliche Units für das Release und Debug zu händeln ist?


Zur erklärung:

Ich habe einen Updater geschrieben in dem eine Unit vorkommt die unterschiedliche Werte (bsp.pfadangaben) zum auslesen hat.
Dieses Projekt wird in das jeweilige Hauptprojekt(app), der upzudatenden Application, neu erstellt. (updater für proj X)
Beide Projecte sind bis auf eine Unit identisch. -> variable_datas.pas

Jedes Hauptprojekt(app) erhält somit seinen eigenen (updater für proj X) mit nur unterschiedlicher variable_datas.pas.
Per Knöpfchen im Updater werden die Quellcodedateien, ausser die variable_datas.pas, vom Updater zu (updater für proj X) überschrieben, schreibgeschützt und das (updater für proj X) Projekt mit eigener variable_datas.pas compiliert.

Struktur:

Updater
-- (updater für proj X) mit eigener variable_datas.pas
-- (updater für proj Y) mit eigener variable_datas.pas
-- (updater für proj Z) mit eigener variable_datas.pas


Hauptprojekt(app X )
-- -- (updater für proj X) mit eigener variable_datas.pas
Hauptprojekt(app Y )
-- -- (updater für proj Y) mit eigener variable_datas.pas
Hauptprojekt(app Z )
-- -- (updater für proj Z) mit eigener variable_datas.pas


Ausschnitt Updater variable_datas.pas

Delphi-Quellcode:
unit variable_datas;

interface

  function give_DATA( s1, s2 :string; i1, i2 :integer ):string;

  //umgelenkte proceduren und functionen -- diese codes sind nur für den HAUPTUPDATER verfügbar
  procedure refresh_UPDATERcodes_Link( func, selected_entry, sender_button_number : string);


implementation
uses unit1;

function give_DATA( s1, s2 :string; i1, i2 :integer ):string;
begin
  reult := 'hier mein wert nur für updater'
end;


refresh_UPDATERcodes( func, selected_entry, sender_button_number );
begin
  dateien vergleichen, schreibschutz raus, dateien kopieren, schreibschutz rein, projektdatei suchen, compilieren
end;

procedure refresh_UPDATERcodes_Link( func, selected_entry, sender_button_number : string);
begin
  refresh_UPDATERcodes( func, selected_entry, sender_button_number );
end;


end.

Ausschnitt updater für proj Y variable_datas.pas

Delphi-Quellcode:
unit variable_datas;

interface

  function give_DATA( s1, s2 :string; i1, i2 :integer ):string;

  //umgelenkte proceduren und functionen -- diese codes sind nur für den HAUPTUPDATER verfügbar
  procedure refresh_UPDATERcodes_Link( func, selected_entry, sender_button_number : string);


implementation
uses unit1;

function give_DATA( s1, s2 :string; i1, i2 :integer ):string;
begin
  reult := 'hier mein wert nur für updater für proj Y'
end;




procedure refresh_UPDATERcodes_Link( func, selected_entry, sender_button_number : string);
begin
  //nix
end;


end.


Etwas ähnliches schwebt mir nun für die Debugversion und Releaseversion vor.
Codes die ich im Debugmodus brauche möchte ich im Releasemodus ins leere laufen lassen.

Dalai 31. Okt 2021 12:01

AW: Unterschiedliche Units für Debug und Release
 
Delphi-Quellcode:
{$IFDEF DEBUG}
uses MyDebugUnit;
{$ELSE}
uses MyReleaseUnit;
{$ENDIF}
oder auch
Delphi-Quellcode:
uses SomeUnit
{$IFDEF DEBUG}
, MyDebugUnit
{$ELSE}
, MyReleaseUnit
{$ENDIF}
, SomeOtherUnit;
Kann man natürlich auch alles in derselben Unit machen und dort nur die Funktionen unterschiedlich implementieren und in dieselben IFDEFs packen.

Oder denke ich zu einfach?

Grüße
Dalai

davtix 31. Okt 2021 12:47

AW: Unterschiedliche Units für Debug und Release
 
ging ja schnell :)

Hab n bissel rumgewürgt aber es scheinbar so hier hinbekommen.


Delphi-Quellcode:
  uses ..  ..JvExExtCtrls, JvExtComponent, JvCaptionPanel,

    //unterschiedliche pas dateien im Debugmodus / releaseModus
   Release_codes {$IFDEF DEBUG} , Debug_codes {$ELSE}   {$ENDIF} ;
Delphi-Quellcode:
unit Release_codes;

interface


   function release_debug:string;


implementation


function release_debug:string;
begin

  result := 'kommt von a release unit'
end;

end.
Delphi-Quellcode:
unit Debug_codes;

interface

   function release_debug:string;


implementation


function release_debug:string;
begin

  result := 'kommt von a debug unit'
end;

end.

in der unit1 beim start dann ...
Delphi-Quellcode:
  //Form ausrichten
      Form1.Width := GetDPI(1200);
      Form1.Height := GetDPI(800);
      Form1.Left := Screen.Width - Form1.Width;
      Form1.Top := screen.Height - (screen.Height - screen.WorkAreaHeight) - form1.Height;


  tempS := release_debug;
  form1.Caption := tempS;

  exit;

Uwe Raabe 31. Okt 2021 13:16

AW: Unterschiedliche Units für Debug und Release
 
Durch das IFDEF wird ja schon quasi ausgeschlossen, dass die jeweiligen Units direkt in das Projekt aufgenommen werden, sondern lediglich über diese uses-Anweisung eingebunden werden.

In dem Fall lässt sich das auch ohne IFDEF realisieren, in dem man in den Build-Konfigurationen unterschiedliche Suchpfade einträgt und dort jeweils passende Units ablegt, die aber gleich heißen (hier z.B. codes.pas).

Natürlich sollte auch sichergestellt werden, dass der DCU-Ausgabepfad für Release und Debug unterschiedlich ist, was aber per Default mit .\$(Platform)\$(Config) ja schon gewährleistet wäre.

Das hätte den Vorteil, dass die verwendenden Units beim Wechsel zwischen Debug und Release nicht jedes mal neu übersetzt werden müssen.

Dalai 31. Okt 2021 13:19

AW: Unterschiedliche Units für Debug und Release
 
Zitat:

Zitat von davtix (Beitrag 1496875)
Delphi-Quellcode:
  uses ..  ..JvExExtCtrls, JvExtComponent, JvCaptionPanel,

    //unterschiedliche pas dateien im Debugmodus / releaseModus
   Release_codes {$IFDEF DEBUG} , Debug_codes {$ELSE}   {$ENDIF} ;

Das würde ich so nicht machen, weil du dann im DEBUG beide Units einbindest und es von der Reihenfolge der Einbindung abhängt, aus welcher Unit die Funktion gerufen wird. Anders ausgedrückt: Würde das IFDEF vor dem Release_codes stehen, würde immer Release_codes.release_debug gerufen werden, weil das zuletzt eingebundene gewinnt - jedenfalls solange man bei solchen Mehrdeutigkeiten nicht explizit die Unit angibt.

Besser ist
Delphi-Quellcode:
  uses ..  ..JvExExtCtrls, JvExtComponent, JvCaptionPanel

    //unterschiedliche pas dateien im Debugmodus / releaseModus
    {$IFDEF DEBUG} , Debug_codes {$ELSE}, Release_codes {$ENDIF} ;

[EDIT]
Ich ziehe IFDEFs den Suchpfaden vor, weil beim Lesen des reinen Codes sofort klar wird, aus welcher Unit der Code kommt. Bei Verwendung von Suchpfaden muss man sich selbige ebenfalls anschauen, um einen Gesamtüberblick des Codes zu bekommen. Gerade ohne IDE ist das eher lästig, in der .dproj rumzugraben.
[/EDIT]

Grüße
Dalai

davtix 31. Okt 2021 13:36

AW: Unterschiedliche Units für Debug und Release
 
@Uwe Raabe , das habe ich schon probiert jedoch ohne erfolg.


@Dalai Ich hab mich schon gewundert warum die IFDEF danach stehen.

so richtig versteh ich das nicht. Es funktioniert nur wenn ich das Komma nach JvCaptionPanel wegnehme.
{$IFDEF DEBUG} hat doch aber nichts mit dem CaptionPanel zu tun ???

Delphi-Quellcode:
  uses ..

 JvExExtCtrls, JvExtComponent, JvCaptionPanel

    //unterschiedliche pas dateien im Debugmodus / releaseModus  
   {$IFDEF DEBUG} , Codes_Debug {$ELSE}, Codes_Release {$ENDIF} ;

Dalai 31. Okt 2021 13:49

AW: Unterschiedliche Units für Debug und Release
 
Zitat:

Zitat von davtix (Beitrag 1496879)
so richtig versteh ich das nicht. Es funktioniert nur wenn ich das Komma nach JvCaptionPanel wegnehme.

Da hast du vollkommen recht, werde das in obigem Beitrag noch korrigieren.

Zitat:

{$IFDEF DEBUG} hat doch aber nichts mit dem CaptionPanel zu tun ???
Hat es nicht, aber die Syntax der uses-Klausel muss stimmen. Nur genau ein Komma zwischen zwei Units.

Grüße
Dalai

davtix 31. Okt 2021 13:59

AW: Unterschiedliche Units für Debug und Release
 
Ahhh , die Syntax beginnt mit nem Komma oder vor dem Komma steht {} .
Hab ichs jetzt verstanden ? :)


Auf jedem danke ich dir.
Das werde ich auch für meine anderen Projekte nutzen in dem Tonnen von Test-Proceduren stehen. Die Anwendungen sind dann dementsprechend gross.
Die Codes so sauberer zu halten und die Stunden zur Quellcodesäuberung sind damit hinfällig.

Angenehmen Sonntag dir :hi:

Uwe Raabe 31. Okt 2021 15:39

AW: Unterschiedliche Units für Debug und Release
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von davtix (Beitrag 1496879)
@Uwe Raabe , das habe ich schon probiert jedoch ohne erfolg.

Na sowas! Anbei ein Testprojekt mit dem es funktioniert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00: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