Link to home
Start Free TrialLog in
Avatar of mornao
mornao

asked on

Main form title (sometimes) incorrect on exit/close MDI child form

An application uses MDI in a panel replacement mode (the MDI child occupies the space where the Panel was) and the Main form caption is generated dynamically (as there are many modes that the program could run as)

On selecting an MDI child form (such as Item Maintenance) the main form title changes to a concatenated caption - the original main form caption followed by the MDI child form caption in square brackets. This is as expected.

On exit of the maintenance IN ALMOST ALL CASES the MDI child form although closed, still passes the form caption to the main form so although you have exited back to the main form the last entered MDI form caption is on the main form. This could be a feature but is not wanted.

Have tried resetting the main form caption after closing all MDI children, but even when this is done and DEBUGged the caption is the same after as before. It suggests that the main form caption is overridden, but with what?

Example 'home1click(Sender)' called on exit from any MDI child process.

procedure TForm1.Home1Click(Sender: TObject);
var i:integer;
begin
  for i := MDIChildCount-1 downto 0 do   // close open windows, who ever they are...
        MDIChildren[i].Close;
  if loggedin=true then ButtonMenuOn;
  panel1.visible:=true;                          // MDI Panel
<< at this point caption might be 'Document Tracking System - [Item Maintenance] >>
  form1.Caption:=UpCaseFirst(runt)+' Tracking System';
  Form1.Repaint;
  SetSts(Sender);
<< At this point caption is still 'Document Tracking System - [Item Maintenance] >>
  Application.ProcessMessages;
end;

As mentioned, not all MDI child exits do the same. All the forms have the same variable parameters, but on exit of the Population enquiry' panel using the same method as all the others the MDI Child title correctly disappears.

Any answers?
ASKER CERTIFIED SOLUTION
Avatar of saravananvg
saravananvg
Flag of India image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of tammoz
tammoz

hi
first of all I do not preffer using MDI forms it has many problems, I preffer to use a normal forms and use an API function in the creation of each of your forms (except 4 the main) so it looks like:

procedure TForm2.FormCreate(Sender: TObject);
begin
  SetWindowPos(self.Handle, HWND_TOPMOST, 0, 0, 0, 0 , SWP_NOSIZE or SWP_NOMOVE);
end;

and feel free to act with your main and virtual children forms
try this it will make form2 acts like a child of form1 with some better features, in other way tou build your MDI application manually
but if you still wanna use MDi inform me to find another solution within MDI

best regards
Avatar of mornao

ASKER

The first response was accepted as there are multiple MDI children involved.

It was given a GOOD rating because all that was required was for FromClose(Sender,caAction) to be populated with a caFree. The Form1.Caption is retained and does not need resetting each time you exit the MDI Child.  The only thing that caused some headache was to avoid the lethal embrace - cured by not calling the close in the MDI child but letting the Form1.Home1Click(Sender) look after everything! It calls the FormClose(Sender,caAction).

The whole point of it being MDI was to give a consistant feel to the application, and allow trans-window messaging (such as turning off options when in the child but turning others on, and allowing the program still to event on them).