![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка при уничтожении ProgressBar [Delphi, Windows]
Don © (2007-01-10 09:16:00)создаю в проекте ProgressBar, при закрытии программы происходит ошибка (даже не знаю какая, просто появляется отладочное окно CPU в делфях).
комментирую создание ProgressBar - все в порядке.
Jon (2007-01-11 15:21:00) [1]This solves error - creating as nil then modifying parent:
program TestPB;
uses windows, messages, KOL;
function MyTest(Dummy:PObj; var Msg:TMsg; var Rslt:Integer):boolean;
begin
Result := false;
if Msg.Message=WM_DESTROY then beep(500,500);
end;
var
Form: PControl;
begin
Applet := NewApplet('Test');
Form := NewForm(Applet, 'Test progress bar');
with NewProgressbar(nil)^ do
begin
onMessage := TOnMessage(MakeMethod(nil,@MyTest));
Parent := Applet;
end;
Run(Applet);
end.
Galkov (2007-01-11 12:00:00) [2]Впрочем, те же два beep-а происходят если вместо Progressbar поставить любой другой контрол.
Понятнее не стало правда :(
Galkov (2007-01-11 11:46:00) [3]Хмм.... А ведь здесь:
program TestPB;
uses windows, messages, KOL;
function MyTest(Dummy:PObj; var Msg:TMsg; var Rslt:Integer):boolean;
begin
Result := false;
if Msg.Message=WM_DESTROY then beep(500,500);
end;
var
Form: PControl;
begin
Applet := NewApplet('Test');
Form := NewForm(Applet, 'Test progress bar');
with NewProgressbar(Form)^ do
onMessage := TOnMessage(MakeMethod(nil,@MyTest));
Run(Applet);
end.
- beep-а то действительно ДВА...
Хотя никакого криминала у меня при этом не происходит...
Непонятно это :(
Don (2007-01-11 11:04:00) [4]в том то и дело, что нету Free. Просто создаю на форме и все (даже ничего не делаю)
попробовал отловить ошибку, поставил breakpoint в процедуре WndFunc.
Получается WM_DESTROY для ProgressBarа вызывается 2 раза и на 2 раз вылетает это окно в момент вызова CallDefWndProc.
program TestPB;может у меня че-то с Делфями? юзаю Delphi7
uses
KOL;
var
Form: PControl;
begin
Applet := NewApplet('Test');
Form := NewForm(Applet, 'Test progress bar');
NewProgressbar(Form);
Run(Applet);
end.
Galkov (2007-01-11 07:46:00) [5]
> Jon © (11.01.07 00:12) [11]
> I added OnDestroy for ProgressBar, the free is needed otherwise
> problem still from IDE (outside the IDE all is well)
What problems ???
Anythings about message-loop while PControl.Destroy ???
Jon (2007-01-11 00:12:00) [6]I added OnDestroy for ProgressBar, the free is needed otherwise problem still from IDE (outside the IDE all is well). This proves it:
Program test;
uses windows,kol;
type TMainForm=object
ProgBar:PControl;
Timer:PTimer;
Count:integer;
procedure _onTimer(Obj:PObj);
procedure QuitApp(Sender: PObj; var Accept: Boolean);
procedure PB_end(Sender: PObj);
end;
procedure TMainForm.PB_end(Sender: PObj);
begin
MsgOK('ProgressBar Destroyed!'); //DISPLAYED WHEN PROGRESSBAR.FREE
end;
procedure TMainForm.QuitApp(Sender: PObj; var Accept: Boolean);
begin
ProgBar.Free;
end;
procedure TMainForm._onTimer(Obj:PObj);
begin
Count := (Count+1)mod 300;
ProgBar.Progress := Count;
end;
var MainForm:TMainForm;
begin
with MainForm do begin
Applet := NewForm(nil,'Test').SetSize(312,80);
Applet.OnClose := QuitApp; //THIS IS NEEDED
ProgBar := NewProgressbar(Applet);
ProgBar.MaxProgress := 300;
ProgBar.OnDestroy := PB_end;
Timer := NewTimer(10);
Timer.onTimer := _onTimer;
Timer.Enabled := true;
end;
Run(Applet);
MainForm.Timer.Free;
end.
Vladimir Kladov (2007-01-10 23:58:00) [7]Тот который выше показан ( Создаю проект без MCK - и все нормально. И на ASM, и на PAS, и в 2.50
Смешней всего то, что я его даже показать могу:
)
Достаточно запустить его и увидеть что по закрытию он выпадает в NtKernel.dll на int 3.
Я про Free говорил, что не надо Progress'у Free говорить.
Galkov (2007-01-10 22:57:00) [8]C Timer ???
Не поверю.
Vladimir Kladov (2007-01-10 22:42:00) [9]Free уберите. Если не верите, что освобождается, назначьте OnDestroy.
D[u]fa (2007-01-10 20:41:00) [10]тока хотел тему создавать... тож самое 2.50 версия, мск. ложим прогрессбар на форму, запускаем - затем закрываем форму - готово вылетает дебаг окно, коб ы брейкпоинт %)
Jon (2007-01-10 19:32:00) [11]My previous advice works - since KOL does not seem to free the progress bar correctly:
Program test;
uses windows,kol;
type TMainForm=object
ProgBar:PControl;
Timer:PTimer;
Count:integer;
procedure _onTimer(Obj:PObj);
procedure QuitApp(Sender: PObj; var Accept: Boolean);
end;
procedure TMainForm.QuitApp(Sender: PObj; var Accept: Boolean);
begin
ProgBar.Free;
end;
procedure TMainForm._onTimer(Obj:PObj);
begin
Count := (Count+1)mod 300;
ProgBar.Progress := Count;
end;
var MainForm:TMainForm;
begin
with MainForm do begin
Applet := NewForm(nil,'Test').SetSize(312,80);
Applet.OnClose := QuitApp;
ProgBar := NewProgressbar(Applet);
ProgBar.MaxProgress := 300;
Timer := NewTimer(10);
Timer.onTimer := _onTimer;
Timer.Enabled := true;
end;
Run(Applet);
MainForm.Timer.Free;
end.
Galkov (2007-01-10 18:30:00) [12]Создаю проект без MCK - и все нормально. И на ASM, и на PAS, и в 2.50
Смешней всего то, что я его даже показать могу:
Program test;
uses windows,kol;
type TMainForm=object
ProgBar:PControl;
Timer:PTimer;
Count:integer;
procedure _onTimer(Obj:PObj);
end;
procedure TMainForm._onTimer(Obj:PObj);
begin
Count := (Count+1)mod 300;
ProgBar.Progress := Count;
end;
var MainForm:TMainForm;
begin
with MainForm do begin
Applet := NewForm(nil,'Test').SetSize(312,80);
ProgBar := NewProgressbar(Applet);
ProgBar.MaxProgress := 300;
Timer := NewTimer(10);
Timer.onTimer := _onTimer;
Timer.Enabled := true;
end;
Run(Applet);
MainForm.Timer.Free;
end.
Jon (2007-01-10 15:59:00) [13]Sorry - my mistake, should be
ProgressBar := NewProgressbar(Form);
Jon (2007-01-10 15:55:00) [14]I experience exactly the same problem. I add the following to the OnClose event of the form:
procedure QuitApp(Dummy: Pointer; Sender: PObj; var Accept: Boolean);
begin
ProgressBar.Free;
end;
.......
Form.OnClose := TOnEventAccept(MakeMethod(nil,@QuitApp));
ProgressBar := NewProgressbarEx(Form);
That seems to work for me!
Don (2007-01-10 09:20:00) [15]Забыл сказать, версия KOL 2.50 без MCK.
И проверял с unicode и без, и на асме и на паскале, везде одно и тоже.
Don (2007-01-10 09:19:00) [16]Забыл сказать, версия KOL 2.50 без MCK