Pisałem na ten temat coprawda pod koniec roku szkolnego, ale to było dawno i nie było odzewu. Spróbuję więc może inaczej. Robię najprostszą (wydawałoby się) rzecz związaną z DLL'kami i menu, jaka mi przyszła do głowy. Mianowicie, tworzę sobie program główny, w nim wstawiam menu, a w procedurze kreacji otwieram dynamicznie biblioteczkę DLL i uruchamiam procedurkę Inicjującą wyglądającą następująco:
procedure Initialize(Form: TForm); stdcall;
var
MenuItem: TMenuItem;
begin
MenuItem:=TMenuItem.Create(Form);
MenuItem.Caption:='DLL1';
MenuItem.OnClick:=Obiekt.MenuClick;
{ add the new item to the Windows menu }
Form.Menu.Items.Add(MenuItem);
end;
Dla porządku wstawię może deklarację Obiektu:
type
TObiekt = object
procedure MenuClick(Sender: TObject);
end;
var
Obiekt: TObiekt;
procedure TObiekt.MenuClick(Sender: TObject);
begin
ShowMessage('Kliknales 1');
end;
No i wszystko działa pięknie, jak uruchomię program, to pojawia mi się menu i element listy (o nazwie DLL1), jak w niego kliknę, to pojawia mi się okienko z napisem "Kliknales 1" i jest cool. Sprawa się komplikuje, jak dodam drugą, identyczną niemal bibliotekę dynamiczną. Różnice polegają jedynie na tym, iż Caption MenuItem'a brzmi DLL2, nie DLL1, a napis w okienku "Kliknales 2", a nie "Kliknales 1". No i niby wszystko działa, menu się pojawia, mam dwa elementy menu (DLL1 i DLL2), jak kliknę w pierwszy, to pojawia mi się napis "Kliknales 1", a jak klikne drugi, to (tu zonk) również pojawia się napis "Kliknales 1". Po krótkich testach doszedłem do wniosku, że niezależnie od wszystkiego, przy kliknięciu w drugi element menu wykonuje mi się event OnClick elementu pierwszego. Jeśli pierwszemu elementowi nie przypiszę żadnego Eventa OnClick, a drugiemu przypiszę event odpowiedni, to kliknięcie na drugi element (tak jak i na pierwszy) nie spowoduje żadnego efektu.
Co jest grane? Jest to przecież najprostsza rzecz, jaką można zrobić, a tu już takie dziwadła się dzieją... Celowo zrobiłem to wszystko w prawie pustym programie, nie służącym do niczego, by uniknąć błędów i by program był najczytelniejszy, jak to tylko możliwe.