FreeBasic
Главная
Вход
Регистрация
Вторник, 15.10.2024, 08:49Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 8
  • «
  • 1
  • 2
  • 3
  • 4
  • 7
  • 8
  • »
Баги или ошибки библиотеки
haavДата: Суббота, 02.05.2015, 13:32 | Сообщение # 16
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Репутация: 49
Статус: 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
Репутация: 0
Статус: Offline
Писать ручками - меня не пугает. Уже, в общем-то, написал. Даже компактнее местами выходит: много однотипных элементов в цикле делать можно. А у меня их мноооого - красивую таблицу из Text- и StringGadget'ов наваял. И столкнулся с вот какой штукой: GetGadgetText очень часто возвращает пустоту из заполненных StringGadget'ов. А чаще даже сама прога вылетает. Помаялся, решил GetWindowText применить. Помогло, все заработало... У меня, на ХР64. А вчера выяснилось, что на Win7 вылетает. Подозреваю, что там именно GetGadgetText работал бы без сбоев. Вот такая хрень. Ну, понятное дело, если в проге Tеxt'ов со String'ами будет десяток-полтора, то все работает классно. А вот в моей «таблице», где ячеек около трехсот штук - увы. У тебя и спрашивать о причинах постеснялся: при таком количество этих самых Gadget'ов как-нибудь, наверно, память неправильно выделяется или черт знает, что еще; но вряд ли, подумал я, еще кому-нибудь, кроме меня, придет в голову такой табличный изврат. А что делать, таблица нужна, а табличного контрола хорошего нет... Ну вот и стал подумывать о статическом, как ты называешь, создании. Вдруг, думаю, в этом случае глюков не будет. Ну и значит, тут тоже облом smile Ладно, буду еще что-нибудь придумывать.
А про 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
Репутация: 49
Статус: 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
Репутация: 0
Статус: Offline
Цитата
Ты вызываешь SetWindowText после команды return wnd , программа просто не доходит до твоей строчки.
    
Ну так это же я smile Устал, видно, совсем уже ничего не вижу smile

Цитата
Приведи код, попробуем отыскать ошибку.

Да как бы не могу пока: прога специфичная, набита конфед.инфой, надо все «такое» вышелушить сперва... Я вот что, я все равно ее буду чутка переделывать, оптимизация по ней горько плачет. А если опять начнутся те же беды, тогда уже пришлю.

А пока вот такой вопрос: если оператор FreeGadget периодически, «в циничной форме» освобождает gadget'ы, которых и не было, - такое дело может плохо обернуться? Он, понимаешь, в цикле gadget'ы удаляет, с номера такого-то по номер такой-то, а в середине-то полно пропусков - несуществующих gadget'ов... В этом, может быть, бяка кроется?
 
haavДата: Суббота, 02.05.2015, 15:48 | Сообщение # 20
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Репутация: 49
Статус: 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
Репутация: 0
Статус: Offline
Да, все работает. Так я и думаю, что в моей проге пакость происходит от не слишком корректного применения чего-то. Сохранилась у меня дурная привычка, со времен еще программируемых калькуляторов, ловчить в программах. Давным-давно смысла в том нет, а привычка... Ладненько, начну переписывать, заставлю себя все делать нормально и по-современному, глядишь так же и заработает.

Matrix listbox очень уж упрощенный, да в стиле 3.11...

А BabyGrid давно видел на FB оф.сайте, но что-то он у меня тогда вообще не заработал. А на твоем сайте - действительно не видел. А ведь работает! Поизучаю, спасибо.

Из IUP я, ты прав, ничего вытянуть не смогу, не та подготовка. Однако, огромный он там, matrix этот, мегабайтный, а у меня на прогу ТЗ - чтоб вся в полмегабайта уложилась.

Да у меня нормально получилось, только глючит немножко smile Справлюсь, думаю.
 
WQДата: Суббота, 02.05.2015, 19:09 | Сообщение # 22
Полковник
Группа: Проверенные
Сообщений: 215
Репутация: 7
Статус: 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
Репутация: 0
Статус: Offline
Цитата
Можно сжимать exe upx-ом...

Да, но у меня там ещё LibHaru, которая около 350кБ места занимает. На основную часть программы остаётся полтораста кБ. Как раз такая она и получилась под window9. Идеально. А вот ещё заоптимизирую!..
 
WQДата: Суббота, 02.05.2015, 20:49 | Сообщение # 24
Полковник
Группа: Проверенные
Сообщений: 215
Репутация: 7
Статус: 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, но там такая документация ужасная wacko


Сообщение отредактировал WQ - Суббота, 02.05.2015, 20:58
 
symarglДата: Четверг, 07.05.2015, 17:14 | Сообщение # 25
Сержант
Группа: Пользователи
Сообщений: 27
Репутация: 0
Статус: 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
Репутация: 49
Статус: Offline
Цитата
Дополнен посылом комбо-боксу стиля «редактируемости»: SetGadgetStyle(1,CBS_DROPDOWN). А включаешь - не работает. Бокс вообще не появляется!


У каждого гаджета есть 2 скрытых стиля (WS_CHILD Or WS_VISIBLE). То есть задавая новый стиль для гаджета, необходимо прописывать и эти стили. В твоем случае ты прописал только стиль CBS_DROPDOWN.
Но!!!! В случае с ComboBox ничего не поменяется и это не проблема библиотеки. Так уж устроен этот контрол. Единственный выход пересоздавать ComboBox заново, когда надо менять стиль.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
symarglДата: Пятница, 08.05.2015, 16:05 | Сообщение # 27
Сержант
Группа: Пользователи
Сообщений: 27
Репутация: 0
Статус: 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

И комбо-бокс становится вечно открытым, никуда не ведущим и, самое досадное, никаких строк не сортирующим sad Действительно, досадно. Что, и тут ничего не поделать?!
 
haavДата: Пятница, 08.05.2015, 18:48 | Сообщение # 28
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Репутация: 49
Статус: 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
Репутация: 0
Статус: Offline
Добавляемое этой функцией он сортирует, а добавляемое AddComboBoxItem - не сортирует, оставляет в конце. Презабавно! Можно извлечь двойную пользу. Спасибо, haav!

Добавлено (08.05.2015, 22:26)
---------------------------------------------
Вроде бы уже совсем не по теме, но вроде бы и в продолжение... А как можно ему, дурню, дать понять, что число, скажем, 12 должно стоять после, скажем 5, а не до?! И можно ли? Он, вишь, по порядку появления знаков сортирует. А чтобы числа понимал?


Сообщение отредактировал symargl - Пятница, 08.05.2015, 22:26
 
haavДата: Суббота, 09.05.2015, 06:47 | Сообщение # 30
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Репутация: 49
Статус: Offline
Цитата symargl ()
Добавляемое этой функцией он сортирует, а добавляемое AddComboBoxItem - не сортирует, оставляет в конце.


Поправлю: не оставляет в конце, а вставляет в любое нужное место. Третий параметр отвечает за место вставки. Данная функция так и задумывалась. Именно поэтому она и несовместима со стилем CBS_SORT . Согласись, теряется логика , если вставлять сначала в нужные места, а потом все равно будет сортироваться.

Цитата
Вроде бы уже совсем не по теме, но вроде бы и в продолжение... А как можно ему, дурню, дать понять, что число, скажем, 12 должно стоять после, скажем 5, а не до?! И можно ли? Он, вишь, по порядку появления знаков сортирует. А чтобы числа понимал?


Мелкософт предлагает стандартную сортировку (CBS_SORT) для этого контрола. Если нужна другая сортировка, то ее нужно реализовывать вручную и тут как раз использовать AddComboBoxItem для вставки в любое место.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
  • Страница 2 из 8
  • «
  • 1
  • 2
  • 3
  • 4
  • 7
  • 8
  • »
Поиск: