Avatar billede fixxxer Nybegynder
18. maj 2003 - 20:36 Der er 3 kommentarer og
3 løsninger

åben form i et allerede åbent program

Hvis jeg har et program, og jeg ønsker at åbne en fil fra fx Stifinder, som er associeret med programmet.
H
vordan kan jeg så "hooke" denne execution, og få programmet til at åbne en form, som fx viser indholdet af den valgte fil i et TMemo?

Jeg skal vel lave et trick, så kun et kopi af programmet kan køres og derefter få programmet til at åbne ParamStr(x) i Memo.Lines.LoadFromFile ?

Skal bare bruge noget kode :)
Avatar billede stone Forsker
18. maj 2003 - 22:15 #1
nedenstående code associerer dit program's *.exe fil med en standard icon som hvis du trykker på filen i explorer eller andet starter dit program.

I dit program's form1.Oncreate kan du skrive:

Memo1.Lines.LoadFromFile('c:\test.txt');//


uses
  registry, shlobj;

procedure TForm1.RegisterFileType(prefix: string; exepfad: string);
var
  reg: TRegistry;
begin
  reg := TRegistry.Create;
  try
    reg.RootKey := HKEY_CLASSES_ROOT;
    //create a new key  --> .pci
    reg.OpenKey('.' + prefix, True);
    try
      //create a new value for this key --> pcifile
      reg.Writestring('', prefix + 'file');
    finally
      reg.CloseKey;
    end;
    //create a new key --> pcifile
    reg.CreateKey(prefix + 'file');
    //create a new key pcifile\DefaultIcon
    reg.OpenKey(prefix + 'file\DefaultIcon', True);
    //and create a value where the icon is stored --> c:\project1.exe,0
    try
      reg.Writestring('', exepfad + ',0');
    finally
      reg.CloseKey;
    end;
    reg.OpenKey(prefix + 'file\shell\open\command', True);
    //create value where exefile is stored --> c:\project1.exe "%1"
    try
      reg.Writestring('', exepfad + ' "%1"');
    finally
      reg.CloseKey;
    end;
  finally
    reg.Free;
  end;
  SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  RegisterFileType('pci', 'c:\project1.exe');
end;

I dit program's form1.Oncreate kan du skrive:

Memo1.Lines.LoadFromFile('c:\test.txt');


koden for at programmet kun kan kører i en instance:

var
    MutexHandle: THandle;


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

          begin
              MessageBox(0, 'Test kører allerede.',
                            '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;




  Application.Initialize;
  Application.Title := 'test';
  Application.HelpFile := 'test.hlp';
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Avatar billede fixxxer Nybegynder
19. maj 2003 - 23:49 #2
det er jo også fint, men det hjælper mig kun halvt. programmet skulle gerne create en ny "edit" form hvor den valgte fil så åbnes.
Avatar billede fracklen Nybegynder
20. maj 2003 - 17:10 #3
const
  WM_MY_MESSAGE = WM_USER + 1337;

prop denne i deklerationer af procedurer:
procedure MessageReceiver(var msg: TMessage); message WM_MY_MESSAGE;

og så lav noget med

procedure TForm1.MessageReceiver(var msg: TMessage);
var filnavn: string;
begin
filnavn:=PChar(msg.WParam);

if FileExists(Filnavn) then
begin
  Memo1.Lines.LoadfromFile(filnavn);
  // mht at åbne flere filer i samme
  // kunne du evt lave noget med nogle
  // child-windows...
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
if ParamCount > 0 then
if FileExists(ParamStr(1)) then
Memo1.Lines.LoadFromFile(ParamStr(1));
end;

initialization
MutexHandle :=CreateMutex(nil,true,'MyAppTest');
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
    SendMessage(
                FindWindow(nil,'Titlen på din form'),
                WM_MY_MESSAGE,
                DWORD(PChar(ParamStr(1))),
                0
                );
    halt;
  end;

finalization
  if MutexHandle <> 0 then CloseHandle(MutexHandle);
end.


Her har du i hvert fald lidt at arbejde videre med...
Avatar billede fixxxer Nybegynder
21. maj 2003 - 19:18 #4
Jeg kan ikke få den til at sende og/eller modtage message. Jeg undersøger om FindWindow giver resultat, det gør den, og smider jeg en ShowMessage() på SendMessage får jeg resulteret 0, så beskeden aldrig er kommet afsted eller blevet modtaget.

Jeg har placeret min const WM_MY_MESSAGE efter første uses clause, og før type.

MessageReciver() har smidt i min unit/form med TfrmEditor foran og smidt dekleringen sammen med andre standard procedurere.

Hele initialization / finalization har jeg ligget til sidst i min unit/form.

Hvad har jeg gjort galt?
Avatar billede fixxxer Nybegynder
22. maj 2003 - 21:16 #5
Nu har jeg lavet lidt tricks, og byttet SendMessage ud med PostMessage, og kan nu få programmet til at modtage beskeden, men den er noget krypteret den der kommer frem, hvorfor?
Avatar billede fixxxer Nybegynder
08. august 2003 - 08:19 #6
sådan her skal det gøres...


http://www.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_20623659.html

i får 15 hver, for at at svare delvist rigtigt på spørgsmålet :)
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



IT-JOB

MAN Energy Solutions

Department Manager Edge Platform

Metro Service A/S

Erfaren IT-supporter

Udviklings- og Forenklingsstyrelsen

IT-generalister til rollen som systemejer

Udviklings- og Forenklingsstyrelsen

ITSM-koordinator