Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.26;
Скачать: CL | DM;

Вниз

Ошибка при уничтожении 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;

uses
 KOL;

var
 Form: PControl;
begin
 Applet := NewApplet("Test");
 Form := NewForm(Applet, "Test progress bar");
 NewProgressbar(Form);
 Run(Applet);
end.
может у меня че-то с Делфями? юзаю Delphi7


 
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 вся ветка

Текущий архив: 2007.08.26;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.029 c
1-1181834100
DevilDevil
2007-06-14 19:15
2007.08.26
Один пункт меню в нескольких меню. Как ?


2-1185719118
Sdubaruhnul
2007-07-29 18:25
2007.08.26
Поиск файлов по маске


6-1166561840
m00ngl0w
2006-12-19 23:57
2007.08.26
WhoIs


15-1185539477
vadgor
2007-07-27 16:31
2007.08.26
УДАЛЕНИЯ ПОВТОРЯЮЩИХСЯ ЗАПИСЕЙ В ТАБЛИЦАХ ПАРАДОХ


15-1185452230
Stan
2007-07-26 16:17
2007.08.26
Wipe algorithms