[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 456
  • Last Modified:

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?
0
mornao
Asked:
mornao
1 Solution
 
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.
0
 
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
0
 
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).
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now