Avatar billede ibhansen Nybegynder
11. juni 2004 - 12:59 Der er 19 kommentarer og
1 løsning

Åbne exe filer efter hinanden

Jeg har lavet et program som skal starte nogle andre programmer, det virkr ved at man sætter et flueben i en checkbox og så skal de køres efter hinanden.

eks.

if Checkbox1.Checked = true then
WinExec('c:\windows\NOTEPAD.EXE', SW_SHOWNORMAL);

if Checkbox2.Checked = true then
WinExec('c:\windows\notepad2.EXE', SW_SHOWNORMAL);
end;

så er det meningen at hvis der er sat flueben i checkbox 1 og 2, at den så skal åbne notepad.exe og når det bliver lukket skal den åbne notepad2.exe.
Avatar billede sejindk Nybegynder
11. juni 2004 - 13:01 #1
Hvad er dit spørgsmål?
Avatar billede ibhansen Nybegynder
11. juni 2004 - 13:02 #2
Lige en ting til, hvordan gør jeg så når man trykker på esc så lukker programmet selv? altså ikke det program der bliver åbnet, men det jeg selv har lavet i delphi.
Avatar billede ibhansen Nybegynder
11. juni 2004 - 13:02 #3
Mit spg. er hvordan jeg for dem til at åbne efter hinanden, og ikke oven i hinanden.
Avatar billede kammeyer Nybegynder
11. juni 2004 - 13:04 #4
Avatar billede stefmeister Nybegynder
11. juni 2004 - 14:14 #5
Til det med hvordan du lukker dit program ved at trykke på esc:

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #27 then Application.Terminate;  // #27 = ESC-knappen
end;
Avatar billede stefmeister Nybegynder
11. juni 2004 - 14:25 #6
skulle selvfølgelig have været et svar :-)
Avatar billede ibhansen Nybegynder
11. juni 2004 - 14:48 #7
kammeyer: Er lidt nu til det her, så fatter ikke meget af alt det der:) Kunne du evt. komme med lidt forklaring.

stefmeister: Kan ikke rigtigt få dit til at virke, den kommer med en fejl, jeg har bare smidt koden ind, lige før det sidste "end." skal jeg gøre andet? eller er jeg bare en nar:D
Avatar billede vallemanden Nybegynder
11. juni 2004 - 14:58 #8
:-D Man er ikke lige en nar fordi man ikke lige kan finde ud af noget, hvis man kunne finde ud af det hele var der jo ikke behov for experten . dk
Avatar billede kammeyer Nybegynder
11. juni 2004 - 14:59 #9
Kopier Borisholts kode ind og kald den for hver af dine ovenstående 2 programmer:

if .... then
  ExecuteAndWait('c:\windows\notepad.exe', SW_SHOWNORMAL);
if .... then
  ExecuteAndWait('c:\windows\notepad2.exe', SW_SHOWNORMAL);
Avatar billede kammeyer Nybegynder
11. juni 2004 - 15:03 #10
Angående FormKeyPress - kopier den ikke 'ubetinget' ind. Klik på din form og i den Object Inspector vælger du Event fanen og finder OnKeypress eventen - dobbelt klik der - så vil den lave ...

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin

end;

... for dig. Her i skal du have
if Key = #27 ..... som stefmeister skrev ovenfor.
Avatar billede jonat Nybegynder
11. juni 2004 - 15:06 #11
Ang. http://www.eksperten.dk/spm/505682 skal du til føje shellapi til users ellers kommer den med fejl. :-d

// Jonat.
Avatar billede ibhansen Nybegynder
11. juni 2004 - 15:40 #12
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
if Checkbox1.Checked = true then


//her under er borisholst kode:----------------------------------------------

  function ExecuteAndWait('c:\windows\NOTEPAD.EXE', SW_SHOWNORMAL);

  function doExecAndWait(('c:\windows\NOTEPAD2.EXE', SW_SHOWNORMAL);


  var
    StartupInfo: TStartupInfo;
    ProcessInfo: TProcessInformation;
    Res: Cardinal;
  begin
    FillChar(StartupInfo, SizeOf(StartupInfo), #0);
    StartupInfo.cb := SizeOf(StartupInfo);
    StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
    StartupInfo.wShowWindow := nCmdShow;

    if not CreateProcess(nil, Pchar(FileName + #32 + '"' + Parameter + '"'), nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
      Res := DWORD(-1)
    else
    begin
      while WaitforSingleObject(ProcessInfo.hProcess, 500) = WAIT_TIMEOUT do
        Application.ProcessMessages;

      GetExitCodeProcess(ProcessInfo.hProcess, Res);
      CloseHandle(ProcessInfo.hProcess);
      CloseHandle(ProcessInfo.hThread);
    end;
    Result := Res = 0;
  end;
var
  FileName, FileDir: TFileName;
  Res: string;
begin
  FileName := ExtractFileName(aFileName);
  FileDir := ExtractFilePath(aFileName);
  SetLength(Res, MAX_PATH);
  FindExecutable(pointer(FileName), pointer(FileDir), pointer(Res));
  SetLength(RES, Pred(Pos(#0, Res)));
  Result := doExecAndWait(RES, aFileName, SW_SHOWNORMAL);
end;
end;

end.


Fatter hat af det her:D Hvor er den gal?
Avatar billede stefmeister Nybegynder
11. juni 2004 - 16:01 #13
ibhansen -> Du har Form1, så trykker i Object Inspector -> Event -> Dobbeltklikker på OnKeyPress og så sætter du denne kode ind:

if Key = #27 then Application.Terminate;


så virker det.
Avatar billede kammeyer Nybegynder
11. juni 2004 - 19:19 #14
Følgende virker for mig:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ ** Start borrisholt kode ** (med få ændringer) }

function ExecuteAndWait(const aFileName: TFileName; Parameter: string; nCmdShow: Integer): Boolean;

  function doExecAndWait(FileName, Parameter: string; nCmdShow: Integer): Boolean;
  var
    StartupInfo: TStartupInfo;
    ProcessInfo: TProcessInformation;
    Res: Cardinal;
  begin
    FillChar(StartupInfo, SizeOf(StartupInfo), #0);
    StartupInfo.cb := SizeOf(StartupInfo);
    StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
    StartupInfo.wShowWindow := nCmdShow;
    if Length(Parameter) > 0 then
      FileName := FileName + #32 + '"' + Parameter + '"';

    if not CreateProcess(nil, Pchar(FileName), nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
      Res := DWORD(-1)
    else
    begin
      while WaitforSingleObject(ProcessInfo.hProcess, 500) = WAIT_TIMEOUT do
        Application.ProcessMessages;

      GetExitCodeProcess(ProcessInfo.hProcess, Res);
      CloseHandle(ProcessInfo.hProcess);
      CloseHandle(ProcessInfo.hThread);
    end;
    Result := Res = 0;
  end;
var
  FileName, FileDir: TFileName;
  Res, Param: string;
begin
  FileName := ExtractFileName(aFileName);
  FileDir := ExtractFilePath(aFileName);
  SetLength(Res, MAX_PATH);
  FindExecutable(pointer(FileName), pointer(FileDir), pointer(Res));
  SetLength(RES, Pred(Pos(#0, Res)));
  Result := doExecAndWait(RES, Parameter, SW_SHOWNORMAL);
end;

{ ** Slut borrisholt kode **}


procedure TForm1.Button1Click(Sender: TObject);
begin
  if Checkbox1.Checked then
    ExecuteAndWait('C:\windows\notepad.exe', '', SW_SHOWNORMAL);
  if Checkbox2.Checked then
    ExecuteAndWait('c:\windows\notepad.exe', 'c:\eksistererikke.txt', SW_SHOWNORMAL);
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #27 then
    Application.Terminate;
end;

end.
Avatar billede kammeyer Nybegynder
11. juni 2004 - 19:20 #15
Evt. marker alle komponenter og i Objekt Inspector vælg OnKeypress sæt den til FormKeyPress for alle valgte komponenter.
Avatar billede fixxxer Nybegynder
11. juni 2004 - 21:21 #16
kammeyer >> mht til din sidste kommentar er det vist bare nok at sætte Formens KeyPreview til True, så uanset hvilket objektet der er i fokus, trigges Key-events på formen
Avatar billede fixxxer Nybegynder
11. juni 2004 - 21:22 #17
If KeyPreview is true, keyboard events occur on the form before they occur on the active control. (The active control is specified by the ActiveControl property.)

If KeyPreview is false, keyboard events occur only on the active control.

Navigation keys (Tab, BackTab, the arrow keys, and so on) are unaffected by KeyPreview because they do not generate keyboard events. Similarly, when a button has focus or when its Default property is true, the Enter key is unaffected by KeyPreview because it does not generate a keyboard events.

KeyPreview is false by default.
Avatar billede ibhansen Nybegynder
14. juni 2004 - 14:03 #18
kammeyer: det virker fint, tak:D

Hvordan åbner man en exe fil som ligge i en mappe under hvor selve delphi programmet ligger.

ExecuteAndWait('\programmer\java.exe', '', SW_SHOWNORMAL);

altså noget lignede det, som bare virker:D kan kun hvis jeg skrive hele stien, men det vil jeg ikke da programmet skal ligge på en cd, og sætte i flere pc, som nogen gange har 2 cd-rom drev, og derfor vil det jo drille hvis manaltid skalbruge f.eks d-drevet.
Avatar billede kammeyer Nybegynder
15. juni 2004 - 08:58 #19
fixxxer > takker  :)

ibhansen > se på GetWindowsDirectory, GetSystemDirectory.
Yderligere fandt jeg:

The location of the Program Files and Common Files directories is registered (using the macro REGSTR_PATH_SETUP) in the HKEY_LOCAL_MACHINE root under the SOFTWARE\Microsoft\
Windows\CurrentVersion key. The value names are ProgramFilesDir and CommonFilesDir.

i hjælpen - så hent værdien v.hj.a. TRegistry komponenten.
Avatar billede ibhansen Nybegynder
16. juni 2004 - 11:50 #20
Takker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester