Делаю свой комопонеты типа 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 не вся память усвобождается.
Так все-таки как правильно удалять компоненты, регионы и саму форму?