Pozmieniałem trochę kod, ale wychodzi to samo.
To jest jedna z głównych funkcji formularza głównej aplikacji:
ilosc:=0;
setlength(h,0);
setlength(t,0);
setlength(a,0);
FindFirst('DLL/*.dll', faAnyFile, sr);
repeat
begin
ilosc:=ilosc+1;
setlength(h,length(h)+1);
setlength(t,length(t)+1);
setlength(a,length(a)+1);
h[ilosc-1]:=LoadLibrary(PAnsiChar('DLL/'+sr.Name));
//showMessage(intTostr(length(h)));
if h[ilosc-1]>=32 then
begin
@t[ilosc-1]:=GetProcAddress(h[ilosc-1],'Utworz');
if @t[ilosc-1]<>nil then
begin
t[ilosc-1](Application, MainMenu1);
end;
@m:=GetProcAddress(h[ilosc-1],'Nazwa');
if @m<>nil then
begin
opcja:=TMenuItem.Create(Application);
opcja.Caption:=m;
@a[ilosc-1]:=GetProcAddress(h[ilosc-1],'pokaz');
opcja.onClick:=Klikniecie;
Menu.Items.Add(opcja);
end
end;
end;
until FindNext(sr)<>0;
FindClose(sr);
Wyszukuje ona DLLe w oddzielnych katalogach, tablicuje już wszystko co się da (handlery, wskaźniki do funkcji Utworz, pokaz itd).
Odpowiednie funkcjie:
Utworz - znajduje się w każdym DLLu - tworzy formularz
Pokaz - pokazuje formularz z danego DLLa
Nazwa - zwraca nazwę jaką chce mieć dany DLL na menu rozwijanym na głównymn formularzu.
Te funkcje/procedury nie mają żadnego znaczenia dla problemu - są napisane poprawnie itd. itp.
Z kolei procedura Klikniecie, ktora jest zdefiniowana w głównej aplikacji wygląda tak:
procedure TForm1.Klikniecie(Sender: TObject);
begin
showMessage(IntToStr(ilosc-1));
a[ilosc-1](Sender);
end;
W obecnej wersji, w menu następują odwołania zawsze do ostatniego DLLa.
Inaczej mówiąc:
opcja.onClick:=Klikniecie; powoduje dla każdego wczytywanego DLLa w każdej pętli, wykonanie działania dla końcowej wartości zmiennej ilość, przez co zawsze po kliknięciu dowolnej pozycji w menu uruchomii się ten sam podformularz...