Constante

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
dash_develop
Beiträge: 38
Registriert: So 15. Mai 2016, 13:33

Constante

Beitrag von dash_develop »

Hallo zusammen,

ich habe mal wieder eine Frage.
Ist es möglich einer Constante den OrdnerPfad der Exe zu geben?

Beispiel:

Code: Alles auswählen

 
Const
Freigaben_TXT_Pfad = ExtractFilePath(Application.ExeName)+ 'permissions.txt'


Ist sowas möglich, denn ich bekomme ständig einen Fehler. "Illegal Expressions".
Habe das Gefühl das man Konstanten solche Werte nicht geben kann.

Vielen Dank schonmal für eine Antwort.

Gruß
dash_develop

BeniBela
Beiträge: 309
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Constante

Beitrag von BeniBela »

Code: Alles auswählen

 
 
Const Freigaben_TXT_Pfad: string;
 
begin
 
Freigaben_TXT_Pfad := ExtractFilePath(Application.ExeName)+ 'permissions.txt'; 
 
 

wp_xyz
Beiträge: 4893
Registriert: Fr 8. Apr 2011, 09:01

Re: Constante

Beitrag von wp_xyz »

dash_develop hat geschrieben:

Code: Alles auswählen

 
Const
Freigaben_TXT_Pfad = ExtractFilePath(Application.ExeName)+ 'permissions.txt'

Ist sowas möglich, denn ich bekomme ständig einen Fehler. "Illegal Expressions".
Habe das Gefühl das man Konstanten solche Werte nicht geben kann.

Naja, zur Kompilierzeit ist nicht bekannt, in welchem Verzeichnis die Anwendung später laufen wird. Daher ist Freigaben_TXT_Pfad keine Konstante, sondern eine Variable, und die Fehlermeldung ist völlig in Ordnung. 'Permissions.txt' scheint dagegen eine Konstante zu sein. Daher kannst du dir den Pfad zur Laufzeit zusammenbasteln:

Code: Alles auswählen

const
  Freigaben_TXT_Name = 'permissions.txt';
var
  Freigaben_TXT_Pfad: String;
begin
  Freigaben_TXT_Pfad := ExtractFilePath(Appliation.ExeName) + Freigaben_TXT_Name;

dash_develop
Beiträge: 38
Registriert: So 15. Mai 2016, 13:33

Re: Constante

Beitrag von dash_develop »

Ohman,

sehr simple. Hätte ich eig. auch selbst iwie drauf kommen können...
Vielen Dank ihr 2.
Habt mir sehr geholfen.

dash_develop
Beiträge: 38
Registriert: So 15. Mai 2016, 13:33

Re: Constante

Beitrag von dash_develop »

Ok tut mir Leid, wenn ich jetzt wieder einen von euch Profis nerve aber seitdem ich das mit den Constanten und Variablen so umgesetzt habe,
funktioniert mein ShellExecute Befehl nicht mehr :/..
Kann das sein das ShellExecute nur mit Strings klar kommt?

Code: Alles auswählen

 
var
Batch_Befehl            : Pchar;
 
const
Batch_Befehl_Name     =  '/c "C:\Program Files (x86)\Windows Resource Kits\Tools\srvcheck.exe" \\%computername% >';
Freigaben_TXT_Name  = 'permissions.txt';
 
Procedure FormCreate
Batch_Befehl               := Pchar(Batch_Befehl_Name + ExtractFilePath(Application.ExeName) + Freigaben_TXT_Name);
 
Button Click
ShellExecute (0,'open','cmd.exe',Batch_Befehl,nil,SW_SHOW);
 


Wenn ich mir mein 'Batch_Befehl' als ShowMessage(Batch_Befehl) anzeigen lasse sieht alles gut aus..
Kommt ShellExecute einfach nicht mit Pchar's klar?
Wenn ich das als String mache, bekomme ich eine Fehlermeldung.

wp_xyz
Beiträge: 4893
Registriert: Fr 8. Apr 2011, 09:01

Re: Constante

Beitrag von wp_xyz »

PChar ist ein Zeiger auf einen String. Dem String hast du aber keinen Speicher zugewiesen. Wenn deine Variable Batch_Befehl als String deklariert ist, geschieht dies automatisch. Arbeite primär mit Variablen vom Typ String, die du dann mit einer Typumwandlung in PChar umwandeln kannst, wenn's benötigt wird. So funktioniert dein Code:

Code: Alles auswählen

var
  Batch_Befehl: String;
const
  Batch_Befehl_Name   =  '/c "C:\Program Files (x86)\Windows Resource Kits\Tools\srvcheck.exe" \\%computername% >';
  Freigaben_TXT_Name  = 'permissions.txt';
begin
  Batch_Befehl := Batch_Befehl_Name + ExtractFilePath(ParamStr(0)) + Freigaben_TXT_Name;
  ShellExecute (0,'open','cmd.exe', PChar(Batch_Befehl), nil, SW_SHOW);
end.

Zusätzlich möchte ich noch darauf hinweisen, dass ShellExecute dein Programm nur unter Windows laufen lässt. Falls du irgendwann einmal daran denken solltest, auf Linux zu wechseln, wäre es gut, wenn du schon beizeiten anfängst, nicht mehr in der Windows-Welt zu denken. Das kann nicht schaden. Für deine Fragestellung lautet ein plattformunabhängiger Befehl "RunCommand" (in der Unit Process):

Code: Alles auswählen

var
  Batch_Befehl: String;
  outStr: String;
const
  Batch_Befehl_Name   =  '/c "C:\Program Files (x86)\Windows Resource Kits\Tools\srvcheck.exe" \\%computername% >';
  Freigaben_TXT_Name  = 'permissions.txt';
begin
  Batch_Befehl := Batch_Befehl_Name + ExtractFilePath(ParamStr(0)) + Freigaben_TXT_Name;
  RunCommand('cmd.exe /c dir *.* > ' + ExtractFilePath(ParamStr(0)) + Freigaben_TXT_Name, outStr);
  // In outstr landet die Ausgabe deines Programms, die aber hier wegen der Ausgabeumleitung leer ist.
end.

Mehr über das Ausführen externer Prozesse findest du im Wiki unter http://wiki.freepascal.org/Executing_Ex ... rograms/de

dash_develop
Beiträge: 38
Registriert: So 15. Mai 2016, 13:33

Re: Constante

Beitrag von dash_develop »

OK. Vielen Dank für den Tipp.
Werde mir den Link mal genauer anschauen.

Es ist aber kein Unterschied zu deinem ParamStr(0) und meinem Application.Exename vorhanden?
Einfach nur die Schreibweise oder?

Gruß
dash_develop

wp_xyz
Beiträge: 4893
Registriert: Fr 8. Apr 2011, 09:01

Re: Constante

Beitrag von wp_xyz »

Ist dasselbe. Ich hatte den Code mit einem einfachen Konsolenprogramm getestet, da ist ParamStr(0) der einfachere Zugang zum Programmnamen also über Application.ExeName.

dash_develop
Beiträge: 38
Registriert: So 15. Mai 2016, 13:33

Re: Constante

Beitrag von dash_develop »

Woran kann das liegen, dass er mir die permissions.txt nicht in den Ordner schreibt, wenn der Ordner auf dem Desktop liegt?
Lege ich den in den TEMP Verzeichniss klappt alles einwandfrei.. :/

dash_develop
Beiträge: 38
Registriert: So 15. Mai 2016, 13:33

Re: Constante

Beitrag von dash_develop »

dash_develop hat geschrieben:Woran kann das liegen, dass er mir die permissions.txt nicht in den Ordner schreibt, wenn der Ordner auf dem Desktop liegt?
Lege ich den in den TEMP Verzeichniss klappt alles einwandfrei.. :/


OK hab meinen Fehler selbst entdeckt...
Falscher Code:
/c "C:\Program Files (x86)\Windows Resource Kits\Tools\srvcheck.exe" \\%computername% > E:\Test Umgebung\Testprogramm\permissions.txt

Richtiger Code:
/c "C:\Program Files (x86)\Windows Resource Kits\Tools\srvcheck.exe" \\%computername% > "E:\Test Umgebung\Testprogramm\permissions.txt"

"" fehlt... :( Dumm von mir. Sind Leerzeichen im Pfad..
Naja gut das ich das selbst lösen konnte :)

dash_develop
Beiträge: 38
Registriert: So 15. Mai 2016, 13:33

Re: Constante

Beitrag von dash_develop »

dash_develop hat geschrieben:
dash_develop hat geschrieben:Woran kann das liegen, dass er mir die permissions.txt nicht in den Ordner schreibt, wenn der Ordner auf dem Desktop liegt?
Lege ich den in den TEMP Verzeichniss klappt alles einwandfrei.. :/


OK hab meinen Fehler selbst entdeckt...
Falscher Code:
/c "C:\Program Files (x86)\Windows Resource Kits\Tools\srvcheck.exe" \\%computername% > E:\Test Umgebung\Testprogramm\permissions.txt

Richtiger Code:
/c "C:\Program Files (x86)\Windows Resource Kits\Tools\srvcheck.exe" \\%computername% > "E:\Test Umgebung\Testprogramm\permissions.txt"

"" fehlt... :( Dumm von mir. Sind Leerzeichen im Pfad..
Naja gut das ich das selbst lösen konnte :)



Zu früh gefreut.. Also über die Windows Konsole funktioniert der Befehl einwandfrei.

Aber mit Shellexecute in Lazarus passiert nichts... :(

Antworten