Avatar billede smith1 Nybegynder
02. august 2006 - 08:33 Der er 5 kommentarer og
1 løsning

Sende parameters

Har læst dene guide, men kan ikke få det til at virke! :(
http://www.swissdelphicenter.ch/de/printcode.php?id=2126

er der en der kan lave et eksempel som virker? og upload det? så jeg kan kigge på koden.
Avatar billede a_nor Nybegynder
02. august 2006 - 11:06 #1
Hej Smith1,

Koden du henviser til virker nok? Jeg har tjekket med Delphi3, og der er nogle småting der skal justeres før det virker. Du kan indlæse nedenstående i hhv proj.source og unit.

(Har fjernet Mutex, og så iøvrigt brugt den overførte streng til noget - caption, og så skal program og unit naturligvis lige hedde Number_5 og mfu)


mvh

Anders

I projectsourcen:


program Number_5;

uses
  Forms, windows,
  mfu in 'mfu.pas' {mf_number5};

{$R *.RES}

//Programm Number_5;
//...
const
  cMutexID = 'Number_5_is_alive';
var
//  Mutex: THandle;
  HAPPLICATION: HWND;
  HMAINFORM: HWND;
  StartParams: string;
  AnzahlParams: Integer;
  AtomSend: Integer;
begin

(*
//    Mutex := CreateMutex(nil, True, cMutexID);
    // +++ identify an already running app +++
    if (Mutex <> 0) and (GetLastError = 0) then
    begin
        // +++ none was found, so proceed as usual +++
        Application.Initialize;
        Application.Title := 'Number 5 is alive';
        Application.CreateForm(TMF, MF);
  Application.Run;
        if (Mutex <> 0) then CloseHandle(Mutex);
    end
    else
    begin
*)
        // +++ look for the running app windows handle +++
        HAPPLICATION := 0;
        HMAINFORM := 0;
        Application.Initialize;
        repeat
              HAPPLICATION := FindWindowEx(0,HAPPLICATION, 'TApplication',
                              PChar('Number 5 is alive'));
        until HAPPLICATION <> Application.Handle;
        // +++ found it, so activate the running app and  proceed with the parameters +++
        if HAPPLICATION <> 0 then
        begin
          Windows.ShowWindow(HAPPLICATION, SW_Normal);
          Windows.SetForegroundWindow(HAPPLICATION);
          // +++ look for the Form handle, wich will be used as a target of the message +++
          HMAINFORM := FindWindowEx(0,0,'TMF_Number5', nil);
          if (HMAINFORM <> 0) then
          begin
              StartParams := '';
              // +++ code your parameters +++
              for AnzahlParams := 1 to ParamCount do
                  StartParams := StartParams + ' ' + ParamStr(AnzahlParams);
              try
                // +++ Send the parameter info +++
                AtomSend := GlobalAddAtom(PChar(StartParams));
                SendMessage(HMAINFORM, WM_ACTIVATENumber5, Length(StartParams), AtomSend);
              finally
                GlobalDeleteAtom(AtomSend);
              end;
          end;
          Halt;
        end
        // all is done: parameters had been sent so we can quit safelly
        ELSE
        BEGIN
          Application.Title := 'Number 5 is alive';
          Application.CreateForm(TMF_NUMBER5, MF);
          Application.Run;
        END;

//    end;
end.

unit MFU;

interface

uses
  Windows, Messages, SysUtils, {Variants,} Classes, Graphics, Controls, Forms;

const
  WM_ACTIVATENumber5 = WM_USER + 101;

type
  Tmf_number5 = class(TForm)
    procedure FormShow(Sender: TObject);
  private
    { Private-Deklarationen }
// a_nor  flyttet hertil :
    procedure WMACTIVATENumber5(var Msg: TMessage); message WM_ACTIVATENumber5;
  public
    { Public-Deklarationen }
  end;

var
  MF: TMF_Number5;

implementation

{$R *.dfm}

procedure TMF_Number5.FormShow(Sender: TObject);
begin
  // +++ the app was normaly started: parameters are maybe pending in the command line buffer +++
  if ParamCount > 0 then
  begin
    // +++ Handle with this parameters.... +++
  end;
end;

procedure TMF_Number5.WMACTIVATENumber5(var Msg: TMessage);
var
  Buffer: PChar;
  S: string;
begin
  // +++ the app was "reactivated": the command line cannot be used thru "ParamStr(..)" yet +++
  try
    // +++ get the length of the "command line message" +++
    Buffer := StrAlloc(Msg.wParam + 1);
    // +++ hold its value +++
    GlobalGetAtomName(Msg.lParam, Buffer, Msg.wParam + 1);
    S := StrPas(Buffer);
//a_nor:
  CAPTION := s;
    // +++ Analyse S and handle with parameters at will.... +++

  finally
    StrDispose(Buffer);
  end;
end;

end.
Avatar billede smith1 Nybegynder
02. august 2006 - 12:36 #2
Får denne fejl: "Error in module MFU: Declaration of class TForm1 is missing or incorect."

Project name: Number_5
Unit Name: MFU

og så copy/past jeg koden! der kommer ikke nogen compiler fejl! kun den fejl^
Avatar billede a_nor Nybegynder
02. august 2006 - 13:31 #3
Efter du har oprettet et nyt project gemmes projektet som 'Number_5' og unitten som 'mfu'. I mfu-unitten omdøber du form1 til mf_number5 (i Object inspector: name) herefter indlæses koden, ellers kan det være lidt bøvlet at få omdøbt korrekt.

Anders
Avatar billede smith1 Nybegynder
02. august 2006 - 14:21 #4
hvad bliver dette brugt til? virker jo uden.
(*
//    Mutex := CreateMutex(nil, True, cMutexID);
    // +++ identify an already running app +++
    if (Mutex <> 0) and (GetLastError = 0) then
    begin
        // +++ none was found, so proceed as usual +++
        Application.Initialize;
        Application.Title := 'Number 5 is alive';
        Application.CreateForm(TMF, MF);
  Application.Run;
        if (Mutex <> 0) then CloseHandle(Mutex);
    end
    else
    begin
*)

er der andet i koden som jeg kan fjerne?
Avatar billede a_nor Nybegynder
02. august 2006 - 15:12 #5
Mutes bruges til at synkronisere afviklingen af programblokke i et program hvis dette afvikles flere gange. Dette kan således også bruges som anført i dit eksempel, men er ikke nødvendigt.

Nu har du ikke skrevet så meget om hvad du vil andet end at "sende parameters" og få koden til at virke. Så kodeoptimering har jeg nu ikke rigtig overvejet. Iøvrigt skal der jo også "fyldes noget i" '.formshow' hvis param's skal bruges første gang programmet startes.

Tjek iøvrigt 'Sende data fra et program til et andet'
http://www.eksperten.dk/spm/720934
Avatar billede smith1 Nybegynder
03. august 2006 - 08:29 #6
Skal bruge det til min text editor, hvor jeg kan have flere text filer åben på samme tid.

Når jeg double klikker på text filer åbner de med mit program, så jeg skal bare overfører paramstr(1) så jeg kan åbne den i den instance der køre.

btw tak for hjælpen
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