Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Где баг??? [D6, Win2k]


Adrian_Copil_Minune ©   (2002-11-19 12:26:00) 

Имеется форма:

unit wait;

interface

uses
Windows, Messages, SysUtils, Variants, Forms, VCLUtils, RzPrgres, Animate,
GIFCtrl, RzPanel, StdCtrls, RzLabel, Controls, ExtCtrls, Classes,
Buttons, RzSpnEdt;

type
TfrmWait = class(TForm)
pnlCaption: TPanel;
RzPanel1: TRzPanel;
RxGIFAnimator1: TRxGIFAnimator;
lblCaption: TRzLabel;
btnClose: TRzRapidFireButton;
RzPanel2: TRzPanel;
lblText: TRzLabel;
ProgressBar: TRzProgressBar;
procedure btnCloseClick(Sender: TObject);
procedure FormCanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean);
private
{ Private declarations }
public
{ Public declarations }
procedure CreateParams(var Params: TCreateParams); override;
constructor CreateForm(AOwner: TComponent; Text: TCaption); virtual;
end;

var
frmWait: TfrmWait;

implementation

{$R *.dfm}

{ TfrmWait }

procedure TfrmWait.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style := WS_THICKFRAME or WS_POPUP or WS_BORDER;
end;

procedure TfrmWait.btnCloseClick(Sender: TObject);
begin
Close();
end;

constructor TfrmWait.CreateForm(AOwner: TComponent; Text: TCaption);
begin
inherited Create(AOwner);
Position := poOwnerFormCenter;
CenterControl(lblCaption);
lblText.Caption := Text;
ProgressBar.Visible := False;
end;

procedure TfrmWait.FormCanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean);
begin
Resize := False;
end;

end.


я ее создаю:

fmWait := TfrmWait.CreateForm(fmOwnerForm, "Loading. Please Wait...");
fmWait.Show();


и кокда нужно убиваю

procedure FreeForm(var Form);
var
Temp: TForm;
begin
Temp := TForm(Form);
Pointer(Form) := nil;
if Temp.Visible then
Temp.Close();
Temp.Free;
end;

if Assigned(fmWait) then
FreeForm(fmWait);


так вот: иногда при уничтожении формы зависает приложение, никак не пойму где ошибка...

Хелп плиз !!!


Ерик   (2002-11-19 14:56:00) [1]

Ребята! с Release вроде не зависает !!!

Может это связанно с тем что форма находится в dll.

Успехов.


Ерик   (2002-11-19 13:30:00) [2]

Ладно попробую еще подумать, иногда помогает :)

Спасибо за внимание.


Skier   (2002-11-19 13:25:00) [3]

>Ерик
Если так , то действительно, попробуй Release.
Не поможет ?


Ерик   (2002-11-19 13:23:00) [4]

Skier © (19.11.02 13:20):
Форма уничтожается в контексте основного потока приложения когда поток уже не существует...


Skier   (2002-11-19 13:20:00) [5]

>Ерик

> На самом деле у меня она уничтожается при возникновения
> одного события (закрывется поток).
> Но все это неважно

Сдаётся мне что это как раз важно, т.к. с методами и свойствами формы ты должен работать в контексте основного потока приложения,
т.е. использовать метод Sychronize() TThread-а.


Ерик   (2002-11-19 13:03:00) [6]

Skier © (19.11.02 12:56)
>>И что ты получишь - у тебя форма создастся и тут же
>>прибъётся - извини, но это ерудна...
Да нет... Скажем так, между созданием формы и ее уничтожении выплняется некоторый код после которого она и должна уничтожится...
На самом деле у меня она уничтожается при возникновения одного события (закрывется поток).
Но все это неважно.

Главное что это форма создается и где нибудь уничтожается. И иногда при этом (иммено при уничтожении формы) блокируется все приложение.


Skier   (2002-11-19 12:56:00) [7]

>Ерик

> я могу с тем же успехом написать


fmWait.Show();
...
fmWait.Close();
fmWait.Free();

И что ты получишь - у тебя форма создастся и тут же
прибъётся - извини, но это ерудна...


Ерик   (2002-11-19 12:52:00) [8]

han_malign © (19.11.02 12:40)
>>Попробуй не Free а Release

Release returns immediately to the caller. It does not wait for the form to be freed before returning. - Мне это мешает...


Ерик   (2002-11-19 12:48:00) [9]

Skier © (19.11.02 12:43):
Просто чтобы удобнее было, я могу с тем же успехом написать

fmWait := TfrmWait.CreateForm(fmOwnerForm, "Loading. Please Wait...");
fmWait.Show();
...
fmWait.Close();
fmWait.Free();
fmWait := nil;


Skier   (2002-11-19 12:43:00) [10]

>Adrian_Copil_Minune
Пока не очень понятно зачем нужна
procedure FreeForm(var Form);

Может быть в обработчике OnClose формы
написать Action := caFree;?


han_malign   (2002-11-19 12:40:00) [11]

Попробуй не Free а Release


Наверх

Титульная страница Поиск, карта сайта Написать письмо