Avatar billede nimmer_dk Nybegynder
17. april 2005 - 20:43 Der 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??

Mvh.

Kim
Avatar billede stone Forsker
17. april 2005 - 22:28 #1
// messagebox kan du bare fjerne hvis du ikke vil have en meddelse

var
    MutexHandle: THandle;


begin
MutexHandle := CreateMutex(nil, TRUE, 'Myappmitprogram');
    if MutexHandle <> 0 then
      begin
          if GetLastError = ERROR_ALREADY_EXISTS then

          begin
              MessageBox(0, 'navn på dit program.',
                            'Information', mb_IconHand);


            CloseHandle(MutexHandle);
              Halt; // 'Halt' er den som sørger for at programmet ikke
                    // kører i mere end en instance.
          end

              end;
Avatar billede kroning Nybegynder
17. april 2005 - 22:52 #2
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 :)
Avatar billede nimmer_dk Nybegynder
17. april 2005 - 23:14 #3
Hvor kalder jeg alt det der Mutex halløj henne??
Avatar billede stone Forsker
17. april 2005 - 23:22 #4
{$R *.DFM}

// her smider du koden ind
Avatar billede stone Forsker
17. april 2005 - 23:28 #5
eller prøv at kigge her for fler muligheder

http://www.swissdelphicenter.ch/en/showcode.php?id=42
Avatar billede nimmer_dk Nybegynder
17. april 2005 - 23:52 #6
Nu kan jeg godt få programmet til kun at køre en gang, men jeg kan ikke få den til at åbne den fil jeg klikker på, når programmet er åbent....
Avatar billede stone Forsker
18. april 2005 - 13:41 #7
hvor har du sat din fil accociation kode ind henne
Avatar billede nimmer_dk Nybegynder
18. april 2005 - 13:53 #8
Den ligger i FormShow
Avatar billede nimmer_dk Nybegynder
19. april 2005 - 20:31 #9
BUMP
Avatar billede kroning Nybegynder
20. april 2005 - 08:01 #10
Hvad betyder BUMP
Avatar billede nimmer_dk Nybegynder
20. april 2005 - 08:54 #11
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...
Avatar billede kroning Nybegynder
20. april 2005 - 11:09 #12
Har du kikket på WM_COPYDATA som jeg tidligere foreslog?
Avatar billede stone Forsker
20. april 2005 - 13:24 #13
<nimmer dk> jeg har ikke glemt dig jeg har bare ikke haft tid til at få kigget nærmere på problemet.

for mig at se er det at din fil accication procedure ikke bliver udført, prøv at lægge den i OnActivate
Avatar billede kroning Nybegynder
20. april 2005 - 16:10 #14
<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.
Avatar billede stone Forsker
20. april 2005 - 18:15 #15
ups ja du har ret det er en tanketorsk gg
Avatar billede kroning Nybegynder
20. april 2005 - 19:19 #16
Her er et eks. på brug af WM_COPYDATA, smid en TMemo på en form:

unit Unit1;

interface

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

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;

end.
Avatar billede nimmer_dk Nybegynder
21. april 2005 - 07:58 #17
Jeg kigger på det senere... indtil videre tak

Kim
Avatar billede nimmer_dk Nybegynder
25. april 2005 - 10:50 #18
Det ser ud til at virke nu, kan jeg splitte pointene ud på jer begge??

Kim
Avatar billede kroning Nybegynder
25. april 2005 - 14:46 #19
Det tror jeg ikke man kan, men du må jo bare give alle points til den du syntes har bedst fortjent det :)
Avatar billede stone Forsker
25. april 2005 - 18:10 #20
ja man kan godt splitte point - men jeg synes selv at kroning har fortjent dem alle
//stone
Avatar billede nimmer_dk Nybegynder
26. april 2005 - 07:59 #21
Hvis du virkelig mener det stone? Det var no jer begge 2 der ledte mig på rette vej, så jeg synes I skulle dele... Hvordan gør jeg det?
Avatar billede stone Forsker
26. april 2005 - 08:13 #22
ok så pyt da .... når jeg lægger et svar og når du skal gi point afmærker du os begge
som modtager af point
Avatar billede nimmer_dk Nybegynder
26. april 2005 - 11:51 #23
Sådan, tak for hjælpen begge 2.

Kim
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