11. juni 2004 - 12:59Der 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.
Støv, fibre og metalliske partikler kan påvirke både uptime, levetid og driftssikkerhed. Derfor arbejder flere datacentre systematisk med contamination control.
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.
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
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.
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;
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;
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
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.
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.
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.
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.