![]() |
Wie Parameter für IDE-Tools festlegen?
Liste der Anhänge anzeigen (Anzahl: 1)
Moin,
so wie es aussieht hab ich ein paar Problemchen damit. siehe ![]() Für mein Tool hab ich diesen Paremeter definiert:
Code:
Hierbei sollte Delphi/BDS/RAD nun das "$PROJECT" durch den Projektnamen (C:\irgendwas\myprojekt.proj) ersetzen.
IniFile=$PROJECT CreateIni=yes
Mit Delphi 2010 funktioniert dieses auch problemlos. Unter Delphi 2007 und 2006 aber leider nicht. In Delphi 7 geht es zwar auch nicht, aber dort gibt es auch kein Makro für den Projektnamen. IniFile=$PATH($EXENAME)$NAMEONLY($EXENAME).dpr sieht doof aus, aber hier werde ich wohl einfach $EXENAME verwenden (mein Programm ersetzt ja eh die Dateiendung) und hoffen daß man die EXE im Projektverzeichnis erstellen läßt. Nun hab ich mit dem Anhang als Tool rausgefunden, daß es Probleme gibt, wenn die Parameter nicht alleine stehen (z.B. von Leerzeichen umgeben). Hat da zufällig schon jemand einen Tipp, wie man dieses lösen kann? [edit]
Code:
funktioniert zwar, allerdings wird da ein Leerzeichen zwischen = und den Projektnamen gelegt, so daß es dann 2 getrennte Parameter ergibt. :(
$NAME(IniFile=)$PROJECT
|
Re: Wie Parameter für IDE-Tools festlegen?
Wenn ich in den Tools Eigenschaften als Parameter nur "$PROJECT" angebe
erhale ich den korrekten Pfad. Wenn ich noch irgendwas anderes drin hab bekomme ich den String "$PROJECT". Oder hattest Du das schon? EDIT: Ich glaub ich habs: geht nix: test= $PROJECT geht : test= '$PROJECT' Edit2: Sorry. Vergiss es. Ist selbstverständlich nur wegen dem Abstand. Vermutlich ist blackfin's Vorschlag die Auswertung umzudrehen am sinnvollsten? Dies würde auch mit D2009/2010 funktionieren. |
Re: Wie Parameter für IDE-Tools festlegen?
Jupp, daß ist auch das Problem.
Nur "$PROJECT" geht, aber in "IniFile=$PROJECT CreateIni=yes" wird es nicht ersetzt. |
Re: Wie Parameter für IDE-Tools festlegen?
Also.....es geht theoretisch, wenn du die Logik "umdrehst", also der Wert vor dem = steht und dahinter die Eigenschaft:
Parameter: $PATH($PROJECT)=Inifile yes=CreateIni Dann bekommst du im Programm als Parameter folgendes: D:\Projekte\Testzeug\params\=Inifile yes=CreateIni Ansonsten ersetzt er dir das leider nicht... Du müsstest halt dann die Parameter "andersrum" parsen, also Wert<>Eigenschaft Ich weiss nicht, ob das was hilft?... |
Re: Wie Parameter für IDE-Tools festlegen?
Nja, es sieht halt etwas "ungewohnt" aus,
vorallem wenn man sich mal die Parameterdefinitionen anderer Programme ansieht. Drum wollte ich die Definitionen eigentlich nicht ändern und hab gehofft man könne Delphi dennoch irgendwie zum Ersetzen bewegen. z.B. wurde auch das probiert, (IniFile=)$PROJECT CreateIni=yes IniFile=($PROJECT) CreateIni=yes wobei hier alles zwischen ( und ) einfach nur weggelassen wird. Aktuell hab ich aber dennoch erstmal meinen Parser (und den Reg-Editor) etwas umgebaut, womit nun auch Nachfolgendes geht. Allerdings muß man ja auch aufpassen, daß die Definitionen relativ eindeutig sind, um Fehlinterpretationen zu vermeiden.
Code:
IniFile=$PROJECT CreateIni=yes
==IniFile $PROJECT CreateIni=yes ==IniFile $PROJECT ==CreateIni yes
Delphi-Quellcode:
Function ReadParam(Name: String; toLower: Boolean = False): String;
Var i: Integer; Begin Result := ''; Name := LowerCase(Name) + '='; For i := ParamCount downto 1 do If Pos(Name, Trim(LowerCase(ParamStr(i)))) <> 0 Then Begin Result := Trim(Copy(ParamStr(i), Length(Name) + 1)); Break; End; Name := '==' + LowerCase(Name); If Result = '' Then For i := ParamCount - 1 downto 1 do If (Name = LowerCase(ParamStr(i))) and ((i <= 1) or (Copy(ParamStr(i - 1), 1, 2) <> '==')) Then Begin Result := Trim(ParamStr(i + 1)); Break; End; If toLower Then Result := AnsiLowerCase(Result); End; |
Re: Wie Parameter für IDE-Tools festlegen?
Langsam werd ich richtig wuschig.
Jetzt läuft das mit den Parametern, aber ein anderes Problem tut sich auf. Anfangs wurde der Pfad "automatisch" von Delphi in " gesetzt, wenn Leerzeichen enthalten waren Aber nun passiert das urplötzlich nicht mehr. :wall: Und manuell kann man das nicht machen, da es dann heißt, das Makro sei unbekannt. Das kann doch alles nicht Wahr sein. :cry: |
Re: Wie Parameter für IDE-Tools festlegen?
Heieiei...das ist echt bugverseucht...
$EXENAME macht er mit Quotes...$PROJECT nicht... :wiejetzt: Ich habs bis jetzt auch nicht geschafft....das ist doch zum verrückt werden... |
Re: Wie Parameter für IDE-Tools festlegen?
Zitat:
"$MAKRO" übersetze er nicht ... anscheinend wird " als Nameszeichen angesehn, weßhalb da wohl auch gemekert wird, daß es das Makro dann nicht gäbe. Anscheinend hab ich jetzt was, aber ein paar weitere Test wollte ich dennoch erstmal machen. [edit] grade nochmal getestet $EXENAME und $HOSTNAME werden mit " und $PROJECT wird ohne " übergeben. Aber ich brauche ja nunmal gerade das Projekt. [edit]
Code:
Die 1 funktioniert in D2010 halbwegs, denn ab der () wird alles einfach weggelassen,
1: CreateIni=yes IniFile="$PROJECT()"
2: CreateIni=yes ==IniFile "$PROJECT()" 3: CreateIni=yes ==IniFile ""$PROJECT() darum auch die getauschten Parameter (zum Glück hab ich inzwischen keine fixen Parameterpositionen mehr). Und zum Glück macht es dem ![]() In D2006 geht die 1 ja nicht, aber dafür geht die Variante 2 (zumindestens mit $EXENAME ginge es), aber mit $PROJECT ... nja, auch hier wird ab dem () alles weggelassen, allerdings meckert hier die IDE darüber, daß es kein schließendes " gäbe (ja nee, is klar :wall: ) Zitat:
|
Re: Wie Parameter für IDE-Tools festlegen?
Murmel murmel....
.....wäre es vielleicht eine Idee, das Ding als Expert über die OTA umzuschreiben? Dann kannste doch eigentlich so ziemlich alles aus der IDE ziehen, ohne umständlich über Command line Parameter gehen zu müssen. Und...wäre doch auch nett, direkt die "Himitsu Experts" neben den GExperts zu haben :D |
Re: Wie Parameter für IDE-Tools festlegen?
Nja, im Grunde benötige ich ja "nur" den Dateinamen der Projektdatei
und dafür währe "eigentlich" kein OTA nötig. Nja, in Zukunft ist zwar für was anderes was mit OTA geplant und wenn ich mich dann mit diesem ganzen OTA-Zeugs halbwegs auskennt .... vielleicht. Hatte gestern keine Zeit mehr zum Testen und muß auch gleich erstmal 'nen Weilchen weg, aber aus gegebenem Anlaß geht ich nun erstmal über eine zweite Anwendung, welche die/den "einen" übergebenen Parameter analysiert, beim Fehlen der " die vielen Parameter wieder zu Einem zusammensetzt, alles um das Parameter-Prefix und den zweiten Parameter erweitert und das dann an meinen MC weiterleitet. (nach hoffentlich erfolgreichen Tests dann mehr dazu) |
Re: Wie Parameter für IDE-Tools festlegen?
Aktuell hab ich also nur eine Lösung gefunden.
(die Makros der IDE-Tools sind wirklich vollkommen schrottig und obwol sich schon was, seit Delphi 2009/2010 geändert hat, ist es insgesamt unzumutbar und mich wundert es, daß sich da nur so Wenige beschwert haben) * Zuerst sind vor Delphi 2009/2010 keinen kombinierten Parameter ala "abc=$PROJECT" möglich. * Und man muß die Parameter selber parsen, denn ohne die " würde ein Parameter ja eventuell als mehrere Parameter erkannt (z.B. bei enthaltenen Leerzeichen). Problem dabei ist, daß man praktisch nur einen Parameter von der IDE aus übergeben kann, oder man muß mit der Reihenfolge aufpassen. - zuerst alle Parameter, welche von der IDE aus korrekt übergeben werden und danach ist nur noch ein Parameter möglich (wobei man hier notfalls mit einem Trennzeichen/Trennwort arbeiten könnte) Eie einfache Möglichkeit den fehlerhaften $PROJECT auszulesen, wäre (wobei man nun bei allen möglichen Lösungen von einem festen Format ausgehen muß, um es entsprechend poarsen zu können)
Delphi-Quellcode:
Ein Problem hierbei bilden Datei-/Pfadnamen mit mehrfachen zusamenhängenden Leerzeichen, denn diese wurden beim Parsen in ParamStr entfernt und hier nur durch ein ' ' ersetzt.
// Parameter = "$PROJECT"
Var TheProject: String; i: Integer; TheProject := ParamStr(1); For i := 2 to ParamCount do TheProject := TheProject + ' ' + ParamStr(i); ShowMessage(TheProject); Wenn zusätzlich noch andere Parameter nötig wären, dann
Delphi-Quellcode:
Die Lösung des Leerzeichenproblems wäre also Selberparsen:
// Parameter = "$CURTOKEN $PROJECT"
Var TheProject: String; i: Integer; TheCurrentToken := ParamStr(1); TheProject := ParamStr(2); For i := 3 to ParamCount do TheProject := TheProject + ' ' + ParamStr(i); ShowMessage(TheProject);
Delphi-Quellcode:
Var TheProject: String;
B: Boolean; i: Integer; TheProject := GetCommandLine; i := 1; B := False; While (i <= Length(TheProject)) and ((TheProject[i] > ' ') or B) do Begin If TheProject[i] = '"' Then B := not B; Inc(i); End; TheProject := Trim(Copy(TheProject, i, Length(TheProject) - i + 1)); If (TheProject <> '') and (TheProject[1] = '"') Then Begin Delete(TheProject, 1, 1); If (TheProject <> '') and (TheProject[Length(TheProject)] = '"') Then Delete(TheProject, Length(TheProject), 1); End; ShowMessage(TheProject); Nun, in meinem Fall wollte ich aber nicht die Parameterbehandlung im eigenem Programm verändern und hab mir somit ein Hilfsprogramm erstellt, welches den Parameter parst, anpaßt und an die eigentlich Anwendung weitergibt.
Delphi-Quellcode:
Auf's Nötigste gekürzt kam letztendlich Folgendes raus, welches dann zusammen mit Delphi 7 eine kleine 15,5 KB-Datei ergab (mit UPX 9 KB), welche ich direkt innerhalb die Zielanwendung ausliefere.
Var TheProject, TheApplication, TheParameter, TheWorkingDirectory: String;
B: Boolean; i: Integer; TheProject := GetCommandLine; i := 1; B := False; While (i <= Length(TheProject)) and ((TheProject[i] > ' ') or B) do Begin If TheProject[i] = '"' Then B := not B; Inc(i); End; TheProject := Trim(Copy(TheProject, i, Length(TheProject) - i + 1)); If (TheProject <> '') and (TheProject[1] = '"') Then Begin Delete(TheProject, 1, 1); If (TheProject <> '') and (TheProject[Length(TheProject)] = '"') Then Delete(TheProject, Length(TheProject), 1); End; TheApplication := ExctractFilePath(ParamStr(0)) + 'TheApplication.exe'; TheParameter := 'IniFile="' + TheProject + '" CreateIni=yes'; TheWorkingDirectory := GetDir(0); If Integer(ShellExecute(0, nil, PChar(TheApplication), PChar(TheParameter), PChar(TheWorkingDirectory), SW_NORMAL)) <= 32 Then RaiseLastOSError; (gut, daß ich so "faul" war und diese kleine App als String und nicht über Resource eingebunden hab, sei mal dahingestellt)
Delphi-Quellcode:
Program IDEForward;
Uses Windows, ShellAPI; Var Mb, Pb, Db: Array[1..1024] of WideChar; M, P, D, P2: PWideChar; B: Boolean; Begin M := @Mb; GetModuleFileNameW(0, M, Length(Mb)); P2 := M + lstrlenW(M) - 1; While P2^ <> '\' do Dec(P2); lstrcpyW(P2 + 1, 'ManifestCreator.exe'); P := PWideChar(@Pb) + 10; lstrcpyW(P, GetCommandLineW); B := False; While (P^ > ' ') or B do Begin If P^ = '"' Then B := not B; Inc(P); End; While (P^ > #0) and (P^ <= ' ') do Inc(P); P2 := P; While P2^ <> #0 do Inc(P2); While (P2 > P) and ((P2 - 1)^ <= ' ') do Dec(P2); If P^ = '"' Then Begin Inc(P); If (P2 > P) and (P2^ = '"') Then Dec(P2); End; Dec(P); lstrcpyW(P - 8, 'IniFile='); P^ := '"'; Dec(P, 8); lstrcpyW(P2, '" CreateIni=yes'); D := @Db; GetCurrentDirectoryW(Length(Db), D); If Integer(ShellExecuteW(0, nil, M, P, D, SW_NORMAL)) > 32 Then Halt(1) Else Halt(0); End. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:28 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