Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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;

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

Форум: "KOL";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.044 c
2-1185880238
ReKLer
2007-07-31 15:10
2007.08.26
глубина цвета


2-1185742968
mfender
2007-07-30 01:02
2007.08.26
Integer в минуты средствами SQL в MSSQL


2-1186219361
AMD
2007-08-04 13:22
2007.08.26
Склеить формы.


1-1182167087
StriderMan
2007-06-18 15:44
2007.08.26
TEdit.AutoSelect


2-1186384446
Раф
2007-08-06 11:14
2007.08.26
Как правильно закрыть программу





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский