Баги или ошибки библиотеки
|
|
haav | Дата: Суббота, 02.05.2015, 13:32 | Сообщение # 16 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Цитата symargl ( ) А почему, если я сделал окно (со всякими дочерними элементами) при помощи VISG'а, или же встроенным в FbEdit визуальным редактором диалогов, у меня не получается управлять этим окном операторами window9 ? Ни по заданным ID, ни по полученным через ID_In_Number...
Есть статическое и динамическое создание окон. Статическое - это создание с помощью ресурсов (диалоги). Динамическое - это с помощью CreateWindow\CreateWindowEx. Это два разных способа! Создание в FbEdit использует создание с помощью диалогов (статически). VISG и window9 использует динамическое создание окон. Window9 "знает" про WinApi функции, но winApi "не знают" о функциях window9. В window9 немало всяких внутренних параметров, функций, определений, которые известны только самой библиотеке и могут использоваться только с ней (практически все функции , работающие с GUI).
Проще говоря:
Для window9 фактически нет практичного визуального редактора, все придется писать ручками. Если использовать какие-нибудь визуальные редакторы , вроде VISG и FBEDIT , то и всю обработку придется делать самому, window9 для этого не годится.
Цитата Более того, почему-то окно , сделанное в VISG'е, даже на SetWindowText не реагирует! Почему так, и можно ли эту проблему как-нибудь решить?
Вот это непонятно, покажи код.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
symargl | Дата: Суббота, 02.05.2015, 14:09 | Сообщение # 17 |
Сержант
Группа: Пользователи
Сообщений: 27
Статус: Offline
| Писать ручками - меня не пугает. Уже, в общем-то, написал. Даже компактнее местами выходит: много однотипных элементов в цикле делать можно. А у меня их мноооого - красивую таблицу из Text- и StringGadget'ов наваял. И столкнулся с вот какой штукой: GetGadgetText очень часто возвращает пустоту из заполненных StringGadget'ов. А чаще даже сама прога вылетает. Помаялся, решил GetWindowText применить. Помогло, все заработало... У меня, на ХР64. А вчера выяснилось, что на Win7 вылетает. Подозреваю, что там именно GetGadgetText работал бы без сбоев. Вот такая хрень. Ну, понятное дело, если в проге Tеxt'ов со String'ами будет десяток-полтора, то все работает классно. А вот в моей «таблице», где ячеек около трехсот штук - увы. У тебя и спрашивать о причинах постеснялся: при таком количество этих самых Gadget'ов как-нибудь, наверно, память неправильно выделяется или черт знает, что еще; но вряд ли, подумал я, еще кому-нибудь, кроме меня, придет в голову такой табличный изврат. А что делать, таблица нужна, а табличного контрола хорошего нет... Ну вот и стал подумывать о статическом, как ты называешь, создании. Вдруг, думаю, в этом случае глюков не будет. Ну и значит, тут тоже облом Ладно, буду еще что-нибудь придумывать. А про SetWindowText - это я просто экспериментировал с VISG'ом, поэтому код опытный, бессмысленный. Вот он: Код '' '' as1.bas '' '' 11:52:42 23-04-2015 '' '' Generated by VISG v.0.951 '' '' VISG: visual and smart GUI builder '' Get the latest version of VISG at '' http://mrhx.clan.su/ '' http://mrhx.ucoz.com/ '' '' Tested on FreeBASIC Compiler 0.18 '' #Include once "windows.bi" #Include once "win/commctrl.bi"
'' names of window classes. const WND_CLASS_NAME0 = "my_wnd_class_name_0"
'' identifiers. const IDC_EDIT0 = 2000
'' function prototypes. declare sub register_classes declare function message_loop as integer declare function wnd_proc0(byval thiswnd as hwnd, byval message as uinteger, byval w_param as wparam, byval l_param as lparam) as lresult declare function create_wnd0 as hwnd declare sub create_wnd_content0(byval parent as hwnd)
'' global data. dim shared instance as hmodule dim shared h_font as HFONT
'' main code. instance = GetModuleHandle(null) InitCommonControls register_classes h_font = CreateFont(-13, 0, 0, 0, FW_NORMAL, 0, _ 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, _ DEFAULT_QUALITY, DEFAULT_PITCH or FF_DONTCARE, "Times New Roman") create_wnd0 end message_loop
'' window procedure #0 [window]. function wnd_proc0(byval thiswnd as hwnd, byval message as uinteger, byval w_param as wparam, byval l_param as lparam) as lresult select case message case WM_CREATE create_wnd_content0 thiswnd
case WM_CLOSE 'if IDYES = MessageBox(thiswnd, "Quit?", "Event", MB_YESNO or MB_ICONQUESTION) then DestroyWindow thiswnd 'end if
case WM_DESTROY: PostQuitMessage 0 '' PostQuitMessage(return_code) quits the message loop.
case else return DefWindowProc(thiswnd, message, w_param, l_param) end select return 0 end function
'' create window #0 [window]. function create_wnd0 as hwnd dim wnd as hwnd wnd = CreateWindowEx(&h00000100, WND_CLASS_NAME0, "window", &h14CF0000, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, null, null, instance, null) ShowWindow wnd, SW_SHOWNORMAL UpdateWindow wnd return wnd SetWindowText(wnd,"Заголовок") end function
'' create window content #0 [window]. sub create_wnd_content0(byval parent as hwnd) dim wnd as hwnd wnd = CreateWindowEx(&h00020000, "Edit", "", &h50010080, 100, 80, 180, 50, parent, cast(hmenu, IDC_EDIT0), instance, null) SendMessage wnd, WM_SETFONT, cast(wparam, h_font), TRUE end sub
'' register all the window classes. sub register_classes dim wc as WNDCLASS
with wc .cbClsExtra = 0 .cbWndExtra = 0 .hbrBackground = cast(hbrush, COLOR_3DFACE + 1) .hCursor = LoadCursor(null, byval IDC_ARROW) .hIcon = LoadIcon(null, byval IDI_APPLICATION) .hInstance = instance .lpszMenuName = null .style = CS_PARENTDC or CS_DBLCLKS end with
wc.lpfnWndProc = @wnd_proc0 wc.lpszClassName = strptr(WND_CLASS_NAME0)
RegisterClass @wc end sub
'' message loop. function message_loop as integer dim message as MSG while (GetMessage(@message, null, 0, 0) <> false) TranslateMessage @message DispatchMessage @message wend DeleteObject h_font return message.wParam end function
'' End of file.
В функцию create_wnd0 я оператор смены заголовка и всунул. А прога на него - ноль внимания.
Сообщение отредактировал symargl - Суббота, 02.05.2015, 14:10 |
|
| |
haav | Дата: Суббота, 02.05.2015, 14:34 | Сообщение # 18 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Цитата Писать ручками - меня не пугает. Уже, в общем-то, написал. Даже компактнее местами выходит: много однотипных элементов в цикле делать можно. А у меня их мноооого - красивую таблицу из Text- и StringGadget'ов наваял. И столкнулся с вот какой штукой: GetGadgetText очень часто возвращает пустоту из заполненных StringGadget'ов. А чаще даже сама прога вылетает. Помаялся, решил GetWindowText применить. Помогло, все заработало... У меня, на ХР64. А вчера выяснилось, что на Win7 вылетает. Подозреваю, что там именно GetGadgetText работал бы без сбоев. Вот такая хрень. Ну, понятное дело, если в проге Tеxt'ов со String'ами будет десяток-полтора, то все работает классно. А вот в моей «таблице», где ячеек около трехсот штук - увы.
Приведи код, попробуем отыскать ошибку.
Цитата У тебя и спрашивать о причинах постеснялся
А чего стесняться? Форум для того и создан.
Цитата '' create window #0 [window]. function create_wnd0 as hwnd dim wnd as hwnd wnd = CreateWindowEx(&h00000100, WND_CLASS_NAME0, "window", &h14CF0000, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, null, null, instance, null) ShowWindow wnd, SW_SHOWNORMAL UpdateWindow wnd return wnd SetWindowText(wnd,"Заголовок") end function
Ты вызываешь SetWindowText после команды return wnd , программа просто не доходит до твоей строчки.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
symargl | Дата: Суббота, 02.05.2015, 15:28 | Сообщение # 19 |
Сержант
Группа: Пользователи
Сообщений: 27
Статус: Offline
| Цитата Ты вызываешь SetWindowText после команды return wnd , программа просто не доходит до твоей строчки. Ну так это же я Устал, видно, совсем уже ничего не вижу
Цитата Приведи код, попробуем отыскать ошибку. Да как бы не могу пока: прога специфичная, набита конфед.инфой, надо все «такое» вышелушить сперва... Я вот что, я все равно ее буду чутка переделывать, оптимизация по ней горько плачет. А если опять начнутся те же беды, тогда уже пришлю.
А пока вот такой вопрос: если оператор FreeGadget периодически, «в циничной форме» освобождает gadget'ы, которых и не было, - такое дело может плохо обернуться? Он, понимаешь, в цикле gadget'ы удаляет, с номера такого-то по номер такой-то, а в середине-то полно пропусков - несуществующих gadget'ов... В этом, может быть, бяка кроется?
|
|
| |
haav | Дата: Суббота, 02.05.2015, 15:48 | Сообщение # 20 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Цитата А вот в моей «таблице», где ячеек около трехсот штук - увы.
Вот код создает 3000 гаджетов, текст возвращает из любого гаджета и ничего не падает как видишь:
Код #Include "window9.bi"
Dim As Integer event,g=2 Dim as HWND hwnd
Sub Scroll() Static X As Integer = 10 If X<> -8*GetScrollGadgetPos(500) Then X = -8*GetScrollGadgetPos(500) ResizeGadget(1, X) EndIf End Sub
hwnd=OpenWindow("Ïðèâåò",10,10,500,500) : CenterWindow(hwnd) ContainerGadget(1,10,10,50000,400): SetGadgetColor(1,&hff,&hff,3) For y As Integer = 1 To 6 For x As Integer = 1 To 500 StringGadget(g,50*x+10,50*y+10,40,20,Str(g)) g+=1 Next Next
UseGadgetList(hwnd)
ScrollBarGadget(500,10,420,480,30,0,3000)
SetTimer(hwnd,1,10,@Scroll())
Do event=WaitEvent() If event = eventgadget Then Select Case EventNumber Case 2 To 3001 ? GetGadgetText(EventNumber) End Select ElseIf Event=EventClose then Exit Do EndIf Loop
Цитата А пока вот такой вопрос: если оператор FreeGadget периодически, «в циничной форме» освобождает gadget'ы, которых и не было, - такое дело может плохо обернуться? Он, понимаешь, в цикле gadget'ы удаляет, с номера такого-то по номер такой-то, а в середине-то полно пропусков - несуществующих gadget'ов... В этом, может быть, бяка кроется?
Ничего плохого происходить не должно, я делал проверки в библиотеке на этот случай. Главное чтобы номера гаджетов были больше 0.
Цитата А что делать, таблица нужна, а табличного контрола хорошего нет...
Вообще-то есть таблички, может ты не видел:
http://free-basic.ru/babygrid.html http://free-basic.ru/matrix_listbox.html
Есть еще один способ вытянуть табличку из библиотеки IUP , но думаю для тебя это сложновато будет.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
symargl | Дата: Суббота, 02.05.2015, 16:30 | Сообщение # 21 |
Сержант
Группа: Пользователи
Сообщений: 27
Статус: Offline
| Да, все работает. Так я и думаю, что в моей проге пакость происходит от не слишком корректного применения чего-то. Сохранилась у меня дурная привычка, со времен еще программируемых калькуляторов, ловчить в программах. Давным-давно смысла в том нет, а привычка... Ладненько, начну переписывать, заставлю себя все делать нормально и по-современному, глядишь так же и заработает.
Matrix listbox очень уж упрощенный, да в стиле 3.11...
А BabyGrid давно видел на FB оф.сайте, но что-то он у меня тогда вообще не заработал. А на твоем сайте - действительно не видел. А ведь работает! Поизучаю, спасибо.
Из IUP я, ты прав, ничего вытянуть не смогу, не та подготовка. Однако, огромный он там, matrix этот, мегабайтный, а у меня на прогу ТЗ - чтоб вся в полмегабайта уложилась.
Да у меня нормально получилось, только глючит немножко Справлюсь, думаю.
|
|
| |
WQ | Дата: Суббота, 02.05.2015, 19:09 | Сообщение # 22 |
Полковник
Группа: Проверенные
Сообщений: 215
Статус: Offline
| Цитата Из IUP я, ты прав, ничего вытянуть не смогу, не та подготовка. Однако, огромный он там, matrix этот, мегабайтный, а у меня на прогу ТЗ - чтоб вся в полмегабайта уложилась. Можно сжимать exe upx-ом, в версии IUP 3.5 matrix будет меньше 0.5 мегабайта. Если версии новее, например, 3.14, тогда чуть больше.
Сообщение отредактировал WQ - Суббота, 02.05.2015, 19:14 |
|
| |
symargl | Дата: Суббота, 02.05.2015, 19:42 | Сообщение # 23 |
Сержант
Группа: Пользователи
Сообщений: 27
Статус: Offline
| Цитата Можно сжимать exe upx-ом... Да, но у меня там ещё LibHaru, которая около 350кБ места занимает. На основную часть программы остаётся полтораста кБ. Как раз такая она и получилась под window9. Идеально. А вот ещё заоптимизирую!..
|
|
| |
WQ | Дата: Суббота, 02.05.2015, 20:49 | Сообщение # 24 |
Полковник
Группа: Проверенные
Сообщений: 215
Статус: Offline
| Цитата WQ ( ) Да, но у меня там ещё LibHaru, которая около 350кБ места занимает. На основную часть программы остаётся полтораста кБ. Как раз такая она и получилась под window9. Идеально. А вот ещё заоптимизирую!.. A IUP, кстати, может и pdf создавать, и многие функции window9 может подменить. GUI можно вообще без WinApi сделать. Да и саму window9 можно собирать только с нужными функциями. У меня одна программа, примерно 14000 строк кода: IUP + window9 + иконки кнопок + куча других библиотек поменьше = 900 кб
Если нужна таблица большая,особенно с активным взаимодействем мышью - IupMatrix из IUP незаменима, как по мне. А в новых версиях еще есть IupMatrixList (очень интересная вещь) и IupMatrixEx, как пишут создатели "support for Import/Export, Clipboard, Undo/Redo, Find, Sort, Column Visibility, Numeric Columns, Numeric Units, Context Menu" (я, правда, это еще не использовал). Таблицы есть еще в библиотеке FLTK, но там такая документация ужасная
Сообщение отредактировал WQ - Суббота, 02.05.2015, 20:58 |
|
| |
symargl | Дата: Четверг, 07.05.2015, 17:14 | Сообщение # 25 |
Сержант
Группа: Пользователи
Сообщений: 27
Статус: Offline
| Возможности IUP на высоте, это так. Смотрел, восторгался. Помимо прочего порадовало, что не отягощает программу dll'ками. А вот сделать её посредством ничего не сумел. Синтаксис и сама логика по мне изуверские. Как WinAPI. Не для простых человечков. FLTK вроде сутью мне поближе, правда без dll'ки суровой величины прога не заработает. А описалово, да, мутное. Хотя, и не такое оригинальное, как к LibPdf: на пять-семь страниц воды-текста один пример... в общем виде. Однако, мои претензии к GUI-библиотекам много проще возможностей и IUP, и FLTK, незачем и связываться. Компактность очень ценю и уважаю. Насчёт же сбора библиотек с нужными функциями я полный ноль. Не умею. Поверхностный пользователь.
Добавлено (07.05.2015, 17:14) --------------------------------------------- Вот ещё интересный вопросик. Код из справки по window9: Код #Include "window9.bi"
OpenWindow("",10,10,300,100) ComboBoxGadget(1,10,10,100,80) AddComboBoxItem(1,"Ïðèâåò0",-1) AddComboBoxItem(1,"Ïðèâåò1",-1) AddComboBoxItem(1,"Ïðèâåò2",-1) TextGadget(2,150,10,100,20)
SetGadgetStyle(1,CBS_DROPDOWN)
Do var event=WaitEvent() If event=eventclose Then End If event=eventgadget Then If eventnumber()=1 Then setgadgettext(2,GetComboBoxText(1,GetItemComboBox(1))) EndIf EndIf Loop
Дополнен посылом комбо-боксу стиля «редактируемости»: SetGadgetStyle(1,CBS_DROPDOWN). А включаешь - не работает. Бокс вообще не появляется! Если посылать таким образом новый стиль по какой-нибудь команде из программы (по нажатию, скажем, специального buttongadget'а), то бокс становится «невосприимчивым» к любым действиям. Вот если стиль прописать при создании бокса, ComboBoxGadget(1,10,10,100,80,CBS_DROPDOWN), то всё хорошо, строчки можно исправлять. Но надо-то - не сразу, надо-то в определённый момент сделать его, бокс, редактируемым (и кстати говоря, потом - возвратить ему состояние CBS_DROPDOWNLIST). Однако, ни фига не получается. Как такую печаль разрулить?
Сообщение отредактировал symargl - Четверг, 07.05.2015, 17:16 |
|
| |
haav | Дата: Четверг, 07.05.2015, 18:16 | Сообщение # 26 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Цитата Дополнен посылом комбо-боксу стиля «редактируемости»: SetGadgetStyle(1,CBS_DROPDOWN). А включаешь - не работает. Бокс вообще не появляется!
У каждого гаджета есть 2 скрытых стиля (WS_CHILD Or WS_VISIBLE). То есть задавая новый стиль для гаджета, необходимо прописывать и эти стили. В твоем случае ты прописал только стиль CBS_DROPDOWN. Но!!!! В случае с ComboBox ничего не поменяется и это не проблема библиотеки. Так уж устроен этот контрол. Единственный выход пересоздавать ComboBox заново, когда надо менять стиль.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
symargl | Дата: Пятница, 08.05.2015, 16:05 | Сообщение # 27 |
Сержант
Группа: Пользователи
Сообщений: 27
Статус: Offline
| Понял, спасибо! Добавлено (08.05.2015, 16:05) --------------------------------------------- Обратно вопрос про тот же хитро устроенный контрол, про Combobox. Тот же код из справки по window9, но сразу добавляю стиль CBS_SORT: Код #Include "window9.bi" OpenWindow("",10,10,300,100) ComboBoxGadget(1,10,10,100,80,CBS_SORT) AddComboBoxItem(1,"Привет0",-1) AddComboBoxItem(1,"Привет1",-1) AddComboBoxItem(1,"Привет2",-1) TextGadget(2,150,10,100,20) Do var event=WaitEvent() If event=eventclose Then End If event=eventgadget Then If eventnumber()=1 Then setgadgettext(2,GetComboBoxText(1,GetItemComboBox(1))) EndIf EndIf Loop И комбо-бокс становится вечно открытым, никуда не ведущим и, самое досадное, никаких строк не сортирующим Действительно, досадно. Что, и тут ничего не поделать?!
|
|
| |
haav | Дата: Пятница, 08.05.2015, 18:48 | Сообщение # 28 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Функция AddComboBoxItem действительно несовместима со стилем CBS_SORT. Но ничего страшного, если нужна сортировка , то можно сделать так:
Код #Include "window9.bi"
Function AddComboBoxItemSort (ByVal iGadget As Integer, ByVal szString As String ) As Integer Return SendMessage( GadgetID(iGadget), CB_ADDSTRING ,0 ,Cast(LPARAM,StrPtr(szString))) End Function
OpenWindow("",10,10,300,100) ComboBoxGadget(1,10,10,100,80,CBS_SORT Or CBS_DROPDOWNLIST Or WS_VSCROLL) AddComboBoxItemSort(1,"sz5" ) AddComboBoxItemSort(1,"sz1" ) AddComboBoxItemSort(1,"sz2" ) TextGadget(2,150,10,100,20)
Do var event=WaitEvent() If event=eventclose Then End If event=eventgadget Then If eventnumber()=1 Then setgadgettext(2,GetComboBoxText(1,GetItemComboBox(1))) EndIf EndIf Loop
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
symargl | Дата: Пятница, 08.05.2015, 22:26 | Сообщение # 29 |
Сержант
Группа: Пользователи
Сообщений: 27
Статус: Offline
| Добавляемое этой функцией он сортирует, а добавляемое AddComboBoxItem - не сортирует, оставляет в конце. Презабавно! Можно извлечь двойную пользу. Спасибо, haav!
Добавлено (08.05.2015, 22:26) --------------------------------------------- Вроде бы уже совсем не по теме, но вроде бы и в продолжение... А как можно ему, дурню, дать понять, что число, скажем, 12 должно стоять после, скажем 5, а не до?! И можно ли? Он, вишь, по порядку появления знаков сортирует. А чтобы числа понимал?
Сообщение отредактировал symargl - Пятница, 08.05.2015, 22:26 |
|
| |
haav | Дата: Суббота, 09.05.2015, 06:47 | Сообщение # 30 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Цитата symargl ( ) Добавляемое этой функцией он сортирует, а добавляемое AddComboBoxItem - не сортирует, оставляет в конце.
Поправлю: не оставляет в конце, а вставляет в любое нужное место. Третий параметр отвечает за место вставки. Данная функция так и задумывалась. Именно поэтому она и несовместима со стилем CBS_SORT . Согласись, теряется логика , если вставлять сначала в нужные места, а потом все равно будет сортироваться.
Цитата Вроде бы уже совсем не по теме, но вроде бы и в продолжение... А как можно ему, дурню, дать понять, что число, скажем, 12 должно стоять после, скажем 5, а не до?! И можно ли? Он, вишь, по порядку появления знаков сортирует. А чтобы числа понимал?
Мелкософт предлагает стандартную сортировку (CBS_SORT) для этого контрола. Если нужна другая сортировка, то ее нужно реализовывать вручную и тут как раз использовать AddComboBoxItem для вставки в любое место.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
|