Свои компоненты и освобождение ресурсов
От: DeniZNET  
Дата: 23.12.04 05:33
Оценка:
Делаю свой комопонеты типа BalloonDialog для MSAgent(многофункциональная текстовая выноска как в MSOffice). Недавно просмотрел использование ресурсов в Диспетчере ресурсов, там есть скрытая колонка "Объекты GUI". Так вот когда диалог выноски появляется, то, естественно, количество объектов увеличивается, соответсвенно, увеличивается используемой памяти. Но когда диалог выноски закрывается, то количество объектов не становиться меньше. А обычные диалоги типа MessageDlg естественно освобождают. Я делаю диалоги вот, так:



TBalloonForm = class(TForm)
    constructor CreateNew(AOwner: TComponent); reintroduce;
    destructor Destroy; override;
...
protected
    HReg: HRGN;
...
end;

TDlgBalloon = class(TComponent)
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  private
    function CreateBlnForm(...): TBalloonForm;
   ...
   public
    function  MessageDlg(const Title: WideString; const Prompt: WideString; DlgType: TMsgDlgType;
   ...
end;

implimentation

function TDlgBalloon.CreateBlnForm(...): TBalloonForm;
var
 f: TBalloonForm;
begin
 f:=TBalloonForm.CreateNew(nil);
 ...
 with TLabel.Create(f) do
     begin
      Name:='Title';
      Parent:=f;
      ...
    end;
 //и так далее все необходимые контролы
 ...
 Result:=f;
end;

function TDlgBalloon.MessageDlg(const Title: WideString; const Prompt: WideString;
  DlgType: TMsgDlgType; Buttons: TMsgDlgButtons): TModalResult;
var
 f: TBalloonForm;
begin
 f:=CreateBlnForm(... Title, Prompt, DlgType,
     Buttons, ...);
 Result:=f.ShowModal;
 f.Release; //даже с этим несолько объектов не удаляется
end;


Кроме того, если не вырезать форму по региону(через CreateRoundRectRgn, CombineRgn и SetWindowRgn), то есть оставлять прямоугольной, то освобождаются все ресурсы.
Я создают регион так:


procedure TBalloonForm.Region();
begin
 Self.HReg:=CreateRoundRectRgn(RegionCut.Left, RegionCut.Top, RegionCut.Right+1,
        RegionCut.Bottom+1, BLN_Round, BLN_Round);
 SetWindowRgn(Self.Handle, Self.HReg, true);   
end;


А потом при уничтожении форму удаляю регион:

DeleteObject(Self.HReg);



А особенно много объектов остается в памяти, когда использую CombineRgn для создания региона по картинке(по TBitmap). ТАм регионов получается много, но все они сливается в один Self.HReg. Но такое ощущение, что после удаления HReg не вся память усвобождается.
Так все-таки как правильно удалять компоненты, регионы и саму форму?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.