1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Hilfe zu Turbo Pascal (Delphi)

Discussion in 'Programmieren' started by reeng, Sep 20, 2007.

Thread Status:
Not open for further replies.
  1. reeng

    reeng ROM

    Hallo zusammen....

    Ich bin ein absoluter Neuling in der Entwicklungsumgebung. Bin eigentlich gelernter Systemtechniker und kein Appli. :o Ich sollte nun jedoch (Für meinen Arbeitgeber) ein kleines Programm schreiben, welches eine Abfrage für eine Installation macht. Und zwar sollte beim auswählen von "CD jetzt installieren" einfach nur eine Batch (.bat) Datei ausgefüht werden. Diese Datei habe ich bereits geschrieben und funktioniert auch einwandfrei. Mein Problem ist also nur der Befehl in Turbo Pascal um dieses Bacth-File beim Klick auf den "Weiter" Button (Grafische Oberfläche) aufzurufen bzw. auszuführen.

    Folgender Code ist mein Anfang. (Die Form1 und einen Button)

    -----------------------------------------------------------------------------------------

    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls;

    type
    TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    private
    { Private-Deklarationen }
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation



    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    begin

    end;

    end.

    -----------------------------------------------------------------------------------------

    :bahnhof:

    Wie kann ich nun beim Klicken auf den Button die Datei autorun.bat ausführen? Wo bzw. muss ich diese Datei angeben? Deklarieren als Variable? Nur den Code zum Öffnen eingeben?

    Habe gestern den ganzen Tag im Internet Hilfe gesucht, bin jedoch nicht auf meine Antwort gestossen. Wäre wirklich super froh um eure Hilfe.

    Vielen Dank im Voraus...

    Gruss Reeng
     
  2. da_Ferdi

    da_Ferdi Halbes Megabyte

    Code:
    PROCEDURE TForm1.Button1Click(Sender: TObject);
    VAR e: INTEGER;
    begin
      e := ShellExecute
             (Handle,
              NIL,
              PCHAR('ExtractPath(Application.Name)+'datei.bat'),
              PCHAR(''),
              NIL,
              SW_SHOW);
      IF (e<=32) THEN
        begin
          ShowMessage('fehler beim ausführen')
        end
    end;
    um die funktion ShellExecute verfügbar machen, musst du die uses -direktive um den eintrag ShellAPI erweitern.
     
  3. reeng

    reeng ROM

    Hallo Da_Ferdi..

    Vielen Dank für deine rasche Antwort. :o ...Bin nun ein Stücklein weiter gekommen. Mein Code sieht nun wie folgt aus:

    --------------------------------------------------------------------------------------------

    unit Unit2;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, ShellAPI, Forms,
    Dialogs, StdCtrls;

    type
    TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    private
    { Private-Deklarationen }
    public
    { Public-Deklarationen }
    end;

    var
    Form2: TForm2;

    implementation

    {$R *.dfm}

    procedure TForm2.Button1Click(Sender: TObject);
    VAR e: INTEGER;
    begin

    e := ShellExecute
    (Handle,
    NIL,
    PCHAR('ExtractPath(Application.Name)'+'autorun.bat'),
    PCHAR(''),
    NIL,
    SW_SHOW);
    IF (e<=32) THEN

    ShowMessage('fehler beim ausführen')

    end;



    end.

    --------------------------------------------------------------------------------------------
    Die Exe kann mit F9 auch ausgeführt werden (also kein Fehler). Jedoch gibt mir die EXE nun immer an: Fehler beim Ausführen. An was kann das liegen? Wie kann ich mein Batch.File also starten? Es wäre super nett von dir, wenn du rasch zu jeder Zeile einen Kommentar hinschreiben würdest, für was die einzelnen Befehle stehen. Ich weiss, ist ein bisschen viel verlangt, stehe aber im Zeitdruck.

    Vielen Dank und ein freundlicher Gruss

    Reeng
     
  4. Falcon37

    Falcon37 Ganzes Gigabyte

    So ist's richtig:

    PCHAR('ExtractFilePath(Application.Exename)'+'\autorun.bat'),

    und so, wenn sich das Ganze im Hauptverzeichnis befindet:

    PCHAR('ExtractFilePath(Application.Exename)'+'autorun.bat'),
     
  5. reeng

    reeng ROM

    Vielen Dank für deine Antwort. Das EXE gibt mir jedoch noch immer aus: Fehler beim Ausführen. Muss ich bei:
    PCHAR('ExtractFilePath(Application.Exename)'+'autorun.bat'),

    Application oder .Exename durch etwas ersetzen damits funktioniert? Muss ich oben im Code (Also nicht in der Button Funktion) noch etwas ergänzen?

    Gruss

    Reeng
     
  6. Falcon37

    Falcon37 Ganzes Gigabyte

    In welchem Verzeichnis befindet sich die Applikation und in welchem die bat-Datei?
     
  7. reeng

    reeng ROM

    Ich habe die autorun.bat Datei in das gleichi Verzeichnis kopiert wo sich auch das Projekt zw. die Exe befindet. Also sollte der Code doch funktionieren? Vielen Dank dass du dich für mein Problem interessierst.

    Gruss

    reeng
     
  8. Falcon37

    Falcon37 Ganzes Gigabyte

    Das hier sollte dann funktionieren (nicht den Backslash und den Rest der Anweisung vergessen):

    PCHAR(ExtractFilePath(Application.Exename)+'\autorun.bat')

    Habe vorher leider deine Hochkommas übersehen!
     
  9. Falcon37

    Falcon37 Ganzes Gigabyte

    Generell würde ich zu diesem Konstrukt raten:

    Code:
    PROCEDURE StartExternalApplication(VAR StartString : STRING);
    VAR Startupinfo : TStartupinfo;
      ProcessInfo : TProcessInformation;
    BEGIN
      FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
      startupinfo.cb := SizeOf(Tstartupinfo);
      CreateProcess(NIL,
      PChar(StartString), // Startstring=Applikation die gestartet werden soll
      NIL,
      NIL,
      FALSE,
      Normal_Priority_Class,
      NIL,
      NIL,
      startupinfo,
      processinfo);
    END;
     
  10. da_Ferdi

    da_Ferdi Halbes Megabyte

    oh, sorry, ich hatte vergessen anzumerken, dass die pfadangabe in meinem code relativ ist, ausserdem vergaß ich einen slash.

    also nochmal lauffähiger code mit RELATIVER pfadangabe:

    Code:
    procedure TForm1.Button2Click(Sender: TObject);
    var e: Integer;
    begin
      e := ShellExecute
        (Handle,
        NIL,
        PCHAR(PCHAR(ExtractFilePath(Application.Exename)+'\batchfile.bat')),
        PCHAR(''),
        NIL,
        SW_SHOW);
      if (e<=32) then
        begin
          ShowMessage('Fehler beim Ausführen der Datei')
        end
    end;
    und hier mit STATISCHER pfadangabe:

    Code:
    procedure TForm1.Button2Click(Sender: TObject);
    var e: Integer;
    begin
      e := ShellExecute
        (Handle,
        NIL,
        PCHAR('C:\Batchfiles\batchfile.bat'),
        PCHAR(''),
        NIL,
        SW_SHOW);
      if (e<=32) then
        begin
          ShowMessage('Fehler beim Ausführen der Datei')
        end
    end;
    anmerkung: da keine pauschale aussage für die laufwerksbuchstaben getroffen werden kann:

    wenn du dein programm auf wechselbaren datenträgern wie einer cd oder einem usb-stick verwenden willst, solltest du relative pfadangaben verwenden. ansonsten besteht das risiko, dass das programm die datei nicht findet, da auf dem system die laufwerksbuchstaben nicht mit jenen im code angegebenen übereinstimmen könnten.
     
  11. Falcon37

    Falcon37 Ganzes Gigabyte

    @ da_ferdi

    Na ja, da lag schon noch mehr im Argen ;)
    Außerdem ist shellexecute veraltet und wurde durch createprocess ersetzt.
     
Thread Status:
Not open for further replies.

Share This Page