Autor Beitrag
neo171190
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mo 20.10.08 13:46 
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.

ausblenden 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 user profile iconGausi: Quote- durch Delphi-Tags ersetzt
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 20.10.08 13:50 
Statt den Pfad händisch eintragen zu lassen würde ich einen TOpenDialog bevorzugen.
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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. :(

ausblenden 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 user profile iconGausi: Quote- durch Delphi-Tags ersetzt


Zuletzt bearbeitet von neo171190 am Mo 20.10.08 14:16, insgesamt 1-mal bearbeitet
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 20.10.08 14:15 
Die Exe soll bei ImgNormalClick gestartet werden? Dann gehören meine beiden Zeilen da rein:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
implementation

uses ShellAPI;

procedure TForm1.ImgNormalClick(Sender: TObject);
begin
  if OpenDialog1.Execute then //wenn der Dialog anders heißt, Namen anpassen
    ShellExecute(Handle,PChar(OpenDialog1.Filename),nil,nil,SW_SHOWDEFAULT);
end;
neo171190 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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... =((
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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]
Einloggen, um Attachments anzusehen!
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 20.10.08 14:53 
Also gut.
ausblenden 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;

//Auswahldialog öffnen und Dateinamen merken
procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then //wenn der Dialog anders heißt, Namen anpassen
    //ShellExecute(Handle,PChar(OpenDialog1.Filename),nil,nil,SW_SHOWDEFAULT);
    begin
      game := OpenDialog1.Filename;
      EditGame.Text := game; 
    end;
end;

//Spiel starten
procedure TForm1.ImgNormalClick(Sender: TObject);
var iResult: Cardinal;
begin
  iResult := ShellExecute(Handle,'open',PChar(game),nil,nil,SW_SHOWDEFAULT);
  //bei Fehler Meldung ausgeben
  if iResult < 33 then
    MessageBox(Handle,PChar(SysErrorMessage(iResult)),nil,MB_OK or MB_ICONERROR);
end;
neo171190 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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 =((
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 20.10.08 15:14 
Titel: Re: Re
user profile iconneo171190 hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
delphi.about.com/od/...nners/l/aa060899.htm
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 20.10.08 15:23 
Noch besser wäre es allerdings, game im private-Abschnitt des Formulars zu deklarieren.
neo171190 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mo 20.10.08 15:35 
Titel: Re
ausblenden volle Höhe 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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  game: String; //<<<Also hier wär die 1. Möglichkeit wie ich's verstanden hab

var
  Form1: TForm1;


implementation

{$R *.dfm}

var
  game: String; //<<<Also hier wär die 2. Möglichkeit wie ich's verstanden hab

  //Nur wo muss die Variable jetzt hin O.o


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;

//Auswahldialog öffnen und Dateinamen merken
procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then //wenn der Dialog anders heißt, Namen anpassen
    //ShellExecute(Handle,PChar(OpenDialog1.Filename),nil,nil,SW_SHOWDEFAULT);
    begin
      game := OpenDialog1.Filename;
      EditGame.Text := game;
    end;
end;

//Spiel starten
procedure TForm1.ImgNormalClick(Sender: TObject);
var iResult: Cardinal;
begin
  ShowMessage(game);
  iResult := ShellExecute(Handle,'open',Pchar(game),nil,nil,SW_SHOWDEFAULT);
  //bei Fehler Meldung ausgeben
  if iResult < 33 then
    MessageBox(Handle,PChar(SysErrorMessage(iResult)),nil,MB_OK or MB_ICONERROR);
end;

end.







//width 641
//height 458


Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt. Aber wir kommen der Sache näher. :zwinker:
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 20.10.08 15:38 
Hast Du denn den Button geklickt? Oder steht der Pfad fest im Edit (über OI eingegeben)?