Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Externe .exe Datei starten.
neo171190 - Mo 20.10.08 13:46
Titel: Externe .exe Datei starten.
Hi,
ich will mit delphi einen gameluncher schreiben. Wenn man ihn startet man (grob gesagt) einen button zum starten des games und dann noch unten ein Edit-Feld und ein OK-Button, in welches man den spielepfad einträgt. Nur leider weiß ich nicht wie man die zwei unten stehenden Prozeduren verbindet =(( ...bitte schnell um hilfe.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.ImgNormalClick(Sender: TObject); var game: string; begin winexec('game', SW_SHOWNORMAL); close; end;
procedure TForm1.ButtonOKClick(Sender: TObject); var game: string; begin EditGamePfad.Text := game end; |
Moderiert von
Gausi: Quote- durch Delphi-Tags ersetzt
Delete - Mo 20.10.08 13:50
Statt den Pfad händisch eintragen zu lassen würde ich einen TOpenDialog bevorzugen.
Delphi-Quelltext
1: 2:
| if OpenDialog.Execute then ShellExecute(Handle,PChar(OpenDialog.Filename),nil,nil,SW_SHOWDEFAULT); |
So in etwa, für ShellExecute muss ShellAPI eingebunden werden.
neo171190 - Mo 20.10.08 14:04
Titel: Re
Das mit dem ShellExecute hab ich net hinbekommen...wenn ich für die Variable Game einfach nen Pfad bzw ne exe eingefügt hat hats funktioniert aber ich will halt dass man einfach jedes Game damit starten kann indem man einfach unten den Pfadnamen eingibt. Is zwar merkwürdet und umständlich aber ich hab so meine gründe warum ichs so will ^^ außerdem bin ich noch ein anfänger in sachen delphi ...tut mir leid wenn ich sachen net gleich begreife aber dazu ist so ein forum ja da
Delete - Mo 20.10.08 14:08
Hast Du meinen Vorschlag denn einmal ausprobiert? Zur Not könnte man den Pfad ja auch noch zusätzlich in ein Edit schreiben ;)
neo171190 - Mo 20.10.08 14:12
Titel: Re
ja vielleicht hab ichs au falsch eingefügt wo muss ich des denn einfügen. tut mir echt leid ^^ ich hab erst angefangen mit delphi zu programmieren...ich kenn zwar die grundlagen aber leider noch nicht so extrem aus :( bin zwar fleißig am lernen aber könntest du mir sagen wo ich des bei meinem obigen quellcode einfügen muss...
Edit: Es kommt immer ein fehler, dass ShellExecute ein undefinierter Bezeichner ist. :(
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.ButtonOKClick(Sender: TObject); begin
if OpenDialog.Execute then ShellExecute(Handle,PChar(OpenDialog.Filename),nil,nil,SW_SHOWDEFAULT);
end; |
Moderiert von
Gausi: Quote- durch Delphi-Tags ersetzt
Delete - Mo 20.10.08 14:15
Die Exe soll bei ImgNormalClick gestartet werden? Dann gehören meine beiden Zeilen da rein:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| implementation
uses ShellAPI;
procedure TForm1.ImgNormalClick(Sender: TObject); begin if OpenDialog1.Execute then ShellExecute(Handle,PChar(OpenDialog1.Filename),nil,nil,SW_SHOWDEFAULT); end; |
neo171190 - Mo 20.10.08 14:23
Titel: RE
ich glaub ich bin echt zu blöd =(( das tut iwie immernoch net...ich glaub ich such ma im internet nochma bissl rum ^^ will hier dich net allzulang nerven...da komm ich mir schon total doof vor... =((
Delete - Mo 20.10.08 14:30
Beschreib doch einfach, was nicht funktioniert.
[edit] Ich denke, ich weiß es: ich hatte einen Parameter unterschlagen.Richtig muss es heißen
ShellExecute(Handle,'open',PChar(OpenDialog1.Filename),nil,nil,SW_SHOWDEFAULT); [/edit]
neo171190 - Mo 20.10.08 14:45
Titel: beschreibung
Also gut. Erstmal zu dem Programm was ich eigentlich erstellen will:
Ich möchte einen Luncher für das Programm World of Warcraft erstellen. Mit meinem ehemaligen Code hat es funktioniert. Nur die *.exe musste im Ordner der wow.exe liegen. Ich möchte jetzt ein Programm schreiben, mitdem man den Pfad in einem Textfeld angibt und anschließend auf OK drück und der eingegebene Text in einer Variable gespeichert wird. Durch den anderen Button (bei mir das Image) kann man das Spiel anschließend Starten.
Unten hab ich mal ein Bild angefügt...Der code darüber ist eigentlich nur für die Over-Funktion des Buttons. Wie man auch sehen kann ist der Standarttext in meinem Bild 'c:\Programme\World of Warcraft\wow.exe. Nur man soll diesen dann ändern können und er soll in der Variable 'game' der Prozedur: winexec('game', SW_SHOWNORMAL); gespeichert werden.
Ich hab mir mal überlegt ob man vielleicht mit: IF EditText.Text then game := EditText.Text aber das funktioniert nicht... =((
Das will ich alles erstellen. Vielleicht ist es noch einbisschen schwer für mich aber deswegen frag ich ja hier...Jetzt wird mein Problem auch ein bisschen klarer
P.S: Nun funktioniert es mit dem Shell.
[EDIT] Vielleicht auch so machen dass man unten durch eine OpenDialog-Funktion den OK Button durch Durchsuchen ersetzt und dann einfach der Pfadname im Textfeld ausgegeben wird und dieser dann per Variable im winexec('game'... ausgegeben wird. [/EDIT]
Delete - Mo 20.10.08 14:53
Also gut.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| implementation
uses ShellAPI;
procedure TForm1.Button1Click(Sender: TObject); begin if OpenDialog1.Execute then begin game := OpenDialog1.Filename; EditGame.Text := game; end; end;
procedure TForm1.ImgNormalClick(Sender: TObject); var iResult: Cardinal; begin iResult := ShellExecute(Handle,'open',PChar(game),nil,nil,SW_SHOWDEFAULT); if iResult < 33 then MessageBox(Handle,PChar(SysErrorMessage(iResult)),nil,MB_OK or MB_ICONERROR); end; |
neo171190 - Mo 20.10.08 15:07
Titel: Re
Danke das war der Code den ich gesucht hab. Nur wurde die Variable von game nicht eingefügt...bzw es kam ein fehler beim Compilieren. Dann hab ich halt var game: String eingefügt...das Prog lässt sich nun compilieren...Nur wenn ich jetzt auf spielen klicke wenn der Code im Textfeld ist hängt das prog leider =((
Delete - Mo 20.10.08 15:14
Titel: Re: Re
neo171190 hat folgendes geschrieben : |
| Nur wenn ich jetzt auf spielen klicke wenn der Code im Textfeld ist hängt das prog leider =(( |
An welcher Stelle hängt es denn? Stepp doch zur Not mal durch (F7).
jaenicke - Mo 20.10.08 15:19
Kann es sein, dass du die Variable nur lokal innerhalb deiner Prozeduren deklariert hast? Das muss oberhalb nach implementation global passieren, sonst ist das in deinen beiden Prozeduren nicht die selbe Variable, das heißt du hast bildlich gesprochen auf zwei Regale "game" geschrieben, packst in das eine in deiner einen Prozedur etwas rein und versuchst es dann aus dem anderen Regal in deiner anderen Prozedur wieder herauszuholen.
Mehr dazu findest du hier:
http://delphi.about.com/od/beginners/l/aa060899.htm
Delete - Mo 20.10.08 15:23
Noch besser wäre es allerdings, game im private-Abschnitt des Formulars zu deklarieren.
neo171190 - Mo 20.10.08 15:25
Titel: Re
Hmm ja gut nun hab ich die Variable mal oben hin geschrieben unter implementation...nur wenn ich es compiliere und speicher dann startet das Programm alles perfekt nur hängen tuts erst wenn ich auf spielen drück...also quellcode is anfürsich richtig...kann es sein dass es einfach zu viel Arbeit für des Programm is? aber glaub ich eher net ... bitte noch einmal um hilfe...achja und was muss game sein...ich hab es als var game: string; hoffe das ist richtig.
jaenicke - Mo 20.10.08 15:29
Naja, da musst du debuggen und schauen was passiert. Also einen Haltepunkt auf die erste Zeile deines Buttonclicks setzen und dann im gestarteten Programm den Button klicken.
Dann landest du wieder in Delphi in der Zeile mit dem Haltepunkt und kannst mit der oben erwähnten Taste F7 oder hier vielleicht besser F8 schrittweise durch deinen Code gehen und schauen was passiert.
Du könntest auch ein ShowMessage(game); vor die Zeile mit dem ShellExecute setzen um zu schauen was in der Variable drin ist.
neo171190 - Mo 20.10.08 15:31
Titel: re
also wenn ich genau das mit show message mache dann kommt ne messagebox mit nix drin...sprich ist also nix drin... =P in der variable game
jaenicke - Mo 20.10.08 15:32
Zeig mal den Code, den du jetzt benutzt. Da wird offenbar nix vorher in die Variable geschrieben.
Kann es sein, dass du die Variable lokal vergessen hast zu entfernen in den Prozeduren?
neo171190 - Mo 20.10.08 15:35
Titel: Re
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, jpeg, ExtCtrls, OleCtrls, ShockwaveFlashObjects_TLB, ShellAPI, StdCtrls;
type TForm1 = class(TForm) ImgPressed: TImage; ImgOver: TImage;
ImgNormal: TImage; Image1: TImage; ShockwaveFlash1: TShockwaveFlash; Label1: TLabel; EditGame: TEdit; Button1: TButton; OpenDialog1: TOpenDialog; procedure Img1Down(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Img1Up(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure ImgNormalClick(Sender: TObject); procedure Button1Click(Sender: TObject);
private public end;
var game: String; var Form1: TForm1;
implementation
{$R *.dfm}
var game: String;
procedure TForm1.Img1Down(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin
ImgNormal.Visible := false; ImgPressed.Visible := true; ImgOver.Visible := false;
end;
procedure TForm1.Img1Up(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin
ImgNormal.Visible := true; ImgPressed.Visible := false; ImgOver.Visible := false;
end;
procedure TForm1.Button1Click(Sender: TObject); begin if OpenDialog1.Execute then begin game := OpenDialog1.Filename; EditGame.Text := game; end; end;
procedure TForm1.ImgNormalClick(Sender: TObject); var iResult: Cardinal; begin ShowMessage(game); iResult := ShellExecute(Handle,'open',Pchar(game),nil,nil,SW_SHOWDEFAULT); if iResult < 33 then MessageBox(Handle,PChar(SysErrorMessage(iResult)),nil,MB_OK or MB_ICONERROR); end;
end.
|
Moderiert von
Gausi: Code- durch Delphi-Tags ersetzt. Aber wir kommen der Sache näher. :zwinker:
Delete - Mo 20.10.08 15:38
Hast Du denn den Button geklickt? Oder steht der Pfad fest im Edit (über OI eingegeben)?
neo171190 - Mo 20.10.08 15:58
Titel: Re
ja hab auf den Button geklickt und dann das game ausgewählt. Dann hab ich auf das image geklickt und es bleibt hängen aber die msg sagt ja dass game kein wert enthällt. Hab's mit beiden stellen versucht die ich am obigen code angegeben hab
Delete - Mo 20.10.08 16:03
Pack sie mal hier hin (die anderen beiden raus):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| type TForm1 = class(TForm) ImgPressed: TImage; ImgOver: TImage;
ImgNormal: TImage; Image1: TImage; ShockwaveFlash1: TShockwaveFlash; Label1: TLabel; EditGame: TEdit; Button1: TButton; OpenDialog1: TOpenDialog; procedure Img1Down(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Img1Up(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure ImgNormalClick(Sender: TObject); procedure Button1Click(Sender: TObject);
private game: string; public end; |
neo171190 - Mo 20.10.08 19:01
Titel: Re
Hängt immernoch. Aber ich hab mir in der Zeit mal was durch den Kopf gehen lassen. Muss die Variable net vielleicht zw.-Speichern über StrToFloat oder so
neo171190 - Mo 20.10.08 19:04
Titel: Re
Sorry jetzt tuts...Es stand nämlich schon von mir als Standart-Text der Standartpfad des Games drin...-_-...aber da hät ich gleich ne weitere Frage...wie mach ichs dann dass des auch tut...wenn schon des als Text drin steht
jaenicke - Di 21.10.08 01:43
Naja, wenn du den Pfad in die Variable übernehmen willst, dann könntest du das zum Beispiel in FormCreate dort reinschreiben.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!