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?
LVL 1
mornaoAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

saravananvgCommented:
Hello sir,

  Before you close the childform you set back the caption of the mainform.

ie, OnClose event of the form when you are freeing the child form set the caption of the main form.

for eg
Under MDI form (say form1) when opening the form set the caption as follows

procedure TForm1.Button1Click(Sender: TObject);
begin
  fORM2 := TForm2.Create(Self);
  Form1.Caption := UpCaseFirst(runt)+' Tracking System'
  Form2.Show;
end;

Under child form (say form2) when closing set back the caption as follows

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Form1.Caption := 'Tracking System';
  Action := caFree;
end;

with regards,
padmaja.

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
tammozCommented:
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
mornaoAuthor Commented:
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).
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Delphi

From novice to tech pro — start learning today.