On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
gfilatov
модератор




Пост N: 699
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 29.01.08 13:59. Заголовок: Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)


Начало темы находится здесь, а теперь

АНОНС * АНОНС * АНОНС * АНОНС * АНОНС

Готовится к опубликованию новая сборка №48, которая выйдет в конце недели.
Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне

Кратко, что нового:

- исправление обнаруженных ошибок и неточностей кода;
- новый класс HEADERIMAGE для Grid и Browse;
- свойство Address в Hyperlink может теперь открывать папку или файл на диске;
- добавлен NOTABSTOP класс для Browse;
- поддержка пользовательских компонентов (заимствована из оффициального релиза);
- расширения и исправления в библиотеках TsBrowse и PropGrid;
- обновлены сборки Харбор и HMGS-IDE;
- новые и обновленные старые примеры (как обычно ).




Спасибо: 5 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]


SergKis
постоянный участник




Пост N: 1473
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 31.05.17 00:05. Заголовок: Петр пишет Это можно..


Петр пишет
 цитата:
Это можно сделать и изящнее, см.BASIC\WindowProperty


О вкусах не спорю.
SET WINDOWPROPERTY "PROP_2" OF Win1 VALUE 2
SET WINDOWPROPERTY "PROP_3" OF Win1 VALUE 3.14
SET WINDOWPROPERTY "PROP_4" OF Win1 VALUE .T.
SET WINDOWPROPERTY "PROP_5" OF Win1 VALUE Date()
SetProp( Win1.Handle, "PROP_6", hb_serialize( { "One" => 1, 2 => "Two", "Today" => Date(), 5 => NIL, 6 => { .T., .F. } } ) )
а потом
RELEASE WINDOWPROPERTY "PROP_2" OF Win1
RELEASE WINDOWPROPERTY "PROP_3" OF Win1
RELEASE WINDOWPROPERTY "PROP_4" OF Win1
RELEASE WINDOWPROPERTY "PROP_5" OF Win1
RELEASE WINDOWPROPERTY "PROP_6" OF Win1
Проходили с MDI интерфейсом - следить за что поставил, что снял - еще то занятие. Не понравилось и отказались.

 цитата:
К примеру, если message входит в диапазон WM_USER.., оконная процедура с помощью GetProp получает связанный обьект и выполняет нужный метод или просто вызывает процедуру/выполняет блок кода, функция Events в этом случае не вызывается.


Совершенно не возражаю, а даже был бы благодарен, за такую реализацию. Кто бы сделал.

 цитата:
Был уже в истории такой период "hmg objects", чем закончился - не знаю


Вроде была жива, но там тот же минус - база на _HMG_... переменных, обернутая в объекты (они сверху), не так как hwg (просто летает в сравнении, но там другое ...). А когда работают днями не выходя из проги (hmg), при больших кол-вах контролов и окон, становится заметнее прорисовки на глаз, что вызывает вопросы, у клиента, т.к. псевдо ООП крутит макро и ascan.
"hmg objects" реализовывать не собираюсь, просто мне так привычнее, после VO (с C не очень дружу).

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1474
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 31.05.17 00:08. Заголовок: gfilatov2002 пишет У..


gfilatov2002 пишет
 цитата:
У меня сейчас эта функция выглядит так:


Хотелось бы, чтобы объект получался и от Handle окна, не только от имени.
Потому и изменения предложил.

Спасибо: 0 
Профиль
Петр
постоянный участник


Пост N: 1491
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 31.05.17 09:34. Заголовок: SergKis пишет: Прох..


SergKis пишет:

 цитата:
Проходили с MDI интерфейсом - следить за что поставил, что снял - еще то занятие.


Наверное вы проходили до включения в MiniGUI EnumProps().
Потому, что с EnumProps все эти манипуляции становятся рутинными.


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1476
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 31.05.17 09:46. Заголовок: Петр пишет Наверное ..


Петр пишет
 цитата:
Наверное вы проходили до включения в MiniGUI EnumProps().
Потому, что с EnumProps все эти манипуляции становятся рутинными.


Это был 2009 год.
Добавив в окно простое _HMG_aFormMiscData1 - решили проблемы наращивания функционала"естественным" способом, аналогичный контролам hmg, т.е. поведение псвесдо объектов контролов и окон одинаково.
Сами включали в свою версию EnumProc и это работало, пока не наткнулись (с разрастанием программы) на плавающий завис на нем. Убрали - все стало ok.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1110
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 31.05.17 11:48. Заголовок: SergKis пишет: Хоте..


SergKis пишет:

 цитата:
Хотелось бы, чтобы объект получался и от Handle окна, не только от имени.


Не вопрос, уже переписал эту функцию так:

*-----------------------------------------------------------------------------* 
FUNCTION _GetWindowObj( FormName )
*-----------------------------------------------------------------------------*
LOCAL i := iif( HB_ISNUMERIC( FormName ), ;
AScan( _HMG_aFormHandles, FormName ), GetFormIndex( FormName ) )

IF i > 0
RETURN _HMG_aFormMiscData1 [ i ][ 1 ]
ENDIF

RETURN NIL

И рабочий код для проверки

@ 100,100 BUTTON Button_11 CAPTION "Click  "  WIDTH  100 HEIGHT 30 ; 
ACTION ( ThisWindow.Cargo := inputbox('Enter text' , 'New Title' , ;
_GetWindowObj( ThisWindow.Handle ):Title ), ;
ThisWindow.Title := (ThisWindow.Cargo) )


Спасибо: 0 
Профиль
Петр
постоянный участник


Пост N: 1492
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 31.05.17 12:05. Заголовок: SergKis пишет: Сами..


SergKis пишет:

 цитата:
Сами включали в свою версию EnumProc и это работало, пока не наткнулись (с разрастанием программы) на плавающий завис на нем. Убрали - все стало ok.


Я не видел сообщений об ошибке на этом форуме. К сожалению, это почти практика для пользователей MiniGUI - смастерить костыль, а не искать причину.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1481
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 31.05.17 13:53. Заголовок: Петр пишет смастерит..


Петр пишет
 цитата:
смастерить костыль, а не искать причину.


Когда костыль вылазит только у некоторых клиентов и случ. образом, как то не до практики искать истинную причину.
А о сообщениях писать ... не всегда есть смыл.
Писал я, что столкнулись, у клиентов, не работает совсем или частично уст. клавишь HotKey и что ... ?
Переделали под себя на CLASS hmgBrowseKey, подсунули вместо HotKey и с 10-го работает как часы + в тсб KeyDown ...
Как там было "Думать некогда, стучать надо."


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1483
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 31.05.17 18:24. Заголовок: gfilatov2002 пишет у..


gfilatov2002 пишет
 цитата:
уже переписал эту функцию так


Пример может и так выглядеть.
DEFINE WINDOW ...
PRIVATE oWnd := _GetWindowObj(This.Name)
...
ACTION ... oWnd:Title
и так везде.
Если в объект добавить ASSIGNы, то
oWnd:Title := '...'
с использованием WITH OBJECT oWnd
:Title
и т.д.


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1484
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 01.06.17 18:17. Заголовок: gfilatov2002 Вариан..


gfilatov2002
Вариант с UserKeys на окно (TWndData на старом варианте) Скрытый текст


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1485
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 01.06.17 18:31. Заголовок: PS Если ACTION контр..


PS
Если ACTION контрола не задам, по умолчанию, можно выполнять oWnd:UserKeys( This.Name )
Проще писать.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1111
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 01.06.17 20:21. Заголовок: SergKis пишет: Вар..


SergKis пишет:

 цитата:
Вариант с UserKeys на окно


Благодарю за помощь!
Буду разбираться...

P.S. Супер! Все работает как надо

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1486
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 01.06.17 22:36. Заголовок: gfilatov2002 В прим..


gfilatov2002
В пример по использованию Cargo добавьте строки
 
PRIV oWnd := This.Object

oWnd:oUserKeys:Cargo := TKeyData():New()
oWnd:oUserKeys:Cargo:Set(1, "Harbour")
oWnd:oUserKeys:Cargo:Set(2, "MiniGui")
oWnd:oUserKeys:Cargo:Set(3, "OK !")

oWnd:UserKeys('M_1_1', {|o,k,p| MsgBox( o:ClassName+"|"+cValToChar(k)+"|"+cValToChar(p), This.Name ) })
...
oWnd:UserKeys('M_2_4', {|o | MsgBox( o:Cargo:Get(1)+" "+o:Cargo:Get(3) , This.Name ) })
oWnd:UserKeys('M_2_5', {|o | MsgBox( o:Cargo:Get(2)+" "+o:Cargo:Get(3) , This.Name ) })


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1487
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 01.06.17 22:40. Заголовок: PS. промахнулся по ..


PS.
промахнулся по кнопке. Еще
 
ITEM 'Item main menu 2.3' ACTION oWnd:UserKeys( This.Name, 2.3 ) NAME M_2_3 IMAGE 'n3'
ITEM 'Item main menu 2.4' ACTION oWnd:UserKeys( This.Name ) NAME M_2_4 IMAGE 'n4'
ITEM 'Item main menu 2.5' ACTION oWnd:UserKeys( This.Name ) NAME M_2_5 IMAGE 'n5'


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1112
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 02.06.17 11:48. Заголовок: SergKis пишет: В пр..


SergKis пишет:

 цитата:
В пример по использованию Cargo


Благодарю за Вашу помощь!
Добавил такое описание в текущий changelog:

  * New: Added the simple TWndData class for a storing of the windows data. 
There are the following access variables in the above class now:
- Index, Name, Handle, ParentHandle, Type, VarName;
- Title, Row, Col, Width, Height, ClientWidth, ClientHeight.
Added the readonly property 'Object' for the all windows.
Usage:
- function syntax:
oWin := GetProperty( ThisWindow.Name, "Object" )
- pseudo-OOP syntax:
oWin := ThisWindow.Object
MsgInfo( oWin:Title, oWin:Name )
Added the method UserKeys( Key, Block ) and the associated set/get
TKeyData class for assigning and executing a codeblock for the objects.
The above classes are guarded by the constant _DEBUG_ in the sources
(look at minigui.ch in folder \include).
Suggested and contributed by SergKis.
(see demo in folder \samples\Advanced\Tsb_UserKeys)

Всем пока - убегаю в отпуск

Спасибо: 0 
Профиль
Петр
постоянный участник


Пост N: 1493
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 02.06.17 14:17. Заголовок: SergKis пишет: у кл..


SergKis пишет:

 цитата:
у клиентов, не работает совсем или частично уст. клавишь HotKey и что ... ?



Это нормально, к Минигуи претензий не может быть никаких (почти).
HotKey в библиотеке построены на RegisterHotKey(), описание которой с указанием причин отказа в регистрации можно легко найти в нете.
К тому же HotKey system-wide.

Вот интересно почему в MiniGUI не реализована поддержка акселераторов (accelerators)?

Спасибо: 0 
Профиль
Петр
постоянный участник


Пост N: 1494
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 02.06.17 14:22. Заголовок: Ваше решение (UserKe..


Ваше решение (UserKeys), базированное на WM_KEYDOWN, - это нормальное рабочее решение.

Но вот что пишет msdn

 цитата:
You could implement keyboard shortcuts by handling individual WM_KEYDOWN messages, but accelerator tables provide a better solution that:
-Requires less coding;
-Consolidates all of your shortcuts into one data file;
-Supports localization into other languages;
-Enables shortcuts and menu commands to use the same application logic.




Спасибо: 0 
Профиль
Петр
постоянный участник


Пост N: 1495
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 02.06.17 14:25. Заголовок: Поддержку акселерато..


Ограниченную поддержку акселераторов в MiniGUI организовать просто

Пример (only Harbour):

/* 
* Harbour MiniGUI Accelerators Demo
* (c) 2017 P.Ch.
*/

#include "minigui.ch"
#include "i_winuser.ch"
#include "demo.ch"

MEMVAR hMenu, hAccel

init procedure App_OnInit()

PUBLIC hMenu := LoadMenu( Nil, 'MainMenu' )
PUBLIC hAccel := LoadAccelerators( Nil, 'FontAccel' )

if Empty( hAccel )
quit
endif

SetGlobalListener( 'App_OnEvents' )

return

//////////////////////////////////////////////////////////////////////////////
function Main()

DEFINE WINDOW Win_1 ;
CLIENTAREA 400, 400 ;
BACKCOLOR BLACK ;
TITLE 'Accelerators Demo' ;
MAIN ;
ON INIT ;
( ;
SetMenu( ThisWindow.Handle, hMenu ), ;
SetAccelerators( ThisWindow.Handle, hAccel ) ;
) ;
ON RELEASE ;
( ;
DestroyMenu( hMenu ), ;
DestroyAcceleratorTable( hAccel ) ;
)


END WINDOW

Win_1.Center
Win_1.Activate

return 0

//////////////////////////////////////////////////////////////////////////////
function App_OnEvents( hWnd, nMsg, wParam, lParam )

local nResult

switch nMsg
case WM_COMMAND
switch LoWord( wParam )
case IDM_REGULAR
case IDM_BOLD
case IDM_ITALIC
case IDM_ULINE
MsgInfo( 'ID:' + hb_NtoS( LoWord( wParam ) ), iif( 0 == HiWord( wParam ), 'Menu', 'Accelerator' ) )
nResult := 0
exit
otherwise
nResult := Events( hWnd, nMsg, wParam, lParam )
end
exit
otherwise
nResult := Events( hWnd, nMsg, wParam, lParam )
end

return nResult

//////////////////////////////////////////////////////////////////////////////
#pragma BEGINDUMP
/*
Parts of this code is contributed and used here under permission of his
author: Copyright 2016 (C) P.Chornyj <myorg63@mail.ru>
*/

#include <hbwinuni.h>
#include <mgdefs.h>
#include "hbapiitm.h"

extern HINSTANCE g_hInstance;

// BOOL WINAPI DestroyAcceleratorTable( HACCEL hAccel )
HB_FUNC( DESTROYACCELERATORTABLE )
{
HACCEL hAccel = ( HACCEL ) ( LONG_PTR ) HB_PARNL( 1 );

hb_retl( DestroyAcceleratorTable( hAccel ) ? HB_TRUE : HB_FALSE );
}

// HACCEL WINAPI LoadAccelerators( HINSTANCE hInstance, LPCTSTR lpTableName )
HB_FUNC( LOADACCELERATORS )
{
HACCEL hAccel = ( HACCEL ) NULL;
HINSTANCE hInstance = HB_ISNUM( 1 ) ? ( HINSTANCE ) HB_PARNL( 1 ) : g_hInstance;
LPCTSTR lpTableName;

if( HB_ISNUM( 2 ) )
{
lpTableName = MAKEINTRESOURCE( ( WORD ) hb_parnl( 2 ) );

hAccel = LoadAccelerators( hInstance, lpTableName );
}
else if( HB_ISCHAR( 2 ) )
{
void * hTableName;
lpTableName = HB_PARSTR( 2, &hTableName, NULL );

hAccel = LoadAccelerators( hInstance, lpTableName );
hb_strfree( hTableName );
}

HB_RETNL( ( LONG_PTR ) hAccel );
}

// HMENU WINAPI LoadMenu( HINSTANCE hInstance, LPCTSTR lpMenuName )
HB_FUNC( LOADMENU )
{
HMENU hMenu = ( HMENU ) NULL;
HINSTANCE hInstance = HB_ISNUM( 1 ) ? ( HINSTANCE ) HB_PARNL( 1 ) : g_hInstance;
LPCTSTR lpMenuName;

if( HB_ISNUM( 2 ) )
{
lpMenuName = MAKEINTRESOURCE( ( WORD ) hb_parnl( 2 ) );

hMenu = LoadMenu( hInstance, lpMenuName );
}
else if( HB_ISCHAR( 2 ) )
{
void * hMenuName;
lpMenuName = HB_PARSTR( 2, &hMenuName, NULL );

hMenu = LoadMenu( hInstance, lpMenuName );
hb_strfree( hMenuName );
}

HB_RETNL( ( LONG_PTR ) hMenu );
}

#pragma ENDDUMP


Спасибо: 0 
Профиль
Петр
постоянный участник


Пост N: 1496
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 02.06.17 14:29. Заголовок: Для того, чтобы прим..


Для того, чтобы пример заработал нужны еще 2 файла


 цитата:
// demo.ch 
#define IDM_REGULAR 1100
#define IDM_BOLD 1200
#define IDM_ITALIC 1300
#define IDM_ULINE 1400





 цитата:
// demo.rc 
#include "demo.ch"

MainMenu MENU
{
POPUP "&Character"
{
MENUITEM "&Regular\tF5", IDM_REGULAR
MENUITEM "&Bold\tCtrl+B", IDM_BOLD
MENUITEM "&Italic\tCtrl+I", IDM_ITALIC
MENUITEM "&Underline\tCtrl+U", IDM_ULINE
}
}

FontAccel ACCELERATORS
{
VK_F5, IDM_REGULAR, VIRTKEY
"B", IDM_BOLD, CONTROL, VIRTKEY
"I", IDM_ITALIC, CONTROL, VIRTKEY
"U", IDM_ULINE, CONTROL, VIRTKEY
}




Спасибо: 0 
Профиль
Петр
постоянный участник


Пост N: 1497
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 02.06.17 14:33. Заголовок: Также нужно внести и..


Также нужно внести изменения в библиотеку (c_windowsAPI.c) и пересобрать ее

 цитата:
 
static HWND hWndMain = NULL;
static HACCEL hAccel = NULL;

HB_FUNC( SETACCELERATORS )
{
hWndMain = ( HWND ) ( LONG_PTR ) HB_PARNL( 1 );
hAccel = ( HACCEL ) ( LONG_PTR ) HB_PARNL( 2 );
}

HB_FUNC( DOMESSAGELOOP )
{
MSG Msg;
BOOL bRet;

while( ( bRet = GetMessage( &Msg, NULL, 0, 0 ) ) != 0 )
{
hDlgModeless = GetActiveWindow();

if( bRet == -1 )
{
// handle the error and possibly exit
hmg_ErrorExit( TEXT( "DOMESSAGELOOP" ), 0, TRUE );
}
else
{
if( hDlgModeless == ( HWND ) NULL || ! TranslateAccelerator( hWndMain, hAccel, &Msg ) )
{
if( ! IsDialogMessage( hDlgModeless, &Msg ) )
{
TranslateMessage( &Msg );
DispatchMessage( &Msg );
}
}
}
}
}




Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1113
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 02.06.17 16:00. Заголовок: Петр пишет: поддерж..


Петр пишет:

 цитата:
поддержку акселераторов в MiniGUI организовать просто


Благодарю за Ваш весомый вклад в развитие библиотеки!
Отдельное спасибо за реализацию функции LoadMenu

Спасибо: 0 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 253
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет