Autor Beitrag
Bombe
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Sa 28.05.11 13:14 
Hallo,
ich bin Programmierneuling und schreibe gerade eine Simulation in Lazarus.
Dabei berechne ich mehrere Werte, die in in .txt - Dateien abspeichere.
Diese möchte ich nun automatisch mit gnuPlot anzeigen lassen.

Das Problem ist, dass ich gnuPlot nicht aufrufen kann.

Mein Code sieht bisher so aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
program project1;

uses
  ShellAPI;   

{ Berechnungen usw... }

ShellExecute(Handle, nil, PChar('C:\Users\Bombe\Desktop\gnuPlot\gnuplot\binary\gnuplot.exe'), nilnil, SW_SHOWNORMAL);


Dadurch hatte ich mir erhofft, dass automatisch gnuplot aufgerufen wird. Allerdings kriege ich immer die Fehlermeldung, dass
Handle und SW_SHOWNORMAL nicht erkannt werden.

Error: Identifier not found "Handle"

Kann da jemand helfen?

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 28.05.11 13:16 
Hallo und :welcome:

Statt Handle kannst du einfach 0 schreiben. Wo die Konstante in Lazarus definiert ist weiß ich nicht, in Delphi ist es die unit Windows...
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 28.05.11 13:31 
Handle ist keine Konstante, sondern eine Variable oder unter Delphi ein Attribut der Formklasse.
Bombe Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Sa 28.05.11 13:40 
Also wenn ich

ausblenden Delphi-Quelltext
1:
ShellExecute(0nil, PChar('C:\Users\Bombe\Desktop\gnuPlot\gnuplot\binary\gnuplot.exe'), nilnil0);					


schreibe, kann ich zwar kompilieren, aber starten tut das Programm gnuplot leider nicht.

Habs ein wenig weiter editiert, klappt weiterhin nicht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
program project1;

uses
  ShellAPI;  

var
  Handle: Word;
  SW_SHOWNORMAL: Word; 


{ Berechnungen usw... }

ShellExecute(Handle, 'open', PWideChar('C:\Users\Bombe\Desktop\gnuPlot\gnuplot\binary\gnuplot.exe'), nilnil, SW_SHOWNORMAL);   {klappt nicht}
ShellExecute(0'open', PWideChar('C:\Users\Bombe\Desktop\gnuPlot\gnuplot\binary\gnuplot.exe'), nilnil0); {klappt nicht}


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


Zuletzt bearbeitet von Bombe am Sa 28.05.11 13:55, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 28.05.11 13:55 
user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Handle ist keine Konstante, sondern eine Variable oder unter Delphi ein Attribut der Formklasse.
Mit Konstante meinte ich natürlich SW_SHOWNORMAL...

Da selbst irgendetwas zu deklarieren bringt jedenfalls nix... :roll:

Was für ein Fehler passiert denn? Um das zu sehen musst du natürlich die Fehlerbehandlung einbauen, die du bis jetzt einfach mal weggelassen hast. (Rückgabewert, GetLasterror, ...)
Bombe Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Sa 28.05.11 14:09 
Hab mal ein kurzes Beispiel gemacht, um das zu testen. Dann muss ich nicht immer in meiner richtigen Datei rumspielen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
program Project1;

uses
  shellapi;

begin

     ShellExecute(0'open', PCHAR('C:\Windows\notepad.exe'), NILNIL0);

end.


Wenn ich das kompiliere, öffnet sich die Konsole und schließt natürlich sofort wieder. Das Programm Notepad wird allerdings nicht gestartet.

Wenn ich versuche, den Befehl GetLastError( ); zu benutzen, kommt der Fehler "Identifier not found".
Hab das Gefühl, dass da irgendwas fehlt...

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 28.05.11 14:34 
GetLastError ist in der Unit Windows deklariert. Aber du solltest den Rückgabewert von Shellexecute auswerten.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 28.05.11 14:54 
Naja, was erwartest du, wenn du als letzten Parameter 0, also SW_HIDE angibst? Das heißt nun einmal verstecken auf Deutsch... :roll:

Ich nehme an du wirst im Taskmanager die notepad.exe sehen, nur eben laut deinem Wunsch ohne sichtbares Fenster. :nixweiss:
MDX
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 595
Erhaltene Danke: 4

Windows 8.1, Linux Debian 8, Android Lollipop
Delphi, PHP, Java (Android)
BeitragVerfasst: Sa 28.05.11 15:38 
   ShellExecute(0'open', PCHAR('C:\Windows\notepad.exe'), NILNIL, SW_SHOW); schonmal probiert?
Bombe Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Sa 28.05.11 16:00 
@ MDX
Wenn ich das so eintippe, wird nichts kompiliert, weil bei SW_SHOW immer ein Fehler kommt, nämlich
"Error: Identifier not found".

Deswegen schrieb ich ja, dass ich glaube, dass da irgendetwas fehlt. Der Compiler scheint nichts mit SW_Show anfangen zu können.
Deswegen hab ich da eine 0 reingesetzt.

Habe mal im TaskManager nachgeschaut. Da steht wirklich bereits 20x Notepad und x-mal GnuPlot drin. Starten tut er es also, aber warum zeigt er nichts an?

Wie kann ich denn den Rückgabewert von Shellexecute (mit GetLastError) auswerten?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 28.05.11 16:06 
user profile iconBombe hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich das so eintippe, wird nichts kompiliert, weil bei SW_SHOW immer ein Fehler kommt, nämlich
"Error: Identifier not found".
Ich habe schon ganz am Anfang die entsprechende Antwort geschrieben. Ich habe gerade extra nen virtuellen PC mit Lazarus gestartet und es ausprobiert, es ist die selbe Unit... :roll:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wo die Konstante in Lazarus definiert ist weiß ich nicht, in Delphi ist es die unit Windows...


user profile iconBombe hat folgendes geschrieben Zum zitierten Posting springen:
Habe mal im TaskManager nachgeschaut. Da steht wirklich bereits 20x Notepad und x-mal GnuPlot drin. Starten tut er es also, aber warum zeigt er nichts an?
Habe ich doch geschrieben:
0 heißt "zeige bitte möglichst kein Fenster des Prozesses an", eben die Konstante SW_HIDE.

user profile iconBombe hat folgendes geschrieben Zum zitierten Posting springen:
Wie kann ich denn den Rückgabewert von Shellexecute (mit GetLastError) auswerten?
Rückgabewert und GetLastError sind zwei verschiedene Sachen. In diesem Fall brauchst du ersteres:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  ExecResult: Integer;
begin
  ExecResult := ShellExecute...
  if ExecResult <= 32 then
    ShowMessage('Fehlercode: ' + IntToStr(ExecResult));
Das steht aber auch alles in der Dokumentation...
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 28.05.11 16:14 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Das steht aber auch alles in der Dokumentation...

Die liest doch keiner, wie wir hier wieder einmal eindrucksvoll gesehen haben :mrgreen:

Wobei das Lesen der Antworten im Thread auch nicht mehr Allgemeingut zu sein scheint :nixweiss:

P.S.: Verständlich war dein Post aber auch nur bedingt; ich wusste, worauf Du hinaus wolltest, aber ein "Binde noch Unit XY vor ShellAPI ein" wäre etwas deutlicher gewesen, als dein "in Delphi ist es Unit XY".

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Bombe Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Sa 28.05.11 17:01 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wo die Konstante in Lazarus definiert ist weiß ich nicht, in Delphi ist es die unit Windows...



Ich versteh das nicht.
MDX
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 595
Erhaltene Danke: 4

Windows 8.1, Linux Debian 8, Android Lollipop
Delphi, PHP, Java (Android)
BeitragVerfasst: Sa 28.05.11 17:08 
Poste doch mal deine gesamte Uses-Liste hier...

Wenn ich das richtig verstanden habe, ist dass eigentlich dasselbe Problem wie hier: www.delphipraxis.net...it-shellexecute.html ...
Mr_Emre_D
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 114
Erhaltene Danke: 14



BeitragVerfasst: Sa 28.05.11 22:11 
Jeder redet um den heißen Brei.

Also lies folgendes genau durch, falls du verstehen willst warum es nicht klappt:
Dieser letzte Parameter, denn man angeben soll - und für den du 0 angegeben hast, teilt dem Programm, das gestartet werden soll, in welcher Form es sichtbar sein soll!
0 steht für SW_HIDE (eine Konstante; Konstanten haben einen einfachen Wert)
dann gäbe es da noch SW_SHOWNORMAL

Diese Konstanten sind in Units definiert (das was unter uses steht sind einzelne Units).

Die Definition von SW_HIDE sähe dann so aus
ausblenden Delphi-Quelltext
1:
2:
const
  SW_HIDE = 0;


Was du nun machen musst, ist, die richtige Unit finden, in der die Konstanten definiert sind und dann die dementsprechende Konstante verwenden (SW_SHOWNORMAL).

Falls du sie nicht findest, kannst du dir die Konstanten selber hier definieren - siehe dazu für Werte
nShowCmd
msdn.microsoft.com/e...53%28v=vs.85%29.aspx

Wie du aus dieser Seite entnehmen kannst, hat SW_SHOW den Wert 5.

Du definierst dir nun entweder die Konstante
const
SW_SHOWNORMAL = 1
oder bindest eine Unit ein, in der das schon gemacht wurde
oder du verwendest direkt den Wert 1 in deinem Code!

So, wenn du das hier nicht verstehst, kann dir nicht mehr geholfen werden =P

(Edit: Ty jaenicke, statt SW_SHOW gehört da ein SW_SHOWNORMAL hin xD)


Zuletzt bearbeitet von Mr_Emre_D am So 29.05.11 06:50, insgesamt 4-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 29.05.11 03:15 
Das Problem liegt dann wohl eher daran, dass nicht klar ist, was uses macht... Da dazu keine Frage kam, dachte ich das sei klar...
user profile iconBombe hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
program project1;

uses
  ShellAPI; 
  

{ Berechnungen usw... }

ShellExecute(Handle, nil, PChar('C:\Users\Bombe\Desktop\gnuPlot\gnuplot\binary\gnuplot.exe'), nilnil, SW_SHOWNORMAL);
Der Quelltext wird in Delphi in der Regel auf mehrere Dateien aufgeteilt. Diese .pas Dateien nennt man Units. Wenn jetzt etwas in einer anderen Unit steht, musst du Delphi sagen, dass du etwas aus einer bestimmten Unit benutzen willst. Denn Delphi kann ja nicht einfach alle auf der Festplatte durchsuchen.

Dafür dient die uses Anweisung. Darin musst du alle Units aufführen, aus denen du etwas verwenden willst. In deinem Fall benutzt du ShellExecute aus der Unit ShellAPI, deshalb hast du das da drin, offenbar halt leider ohne zu wissen oder dich zu fragen warum.

Jedenfalls benötigst du jetzt die Konstante SW_SHOWNORMAL aus der Unit Windows, also musst du die auch in deine uses aufnehmen:
ausblenden Delphi-Quelltext
1:
2:
uses
  ShellAPI, Windows;
finalizat0r
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 24
Erhaltene Danke: 1



BeitragVerfasst: So 29.05.11 16:41 
Kurze Zusammengefassung des Codes:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
program Project1
uses
  ShellAPI, Windows;

var
  ErrCode: Integer;
begin
  ErrCode := ShellExecute(0'open', PChar('C:\WINDOWS\notepad.exe'), nilnilSW_SHOW);

  if ErrCode <= 32 then
    ShowMessage(ShellExecuteErrMessage(ErrCode));
end.