wince и TCustomControl

Модератор: Модераторы

wince и TCustomControl

Сообщение baiguzov » 13.01.2009 21:01:17

На Lazarus под wince заметил странный глюк, если в программе создаёшь любой компонет, производный от TCustomControl, а затем всталяешь на главную форму командой InsertControl, то с вероятностью 20% появляется ошибка access violation или ошибка [Exception] failed to create win32 control, error: 1413

Код: Выделить всё
Type
   MyControl = class(TCustomControl)
     ...
   end;

Control1 := TMyControl.Create(nil);
Form1.InsertControl(Control1);


Ошибка появляется не всегда сразу, иногда нужно несколько раз повторить создание Control1 и вставку на форму. Причём если у Control1.Visible := false то ошибка не появляется. Также эта ошибка наблюдается у всех стандартных компонентов порождённых от TCustomControl, например TIpHtmlPanel.

Пробовал запускать на КПК HTC Windows Mobile 6.1, а также на эмуляторе от microsoft с Windows Mobile 5 и там и там ошибка выскакивает. Эта ошибка появляется только для платформы arm-wince, на i386-win32 этой ошибки нет.

Может кто сталкивался уже с такой проблемой, поделитесь опытом решения.
Последний раз редактировалось baiguzov 14.01.2009 23:44:20, всего редактировалось 1 раз.
baiguzov
новенький
 
Сообщения: 14
Зарегистрирован: 13.01.2009 20:30:58

Re: wince и TCustomControl

Сообщение Mr.Smart » 14.01.2009 01:36:05

Что можно сказать:
1) LCL для платформы WinCE очень сырая. Ещё не мало проблем с ними будет!
2) Пользуйся библиотеками KOL/MCK. Там проблем с виджетами практически нет!
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: wince и TCustomControl

Сообщение haword » 14.01.2009 18:14:45

а сразу на форме создавать не пробывал? :wink:

Control1 := TMyControl.Create(Form1);
Control1.Parent:=Form1;
haword
постоялец
 
Сообщения: 301
Зарегистрирован: 02.03.2006 11:34:40

Re: wince и TCustomControl

Сообщение baiguzov » 14.01.2009 22:05:19

Если сразу на форму поместить компонент, то работать конечно же будет, ошибка появляется не сразу, точнее иногда и сразу, а чаще через некоторое время.

Код: Выделить всё
Control1 := TMyControl.Create(nil);
Form1.InsertControl(Control1);
пауза.
Form1.RemoveControl(Control1);
Control1.Free;

Control1 := TMyControl.Create(nil);
Form1.InsertControl(Control1);
пауза.
Form1.RemoveControl(Control1);
Control1.Free;

Control1 := TMyControl.Create(nil);
Form1.InsertControl(Control1);
и тут появляется ошибка.


Причём если заменить InsertControl на Parent := Form1, и даже если TMyControl.Create(nil) заменить на TMyControl.Create(Form1) то ничего не меняется ошибка также выскакивает. Я думаю проблема не в InsertControl, а в процедуре перерисовки, ведь при Control1.Visible := false всё работает без ошибок.
baiguzov
новенький
 
Сообщения: 14
Зарегистрирован: 13.01.2009 20:30:58

Re: wince и TCustomControl

Сообщение haword » 14.01.2009 22:38:07

ну ниче не остаеться делать как брать ставить дебагер прыгая с бубном и смотреть от куда это вываливается уже в самом коде. скорее всего где то память не правильно освобождается
haword
постоялец
 
Сообщения: 301
Зарегистрирован: 02.03.2006 11:34:40

Re: wince и TCustomControl

Сообщение baiguzov » 15.01.2009 14:28:20

Сделал так создаю Control1 при создании формы и уничтожаю при уничтожении формы. А в программе вместо InsertControl/RemoveControl использую Visible := true, Visible := false и этот вариант работает без ошибок для большинства контролов порождённых от TCustomControl, но это далеко не самое лучшее решение и оно расходует больше памяти, т.к. однажды созданный Control1 висит в памяти до завершения программы. Увы контролу TIpHtmlPanel это не помогло и он как выдавал ошибку, так и выдаёт, после 2-3 комманд IpHtmlPanel.setHtml(html).
baiguzov
новенький
 
Сообщения: 14
Зарегистрирован: 13.01.2009 20:30:58

Re: wince и TCustomControl

Сообщение haword » 15.01.2009 18:09:36

проверил, есть такой косяк. напиши в багтреер мож исправят, только пример программы приложы которая валиться.

Перепрошил свой телефон на 6.1 версию винды. Такая же на подобии ошибка вылетала когда я раз 5-6 вызывал калькулятор из RXCalcEdit, после прощивки тыкал раз 10, ни одно йошибки, хз что гонит или вынь или LCL.

Добавлено спустя 1 час 31 минуту 28 секунд:
кажись слега догнал в чем проблема, вот теперь осталось подумать как ее решить, может буть обитающие сдесь люди входящие в число разработчиков помогут решить ее. Короче говоря скорее всего ошибка возникает из за неправильного сообщения с неправилиными размерами контрола. Судя по исходникам такая проблема уже возникала и ее решили на других интерфейсах. Может быть вспонит кто ни будь как ее решили и можно ли ее к WinCE интерфейсу прикрутить, это исправление. Вот что вышло у меня при проверки ошибки в дебагере:

Program received signal SIGSEGV, Segmentation fault.
0x000eca38 in TWINCONTROL__INVALIDATECLIENTRECTCACHE (WITHCHILDCONTROLS=true, this=0x1b962b0)
at wincontrol.inc:3370
Current language: auto; currently pascal
(gdb) c
warning: AKY=00020001 PC=00021f04(project1.exe+0x00011f04) RA=001a1e5c(project1.exe+0x00191e5c) BVA=2
4000040 FSR=00000407

Program received signal SIGSEGV, Segmentation fault.
0x00021f04 in SYSTEM_TOBJECT_$__DISPATCH$formal ()
(gdb) bt
#0 0x000eca38 in TWINCONTROL__INVALIDATECLIENTRECTCACHE (WITHCHILDCONTROLS=true, this=0x1b96310)
at wincontrol.inc:3370
#1 0x00198514 in WINDOWPROC (WINDOW=2080906528, MSG=5, WPARAM=0, LPARAM=3276970)
at wincecallback.inc:1979
#2 0xf000fffc in ?? ()
#3 0xf000fffc in ?? ()
haword
постоялец
 
Сообщения: 301
Зарегистрирован: 02.03.2006 11:34:40


Вернуться в WinCE

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru