Tworzenie MDIChild

0

Witam serdecznie tworze formatke glowna MDIForm i kilka pochodnych MDIChild chodzi o to aby po kliknieciu na button formatka MDIChild otwierala sie tylko raz. Niestety moj kod

procedure TfmMain.tbKDClick(Sender: TObject);
begin

    if (fmKD <> nil) then
     begin
      if (fmKD.Name = '') then
       begin
        try
        FreeAndNil(fmKD) ;
        except
        end;
        fmKD := TfmKD.Create(self);
       end
      else
       fmKD.Show ;
     end
      else
       fmKD := TfmKD.Create(self);

end;

Dziala lecz wyrzuca blad na debugerze ... invalid pointer ... Jakies pomysly ??

0

Musisz przeszukać odpowiednią tablicę(nazywa się chyba MDIForms) pod kątem występowania danego okna. Jeśli jest, to je pokazujesz, jeśli nie ma to je tworzysz i pokazujesz.

A zwolnienie okna ma nastąpić po jego zamknięciu, czyli w OnClose dajesz:

  action:=caFree;
0

Mam to action := caFree niestety nie zwalnia to pamieci w 100% a jedynie czysci formatke pozostawiajac ja w pamieci (sam sprawdzalem) dlatego nil nie dziala ... a ta tablice mdiforms to w jaki sposob sprawdzac ??

0
woolfik napisał(a)

Mam to action := caFree niestety nie zwalnia to pamieci w 100% a jedynie czysci formatke pozostawiajac ja w pamieci (sam sprawdzalem) dlatego nil nie dziala

Niemożliwe to jest. Może masz jakieś MemoryLeaki?

... a ta tablice mdiforms to w jaki sposob sprawdzac ??

:| A patrzyłeś, jakie właściwości ma forma główna?

0

No wlasnie ja tez myslalem ze caFree powoduje calkowite zwolnienie pamieci ale tak nie jest a forma glowna jest ustawiona na mdiForm pozostale na mdiChild. Jesli nie wierzysz to sprawdz sobie w debug inspectorze. Nie wiem czy to istotne ale pracuje na Delphi 2009.

0

Co do formy głównej to miałem na myśli tablicę.

Ja to robię w ten deseń:

Funkcja zwraca dziecko lub nil. Parametr TAG jest konkretnie mi czasem potrzebny

function TMainForm.FindMDIChild(AClassType: TClass; ATag: integer = 0): TForm;
var
 i: integer;
begin
  result:=nil;
  for i:=0 to self.MDIChildCount-1 do
    if (self.MDIChildren[i].ClassType = AClassType) and
       (self.MDIChildren[i].Tag = ATag) then
    begin
      result:=self.MDIChildren[i];
      break;
    end;
end;

A teraz tworzenie formy dziecka(mdiChild)

var
  form: TForm;
begin
  form:=FindMDIChild(TMojaFormaMDI);
  if form<>nil then form.BringToFront else
  begin
    form:=TMojaFormaMDI.Create(self);
    form.Show;
  end;
end;

w onClose form MDIChild mam action:=caFree i wszystko działa.

0

Wielkie dzieki dokladnie o takie rozwiazanie mi chodzilo. Browar dla ciebie :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.