Just as I expected, "Stig Johansen" <stig@w3data.dk> came up with
this:
>Du får lige noget 'straight from the brain'.
>IF ( FindWindow('TDinHovedForm',PCHAR(0)) = 0 ) THEN BEGIN
Jaa, FindWindow finder desværre det vindue Delphi laver mens man
designer formen. (Det har vinduesklassen "T" + Form.Name.) Jeg ved
ikke rigtig om der er noget at gøre ved det, da jeg ikke lige har lyst
til at afslutte Delphi for at teste mit program. (Det tager mig næsten
et helt minut at starte Delphi!)
> Application.CreateForm(TTDinHovedForm, TDinHovedForm);
>....
> Application.Run;
>END ELSE BEGIN
> IF ParamCount > 0 THEN BEGIN // vi forventer en fil
> Send en message til programmet med filnavnet
> Vistnok WM_copydata.
> END;
> SetFocus ( FindWindow('TDinHovedForm',PCHAR(0)) );
>END;
Jeg ved endnu ikke om det fungerer (se ovenfor), men det kompilerer
da! For at være på den sikre side (med at finde ud af om programmet
faktisk kører) har jeg beslutte mig for at bruge "den go'e gamle
metode" med at lave et Mutex så snart programmet starter, og hvis det
mislykkes så kører programmet allerede. Det er så kun i det tilfælde
at programmet allerede kører at resten af "find vinduet og seng
message" bliver kørt. Desværre lykkes det at oprette Mutex _hver_
_eneste_ gang, altså hvis jeg kører programmet to gange. (Jeg bruger
ikke "Run" i Delphi, men kører i stedet den kompilerede .exe fil
direkte. Her er min kode:
- - - Start DPR fil (projekt-fil) - - -
program MitProgram;
uses
Forms,
Windows,
Messages,
SysUtils,
MainFormUnit in 'MainFormUnit.pas' {MainForm},
{ ... flere forms ... };
{$R *.RES}
var
OldInst: HWND;
cpdStruct: PCopyDataStruct;
Mtx: THandle;
begin
Mtx := CreateMutex(nil, True, 'MinMutex');
if GetLastError <> 0 then
begin
OldInst := FindWindow('TMainForm', PChar(0));
if OldInst > 0 then
begin
New(cpdStruct);
if ParamCount = 0 then
with cpdStruct^ do
begin
dwData := 0;
cbData := 0;
lpData := nil;
end
else
with cpdStruct^ do
begin
dwData := 1;
cbData := Length(ParamStr(1))+1;
lpData := PChar(ParamStr(1));
end;
SendMessage(OldInst, WM_COPYDATA, Application.Handle,
Integer(cpdStruct));
Dispose(cpdStruct);
Halt;
end
end
else
begin
Application.Initialize;
{ ... diverse CreateForm() og App.Title := osv ... }
Application.Run;
ReleaseMutex(Mtx);
end;
end.
- - - Slut DPR fil - - -
- - - Start MainFormUnit.pas - - -
unit MainFormUnit;
{ Jeg har skåret alt irrelevant væk }
interface
type
TMainForm = class(TForm)
{ ... Felter til kontroller og event-handlers ... }
private
procedure CopyData(var Msg: TWMCopyData); message WM_COPYDATA;
end;
inplementation
procedure TMainForm.CopyData(var Msg: TWMCopyData);
begin
case Msg.CopyDataStruct.dwData of
0:
NewFile;
1:
with TEditor.Create(Application) do
begin
LoadFile(PChar(Msg.CopyDataStruct.lpData));
Show;
end;
end;
end;
end.
- - - Slut MainFormUnit.pas - - -
De fleste kan nok se at jeg ikke vil ud med hvilken type program jeg
laver!
Hvis der er nogen der gider teste dette og/eller finde fejl i koden,
såå ... ville jeg nok blive meget glad!
Niels (aka. niLLer)
--
e-mail: nmartin at iname dot com ICQ UIN: 50187323
http://xoasis.com/~niller/ - niLLer's pages (My programs, in English)
http://whitehat.dk/g4s/ - The G4S Page (Personlig side, på dansk)
-- Behind the end of nowhere!