Piszę notanik z zakładkami... I chcę zrobić coś takiego, że jak otwieram jakiś plik tekstowy moim notatnikiem, a już mam otwartą jego jedną kopię (notatnika), to żeby ten plik się otworzył w tej już istniejącej instancji, a ta druga zeby sie zamknela.
Mam kodzik:
(wyslanie komunikatu - w źrodle projektu)
const
WM_OPENFILE = WM_USER + 1000;
var
hM : HDC;
handle: THandle;
buffer: string;
begin
hM:=CreateFileMapping(THANDLE($FFFFFFFF),nil,
PAGE_READONLY,0,32,'ApplicationTestMap');
if GetLastError=ERROR_ALREADY_EXISTS then
begin
handle:= findwindow('TFrmMain', nil);
if paramstr(1)<>'' then
begin
buffer:=paramstr(1);
sendmessage(handle, WM_OPENFILE, integer(PChar(buffer)), 0);
end;
Application.Terminate;
CloseHandle(hM);
end;
(Odebranie komunikatu - w kodzie programu)
const
WM_OPENFILE = WM_USER + 1000;
type
TfrmMain = class(TForm)
(...)
private
{ Private declarations }
public
(...)
procedure tworz_zakladke;
procedure wmOpenFile(var msg: TMessage); message WM_OPENFILE;
{ Public declarations }
end;
var
frmMain: TfrmMain;
(...)
aktywnytab: integer; // numer aktywnego tabu w pagecontrol
implementation
{$R *.dfm}
procedure TfrmMain.wmOpenFile(var msg: TMessage);
var
buffer: string;
begin
buffer:=string(msg.WParam);
tworz_zakladke;
TRichedit(findcomponent('rText'+inttostr(aktywnytab))).Lines.LoadFromFile(buffer);
end;
I przy uruchamianiu drugiej instancji (jeśli jest parametr, czyli otwarcie pliku) program wywala mi Access Violation w linii Sendmessage(...). Możliwe, że jest to spowodowane niepoprawnym formatem danych, czyli zamiana sciezki otwatego pliku na integer (zeby mozna bylo wyslac przez sendmessage jako parametr):
sendmessage(handle, WM_OPENFILE, integer(PChar(buffer)), 0);
Pomożcie! :)