Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

XE5: Variablen in Pfadnamen

97 views
Skip to first unread message

Heiko Rompel

unread,
Dec 29, 2013, 6:19:19 PM12/29/13
to
Moin,

man kann ja in den Optionen f�r alles und jeden einzelne Ausgabepfade
einstellen (Release 32Bit, Release 64Bit, Debug 32, Debug 64 , Windows,
iOS, Android)

Aber, gibt es auch Variablen, die ich in "Alle Konfigurationen - Alle
Plattformen" eintragen kann und die obiges dann "automatisch" erledigen?

Ich denke so an d:\projekte\delphi\xe5\{projektname}\{plattform}\{build}
und das ganze solle dann soweit nicht manuell ge�ndert als Default f�r
alle neuen Projekte gelten.

In der OH und bei Tange g**gle habe ich nicht gefunden (vielleicht mal
wieder nur die falschen Suchbegriffe)

Gibt es solche Variable?
Wenn ja, wo finde ich eine �bersicht?

Wenn ja, k�nnte man die dann z.B. auch bei den "Versionsinformationen"
im Feld "Kommentare" nutzen?

Gru� Heiko

Heiko Rompel

unread,
Jan 1, 2014, 11:32:34 AM1/1/14
to
Nachtrag:

Also $(Config) habe ich in der OH gefunden.
Aber, f�r das Zielsystem und den Projektnamen habe ich keine Variablen
gefunden.

Gru� Heiko

Faxe

unread,
Jan 1, 2014, 12:19:17 PM1/1/14
to
Moin,

das Zielsystem wird wohl mit $(Platform) angegeben.

Standardeintrag bei neuem Projekt ist ja:
.\$(Platform)\$(Config)

Gru�,
Rainer

Faxe

unread,
Jan 1, 2014, 12:48:30 PM1/1/14
to
Nachtrag:

Das $(ProjectDir) hab ich hier mal gesehen:
http://www.delphipraxis.net/166030-$-variablen-den-projektoptionen.html

Gru�,
Rainer

Heiko Rompel

unread,
Jan 1, 2014, 1:35:51 PM1/1/14
to
Hallo Rainer,

>
> Das $(ProjectDir) hab ich hier mal gesehen:
> http://www.delphipraxis.net/166030-$-variablen-den-projektoptionen.html

Interessant.

>> $(Platform)_$(Config)
Das habe ich so umsetzt.

Jetzt noch ein $(projectname) das den unter "Projekt / Optionen /
Anwendungen / Versionsinformationen / Produktname" eingetragenen
Produktnamen beinhaltet.

Gru� Heiko

Arno Garrels

unread,
Jan 1, 2014, 2:25:29 PM1/1/14
to
Gibs nicht ;) Eine Echse erhält immer den Projektnamen wie er im Projektmanager sichtbar ist. Aber es gibt das Post-Build-Event.
Dort könnte man die Echse kopieren und umbenennen (ungetestet).

--
Arno

Heiko Rompel

unread,
Jan 1, 2014, 3:40:25 PM1/1/14
to
Hallo Arno,

> Gibs nicht ;) Eine Echse erh�lt immer den Projektnamen wie er im Projektmanager sichtbar ist. Aber es gibt das Post-Build-Event.
> Dort k�nnte man die Echse kopieren und umbenennen (ungetestet).

Mit geht es nicht um die EXE, sondern um das Zielverzeichnis.
z.B. D:\Projekte\Delphi\{Projektname}\$(Platform)_$(Config)

Gru� Heiko



Arno Garrels

unread,
Jan 2, 2014, 4:28:00 AM1/2/14
to
Heiko Rompel wrote:

> Hallo Arno,
>
>> Gibs nicht ;) Eine Echse erhält immer den Projektnamen wie er im
>> Projektmanager sichtbar ist. Aber es gibt das Post-Build-Event. Dort
>> könnte man die Echse kopieren und umbenennen (ungetestet).
>
> Mit geht es nicht um die EXE, sondern um das Zielverzeichnis.
> z.B. D:\Projekte\Delphi\{Projektname}\$(Platform)_$(Config)

Wie auch immer, wenn "{Projektname}" keine Konstante oder Umgebungsvariable ist, die du bei der Angabe des Ausgabeverzeichnis in den Projektoptionen verwenden könntest, bietet sich das Post-Build-Event an (Projektoptionen | Build-Events). Schreibst du ein kleines Konsoleprogramm welches die Versionsinformationen der Echse liest (wie z.B. http://delphidabbler.com/articles?article=20), daraus einen Verzeichnisnamen bastelt, das Verzeichnis erstellt und die Echse da hinein kopiert. Etwas Einfacheres fällt mir momentan leider nicht ein.

--
Arno

Heiko Rompel

unread,
Jan 2, 2014, 8:24:49 AM1/2/14
to
Hallo Arno,

> Wie auch immer, *wenn* "{Projektname}" keine Konstante oder
> Umgebungsvariable ist, die du bei der Angabe des Ausgabeverzeichnis
> in den Projektoptionen verwenden k�nntest,

Aber, genau das ich ja meine Frage: "Gibt von Seiten der IDE eine
"Konstante" oder "Umgebungsvariable" die den Namen des aktuellen
Projektes enth�lt???"

Wenn ich ein neues Projekt anlege, dann hei�t dieses in der
Projektverwaltung erst mal "Project1.exe".

Speichere ich das Projekt das erste mal, dann kann ich als erstes der
"Unit" einen neuen Namen geben und als n�chstes der ".dproj"-Datei.

Wenn ich an dieser Stelle der ".dproj"-Datei einen neuen Namen gebe,
wird auch der Name in der Projektverwaltung aktualisiert.

�ndere ich als erstes den Projektnamen in der Projektverwaltung,
dann wird mir der neue Name auch als Name f�r die ".dproj"-Datei angeboten.

Jetzt ist es die Frage:"Steht dieser "Projektname" in irgendeiner
Variablen oder Konstante, auf die man in den Projektoptionen Zugriff hat?"

Gru� Heiko



Arno Garrels

unread,
Jan 2, 2014, 9:14:51 AM1/2/14
to
Heiko Rompel wrote:

> Hallo Arno,
>
>> Wie auch immer, *wenn* "{Projektname}" keine Konstante oder
>> Umgebungsvariable ist, die du bei der Angabe des Ausgabeverzeichnis
>> in den Projektoptionen verwenden könntest,
>
> Aber, genau das ich ja meine Frage: "Gibt von Seiten der IDE eine
> "Konstante" oder "Umgebungsvariable" die den Namen des aktuellen
> Projektes enthält???"
>
> Wenn ich ein neues Projekt anlege, dann heißt dieses in der
> Projektverwaltung erst mal "Project1.exe".
>
> Speichere ich das Projekt das erste mal, dann kann ich als erstes der
> "Unit" einen neuen Namen geben und als nächstes der ".dproj"-Datei.
>
> Wenn ich an dieser Stelle der ".dproj"-Datei einen neuen Namen gebe,
> wird auch der Name in der Projektverwaltung aktualisiert.
>
> Ändere ich als erstes den Projektnamen in der Projektverwaltung,
> dann wird mir der neue Name auch als Name für die ".dproj"-Datei
> angeboten.
>
> Jetzt ist es die Frage:"Steht dieser "Projektname" in irgendeiner
> Variablen oder Konstante, auf die man in den Projektoptionen Zugriff
> hat?"

Du musst dich schon für einen bestimmten Projektnamen entscheiden. Vorher hast du nach dem Projektnamen in der *Versionsresource* gefragt. Der IDE-Standard-Name des Projekts steht in $(MSBuildProjectName).

--
Arno

Heiko Rompel

unread,
Jan 2, 2014, 10:30:01 AM1/2/14
to
Hallo Arno,

> Du musst dich schon f�r einen bestimmten Projektnamen entscheiden.

Ich bin der Meinung immer von dem selben Programmnamen geredet zu haben.

> Vorher hast du nach dem Projektnamen in der *Versionsresource*
> gefragt.

Weil ich das zu dem Zeitpunkt als einzige Stelle angesehen hatte, an der
man einen Projektnamen definieren k�nnte.

> Der IDE-Standard-Name des Projekts steht in $(MSBuildProjectName).

Super, das war genau das was ich gesucht habe.

Jetzt, habe ich meine Ausgabepfad-Konfiguration so definiert:

d:\projekte\delphi\xe5\$(MSBuildProjectName)\$(Platform)_$(Config)

was schon f�r reichlich Ordnung sorgt.
Den vorderen Teil lege ich vielleicht auch noch in eine Umgebungsvariable.

Das einzige was jetzt noch nervt, ist die Tatsache das ich diese
Vorgaben, in jedes Projekt neu einladen muss.
Kann man diese Daten und auch die Tatsache das man als Zielplattform
auch Win64 (iOS, Android) haben will, nicht irgendwo als Standard f�r
ALLE neuen Projekte definieren?

Gru� Heiko

Heiko Rompel

unread,
Jan 4, 2014, 2:37:16 AM1/4/14
to
Hallo Arno,

> Der IDE-Standard-Name des Projekts steht in $(MSBuildProjectName).
>

Schade, damit funktioniertes doch nicht richtig.
Es ist alles super wenn ich das Projekt mittels
[Umschalt][F9] Erzeuge oder mittels [STRG][F9] Compiliere,
aber ein Start mittels [F9] ausf�hre erhalte ich die Meldung:

Programm 'D:\projekte\delphi\Delphi
XE5\%MSBuildProjectName%\Win32_Debug\Mathetrainer.exe' kann nicht
gefunden werden.

Starte ich das Programm mittels [Umschalt][STRG][F9], erhalte ich die
Meldung:

Prozess kann nicht erzeugt werden: Der Verzeichnisname ist ung�ltig.

Also, scheint %MSBuildProjectName% nicht durchg�ngig "aufgel�st zu werden".

Oder mu� ich meine Pfadangabe aus den "Projektoptionen / Delphi-Compiler
/ Ausgabeverzeichnis" und "DCP-Ausgabeverzeichis"

D:\projekte\delphi\Delphi XE5\$(MSBuildProjectName)\$(Platform)_$(Config)

noch irgendwo eintragen?

Gru� Heiko

Heiko Rompel

unread,
Jan 4, 2014, 2:45:01 AM1/4/14
to
ersetze ich "$(MSBuildProjectName)" durch "Mathetrainer"

dann l�uft alles normal.

Gru� Heiko

Arno Garrels

unread,
Jan 5, 2014, 7:01:52 AM1/5/14
to
Heiko Rompel wrote:

> Hallo Arno,
>
>> Der IDE-Standard-Name des Projekts steht in $(MSBuildProjectName).
>>
>
> Schade, damit funktioniertes doch nicht richtig.
> Es ist alles super wenn ich das Projekt mittels
> [Umschalt][F9] Erzeuge oder mittels [STRG][F9] Compiliere,
> aber ein Start mittels [F9] ausführe erhalte ich die Meldung:
>
> Programm 'D:\projekte\delphi\Delphi
> XE5\%MSBuildProjectName%\Win32_Debug\Mathetrainer.exe' kann nicht
> gefunden werden.
>
> Starte ich das Programm mittels [Umschalt][STRG][F9], erhalte ich die
> Meldung:
>
> Prozess kann nicht erzeugt werden: Der Verzeichnisname ist ungültig.
>
> Also, scheint %MSBuildProjectName% nicht durchgängig "aufgelöst zu
> werden".

Yup, teste mal Folgendes:

{code}
{*_* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Description: Adds/writes an environment variable "ProjectName" before each compile.
Usage: 1.) Add this unit to a new design-time package.
2.) Make sure "designide.dcp" is in package's Requires node, if not add a reference.
3.) Build and install the package.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
unit uProjectNameVar;

{.$DEFINE DEBUGLOG}


interface

uses
Windows, SysUtils, Classes, Forms, TypInfo,
ToolsApi;

type
TIdeNotifier = class(TNotifierObject, IOTAIDENotifier)
private
FLastDpr : string;
protected
procedure AfterCompile(Succeeded: Boolean);
procedure BeforeCompile(const Project: IOTAProject; var Cancel: Boolean);
procedure FileNotification(NotifyCode: TOTAFileNotification;
const FileName: string; var Cancel: Boolean);
end;

procedure Register;

implementation

var
IDENotifierIndex : Integer = -1;
{$IFDEF DEBUGLOG}
GMessageService: IOTAMessageServices = nil;
{$ENDIF}

{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{$IFDEF DEBUGLOG}
procedure DebugLog(const Msg: string);
begin
GMessageService.AddTitleMessage(Msg);
end;
{$ENDIF}


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure Register;
var
Services : IOTAServices;
begin
Services := BorlandIDEServices as IOTAServices;
{$IFDEF DEBUGLOG}
GMessageService := BorlandIDEServices as IOTAMessageServices;
{$ENDIF}
if IDENotifierIndex = -1 then
begin
IDENotifierIndex := Services.AddNotifier(TIdeNotifier.Create);
{$IFDEF DEBUGLOG}
DebugLog('Installed NotifierIndex: #' + IntToStr(IDENotifierIndex));
{$ENDIF}
end;
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TIdeNotifier.AfterCompile(Succeeded: Boolean);
begin
{$IFDEF DEBUGLOG}
DebugLog('After Compile');
{$ENDIF}
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function SetEnvVar(const VarName, VarValue: string): Integer;
begin
if SetEnvironmentVariable(PChar(VarName),
PChar(VarValue)) then
Result := 0
else
Result := GetLastError;
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TIdeNotifier.BeforeCompile(const Project: IOTAProject;
var Cancel: Boolean);
var
ProjName: string;
LastErr: Integer;
begin
{$IFDEF DEBUGLOG}
DebugLog('Before Compile');
{$ENDIF}
ProjName := ChangeFileExt(ExtractFileName(Project.GetFileName), '');
{$IFDEF DEBUGLOG}
DebugLog('ProjectName=' + ProjName);
{$ENDIF}
LastErr := SetEnvVar('ProjectName', ProjName);
{$IFDEF DEBUGLOG}
if LastErr <> 0 then
DebugLog('Error=' + SysErrorMessage(LastErr));
{$ENDIF}
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TIdeNotifier.FileNotification(NotifyCode: TOTAFileNotification;
const FileName: string; var Cancel: Boolean);
begin
{$IFDEF DEBUGLOG}
DebugLog('FileNotification');
{$ENDIF}
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure RemoveIDENotifier;
var
Services : IOTAServices;
begin
if IDENotifierIndex > -1 then
begin
Services := BorlandIDEServices as IOTAServices;
if Services <> nil then
Services.RemoveNotifier(IDENotifierIndex);
IDENotifierIndex := -1;
end;
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
initialization

finalization
RemoveIDENotifier;

end.
{code}

Heiko Rompel

unread,
Jan 5, 2014, 8:33:15 AM1/5/14
to
Hallo,Arno Garrels schrieb:

> {code}
> {*_* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
>
> Description: Adds/writes an environment variable "ProjectName" before each compile.
> Usage: 1.) Add this unit to a new design-time package.
> 2.) Make sure "designide.dcp" is in package's Requires node, if not add a reference.
> 3.) Build and install the package.
>
> * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}

Jetzt hast Du mich voll erwischt.
Hast Du die Anleitung auch noch in deutsch und DAU sicher?

Gru� HEiko

Arno Garrels

unread,
Jan 5, 2014, 9:26:58 AM1/5/14
to
Erzeuge ein neues Package-Projekt, Datei | Neu | Package
Speicher das Projekt in einem eigenen Verzeichnis z.B. als "dclProjectNameVar" (funktioniert genau so wie bei .EXE-Projekten).
Kopiere meine Unit in dieses Verzeichnis.
Im Projektmanager Kontextmenu des Nodes mit dem Namen dclProjectNameVar.bpl fügst du meine unit dem Projekt hinzu.
Im Projektmanager Kontextmenu des Nodes mit dem Namen Requires klickst do Hinzufügen und schreibst im Feld Name "designide" rein und klickst auf den OK-Knopf.
Speicher alles (funktioniert genau so wie bei .EXE-Projekten).
Im Projektmanager Kontextmenu des Nodes mit dem Namen dclProjectNameVar.bpl klickst du Installieren, fertig.


Über Menu | Komponente | Packages installieren | kannst du die Laufzeitbibliothek wieder entfernen.

--
Arno

Arno Garrels

unread,
Jan 5, 2014, 9:32:31 AM1/5/14
to
Es wird dann die neue Umgebungsvariable "ProjectName" vor jedem Compiliren gesetzt, siehe
procedure TIdeNotifier.BeforeCompile.

Arno Garrels

unread,
Jan 5, 2014, 9:44:06 AM1/5/14
to
Ach ja, die Uses-Klausel ändere mal so:

{code}
uses
Windows, SysUtils, ToolsApi;
{code}


Heiko Rompel

unread,
Jan 5, 2014, 12:52:29 PM1/5/14
to
Hallo Arno,

es FUNKTIONIERT.

Hast Du das liegen gehabt oder mal eben aus dem �rmel gesch�ttelt?

Gru� HEiko

Arno Garrels

unread,
Jan 5, 2014, 1:16:17 PM1/5/14
to
Heiko Rompel wrote:

> Hallo Arno,
>
> es FUNKTIONIERT.

Gut zu wissen.

> Hast Du das liegen gehabt oder mal eben aus dem Ärmel geschüttelt?

TIdeNotifier habe ich kopiert von meinem Kode für ICS, der Rest war ein Kinderspiel.

--
Arno

Heiko Rompel

unread,
Jan 5, 2014, 2:09:46 PM1/5/14
to
Hallo Arno,

> TIdeNotifier habe ich kopiert von meinem Kode f�r ICS, der Rest war ein Kinderspiel.

Kannst Du denn auch einen "automatischen Layout-Umschalter" aus dem
�rmel sch�tteln?

Gru� Heiko

Arno Garrels

unread,
Jan 5, 2014, 2:27:26 PM1/5/14
to
Heiko Rompel wrote:

> Hallo Arno,
>
>> TIdeNotifier habe ich kopiert von meinem Kode für ICS, der Rest war
>> ein Kinderspiel.
>
> Kannst Du denn auch einen "automatischen Layout-Umschalter" aus dem
> Ärmel schütteln?

Nein, was verstehst du unter einem Layout-Umschalter?
Nebenbei, postest du technische Frage wiederholt in non-tech.
Bitte benutze de.comp.lang.delphi.misc für solche Fragen, danke.

--
Arno

Heiko Rompel

unread,
Jan 5, 2014, 3:08:51 PM1/5/14
to
Hallo Arno;

> Nein, was verstehst du unter einem Layout-Umschalter?

Wenn ich vom z.B. mittels F12 von Layout auf Code umschalte, dann soll
von dem gespeicherte Layout "Code" auf das gespeicherte Layout "Code"
automatisch umgeschaltet werden.

> Nebenbei, postest du technische Frage wiederholt in non-tech.
> Bitte benutze de.comp.lang.delphi.misc f�r solche Fragen, danke.

Ich verstehe "de.comp.lang.delphi.misc" als Plattform f�r:
"Wie programmiere ich ein Schleife?", "Wie skaliere ich Fenster XY?", usw.

Mit freundlichem Gru�
Heiko



Arno Garrels

unread,
Jan 6, 2014, 8:13:50 AM1/6/14
to
Heiko Rompel wrote:

> Hallo Arno;
>
>> Nein, was verstehst du unter einem Layout-Umschalter?
>
> Wenn ich vom z.B. mittels F12 von Layout auf Code umschalte, dann soll
> von dem gespeicherte Layout "Code" auf das gespeicherte Layout "Code"
> automatisch umgeschaltet werden.

Dazu fällt mir spontan nichts ein.

>> Nebenbei, postest du technische Frage wiederholt in non-tech.
>> Bitte benutze de.comp.lang.delphi.misc für solche Fragen, danke.
>
> Ich verstehe "de.comp.lang.delphi.misc" als Plattform für:
> "Wie programmiere ich ein Schleife?", "Wie skaliere ich Fenster XY?",
> usw.

Und natürlich auch für Fragen zur Entwicklungsumgebung, denn das ist Delphi auch.

--
Arno

Heiko Rompel

unread,
Jan 6, 2014, 8:43:43 AM1/6/14
to
Hallo Arno;

>> Wenn ich vom z.B. mittels F12 von Layout auf Code umschalte, dann
>> soll
>> von dem gespeicherte Layout "Code" auf das gespeicherte Layout "Code"
>> automatisch umgeschaltet werden.
>
> Dazu f�llt mir spontan nichts ein.

Schade.

> Und nat�rlich auch f�r Fragen zur Entwicklungsumgebung, denn das ist Delphi auch.

Vielleicht sollten wir endlich die Gruppen
de.comp.lang.delphi.datenbanken
de.comp.lang.delphi.misc
de.comp.lang.delphi.non-tech

zusammenlegen.

Gru� HEiko


0 new messages