Форум » GUI » Вопросы и замечания по реализации некоторых объектов » Ответить

Вопросы и замечания по реализации некоторых объектов

SADSTAR2: накопилось некоторое количество вопросов, на которые я не смог найти ответа . А так же замечаний по реализации некоторых свойств. Думаю - уместно будет их опубликовать для коллективного обсуждения, устранения или моего образования (если я что то не так понимаю). Все - в версии 1.43. Может в 1.44 что то уже изменилось? ---- У контрола TAB нет свойств для управления цветом букв в заголовках страниц и фоном на теле TAB. Последнее особенно важно т.к. не позволяет выбрать цвет TAB в тон измененному цвету окна. Аналогично - TimePicker ---- В SLIDER нет реакции на системное событие GotFocus и LostFocus (толко OnChange). Т.е. система эти действия производит, а МиниГУИ их не ловит. А мне было бы полезно и удобно . Аналогично в RadioGroup. ----- TextBox. Во время вставки текста в TextBox из ClipBoard посредством Shif+Ins происходит изменение режима вставки как будто просто нажали Ins. ----- ListBox 1. запись нового значения в текущую позицию i:=wMain.List_1.Value wMain.List_1.Item(i):=t сбрасывает текущую позицию в 0. Думаю - это нелогичное поведение. Восстановление позиции wMain.List_1.Value:=i вызывает срабатывание обработчика события OnChange для List_1 2. запись нового значения в нулевую позицию wMain.List_1.Item(0):=t добавляет новую строку т.е. выполняет wMain.List_1.AddItem(t) Это баг или фича? --- функция file(fn) не переваривает полное имя файла с пробелом в имени каталога или файла типичный код if !file(fn); MsgStop('Файл '+fn+' не найден'); endif Изменение file('"'+fn+'"') - не помогает. Что делать? --- повторю про ShowGrid() чтобы было все в одном месте Сделал себе функцию ShowGrid() для целей конкретного приложения. При компиляции выпадает на ошибку. Переобозвал в ShowGrid2() - все Ок. Поиск по всем файлам дал только SHOWGRID в составе команды DRAW GRAPH IN WINDOW GraphTest ; ... ; SHOWGRID ; ... Думаю - это нелогичное поведение компилятора - не различать внутренний тэг команды и честную функцию. --- Как изменить имя существующего на форме контрола? Только удалением и созданием нового с новым именем? Но тогда нарушится последовательность обхода. Закрывать форму и открывать снова с новым именем контрола? --- Объясните на пальцах - что такое активация окна? Я считал что окно пассивно до активации , т.е. не выполняет никаких активных действий. А выяснилось что между "load window ..." и "activate window ..." уже срабатывают обработчики событий окна OnSize и OnMove. Да наверное и другие тоже. --- Жду ответа как соловей лета. С наилучшими пожеланиями. SadStar.

Ответов - 13

Петр: SADSTAR2 пишет: Поиск по всем файлам дал только SHOWGRID в составе команды DRAW GRAPH IN WINDOW GraphTest ; ... ; SHOWGRID ; ... Думаю - это нелогичное поведение компилятора - не различать внутренний тэг команды и честную функцию. i_altsyntax.ch #xcommand SHOWGRID <grid>; =>; _HMG_ActiveControlFontItalic := <grid>

gfilatov: SADSTAR2 пишет: У контрола TAB нет свойств для управления цветом букв в заголовках страниц и фоном на теле TAB. Последнее особенно важно т.к. не позволяет выбрать цвет TAB в тон измененному цвету окна. Аналогично - TimePicker Все верно! Нужна помощь сишников и/или знатоков WinAPI в реализации этого свойства SADSTAR2 пишет: В SLIDER нет реакции на системное событие GotFocus и LostFocus (толко OnChange). Снова Вы абсолютно правы, но это уже особенности реализации этого контрола в WinAPI, который не имеет подобных событий Предлагайте, какие из существующий системных сообщений у этого конторола мы может использовать для обработки GotFocus и LostFocus SADSTAR2 пишет: функция file(fn) не переваривает полное имя файла с пробелом в имени каталога или файла Это косяки реализации этой функции в Харборе Вроде, разработчики работают над исправлением ситуации - предложили новую функцию HB_FILEEXISTS(), но она не поддерживает маски SADSTAR2 пишет: Сделал себе функцию ShowGrid() для целей конкретного приложения. При компиляции выпадает на ошибку. Увы, так работает препроцессор Харбора SADSTAR2 пишет: Как изменить имя существующего на форме контрола? А зачем? Именуйте как надо сразу... SADSTAR2 пишет: Закрывать форму и открывать снова с новым именем контрола? Думаю, что да SADSTAR2 пишет: что такое активация окна? Это когда окно уже создано, но еще не показано SADSTAR2 пишет: Я считал что окно пассивно до активации Активация вызывает вывод окна на экран и остановку для обработки системных ссобщений. Впрочем, такая остановка может быть отложена при использовании класса NOWAIT, но тогда может потребоваться позже вызвать DO MESSAGE LOOP.

gfilatov: SADSTAR2 пишет: ListBox 1. запись нового значения в текущую позицию i:=wMain.List_1.Value wMain.List_1.Item(i):=t сбрасывает текущую позицию в 0. Думаю - это нелогичное поведение. Увы, так работает WinAPI SADSTAR2 пишет: 2. запись нового значения в нулевую позицию wMain.List_1.Item(0):=t добавляет новую строку т.е. выполняет wMain.List_1.AddItem(t) Это баг или фича? Снова работает WinAPI Если Вас не устраивает такое поведение ListBox, то попробуйте использовать GRID


Петр: gfilatov пишет: А зачем? Именуйте как надо сразу... Очевидно, что речь идет о дизайнере форм или чего нибудь другого. SADSTAR2 в коде создания всех контролов вы можете встретить такой код mVar := '_' + ParentFormName + '_' + ControlName .. Public &mVar. := k .. _HMG_aControlNames [k] := ControlName Очевидно, что mVarNew := '_' + ParentFormName + '_' + ControlNameNew Public &mVarNew := mVar _HMG_aControlNames [mVarNew] := ControlNameNew RELEASE mVar принесет нам желаемый результат. Но будьте осторожны с псевдо ООП..

Петр: SADSTAR2 пишет: У контрола TAB нет свойств для управления цветом букв в заголовках страниц и фоном на теле TAB. Частично исправить ситуацию можно используя сл.конструкцию Brush := CreateSolidBrush( red, green, blue ) SetWindowBrush( hWnd, Brush ) Где hWnd хэндл нужного вам контрола. Причем можно использовать для установки фона и картинку. Подробнее смотрите source\h_wbrush.prg

SADSTAR2: gfilatov пишет: SADSTAR2 пишет: цитата: В SLIDER нет реакции на системное событие GotFocus и LostFocus (толко OnChange). Снова Вы абсолютно правы, но это уже особенности реализации этого контрола в WinAPI, который не имеет подобных событий Предлагайте, какие из существующий системных сообщений у этого конторола мы может использовать для обработки GotFocus и LostFocus Я наверное имею неправильные представления о работе системы, но Слайдер ведь получает фокус ввода так же как и кнопка или текстбокс. Т.е. кнопкой <Tab> без мыши попадаешь на слайдер, видишь рамку которая показывает текущий фокус ввода, управляешь слайдером клавишами и покидаешь по <Tab>. Значит должно быть и событие такое.

gfilatov: SADSTAR2 пишет: ListBox 1. запись нового значения в текущую позицию i:=wMain.List_1.Value wMain.List_1.Item(i):=t сбрасывает текущую позицию в 0. Думаю - это нелогичное поведение. Уже поправил для нового релиза. Кстати, это справедливо и для MultiSelect ListBox контрола. SADSTAR2 пишет: 2. запись нового значения в нулевую позицию wMain.List_1.Item(0):=t добавляет новую строку т.е. выполняет wMain.List_1.AddItem(t) Это баг или фича? Видимо, все же фича, которую предоставляет WinAPI.

gfilatov: SADSTAR2 пишет: Слайдер ведь получает фокус ввода Да, все верно Но при этом обработчику не посылается сообщение ??_SETFOCUS Кстати, по ходу добавил обработку события ON SCROLL, срабатывающее в процессе перетаскивания ползунка SADSTAR2 пишет: кнопкой <Tab> без мыши попадаешь на слайдер, видишь рамку которая показывает текущий фокус ввода, управляешь слайдером клавишами и покидаешь по <Tab>. Вот именно! Но какие при этом генерируются сообщения обработчику? Поэтому я и просил помощи у сведущих товарищей Петр?!

Петр: LB_INSERTSTRING This message is sent by an application to insert a string into a list box. Unlike the LB_ADDSTRING message, the LB_INSERTSTRING message does not cause a list with the LBS_SORT style to be sorted. LB_INSERTSTRING wParam = (WPARAM) index; lParam = (LPARAM)(LPCTSTR) lpsz; Parameters index Zero-based index of the position at which to insert the string. If this parameter is –1, the string is added to the end of the list. А вот реализация из MiniGUI HB_FUNC( LISTBOXINSERTSTRING ) { char *cString = hb_parc( 2 ); SendMessage( (HWND) hb_parnl(1), LB_INSERTSTRING, (WPARAM) hb_parni(3) - 1, (LPARAM) cString ); } Все логично 0-1 = -1

Петр: Действительно, некоторые элементы управления Windows (controls) имеют свою специфику - SLIDER один из них. Чтобы заставить SLIDER адекватно реагировать на происходящее ( ) - нужно делать сабклассинг. Только есть ли в этом такая большая необходимость?

gfilatov: Петр пишет: нужно делать сабклассинг Элемент управления Spinner имеет пример такого обработчика для вывода контекстного меню и режима расширенной навигации по клавише Enter Петр пишет: Только есть ли в этом такая большая необходимость? Я тоже не вижу, но для полноты и единообразия реализации событий у всех контроллов это может потребоваться

Петр: Окей, до сл.выпуска сделаем .

gfilatov: Петр пишет: до сл.выпуска сделаем Спасибо! Я планирую выпустить следующий релиз не раннее 26 ноября



полная версия страницы