[Delphi] Dynamiczne formy i wyładowanie z pamięci

Odpowiedz Nowy wątek
2006-08-24 19:09
Marek123321
0

Stworzyłem sobie klase w ktorej mam dynamiczną forme, 3 labele i jednego buttona. Potrzebuje otworzyć nieograniczoną liczbe tych form tak wiec wpakowałem to do tablicy dynamicznej. Jednym buttonem powiekszam tablice i tworze forme, drugim ją usuwam i zmniejszam tablice (zaczynając zawsze od ostatniej). Jest tylko jeden problem, podczas calej tej operacji mam w tle odpalone menedzer zadan i widze ze podczas nowej formy zwiększa się zużycie RAMu ale podczas ich zamykania nie jest ani troche zwalniane. Zrobilem wszystko czego sie nauczyłem z książek i dynamicznych komponentach i nie wiem dlaczego tak sie dzieje. "Normalne" formy delphi znikają w pamięci prawidłowo. Mógłby ktos zerknąć na kod? Jest bardzo prosty.

type
  TFormy = class
  public
    forma: TForm;
    labTime: TLabel;
    labDate: TLabel;
    labTytul: TLabel;
    buttOK: TBitBtn;
    constructor Utworz(Godzina, Data, Tytul: String);
    destructor Usun;
end;
 
var
  Formy: Array of TFormy;
 
//CONSTRUCTOR
constructor TFormy.Utworz(Godzina, Data, Tytul: String);
begin
  forma := TForm.Create(nil);
  labTime := TLabel.Create(forma);
  labDate := TLabel.Create(forma);
  labTytul := TLabel.Create(forma);
  buttOK := TBitBtn.Create(forma);
 
  //button
  with buttOK do begin
    Parent := forma;
    Left := 1;
    Top := 50;
    Caption := 'OK';
    Show;
  end;
 
  //label 1 
  with labTime do begin
    Parent := forma;
    Left := 1;
    Top := 1;
    Caption := Godzina;
    Show;
  end;
 
  //label 2
  with labDate do begin
    Parent := forma;
    Left := 1;
    Top := 10;
    Caption := Data;
    Show;
  end;
 
  //label 3
  with labTytul do begin
    Parent := forma;
    Left := 1;
    Top := 20;
    Caption := Tytul;
    Show;
  end;
 
  //pokaz forme
  forma.Show;
end;
 
//DESTRUCTOR
destructor TFormy.Usun;
  var
   i: integer;
begin
  FreeAndNil(labTime);
  FreeAndNil(labDate);
  FreeAndNil(labTytul);
  FreeAndNil(buttOK);
  FreeAndNil(forma);
end;
 
//BUTTON UTWORZ FORME
procedure TfrmMain.ToolButton5Click(Sender: TObject);
begin
  SetLength(Formy, Length(Formy)+1);
  Formy[High(Formy)] := TFormy.Utworz('01:12', '345345', 'Jakis tytul');
end;
 
//BUTTON USUN FORME
procedure TfrmMain.ToolButton6Click(Sender: TObject);
begin
  Formy[High(Formy)].Usun;
  Formy[High(Formy)] := nil;
  SetLength(Formy, Length(Formy)-1);
end;

Pozostało 580 znaków

2006-08-24 23:23
0

co do głównego pytania to u mnie działa, ale sama forma zajmuje tak mało pamięci, że memorymenager żeby nie robić ruchu nie zwalnia po te kilka kB jeśli nie musi. Otwórz ich sobie np 100 i potem zamknij to zobaczysz, że część pamięci zostanie zwolniona.

Natomiast z drugiej strony dziwnie to zrobiłeś (pomysł z osobną tablicą) ba jak masz klasę okien to powinieneś w niej mieć zamiast forma: TForm; właśnie Formy: Array of TFormy; oraz metody dodaj i usun i zmieniony konstruktor tak, żeby tworzenie formy było w metodzie dodaj i tak samo z destruktorem


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2006-08-25 08:18
Marek123321
0

Dzięki Misiekd! Jestem w pracy i nie mam jak sprawdzić, ale skoro sprawdzałeś to tak pewnie jest.

I dzięki za podpowiedź odnośnie konstruktora, nie wiedziałem dlaczego nie zwalnia mi pamięci dlatego zastosowałem dość prosty szablon :)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0