Форум: "KOL";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];
ВнизОшибка при уничтожении ProgressBar Найти похожие ветки
← →
Don © (2007-01-10 09:16) [0]создаю в проекте ProgressBar, при закрытии программы происходит ошибка (даже не знаю какая, просто появляется отладочное окно CPU в делфях).
комментирую создание ProgressBar - все в порядке.
← →
Don © (2007-01-10 09:19) [1]Забыл сказать, версия KOL 2.50 без MCK
← →
Don © (2007-01-10 09:20) [2]Забыл сказать, версия KOL 2.50 без MCK.
И проверял с unicode и без, и на асме и на паскале, везде одно и тоже.
← →
Jon © (2007-01-10 15:55) [3]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!
← →
Jon © (2007-01-10 15:59) [4]Sorry - my mistake, should be
ProgressBar := NewProgressbar(Form);
← →
Galkov © (2007-01-10 18:30) [5]Создаю проект без 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 19:32) [6]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.
← →
D[u]fa © (2007-01-10 20:41) [7]тока хотел тему создавать... тож самое 2.50 версия, мск. ложим прогрессбар на форму, запускаем - затем закрываем форму - готово вылетает дебаг окно, коб ы брейкпоинт %)
← →
Vladimir Kladov (2007-01-10 22:42) [8]Free уберите. Если не верите, что освобождается, назначьте OnDestroy.
← →
Galkov © (2007-01-10 22:57) [9]C Timer ???
Не поверю.
← →
Vladimir Kladov (2007-01-10 23:58) [10]Тот который выше показан (Создаю проект без MCK - и все нормально. И на ASM, и на PAS, и в 2.50
Смешней всего то, что я его даже показать могу:
)
Достаточно запустить его и увидеть что по закрытию он выпадает в NtKernel.dll на int 3.
Я про Free говорил, что не надо Progress"у Free говорить.
← →
Jon © (2007-01-11 00:12) [11]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.
← →
Galkov © (2007-01-11 07:46) [12]
> 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 ???
← →
Don © (2007-01-11 11:04) [13]в том то и дело, что нету 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 11:46) [14]Хмм.... А ведь здесь:
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-а то действительно ДВА...
Хотя никакого криминала у меня при этом не происходит...
Непонятно это :(
← →
Galkov © (2007-01-11 12:00) [15]Впрочем, те же два beep-а происходят если вместо Progressbar поставить любой другой контрол.
Понятнее не стало правда :(
← →
Jon © (2007-01-11 15:21) [16]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.
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.041 c