Przerzucam w D7 część kodu do dll. Trafił mi się taki oto przypadek braku wiedzy:
W dll chcę mieć formę dostępną dla użytkownika w ten sposób, że jest ona zawsze na wierzchu ale pozwala na interakcję z główną aplikacją. Klasyczna forma niemodalna StayOnTop.
Umówmy się, że forma zawiera tylko jeden Button którego rolą jest zamknąć okno.
W "Delphi 6 Vademecum profesjonalisty" jest odpowiedni przykład jak taką formę oprogramować. Delikatnie go zmieniłem i cytuję poniżej.
Tworzę i eksportuję z dll funkcję tworzącą formę oraz procedurę ją zwalniającą jak w przykładzie:
unit DLLfrm;
interface
uses ...
type
TDLLForm = class(TForm)
ButtonZamknij :TButton;
procedure ButtonZamknijClick(Sender: TObject);
end;
function ShowCalendar(AHandle: THandle): LongInt; stdcall;
procedure CloseCalendar(var AFormRef:Longint): stdcall;
var InnerRef:LongInt;
implementation
{$R *.DFM}
function ShowCalendar(AHandle:THandle): LongInt;
var DLLForm:TDLLForm;
begin
Application.Handle := AHandle;
DLLForm := TDLLForm.Create(Application);
Result := LongInt(DLLForm);
InnerRef := Result;
DLLForm.Show;
end;
procedure CloseCalendar(var AFormRef:LongInt);
begin
if AFormRef > 0 then TDLLForm(AFormRef).Release;
AFormRef := 0; {<- jak tą wiadomosć przekazać do głównej aplikacji?}
end;
procedure TDLLForm.ButtonZamknijClick(Sender: TObject);
begin
CloseCalendar(InnerRef);
end;
W aplikacji matce wywołuję:
if Referencja = 0 then {zabezpieczam się przed dwukrotnym wywołaniem okna}
Referencja := ShowCalendar(Application.Handle);
Jeśli chcę zamknąć formę buttonem, który znajduje się w aplikacji a nie na formie z dll to jak rozumiem wywołuję CloseCalendar(Referencja) i sprawa jest jasna.
A teraz pytanie:
Jeśli jednak chcę zamknąć okno buttonem, który jest częścią tego okna to w jaki sposób mogę przesłać informację do aplikacji matki, że okna już nie ma. Chciałbym uaktualnić wartość zmiennej Referencja na zero.
Pomożecie? :)