Autor |
Beitrag |
Bombe
Hält's aus hier
Beiträge: 5
|
Verfasst: 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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| program project1;
uses ShellAPI;
ShellExecute(Handle, nil, PChar('C:\Users\Bombe\Desktop\gnuPlot\gnuplot\binary\gnuplot.exe'), nil, nil, 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 Narses: Code- durch Delphi-Tags ersetzt
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 28.05.11 13:16
Hallo und
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
|
Verfasst: Sa 28.05.11 13:31
Handle ist keine Konstante, sondern eine Variable oder unter Delphi ein Attribut der Formklasse.
|
|
Bombe 
Hält's aus hier
Beiträge: 5
|
Verfasst: Sa 28.05.11 13:40
Also wenn ich
Delphi-Quelltext 1:
| ShellExecute(0, nil, PChar('C:\Users\Bombe\Desktop\gnuPlot\gnuplot\binary\gnuplot.exe'), nil, nil, 0); |
schreibe, kann ich zwar kompilieren, aber starten tut das Programm gnuplot leider nicht.
Habs ein wenig weiter editiert, klappt weiterhin nicht:
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;
ShellExecute(Handle, 'open', PWideChar('C:\Users\Bombe\Desktop\gnuPlot\gnuplot\binary\gnuplot.exe'), nil, nil, SW_SHOWNORMAL); ShellExecute(0, 'open', PWideChar('C:\Users\Bombe\Desktop\gnuPlot\gnuplot\binary\gnuplot.exe'), nil, nil, 0); |
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
Zuletzt bearbeitet von Bombe am Sa 28.05.11 13:55, insgesamt 1-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 28.05.11 13:55
Luckie hat folgendes geschrieben : | 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...
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 
Hält's aus hier
Beiträge: 5
|
Verfasst: 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.
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'), NIL, NIL, 0);
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 Narses: Code- durch Delphi-Tags ersetzt
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 28.05.11 14:34
GetLastError ist in der Unit Windows deklariert. Aber du solltest den Rückgabewert von Shellexecute auswerten.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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...
Ich nehme an du wirst im Taskmanager die notepad.exe sehen, nur eben laut deinem Wunsch ohne sichtbares Fenster. 
|
|
MDX
      
Beiträge: 595
Erhaltene Danke: 4
Windows 8.1, Linux Debian 8, Android Lollipop
Delphi, PHP, Java (Android)
|
Verfasst: Sa 28.05.11 15:38
ShellExecute(0, 'open', PCHAR('C:\Windows\notepad.exe'), NIL, NIL, SW_SHOW); schonmal probiert?
|
|
Bombe 
Hält's aus hier
Beiträge: 5
|
Verfasst: 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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 28.05.11 16:06
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 28.05.11 16:14
jaenicke hat folgendes geschrieben : | Das steht aber auch alles in der Dokumentation... |
Die liest doch keiner, wie wir hier wieder einmal eindrucksvoll gesehen haben
Wobei das Lesen der Antworten im Thread auch nicht mehr Allgemeingut zu sein scheint
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 
Hält's aus hier
Beiträge: 5
|
Verfasst: Sa 28.05.11 17:01
|
|
MDX
      
Beiträge: 595
Erhaltene Danke: 4
Windows 8.1, Linux Debian 8, Android Lollipop
Delphi, PHP, Java (Android)
|
Verfasst: 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
      
Beiträge: 114
Erhaltene Danke: 14
|
Verfasst: 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
Delphi-Quelltext
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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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... Bombe hat folgendes geschrieben : | Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| program project1;
uses ShellAPI;
ShellExecute(Handle, nil, PChar('C:\Users\Bombe\Desktop\gnuPlot\gnuplot\binary\gnuplot.exe'), nil, nil, 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: Delphi-Quelltext 1: 2:
| uses ShellAPI, Windows; |
|
|
finalizat0r
      
Beiträge: 24
Erhaltene Danke: 1
|
Verfasst: So 29.05.11 16:41
Kurze Zusammengefassung des Codes:
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'), nil, nil, SW_SHOW);
if ErrCode <= 32 then ShowMessage(ShellExecuteErrMessage(ErrCode)); end. |
|
|
|