17. april 2005 - 20:43Der er
21 kommentarer og 2 løsninger
Åbne flere filer i MDI program med ParamStr
Hej,
Jeg har et MDI-program, hvor jeg har associeret en extension (.hma), så jeg bare kan dobbeltklikke på min fil for at åbne den i programmet. Mit problem er så, at hvis jeg dobbeltklikker på en anden fil, mens programmet kører, åbner den en ny version af programmet, i stedet for at åbne filen i det kørende program. Hvordan retter jeg dette??
Det må være noget med at du først skal sørge for at der ikke startes en ny version, det kan du gøre som stone skriver med kode der bla. benytter CreateMutex. Jeg vil dog foreslå at du henter XJustOne komponenter ( http://www.utilmind.com/delphi/justone.zip ) den er freeware og open source så du kan se hvad der foregår. Inden program nr 2 som er ved at starte op men bliver lukket ned igen når XJustOne komponenten finder ud af at der allerede er startet en version af programmet så skal du have sendt en besked til det allerede startede program, XJustOne har en event (AlreadyExist) der kaldes i dette tilfælde. For at sende en besked med diverse parametre til det allerede startede program kan du evt. bruge WM_COPYDATA, se win32 API for en beskrivelse. Jeg har brugt WM_COPYDATA i et par programmer og det virker ganske fint. Sig til hvis du vil have et eks. på brug af WM_COPYDATA. Om alt dette er nødvendig eller om der findes en anden ganske enkelt løsning skal jeg ikke kunne sige :)
Når man "BUMP"'er en tråd, plejer den at komme øverst igen, så folk lægger mærke til den. Sådan er det ihvertfald på mange boards. Når men det var nu bare for at gøre opmærksom på, at jeg endnu ikke har løst mit problem.... og Stone spurgte til, hvor jeg havde lagt min fil associations kode henne...
<stone> Hvordan har du tænkt dig at det program der allerede er startet skal få noget at vide om filen når det program der får noget at vide bliver lukket med det samme pga. CreateMutex koden. Der sker følgende: 1. Program_1 startes når der klikkes på en hma fil, det virker fint. 2. Program_2 startes når der klikkes på endnu en hma fil, men program_2 lukkes igen med det samme pga. CreateMutex kode. Program_1 der allerede er startet får intet at vide om den nye hma fil.
Altså det man skal er at når program_2 startes så skal program_2 sende besked til program_1 om hma filen inden program_2 lukkes.
type TForm1 = class(TForm) Memo1: TMemo; procedure FormActivate(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } procedure ModtagHMAfil(Filnavn : string); procedure WMCOPYDATA(var m : TMessage); message WM_COPYDATA; public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WMCOPYDATA(var m : TMessage); var CopyDataStruct : TCopyDataStruct; Filnavn : string; begin CopyDataStruct:=PCopyDataStruct(m.lParam)^; Filnavn:=pchar(CopyDataStruct.lpData); ModtagHMAfil('Via WM_COPYDATA: '+Filnavn); end;
procedure TForm1.ModtagHMAfil(Filnavn : string); begin Memo1.Lines.Add(Filnavn); end;
procedure TForm1.FormActivate(Sender: TObject); begin if ParamCount>0 then ModtagHMAfil('Normal: '+ParamStr(1)); end;
procedure TForm1.FormCreate(Sender: TObject); var PrevHandle: THandle; WinCaption : string; Mutex: hWnd; CopyDataStruct : TCopyDataStruct; begin WinCaption:=Self.Caption; Mutex:=CreateMutex(nil, False, PChar(Self.Caption)); if (GetLastError=ERROR_ALREADY_EXISTS) or (Mutex=0) then begin if ParamCount>0 then begin Self.Caption:=''; Application.Title:=''; PrevHandle:=FindWindow(nil, PChar(WinCaption)); if PrevHandle<>0 then begin CopyDataStruct.dwData:=0; CopyDataStruct.cbData:=length(ParamStr(1))+1; CopyDataStruct.lpData:=pointer(ParamStr(1)); SendMessage(PrevHandle, WM_COPYDATA, 0, lparam(@CopyDataStruct)); end; end; Application.ShowMainForm:=False; Application.Terminate; end; end;
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.