Try this approach:
in every form you want to close "remotely" set onDeactivate event like this
Tdesiredform.OnDeactivate(Sender : TObject);
begin
gHandle := self.Handle; // gHandle is a global variable of type THandle
end;
When you click on your dedicated "Close" button do
if gHandle <> 0 then PostMessage(gHandle, WM_CLOSE, 0,0);
gHandle := 0;
The last piece is a Delphi code, but something very similar must exist in Lazarus as well. Edited: in fact, it does not work, because I could not figure out what message is closing the form. So another approach would be:
var formRef : TForm; // global variable available everywhere
...
TsomeForm.Deactivate(Sender : TObject);
begin
formRef := self; // second reference to someForm;
// formRef always refers to last active form or nil
end;
....
TMainForm.CloseFormButtonClick(Sender : TObject);
begin
if Assigned(formRef) then formRef.Close;
formRef := nil; // to avoid re-use
end;
.....
TsomeForm.FormClose(Sender : TObject);
begin
if formRef = self then formRef := nil;
// to avoid reference to already closed form
end;
I think the above code must work in Lazarus.