Programme lassen sich mit ShellExecute nicht öffnen...

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
jonas_rotter1234
Beiträge: 14
Registriert: Sa 7. Nov 2015, 21:49

Programme lassen sich mit ShellExecute nicht öffnen...

Beitrag von jonas_rotter1234 »

Liebe Lazarus- Community,

bei folgendem Programm lassen sich die drei verschiedenen Programme (über die RadioButtons ausgewählt) leider nicht öffnen. Über den Erstellungsordner funktioniert dies allerdings.

Code: Alles auswählen

unit uAuswahl;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, Buttons, ShellAPI;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    Image1: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Memo1: TMemo;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    RadioGroup1: TRadioGroup;
    procedure BitBtn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  if RadioButton1.Checked= true then
     ShellExecute(Form1.Handle, 'open', PChar('C:\Users\Jonas\Documents\BUSSE\BUSSE_Programme\Gesamtprogramm_privat\pgesamt1.exe'), nil, nil, 1);
     Label1.Caption:='';
  if RadioButton2.Checked=true then
     ShellExecute(Form1.Handle, 'open', PChar('C:\Users\Jonas\Documents\BUSSE\BUSSE_Programme\Gesamtprogramm_geschaeftlich\pgesamt1.exe'), nil, nil, 1);
     Label1.Caption:='';
     if RadioButton3.Checked=true then
     ShellExecute(Form1.Handle, 'open', PChar('C:\Users\Jonas\Documents\BUSSE\BUSSE_Programme\Kalender\pKalender.exe'), nil, nil, 1);
     Label1.Caption:='';
  if (RadioButton2.Checked=false) and (RadioButton1.Checked=false) and (RadioButton3.Checked = false) then
     Label1.Caption:='Bitte wählen Sie ein Adressbuch aus.';
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
ShellExecute(Form1.Handle, 'open', PChar('C:\Users\Jonas\Documents\BUSSE\BUSSE_Programme\Notfall\pNotfall.exe'), nil, nil, 1);
Memo1.Lines.Clear;
Image1.Picture.LoadFromFile('C:\Users\Jonas\Pictures\BUSSE\top1.bmp');
end;
 
end.
Könnt ihr mir einen Tipp geben bzw. helfen, was ich falsch mache?

VIele Grüße

jonas_rotter1234

Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Re: Programme lassen sich mit ShellExecute nicht öffnen...

Beitrag von Andromeda »

jonas_rotter1234 hat geschrieben:

Code: Alles auswählen

 
  if RadioButton1.Checked= true then
 
Also ob das der Fehler ist, weiß ich nicht, aber das ist auf jeden Fall schlechter Stil. Es heißt:

Code: Alles auswählen

 
  if RadioButton1.Checked then ...
 
Du sagst doch auch nicht: "Wenn Du fertig bist = wahr, dann ..."

Noch schlimmer ist:

Code: Alles auswählen

 
  if RadioButton1.Checked= false then ...
 
Richtig:

Code: Alles auswählen

 
  if not RadioButton1.Checked then ...
 

wp_xyz
Beiträge: 5152
Registriert: Fr 8. Apr 2011, 09:01

Re: Programme lassen sich mit ShellExecute nicht öffnen...

Beitrag von wp_xyz »

Also bei mir geht's. Vielleicht steckt in den ellenlangen Pfadangaben ein Tippfehler. Vorschlag: Schreibe den String in eine Konstante, dann musst du nur 1x etwas ändern.

Generell würde ich ShellExecute nicht verwenden. Das bindet dich an Windows. Nimm lieber ExecuteProcess aus der standardmäßig aufgerufenen Unit SysUtils. Oder RunCommand aus der Unit Process ist genauso einfach aufzurufen. Mehr dazu in http://wiki.freepascal.org/Executing_Ex ... rograms/de.

Das Bild könntest du dir auch im Object Inspector der Picture-Property der Image-Komponente zuweisen. Damit wäre es permanent in die Exe eingebunden, und das Programm würde auch noch laufen, wenn das Bild irgendwann nicht mehr gefunden werden sollte.

In der BitBtn-Click Prozedur vemute ich aufgrund der Einrückung, dass jeweils ein begin/end fehlt. Also

Code: Alles auswählen

 
const
  BUSSE_PFAD = 'C:\Users\Jonas\Documents\BUSSE\BUSSE_Programme\ ';   
  // Das Leerzeichen am Ende wurde absichtlich eingefügt, weil sonst der Syntaxhighlighter spinnt.
 
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  if RadioButton1.Checked then 
  begin
     ShellExecute(Handle, 'open', PChar(BUSSE_PFAD + 'Gesamtprogramm_privat\pgesamt1.exe'), nil, nil, SW_SHOWNORMAL);
     // Form1.Handle läuft hier zwar, ist aber falsch, weil die Klasse Handle bereits kennt. 
     // Falls du eine zweite Instanz von TForm1 erzeugst, würde das Programm mit "Form1.Handle" 
     // nicht richtig laufen, mit "Handle" allein dagegen schon.
     // Und: Der Code wird lesbarer, wenn du als letzten Parameter statt "1" die Konstante "SW_SHOWNORMAL" verwendest.
     // Dafür brauchst du die Unit Windows in "uses".
     Label1.Caption:='';
  end;
  if RadioButton2.Checked then begin
     // ShellExecute(Handle, 'open', PChar(BUSSE_PFAD + 'Gesamtprogramm_geschaeftlich\pgesamt1.exe'), nil, nil, 1);
     // Hier die plattform-unabhängige Variante mit "ExecuteProcess" 
     ExecuteProcess(BUSSE_PFAD + 'Gesamtprogramm_geschaeftlich\pgesamt1.exe', '');
     Label1.Caption:='';
  end;
  ....
  if not RadioButton2.Checked and not RadioButton1.Checked and not RadioButton3.Checked then
     Label1.Caption:='Bitte wählen Sie ein Adressbuch aus.';
end;

TBug
Beiträge: 179
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: Programme lassen sich mit ShellExecute nicht öffnen...

Beitrag von TBug »

Was gibt denn ShellExecute zurück?

Also einfach einmal

Code: Alles auswählen

Caption := IntToStr(ShellExecute(Self.Handle, 'open', PChar('C:\Windows\Notepad.exe') , nil, nil, 1));
den Rückgabewert von ShellExecute in die Caption der Form schreiben lassen.


.

jonas_rotter1234
Beiträge: 14
Registriert: Sa 7. Nov 2015, 21:49

Re: Programme lassen sich mit ShellExecute nicht öffnen...

Beitrag von jonas_rotter1234 »

Erstmal vielen Dank für die schnellen Antworten und Anregungen.Vor allem an dich, @wp_xyz. Ich habe deinen genannten Quelltext auch gleich in die Tat umgesetzt, leider funktioniert das Programm immer noch nicht so, wie es soll - es wird kein per RadioButton ausgewähltes Programm geöffnet und langsam weiß ich mir nicht mehr wirklich weiterzuhelfen.
Wenn ich alles mit nur einem ShellExecute-Aufruf probiere, funktioniert alles einwandfrei...
Viele Grüße

jonas_rotter1234

jonas_rotter1234
Beiträge: 14
Registriert: Sa 7. Nov 2015, 21:49

Re: Programme lassen sich mit ShellExecute nicht öffnen...

Beitrag von jonas_rotter1234 »

Ich hab jetzt herausgefunden, dass es vermutlich an meiner mutex-Unit liegt, hab sie entfernt und siehe da, es funktioniert.

Antworten