Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Parameter (https://www.delphipraxis.net/53571-parameter.html)

sysadmin 19. Sep 2005 10:57


Parameter
 
Hallo

Ich komme mit ParamStr nicht so ganz nach.

Ich habe folgendes Programm bereits geschrieben.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ShellExecute(application.Handle, 'print','Pfad\Datei', nil, nil, SW_Show);
end;
Nun möchte ich Pfad\Datei als Parameter mitgeben, wenn ich das Programm mit Ausführen starte

zB. Pfad\MeinProgramm.exe Pfad\Datei

Danke

Hador 19. Sep 2005 11:03

Re: Parameter
 
Einfach:
Delphi-Quellcode:
ShellExecute(application.Handle, 'print','Pfad\Datei', 'Parameter', nil, SW_Show);
Ich hoffe mal, dass ich das noch richtig im Gedächtnis habe ^^

Und abfragen dann über
Delphi-Quellcode:
ParamStr(1)
EDIT:

Zitat:

Zitat von Delphi 7 PE Hilfe
HINSTANCE ShellExecute(

HWND hwnd, // handle to parent window
LPCTSTR lpOperation, // pointer to string that specifies operation to perform
LPCTSTR lpFile, // pointer to filename or folder name string
LPCTSTR lpParameters, // pointer to string that specifies executable-file parameters
LPCTSTR lpDirectory, // pointer to string that specifies default directory
INT nShowCmd // whether file is shown when opened
);


Kroko1999 19. Sep 2005 11:05

Re: Parameter
 
(1) paramstr (0)
(2) Application.exename

n0b0dy 19. Sep 2005 11:09

Re: Parameter
 
das andere programm startest du so:

Delphi-Quellcode:
  ShellExecute(Handle, 'open', 'exename', 'Pfad\Datei', nil, SW_SHOWNORMAL);
und die auswertung im ersten programm folgendermaßen
Delphi-Quellcode:
  if ParamCount > 0 then
    Showmessage(ParamStr(1))

// gibt dann Pfad\Datei aus

himitsu 19. Sep 2005 12:17

Re: Parameter
 
Und net vergessen Pfad\Datei in " einzuschließen, sonst kann es dir passieren, daß deine Dateiangaben auf mehrere Parameter aufgesplittet werden. (wenn z.B. Leerzeichen enthalten sind)
Code:
ShellExecute(application.Handle, 'print','[color=red]"[/color]Pfad\Datei[color=red]"[/color]', nil, nil, SW_Show);

sysadmin 19. Sep 2005 13:03

Re: Parameter
 
Anscheindend Versteht ihr mich falsch oder ich euch.

Ich habe hier mein Druckprogramm "MyProgramm.exe" jetzt möchte ich das mit der Eingabe aufforderung starten und gleichzeitig dem Programm den Pfad und Dateinamen des Files geben welches es ausgeben soll.
In der Eingabeaufforderung sieht das dann so aus:
C:\MyProgramm.exe -"C:\Dokumente und Einstellungen\Benutzer\Eigene Dateien\File.txt"

leddl 19. Sep 2005 13:12

Re: Parameter
 
Wie jetzt? Per Eingabeaufforderung, oder per ShellExecute? Drück dich doch mal deutlich aus. Wie es per ShellExecute geht wurde es dir doch jetzt mehrfach gesagt.
Falls es dir darum geht die Parameter mit denen deine Anwendung gestartet wurde zu erfahren (Danach hast du aber bisher nun wirklich nicht geftag), dann fragst du eben ParamStr ab. ParamStr[0] ist der Pfad und Name deines Programmes, ParamStr[1] ist der erste Parameter, ParamStr[2] der zweite. Vor dem Auslesen solltest du allerdings per ParamCount überprüfen, wieviele Parameter angegeben wurden.

Christian Seehase 19. Sep 2005 13:18

Re: Parameter
 
Moin Sysadmin,

dann könntest Du es so aufrufen:

Delphi-Quellcode:
ShellExecute(0,'open','cmd.exe',nil,PChar('/C "C:\MyProgramm.exe" "C:\Pfad zu der Datei\Datei.txt"'),SW_SHOW);
[EDIT]

Ggf so:

Delphi-Quellcode:
ShellExecute(0,'open','cmd.exe',nil,PChar('/C "C:\MyProgramm.exe" "'+paramstr(1)'"'),SW_SHOW);
wobei Du hier, wie schon angesprochen wurde, erst einmal prüfen solltest, ob paramstr(1) überhaupt etwas enthält.
[/EDIT]

sysadmin 20. Sep 2005 07:44

Re: Parameter
 
Habe mein Problehm gelöst. Vielen Dank an für eure Hilfe.

Mein Code:
Delphi-Quellcode:
if ParamCount > 0 then
ShellExecute(application.Handle, 'print', PChar(ParamStr(1)), nil, nil, SW_Show);

leddl 20. Sep 2005 08:19

Re: Parameter
 
Wobei ich mir jetzt gerade nicht ganz sicher bin, ob ParamCount nicht auch ParamStr[0] mitzählt... :gruebel: Ich denke eigentlich schon. Daher solltest du evtl auf "ParamCount > 1" prüfen.
Probiers mal aus, ich hab grade leider kein Delphi zur Hand.

n0b0dy 20. Sep 2005 09:07

Re: Parameter
 
@Leddl

ParamStr(0) ist soweit ich weiß der eiegene exename (incl. Pfad)

leddl 20. Sep 2005 09:12

Re: Parameter
 
:gruebel: Ja... und? Genau das hab ich oben schon geschrieben. Aber inwiefern hilft das? ;)

PS: Warum mach ich eigentlich ständig eckige Klammern bei ParamStr? :roll:

n0b0dy 20. Sep 2005 09:20

Re: Parameter
 
hm aso meinst du das.
na dann eben ParamCount > 1.
hast schon recht :wall: :wall: :wall:

ich mach das immer inner schleife, und hab mir darüber noch keine gedanken gemacht. *g*
die läuft dann von 1 to ParamCount.

also haste recht1

leddl 20. Sep 2005 09:40

Re: Parameter
 
Zitat:

Zitat von n0b0dy
hm aso meinst du das.
na dann eben ParamCount > 1.
hast schon recht :wall: :wall: :wall:

ich mach das immer inner schleife, und hab mir darüber noch keine gedanken gemacht. *g*
die läuft dann von 1 to ParamCount.

also haste recht1

:gruebel: Wie jetzt? Die beiden Absätze widersprechen sich irgendwie. Im einen gibst du mir recht und sagst, daß ParamStr(0) mitgezählt wird, im nächsten sagst du, deine Schleife läuft von 1 bis ParamCount. Sollte ParamStr(0) aber mitgezählt werden bekommst du ne Exception. Also wenn, dann bis ParamCount-1 ;)

@sysadmin:
Aber so, wie du das jetzt gelöst hast, ist es eigentlich auch nicht sinnvoll. Was machst du, wenn dein Programm zwar mit einem Parameter gestartet wird, dieser aber komplett unsinnig ist?
Besser wäre es, erst zu überprüfen, ob ParamCount > 1 ist (oder 0, falls ParamStr(0) nicht mitgezählt wird), und dann zu testen, ob die Datei überhaupt existiert. Evtl wäre es auch noch besser, den Parameter in "s zu packen, damit er auch auf jeden Fall als 1 Parameter erkannt wird. (Edit: Wobei ich ja auch nicht der erste bin, der das hier sagt :roll:)
Delphi-Quellcode:
if (ParamCount > 1) and (FileExists(ParamStr(1))) then
  ShellExecute(application.Handle, 'print', PChar('"' + ParamStr(1) + '"'), nil, nil, SW_Show);

n0b0dy 20. Sep 2005 09:57

Re: Parameter
 
hää?

da wird doch keine Exception ausgelöst, wenn ich das hier mache:

Delphi-Quellcode:
  for i := 1 to ParamCount do
    if FileExists(ParamStr(i)) then
      // öffne diese Datei unter ParamSTr(i)
ParamStr(0) gibt es immer, egal ob ich parameter übergebe oder nicht.
und in diesem fall wird halt ParamStr(0) nicht berücksichtigt, weil ich ja nicht die eigene exe öffnen will... (eigeneExe steht ja unter ParamStr(0))

oder ich raff grade net, was du mir sagen willst :) :gruebel:

dfried 20. Sep 2005 10:02

Re: Parameter
 
Er ging halt davon aus, dass auch wenn keine Parameter an das Programm übergeben werden der Paramcount = 1 ist, weil ja Paramstr(0) immer da ist. Dem ist aber nicht so. Paramcount berücksichtigt Paramstr(0) nicht und gibt somit 0 zurück wenn keine Parameter an das Programm übergeben wurden.

leddl 20. Sep 2005 10:17

Re: Parameter
 
Wenn ParamStr 0-basiert ist (und ParamCount den 0-ten Parameter mitzählt!), ist der höchste Index ParamCount-1. Daher bekommst du beim Zugriff auf ParamStr(ParamCount) eine Zugriffsverletzung, da dieser Parameter schließlich nicht existiert ;)

@dfried:
Genau das war ja meine Frage. Ich war mir nicht sicher, ob ParamCount eben auch ParamStr(0) mitzählt, da ich schon lange nicht mehr mit Parametern gearbeitet habe.
Aber n0b0dy meinte ja, daß es so sei, und daher war seine Aussage eben widersprüchlich.

Mit dem Wissen, daß dem aber nicht so ist, sollte also der Ausdruck tatsächlich lauten:
Delphi-Quellcode:
if (ParamCount > 0) and (FileExists(ParamStr(1))) then
  ShellExecute(application.Handle, 'print', PChar('"' + ParamStr(1) + '"'), nil, nil, SW_Show);

n0b0dy 20. Sep 2005 10:19

Re: Parameter
 
nein. es ist eben nicht so!!!

ParamStr(0) wird bei ParamCount NICHT mitgezählt.

jetzt bald weiß ich net mehr was stimmt udn was net :D ich überprüfe das gleichmal


[EDIT]
Zitat:

Zitat von n0b0dy
hm aso meinst du das.
na dann eben ParamCount > 1.
...

hm habs überprüft und habe recht. also müsste es in der tat ParamCount >= 1 heißen oder einfach nur ParamCount > 0 ;)

dfried 20. Sep 2005 10:24

Re: Parameter
 
Zitat:

Zitat von n0b0dy
nein. es ist eben nicht so!!!

Was ist eben nicht so?

leddl hat doch schon geschrieben, dass er sich nicht sicher war ob ParamCount auch den ParamStr(0) mitsählt, und nach meinem Post hat er ja dann auch nettwerweise gleich noch eine Funktionierende Lösung mitgeliefert?!?

Oder versteh ich jetzt nur Bahnhof :wall:

leddl 20. Sep 2005 10:25

Re: Parameter
 
:roll: Nein, passt jetzt schon. n0b0dy hat wohl nur vergessen, was er vorhin gesagt hat. :mrgreen:

sysadmin 20. Sep 2005 10:26

Re: Parameter
 
wie kann ich das Programm automatisch schliessen lassen? mit
Delphi-Quellcode:
close;
geht es nicht, und die anderen beiträge zum Thema Beenden helfen mir auch nicht weiter.

n0b0dy 20. Sep 2005 10:27

Re: Parameter
 
*g* hm. jetzt bin ich zwar total verwirrt, aber ich werde das hoffenltich net alll zu oft mehr brauchen :D

ne, aber dann hatte ich vorhin wohl mal wieder nen aussetzer ;)

[EDIT]
wenn Application.Terminate auch nicht geht, dann weiß ichs uach net...

leddl 20. Sep 2005 10:29

Re: Parameter
 
Zitat:

Zitat von sysadmin
wie kann ich das Programm automatisch schliessen lassen? mit
Delphi-Quellcode:
close;
geht es nicht, und die anderen beiträge zum Thema Beenden helfen mir auch nicht weiter.

:gruebel:
Erstens gilt hier normalerweise "Neue Frage, neuer Thread", damit man auch was findet und zweitens: Präzisier das doch mal genauer, was geht nicht? Meine Programme lassen sich sehr wohl mit Close schließen.

Grishnak 20. Sep 2005 10:32

Re: Parameter
 
c:\>programm eins zwei drei vier

ParamCount: 4
ParamStr(0): c:\programm.exe
ParamStr(1): eins
ParamStr(2): zwei
ParamStr(3): drei
ParamStr(4): vier

Der Zugriff auf ParamStr(ParamCount) ist also kein Problem!

leddl 20. Sep 2005 10:34

Re: Parameter
 
:roll: Warum muß man eine inzwischen gelöste Frage noch breittreten? :wall:

Grishnak 20. Sep 2005 10:37

Re: Parameter
 
Zitat:

Zitat von leddl
Warum muß man eine inzwischen gelöste Frage noch breittreten?

Ich fand, dass sie nicht eindeutig und verständlich beantwortet war!
Ansonsten bitte ich meine Hilfe zu entschuldigen!

Sharky 20. Sep 2005 10:41

Re: Parameter
 
Zitat:

Zitat von leddl
... :wall:

Als erstes gilt hier mal der Grundsatz der Höflichkeit! Es gibt keinen Grund jemandem vorzuwerfen wenn er noch einmal eine weitere Erläuterung postet.

Sicher, es bringt nichts wenn nach einer Lösung noch zig weitere Postings mit der selben Lösung kommen. ABER dies ist kein Grund unhöflich zu werden.


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