Форум » GUI » Примеры из Минигуи -ошибки, вопросы..... (продолжение) » Ответить

Примеры из Минигуи -ошибки, вопросы..... (продолжение)

Andrey: Всем привет. Взялся смотреть примеры из МиниГуи, так не все работают. Может кто подскажет что там "допилить" нужно ? А заодно может и исправить и добавить новые.... Очень красочный пример: \MiniGUI\SAMPLES\Advanced\AVI_Animation - не работает под Win7 (наверно AVI-шки нет в ресурсах) Предложение Григорию: Можно ли добавить еще один пример с отдельным AVI-файлом в ресурсах проекта и показом такого же бегунка ? Пример: \MiniGUI\SAMPLES\Advanced\DisplayMode - не работает под ХР и далее.... Пример: \MiniGUI\SAMPLES\Advanced\Tsb_filter - вылетает на ХР -------------------------------------------------------------------------------- Harbour MiniGUI Errorlog File Harbour MiniGUI Extended Edition 2.0.1 - 2011.09.21 -------------------------------------------------------------------------------- Date: 11/15/2011 Time: 22:13:24 Error BASE/1124 Argument error: LEFT Called from LEFT(0) Called from SCANSOFT(195) Called from MAIN(84) Пример: \MiniGUI\SAMPLES\BASIC\MsgEdit - не собирается... Z:\MiniGUI\SAMPLES\BASIC\MsgEdit>call ..\..\..\batch\compile.bat demo /L shell32 Harbour 3.1.0dev (Rev. 17042) Copyright (c) 1999-2011, http://harbour-project.org/ Compiling 'demo.prg'... Lines 20133, Functions/Procedures 30 Generating C source output to 'demo.c'... Done. Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland demo.c: Error E2141 demo.prg 993: Declaration syntax error *** 1 errors in Compile *** C compile error.

Ответов - 301, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 All

Andrey: БОЛЬШОЕ СПАСИБО за разъяснения ! Буду думать....

Andrey: Читаю хелпер по МиниГуи - CheckBox Хочу задать другой цвет, добавляю в пример: \MiniGUI\SAMPLES\BASIC\checkbox\demo.prg Define CheckBox Check1 Row 40 Col 10 Value .F. Caption 'Simple CheckBox' Width 120 FontColor RED BackColor YELLOW OnChange MsgInfo( "CheckBox 1 Value is Changed!" ) End CheckBox Цвет не меняется ! Фон меняется ! Так должно быть ? Или у меня Win8 глючит ?

Andrey: Всем привет. Пример \MiniGUI\SAMPLES\BASIC\Grid_5 Как поменять цвет выбора (маркера) на другой ? Хочу черный маркер и на нем желтые буквы.... Как поменять цвет заголовка таблицы на другой ? Никак у меня не получается ...


gfilatov2002: Andrey пишет: Как поменять цвет выбора (маркера) на другой ? Такая возможность для стандартного Grid есть (см. пример в папке samples\Advanced\GridColor). Andrey пишет: Как поменять цвет заголовка таблицы на другой ? Для стандартного Grid - никак, в таком случае надо использовать библиотеку TSBrowse с расширенными возможностями (см. элемент управления TBROWSE).

Andrey: gfilatov2002 пишет: Такая возможность для стандартного Grid есть (см. пример в папке samples\Advanced\GridColor). Что-то не получается у меня (для меню из 3-х элементов) ... Если включить CELLNAVIGATION .T. то цвет на одной ячейке появляется... Вот текст примера: /* * MiniGUI Grid Color Demo * * The idea of 2013 Verchenko Andrey <verchenkoag@gmail.com> * Implementation (c) 2013 Grigory Filatov <gfilatov@inbox.ru> */ #include "minigui.ch" Procedure Main LOCAL aColor := {105,182,34} // bright green LOCAL aColor2 := YELLOW LOCAL aColor3 := AQUA LOCAL aBtnColor := WHITE, aBackColor := aColor LOCAL fColor := { | Val, CellRowIndex | IF ( CellRowIndex / 2 == Int( CellRowIndex / 2 ) , RGB( aColor2[1],aColor2[2],aColor2[3] ) , RGB( aColor3[1],aColor3[2],aColor3[3] ) ) } LOCAL fColor2 := { | Val, CellRowIndex | IF ( CellRowIndex / 2 == Int( CellRowIndex / 2 ) , RGB( aColor[1],aColor[2],aColor[3] ) , RGB( aColor[1],aColor[2],aColor[3] ) ) } SET MULTIPLE OFF SET AUTOADJUST ON DEFINE WINDOW Form_2 ; AT 0,0 ; WIDTH 600 ; HEIGHT 400 ; TITLE 'Grid Colors Themes (color style)' ; MAIN ; BACKCOLOR aBackColor ; FONT 'Tahoma' SIZE 14 ; ON INIT OnInitGrid() DEFINE MAIN MENU DEFINE POPUP 'File' MENUITEM 'Exit' ACTION ThisWindow.Release END POPUP END MENU // Title grid {HEADERS} consists of only one line. // The second line is not visible! Limitation grid. DEFINE GRID Grid_2 ROW 10 COL 10 WIDTH 570 HEIGHT 300 WIDTHS { 550 - IF(IsXPThemeActive(), 2, 0) } HEADERS {'No (1)','Menu (2)', 'File (3)' } WIDTHS { 100, 280, 150 } ITEMS MyLoadDim() VALUE 1 ON DBLCLICK Test_Choice(1) ONHEADCLICK { {|| MsgInfo('Header 1 Clicked !')} , { || MsgInfo('Header 2 Clicked !')}, { || MsgInfo('Header 3 Clicked !')} } NOLINES .T. CELLNAVIGATION .F. DYNAMICFORECOLOR { fColor , fColor, fColor } DYNAMICBACKCOLOR { fColor2, fColor2, fColor2 } FONTBOLD .T. FONTCOLOR BLUE BACKCOLOR aBackColor END GRID ON KEY F4 ACTION Test_Choice(2) END WINDOW CENTER WINDOW Form_2 ACTIVATE WINDOW Form_2 Return /////////////////////////////////////////////////////////////////////////// Procedure OnInitGrid() _HMG_GridSelectedCellForeColor := RED _HMG_GridSelectedCellBackColor := BLACK Form_2.Grid_2.Value := 1 Form_2.Grid_2.SetFocus Return /////////////////////////////////////////////////////////////////////////// Function MyLoadDim() Local nI, aRows := {} FOR nI := 1 TO 25 AAdd( aRows, { STR(nI)+".", "Example menu -> "+STR(nI,3), "file"+LTRIM(STR(nI))+".txt" } ) NEXT Return aRows /////////////////////////////////////////////////////////////////////////// Procedure Test_Choice(nVal) Local nMenuNum := Form_2.Grid_2.Value Local cMenuName := GetColValue( "Grid_2", "Form_2", 2 ) Local cFileName := GetColValue( "Grid_2", "Form_2", 3 ) Local cText //MsgDebug(nMenuNum,VALTYPE(nMenuNum)) cText := IIF(nVal==2,"You press F4","") + CRLF + CRLF cText += "Menu selection = " + STR(nMenuNum,2) + CRLF + CRLF cText += "Menu (2): ["+ cMenuName + "]" + CRLF + CRLF cText += "File (3): ["+ cFileName + "]" + CRLF + CRLF MsgInfo(cText) //refresh_it() // не работает что-то Return /////////////////////////////////////////////////////////////////////////// Function GetColValue( xObj, xForm, nCol ) Local nPos:= GetProperty(xForm, xObj, 'Value') Local aRet:= GetProperty(xForm, xObj, 'Item', nPos) Return aRet[nCol] /////////////////////////////////////////////////////////////////////////// Function refresh_it() Local a := Form_2.Grid_2.Value Form_2.Grid_2.Value := iif(a[1] # 1, 1, 2) Form_2.Grid_2.Value := a Return NIL gfilatov2002 пишет: Для стандартного Grid - никак, в таком случае надо использовать библиотеку TSBrowse Понял. Спасибо.

Andrey: Есть ли в МиниГуи окно (не MsgInfo) без остановки программы ? Т.е. на экран вешается ПРОСТОЕ сообщение, а программа выполняется дальше...

Haz: в минигуи пример называется WaitWindow

Andrey: \MiniGUI\SAMPLES\BASIC\WAIT_WINDOW\demo2.prg - подходит, но при нажатии в любом месте мышкой, окно закрывается... Нужно бы кнопку на это окно "Закрыть", тогда юзер успеет посмотреть что за ошибка была ! Да и пример пару раз повисал...

Haz: так это базовый пример, и лучше подходит demo1 - там параметр NOWAIT используется чтоб не ждать any key ... а кнопку в окно добавить легко - в InitWaitWindow до/после LABEL дописать и подвесить на нее событие { || _HMG_CHILDWAITWINDOW.HIDE } PS. Я бы использовал трей для вывода сообщения об ошибке - посмотри пример TrayBalloon_2

Andrey: Haz пишет: Я бы использовал трей для вывода сообщения об ошибке - посмотри пример TrayBalloon_2 Я другое хочу: Т.е. много ошибок или просто сообщений на рабочий стол...

Andrey: Так, с предыдущим примером закончили. Пример сделал с помощью Григория. Теперь другой, вопрос. Как узнать размер desktop toolbars в своей программе ? Для вычисления истинного размера экрана своей проги. Подобный вопрос уже обсуждали в теме: http://clipper.borda.ru/?1-20-0-00000265-000-0-0-1171206710 Но этих функций на С нет в библиотеке МиниГуи. А таскать каждый раз их в другие проекты неудобно. Хотя это отличные функции. Есть ли еще другие варианты решения этой проблемы ?

gfilatov2002: Andrey пишет: Как узнать размер desktop toolbars в своей программе ? Посмотри функцию GetTaskBarHeight()

SergKis: Anderey пишет:Но этих функций на С нет в библиотеке МиниГуи. А таскать каждый раз их в другие проекты неудобно Может стоит создать проект для своей lib и подключать к проектам программ: for %%i in ( OBJ\*.obj ) Do %HB_INS_BCC%\bin\tlib.exe LIB\my_lib1.lib -+%%i > nul

Andrey: SergKis пишет: Может стоит создать проект для своей lib и подключать к проектам программ Да я не любитель своих библиотек. Намаялся в свое время с восстановлением потерянных библиотек и решил не писать их, только библиотека исходников. Просто на маленькие примеры стараюсь пользоваться стандартными функциями.

Andrey: Есть замечательный пример \MiniGUI\SAMPLES\Advanced\TrayBalloon Только иконка на этом "балоне" одна - [ i ] Как бы его можно модифицировать, чтобы можно было задавать типы иконок, как в следующем примере: Кто знает как менять иконки в балоне ?

gfilatov2002: Andrey пишет: как менять иконки в балоне ? Просто посмотри следующий пример Advanced\TrayBalloon_2 в котором можно менять тип иконки

Andrey: gfilatov2002 пишет: Просто посмотри следующий пример Advanced\TrayBalloon_2 в котором можно менять тип иконки Да этот пример - монстр. И библиотеку hbwin цеплять нужно... И угловатый какой то. Первый пример округленький, красивей. В первом так все понятно: MsgBalloon( cMessage, cTitle ) - простота лучший друг понимания. Вот бы сюда добавить тип иконки: MsgBalloon( cMessage, cTitle, nIcon ) Можно добавить этот параметр ?

gfilatov2002: Andrey пишет: Можно добавить этот параметр ? Andrey Сделаю для следующей сборки

Andrey: Спасибо БОЛЬШОЕ Григорий !

Andrey: Если задача вылетает по ошибке, то в файле ошибок ErrorLog.htm есть такая строка: Time from start: 0 days 0 hours 0 mins 3 secs<BR> А как можно получить в программе это значение ? Хочу использовать для отображения на NOTIFYTOOLTIP программы. ?

gfilatov2002: Andrey пишет: как можно получить в программе это значение ? Используй значение, которое возвращает функция TimeFromStart()

Andrey: Использую Form_1.Maximize ! Окно открывается на весь экран без учета desktop toolbars ! Как сделать чтобы вычиталось GetTaskBarHeight() ?

gfilatov2002: Andrey пишет: Использую Form_1.Maximize Попробуй вместо этой команды не указывать ширину и высоту окна (как в примере ниже) [pre]#include "minigui.ch" Function Main DEFINE WINDOW Win_1 ; TITLE 'Hello World!' ; MAIN END WINDOW ACTIVATE WINDOW Win_1 Return Nil[/pre]

Andrey: Непонятно... ну чуть позже вернусь к этому вопросу. А как растянуть картинку на всю форму окна ? nWidth := Form_1.Width nHeight := Form_1.Height @ 0, 0 IMAGE Img_Bckgrnd PICTURE cPict WIDTH nWidth HEIGHT nHeight Если картинка маленькая, то она не растягивается на все окно ! И что лучше использовать в качестве этих заливок (bmp, jpg, png) ? И как по ходу программы можно сменить картинку фона окна ? DEFINE BKGBRUSH newBrush PATTERN IN Form_11 BITMAP PAPER

gfilatov2002: Andrey пишет: как по ходу программы можно сменить картинку фона окна ? Посмотри пример в папке samples\Basic\WindowBackground После команды Andrey пишет: DEFINE BKGBRUSH newBrush PATTERN IN Form_11 BITMAP PAPER надо вызвать ERASE WINDOW Form_11

Andrey: Пытаюсь сделать для пользователя на русском языке пример SendMail ! Отличный пример ! Что такое - Message Priority: "Normal", "Highest", "Low" ? И что за графы Cc: и Bcc: ? И лог-файл не создается ! Хотя письма доходят нормально, через mail.ru !

LYSK: тут почитай Cc: (Carbon Copy) — адресация копий, этот заголовок является расширением поля «To», он указывает дополнительных получателей письма (получатель «To» видит список всех «Cc») Bcc: (Blind Carbon Copy) — слепая/скрытая копия (получатели не подозревают о других получателях из поля «Bcc»). Message Priority исключительно свободный заголовок, устанавливающий приоритет сообщения. Большинство программ его игнорируют.

Andrey: LYSK пишет: тут почитай Спасибо БОЛЬШОЕ ! А это: И лог-файл не создается ! Хотя письма доходят нормально, через mail.ru ! Почему ?

Andrey: Пытаюсь использовать: DEFINE BKGBRUSH newBrush PATTERN IN Form_1 BITMAP WALLPIC WALLPIC засовываю естественно в ресурсы. Не засовывается... пишет: Error demo3.rc 30 40: Invalid bitmap format Картинка обычная : WALLPIC BITMAP picture\Strips.bmp Что делать ? Нашел в чем дело, картинка не 24-битная... А чем вообще можно заменить глючный компилятор ресурсов bcc ?

Andrey: Делаю CENTER WINDOW Form_1, но эта команда не всегда точно центрирует окно. А как окно после этой команды поднять вверх ? Т.е. от самого верха окна экрана допустим на 50 пикселей. Или как окно прижать к самому верху экрана, но чтобы было по центру экрана ?

Haz: куда ж проще то Form_1.Row := 50 не работает ?

Andrey: Haz пишет: Form_1.Row := 50 не работает ? Блин, не сообразил.. Спасибо ! Иногда на простой вопрос ищешь чер знает что...

Andrey: А как получить список всех ярлыков на рабочем столе компа. В примерах есть только как создавать ярлыки, а как получить список не нашел.... Может и плохо искал. Хочу прогу написать по чисте от мусора. Достали юзера...

AlexMyr: Andrey пишет: А как получить список всех ярлыков на рабочем столе компа. В примерах есть только как создавать ярлыки, а как получить список не нашел.... Наверное надо прочитать список файлов в папке "рабочий стол" конкретного юзера, а дальше с массивом файлов делай что хочешь.

Andrey: AlexMyr пишет: Наверное надо прочитать список файлов в папке "рабочий стол" конкретного юзера А как ? aFiles := DIRECTORY( ) И еще ведь есть ОБЩИЕ ярлыки ?

AlexMyr: Andrey пишет: А как ? aFiles := DIRECTORY( ) Уже проходили материал, смотри http://clipper.borda.ru/?1-4-0-00000621-000-60-0 Andrey пишет: И еще ведь есть ОБЩИЕ ярлыки ? прописать в проге общие и пропускать их.

Andrey: Да у в примерах по МиниГуи есть создание ярлыков по разному и через WSH_Service и так. А как правильно читать папку ярлыков не знаю ? Достаточно ли использовать: #define CSIDL_DESKTOPDIRECTORY 0x0010 // <user name>\Desktop aFiles := DIRECTORY( C_getspecialfolder(CSIDL_DESKTOPDIRECTORY)+"\*.lnk" )

Dima: Andrey Ерундой занимаешься Да сдались тебе ярлыки юзеров , ярлыки ихние и пущай сами что хотят с ними то и творят. А то косяк в твоей проге и бац , юзера без ярлыков могут оказаться ;)

AlexMyr: Andrey пишет: А как правильно читать папку ярлыков не знаю ? Чем ярлык отличается от других фалов?

AlexMyr: Dima пишет: Andrey Ерундой занимаешься Да сдались тебе ярлыки юзеров , ярлыки ихние и пущай сами что хотят с ними то и творят. Еще опцию в винде можно включить, чтоб сама винда убирала не используемые ярлыки.

Dima: AlexMyr пишет: Еще опцию в винде можно включить, чтоб сама винда убирала не используемые ярлыки. +1

Andrey: Dima пишет: юзера без ярлыков могут оказаться ;) Да я хочу удалить ярлыки от своих старых программ. А то достали юзера, видите ли программа не работает. А рядом ярлык рабочей программы не видят. Вот и чтобы по компам не ходить хочу прогу сделать и удалить лишний мусор ! Попробуй по этажам побегай по компам, удалять ярлыки...

Andrey: AlexMyr пишет: Чем ярлык отличается от других фалов? Вот я и уточняю здесь на форуме. Прав я ил не прав...

Dima: Andrey При чем тут Минигуи я только не пойму ;)

Andrey: Dima пишет: При чем тут Минигуи Просто у Григория очень большая коллекция примеров, вот я оттуда и беру. Там есть классный пример \SAMPLES\Advanced\WSH_Service по созданию ярлыков, без всяких #define CSIDL_DESKTOPDIRECTORY 0x0010 // <user name>\Desktop Вот я и пытаюсь понять, как правильней делать !

petr707: Ярлык на рабочем столе - это просто файл Чтобы удалить ярлыки, нужно всего три вещи: 1) знать место размещения - рабочий стол юзера или общий 2) знать имя ярлыка или уметь определять по имени ,что он свой 3) иметь права на удаление файла ярлыка При старте Ваша же текущая софтина может в раз день шарить по предполагаемым местам размещения этих файлов, и будет пытаться удалить все то, что посчитает своим и старым. Доступен будет рабочий стол юзера, выполнившего вход на том компе и общий - если юзер -имеет права админа того компа

Andrey: petr707 Да понятно это. Я спрашивал про доступ к ярлыкам. Посмотрите пример \SAMPLES\Advanced\WSH_Service и все станет ясно. Я пытался так же сделать чтение ярлыков.

petr707: Если Ваши ярлыки - не общие, а юзеровские - проблем с удалением - не будет. Создавались они - инсталлятором или Вашей прогой? Или юзерами произвольно - в тех, местах где получится? Повышение привилегий до админа - при установке ярлыков было?

Andrey: Сделал удаление ярлыков, вроде работает. Тестил на нескольких машинах. Другой вопрос, явно про Минигуи: Можно ли сделать компонент TEXTBOX прозрачным на форме ? LABEL делается. Может пример какой нибудь есть ?

gfilatov2002: Andrey пишет: Может пример какой нибудь есть ? Посмотри как это сделано для LISTBOX в примере demo1 из папки samples\Advanced\Transparency Возможно, такой подход поможет и для TEXTBOX

yury2003: MiniGUI 2.2.9 у меня не собираются три примера: ...\Samples\Basic\Folder Error: unresolved external '_HB_FUN_GETFOLDERHANDLE' referenced from \MINIGUI\SAMPLES\BASIC\FOLDER\DEMO.OBJ ...\Samples\Applications\Reservation Error: unresolved external '_HB_FUN_GETTITLEHEIGHT' referenced from \MINIGUI\SAMPLES\Applications\Reservation\PRESA.OBJ ...\Samples\Applications\Super Error: unresolved external '_HB_FUN_GETDESKTOPWIDTH' referenced from \MINIGUI\SAMPLES\Applications\Super\FUNCOES.OBJ Error: unresolved external '_HB_FUN_GETDESKTOPHEIGHT' referenced from \MINIGUI\SAMPLES\Applications\Super\FUNCOES.OBJ ОС WIN7 компилятор BCC

gfilatov2002: yury2003 Благодарю за сообщение! Эти ошибки будут исправлены в следующей сборке. А сейчас это можно поправить следующим образом: - в пример Folder добавить функцию GETFOLDERHANDLE() из исходника source\h_folder.prg - в примере Reservation убрать ненужный параметр при вызове функции GETTITLEHEIGHT() - в пример Super добавить в начале файла FUNCOES.PRG строку #include "minigui.ch"

Andrey: Собираю програмку, добавляю свои иконки. А после сборки наблюдаю иконки, которые не вставлял !!! Кто добавил их ? Откуда они добавляются ? Я в файле своего проекта *.rc их не добавляю !!! Они не мешали бы, только при установке ярлыка ВМЕСТО своей иконки СТАВИТЬСЯ принтер !!! Достал этот принтер ! Как можно отключить эту фигню ???

Dima: Возможно твой RC цепляет еще какой то RC где они объявлены.

SergKis: Andrey Верхняя и нижняя - это miniGui в statusbar индикация состояния клавиш CapsLock, Insert, ... другие, думаю тоже.

Andrey: А как их убрать ? Т.е. как указать у себя в проекте сборку lib без этих иконок ? Я же не прописываю сборку этих иконок у себя в проекте ! Иконка принтера: \MiniGUI\RESOURCES\print.ico - как убрать из своего проекта ? Это иконка скорее всего из библиотеки hbprinter.lib Я её не использую. Как мне указать в моем МойПроект.hbp - не линковать эту библиотеку ? Удаление иконки принтера Resource Hacker из готового ехе-ника результата не дало. Ярлык получается со стандартной иконкой ВИНДОВ, хотя на программе иконка правильная - моя !

Andrey: Взял код из примера MiniGUI\SAMPLES\Applications\Daily\set3.prg //-------------------------------------------------------------\\ FUNCTION CreateLink( LinkName, TargPath, HKey, IconLoc, Descr ) LOCAL NShortcut LOCAL WshShell := TOleAuto():New( "WScript.Shell" ) IF Ole2TxtError() != 'S_OK' RETURN .F. ENDIF NShortcut := WshShell:CreateShortcut( LinkName ) //Set shortcut placement NShortcut:TargetPath := TargPath //Set standard style of window NShortcut:WindowStyle := 1 //Set hotkey NShortcut:Hotkey := HKey //Path to icon NShortcut:IconLocation := IconLoc + ", 0" //Set tooltip NShortcut:Description := Descr //Set path to application as working directory NShortcut:WorkingDirectory := GetStartupFolder() // это я здесь сам заменил. //Save settings and shortcut NShortcut:Save() RETURN .T. Создаю ярлыки: cNameApp := "Моя_программа" cPathStUp := GetSpecialFolder( CSIDL_STARTUP ) cFileExe := EXENAME() cFileLink := cPathStUp + '\' + cNameApp + '.lnk' IF M->lPubAutoStart // автозапуск программы CreateLink( cFileLink, cFileExe, '', cFileExe, 'Events control' ) ELSE FErase( cFileLink ) ENDIF cPathDeskTop := GetDesktopFolder() cFileLink := cPathDeskTop + '\' + cNameApp + '.lnk' IF !FILE(cFileLink) // рабочий стол CreateLink( cFileLink, cFileExe, '', cFileExe, 'Events control' ) ENDIF Так вот вопрос, в одной программе ярлыки создает/удаляет нормально, а в другой нет ! Я уже полдня бьюсь с этим... Вторая программа сидит в трее, при записи настроек пытаюсь создать ярлыки - ни один не создается ! Хотя откуда брал, там тоже программа в трее сидит... В чем дело ? Может кто посмотрит, свежим взглядом ? Подключил создание ярлыка из \MiniGUI\SAMPLES\Applications\LINK_EXECUTOR\LinkExecutor.prg - работает всегда ! Правда удалить эти ярлыки из программы не могу уже... Что не сделаешь - везде "засада"...

Andrey: Всем привет. Подскажите как правильно перерисовать объекты на ФОРМЕ ? Я рисую объекты: потом удаляю ОДИН файл (крестиком) и удаляю в цикле ВСЕ нарисованные объекты. Потом пытаюсь заново нарисовать эти объекты и получаю облом ... нет новых объектов... И остается "мусор" после LABEL и BUTTONEX : Что не правильно делаю ? //////////////////////////////////////////////////////////////////////////// // рисуем иконки прикрепленных файлов FUNCTION ViewPngFile() ............. FOR nI := 1 TO LEN(aDim) .......................... cObj := "Img_File"+LTRIM(STR(nI)) cImage := MaskaTypeFile(cFile ) @ nRow, nColTek IMAGE &cObj OF Form_1 PICTURE cImage WIDTH 131 HEIGHT 59 cObj2 := "Label_File"+LTRIM(STR(nI)) @ nRow+40, nColTek+5 LABEL &cObj2 VALUE cFile WIDTH 131-10 HEIGHT 16 ; FONT 'Tahoma' SIZE 9 ; TRANSPARENT FONTCOLOR aFontColor CENTERALIGN OF Form_1 cObj2 := "Label_Size"+LTRIM(STR(nI)) @ nRow+20, nColTek+25 LABEL &cObj2 VALUE cFSize WIDTH 131-15 HEIGHT 16 ; FONT 'Tahoma' SIZE 9 BOLD ; TRANSPARENT FONTCOLOR GRAY CENTERALIGN OF Form_1 cObj3 := "Button_Del"+LTRIM(STR(nI)) cRun := "File_Delete("+LTRIM(STR(nI))+")" // Удаляем прикрепленный файл @ nRow, nColTek+131-16 BUTTONEX &cObj3 OF Form_1 ; WIDTH 16 HEIGHT 16 ; ACTION &cRun ICON "iDel16" NEXT RETURN NIL ///////////////////////////////////////////////////////////////////////////// // Удаляем прикрепленный файл FUNCTION File_Delete(nDel) LOCAL cObj, cObj2, cObj2a, cObj3 LOCAL aDim := ACLONE(M->aGet[7]), cFilePath, cRun M->aGet[7] := {} FOR nI := 1 TO LEN(aDim) IF nI # nDel AADD(M->aGet[7],aDim[nI]) ENDIF cObj := "Img_File"+LTRIM(STR(nI)) cObj2 := "Label_File"+LTRIM(STR(nI)) cObj2a := "Label_Size"+LTRIM(STR(nI)) cObj3 := "Button_Del"+LTRIM(STR(nI)) RELEASE CONTROL &cObj3 OF Form_1 RELEASE CONTROL &cObj2a OF Form_1 RELEASE CONTROL &cObj2 OF Form_1 RELEASE CONTROL &cObj OF Form_1 NEXT DO EVENTS ViewPngFile() // перерисуем иконки файлов RETURN NIL

Andrey: После подсказки Григория - добился нормальной работы. Нужно не удалять объект, а просто его скрывать. Если не хватает объекта, то добавляем объект и показываем. Мусора нет, все прекрасно работает. Кому интересно могу выложить код. Все короче просто, если знаешь куда копать...

Dima: Andrey пишет: Все короче просто, если знаешь куда копать... Да это так.

Andrey: Можно ли средствами МиниГуи получить иконку, bmp зарегистрированного файла в системе ? Допустим *.doc файла Я просто хочу эти иконки использовать у себя в программе. Куда копать ?

Andrey: Нашел исходник на С, как перевести для Харбора не знаю... http://www.rsdn.ru/forum/com/2978877.flat

Andrey: Хочу сделать листинг директории с показом иконок ассоциированными с данными типами файлов. И затык... Может пример уже готовый есть, а я велосипед изобретаю.... Или на FiveWin примеры есть ? Подскажите пожалуйста.

Andrey: Да Григорий, один твой пример и чувствуешь себя Незнайкой на Луне. Сидишь тут иконки выдираешь, время убиваешь на это, а то что этим вообще не нужно заниматься - даже и не знаешь. Надеюсь пример работы с иконками появится в примерах ? Как сделать виртуальную форму со скролинком ? Есть ли такие примеры ? Т.е. если на форме не помещаются все иконки, то чтобы по скролингу вниз - можно было просмотреть форму дальше ?

Haz: Andrey пишет: Как сделать виртуальную форму со скролинком Андрей глянь сюда \MiniGUI\SAMPLES\BASIC\CONTAINERS\Panel_2

Andrey: Спасибо - сделал. Только вот получилось не совсем то, иконки появляются, а как скролтнгом подергаешь, иконки все пропадают... DEFINE WINDOW Form_1 ; AT 0 , 0 WIDTH nDesktopWidth HEIGHT nDesktopHeight ; VIRTUAL WIDTH nDesktopWidth*2 VIRTUAL HEIGHT nDesktopHeight*2 ; TITLE "Icon from shell32.dll" ; MAIN ; ON INIT MyDrawIcons() ; ON RELEASE DestroyIcon( hIcon ) ; ON INTERACTIVECLOSE Nil ; ON MOUSECLICK Nil ON MOUSEDRAG Nil ON MOUSEMOVE Nil ; ON SIZE Nil ON MAXIMIZE Nil ON MINIMIZE Nil ON PAINT Nil ; BACKCOLOR Nil NOTIFYICON NIL NOTIFYTOOLTIP NIL ON NOTIFYCLICK Nil ; ON GOTFOCUS Nil ON LOSTFOCUS Nil ON SCROLLUP Nil ; ON SCROLLDOWN Nil ON SCROLLLEFT Nil ON SCROLLRIGHT Nil ; ON HSCROLLBOX Nil ON VSCROLLBOX Nil Хотя объект LABEL сохраняется нормально. Видно как то нужно ставить обработку... А как не знаю ?

Haz: ради эксперимента c PANEL . может на ON SCROLL..... MyDrawIcons() повесить ? или дай своему MAIN окну виртуальные размеры сразу и не мучайся )) VIRTUALWIDTH xxx VIRTUALHEIGHT yyy в синтаксис DEFINE WINDOW подсмотри

Andrey: Оказывается все просто. Обращаешься к ГУРУ и ответ простой: Иконки пропадают, поскольку в функции DrawIcon() идет прямая запись на экран. Что я тоже потом обнаружил. Запуск формы: Форма после восстановления с панели: Эх опять недоработка в МиниГуи.... Рано я радовался... Остается только одно, иконку преобразовывать в bmp и показывать. Но опять другое вылазит: bmp-ка не прозрачная.... Цвета подбирать нужно под bmp. Некрасиво получается...

gfilatov2002: Haz пишет: дай своему MAIN окну виртуальные размеры Рабочий пример ниже [pre]#include "minigui.ch" Procedure MAIN LOCAL nDesktopWidth := GetDesktopWidth() LOCAL nDesktopHeight := GetDesktopHeight() - GetTaskBarHeight() SET MULTIPLE OFF WARNING SET FONT TO "Tahoma", 9 DEFINE WINDOW Form_1 ; VIRTUAL WIDTH nDesktopWidth+10 VIRTUAL HEIGHT nDesktopHeight*1.5 ; TITLE "Icons from shell32.dll" ; MAIN ; ON INIT MyDrawIcons() END WINDOW Form_1.Sizable := .F. // NOSIZE Form_1.MinButton := .F. // NOMINIMIZE Form_1.MaxButton := .F. // NOMAXIMIZE Form_1.Activate Return ///////////////////////////////////////////////////////////////////////////////// Function MyDrawIcons() LOCAL nJ := 0, nI, cStr, cObj, nRow := 10, nCol LOCAL nWidth := Form_1.Width LOCAL nHeight := Form_1.Height LOCAL cIcon := System.SystemFolder + "\shell32.dll" LOCAL count := ExtractIcon( cIcon, -1, 0, 0, 0 ) FOR nI := 0 TO count nJ++ nCol := 10 + 70*(nJ-1) IF nCol > nWidth - 80 nRow += 70 nJ := 1 nCol := 10 ENDIF cObj := "Btn_"+LTRIM(STR(nI)) @ nRow, nCol BUTTON &cObj ; OF Form_1 ; WIDTH 38 HEIGHT 38 ; ICON cIcon ; EXTRACT nI FLAT cObj := "Lbl_"+LTRIM(STR(nI)) cStr := "nI="+LTRIM(STR(nI)) @ nRow + 40, nCol LABEL &cObj ; OF Form_1 VALUE cStr ; WIDTH 60 HEIGHT 12 ; TRANSPARENT FONTCOLOR BLUE NEXT Return NIL [/pre]

Haz: Вопрос по классу TComboBox из TBrowse, мож кто знает ??? Возможно ли применение DISPLAYEDIT к данному классу. Нужно не сколько само редактирование, сколько возможность поиска в комбо по первым введенным буквам, без этого поиск отрабатывает только первую букву Пробовал тупо выставить переменную displaychange := .T. в исходнике TComboBox.Prg, появляется и поиск и редактированпие, но пропадает реакция на клавиши выбора ENTER или ESCAPE. Григорий, PS. и еще маленький фикс кода для этогокласса Когда в колонке с числовым ID используя :SetData отображаю символьные строки из справочного массива, то при редактировании ComboBox растягивается до самой длинной строки из массива. Это происходит из-за кода в h_tbrowse.prg строка 3782: If oCol:cDataType != Nil .and. oCol:cDataType == "N" колонка типа "N" - т.к. там ID, но отображаю в ней строку из массива, соответствующую этому ID предлагаю в коде заменить на If ValType( Eval( oCol:bData ) ) == "N" , тогда при числовых значенияч все остается как есть, а при строковых будет определяться через :SetColSize

gfilatov2002: Haz пишет: предлагаю в коде заменить на If ValType( Eval( oCol:bData ) ) == "N" Спасибо, поправил для следующей сборки.

Andrey: Хотел из объекта LABEL сделать самостоятельно СВОЮ кнопку. типа такого: @ nRow, nColTek LABEL &cObj OF Form_1 VALUE "" ; WIDTH 131 HEIGHT 60 BACKCOLOR aBackColor ; // borders DRAW LINE IN WINDOW Form_1 At nRow,nColTek to nRow+60,nColTek PENCOLOR {64,64,64} PENWIDTH 1 DRAW LINE IN WINDOW Form_1 At nRow,nColTek to nRow,nColTek+131 PENCOLOR {64,64,64} PENWIDTH 1 DRAW LINE IN WINDOW Form_1 At nRow,nColTek+131 to nRow+60,nColTek+131 PENCOLOR {64,64,64} PENWIDTH 1 DRAW LINE IN WINDOW Form_1 At nRow+60,nColTek-1 to nRow+60,nColTek+131 PENCOLOR {64,64,64} PENWIDTH 1 А окантовка кнопки по LABEL командой DRAW LINE не происходит ! Почему ? Если сделать DRAW LINE ... At nRow-1, то есть вокруг LABEL, то окантовку видно. Но если объект LABEL скрыть, то тогда остается окантовка без кнопки. Как тогда убрать окантовку с сохранением фона под окантовкой ?

SergKis: Andrey А свойств BORDER и CLIENTEDGE в LABEL разве не достаточно для обводки (чтобы не усложнять жизнь) ?

Andrey: SergKis пишет: А свойств BORDER и CLIENTEDGE в LABEL разве не достаточно для обводки (чтобы не усложнять жизнь) ? Вот-вот... Сам делал и забыл... Посмотрел на кнопку и решил сделать, а подумать то забыл, или праздники утомили... Спасибо большое за возврат к действительности ! С этим разобрался. А на будущее: как удалить нарисованную линию ?

SergKis: Andrey пишет:А на будущее: как удалить нарисованную линию ? Перерисовать окно (все контролы, включая обои)

Andrey: SergKis пишет: Перерисовать окно (все контролы, включая обои) Да уж... Интересно, а в других библиотеках как это делается ?

SergKis: Andrey пишет:Да уж... а сложность в чем ? FormName.ControlName.Refresh по списку сделать.

Andrey: Приветствую gfilatov2002 ! В примере demo2.prg ("Select file & Icon associated with the file type - 1.0") обнаружил одну фигню ! Если добавлять файлы по 2 и более, то не всегда красиво получается отображение кнопок... Что то связанное с прорисовкой. Как побороть не знаю. По одному файлу добавляет нормально !

gfilatov2002: Andrey пишет: Что то связанное с прорисовкой. Как побороть не знаю. Попробуй переставить команду DO EVENTS в функции File_Delete() ниже [pre2]... IF nDel == 0 // delete all files - reset array M->aDimFile := {} ELSE ViewIconFile() // show icons attachments ENDIF DO EVENTS ... [/pre2]

Andrey: gfilatov2002 пишет: Попробуй переставить команду DO EVENTS в функции File_Delete() ниже Не помогло...

gfilatov2002: Andrey пишет: Не помогло Тогда попробуй добавить команду DO EVENTS в цикл в функции ViewIconFile() [pre2]... cImage := MaskaTypeFile(cFilePath, cObjIco ) // иконка типа файла SetProperty( 'Form_1', cObjIco, "Visible" , .T. ) DO EVENTS NEXT RETURN NIL[/pre2]

Andrey: gfilatov2002 пишет: Тогда попробуй добавить команду DO EVENTS в цикл в функции ViewIconFile() Не работает...

Andrey: Григорий, вопрос по уже сделанным примерам WAIT_WINDOW_2WIN http://files.mail.ru/6D25619CF1C94F1391599D54C1A65853 Когда начинаешь перемещать красное или желтое окно, то курсор руки пропадает, а курсор сжатой руки не появляется ! Почему ? Что нужно изменить в коде ? В WaitWindow3.prg - есть же процедура изменения курсора: RC_CURSOR( "Grabbed32" )

gfilatov2002: Andrey пишет: RC_CURSOR( "Grabbed32" ) Проверь имя ресурса в файле .RC - там опечатка в первой букве CRABBED32 CURSOR res\Grabbed32x32.cur А должно быть GRABBED32 CURSOR res\Grabbed32x32.cur Теперь ясно

Andrey: gfilatov2002 пишет: Теперь ясно Спасибо большое !

Andrey: Всем привет ! Пример MiniGUI\SAMPLES\Advanced\TrayBalloon показывает всплывающее окно на некоторое время в трее. А можно ли такое же всплывающее окно сделать на объекте LABEL или BUTTON ?

Andrey: Всем привет. Есть ли механизм в МиниГуи, позволяющий входить в меню или нажимать кнопку только ОДИН раз ? Я могу конечно сам сделать проверку входа через PUBLIC переменную. Просто хочется узнать современные решения.

Haz: Andrey пишет: Есть ли механизм в МиниГуи, позволяющий входить в меню или нажимать кнопку только ОДИН раз ? встроенного штатного механизма нет, но ничто не мешает на ACTION повесить что то типа this.enabled := .F. ( варианты самого this. зависят от синтаксиса контрола )

Andrey: Haz пишет: но ничто не мешает на ACTION повесить что то типа this.enabled := .F. ( варианты самого this. зависят от синтаксиса контрола ) А поподробнее пожалуйста можно расписать ?

Haz: Andrey пишет: А поподробнее на примере меню: Define MAin menu of form_0 popup 'menu1' menuitem 'элемент 1' action {|| action_1() } name M1 end popup End menu Func Action_1() Form_0.M1.ENABLED := .F. // после первого вызова этот элемент меню будет запрещен ... тут код который нужен Return nil PS. по Button - примерно так же

Andrey: Haz пишет: примерно так Спасибо БОЛЬШОЕ !

Andrey: Можно ли как то использовать смайлики в программе на МиниГуи ? Есть ли примеры ?

Dima: Andrey пишет: Можно ли как то использовать смайлики Смайлик это BMP вероятно или ICO иль GIF , значит можно. Во всяком случае их можно преобразовать к нужному формату. Пример http://forum24.ru/gif/smk/sm31.gif

Andrey: Dima пишет: Смайлик это BMP вероятно или ICO иль GIF , значит можно. Нет, мне нужны правильные смайлики - И желательно с просмотром каталога: Может готовые библиотеки смайликов есть ?

Dima: Andrey пишет: Может готовые библиотеки смайликов есть ? Новый вариант ICQ создаешь ?

Andrey: Всем привет. Имеется картинка на форме. @ 50,20 IMAGE Image_1 PICTURE .... Можно ли сделать так, чтобы при попадании мышки на картинку, курсор бы менялся на "палец тык" ? Как в HYPERLINK - параметр HANDCURSOR .T. Есть ли в примерах такое уже ? Сделал на IMAGE Image_1 обработку: ON MOUSEHOVER SelectImage( ThisWindow.Name, This.Name ) А в функции описал: FUNCTION SelectImage( cForm, cCtrl ) CursorHand() RETURN Nil Еще что-нибудь нужно ?

gfilatov2002: Andrey пишет: Сделал на IMAGE Image_1 обработку: ON MOUSEHOVER SelectImage( ThisWindow.Name, This.Name ) Все верно, но можно проще: ON MOUSEHOVER CursorHand()

Andrey: gfilatov2002 пишет: Все верно, но можно проще: Спасибо !

Andrey: gfilatov2002 пишет: Подтверждаю. Мой тестовый пример см. ниже Из темы http://clipper.borda.ru/?1-4-0-00000851-000-0-1-1396268068 В этом примере можно расширить окно мышкой. А как сделать динамическое растаскивание/сжатие BROWSE вместе с окном ?

gfilatov2002: Andrey пишет: как сделать динамическое растаскивание/сжатие BROWSE вместе с окном ? Для этого надо использовать два события: ON SIZE и ON MAXIMIZE, в которых прописать изменение размеров элементов управления вместе с изменением размеров формы. Очень наглядный пример использования есть в исходниках утилиты MPM (см. в папке Utils\MPM). Для ленивых существует глобальная команда SET AUTOADJUST ON [ NOBUTTONS ], которая действует для всех окон, но она не всегда работает так, как может потребоваться, из-за своей универсальности

Andrey: gfilatov2002 пишет: Для этого надо использовать два события .... Спасибо БОЛЬШОЕ !!! Теперь знаю где копать...

Andrey: Всем привет. Подскажите пожалуйста как можно получить bmp-ки 16х16 из ExtractIcon( System.SystemFolder + "\shell32.dll"....) Пример :\MiniGUI\SAMPLES\BASIC\ExtractIcon\demo2.prg А то надоело иконки держать в ресурсах... Хочу из системы брать.

gfilatov2002: Andrey пишет: Подскажите пожалуйста как можно получить bmp-ки 16х16 Для этого надо использовать расширенную функцию ExtractIconEx() вместо простой функции ExtractIcon() Рабочий пример использования demo.prg см. ниже [pre]#include <minigui.ch> Procedure MAIN local aIcons := ExtractIconEx( GetStartUpFolder() + "\demo.exe", 0, 0, 0, 1 ) priv hIcon := aIcons[2] SET FONT TO "Ms Sans Serif", 8 DEFINE WINDOW Main ; AT 0,0 WIDTH 120 HEIGHT 119 ; TITLE "Information" ; MAIN ; ON PAINT fgDraw() ; ON RELEASE DestroyIcon( hIcon ) DEFINE LABEL hello ROW 43 - GetTitleHeight() - GetBorderHeight() COL 62 VALUE 'Hello' AUTOSIZE .T. END LABEL DEFINE BUTTON ok ROW 83 - GetTitleHeight() - GetBorderHeight() COL 12 WIDTH 90 HEIGHT 21 CAPTION 'OK' ACTION ThisWindow.Release DEFAULT .T. END BUTTON END WINDOW Main.Sizable := .F. // NOSIZE Main.MinButton := .F. // NOMINIMIZE Main.MaxButton := .F. // NOMAXIMIZE Main.Center Main.Activate Return Function fgDraw() Drawicon( Application.Handle, 12, 12, hIcon ) Return NIL #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" #define SMALL_ICON 16 HB_FUNC( DRAWICON ) { HWND hwnd = (HWND) hb_parnl( 1 ); HDC hdc; hdc = GetDC( hwnd ); hb_retl( DrawIconEx( (HDC) hdc, hb_parni( 2 ), hb_parni( 3 ), (HICON) hb_parnl( 4 ), SMALL_ICON, SMALL_ICON, 0, 0, DI_NORMAL ) ); ReleaseDC( hwnd, hdc ); } HB_FUNC( DESTROYICON ) { DestroyIcon( (HICON) hb_parnl( 1 ) ); } HB_FUNC ( EXTRACTICONEX ) { HICON iLarge; HICON iSmall; UINT nIcons=hb_parni(5); ExtractIconEx( (LPCSTR) hb_parc( 1 ), hb_parni( 2 ) , &iLarge , &iSmall , nIcons ); hb_reta( 2 ); hb_storvnl( ( LONG ) iLarge, -1, 1 ); hb_storvnl( ( LONG ) iSmall, -1, 2 ); } #pragma ENDDUMP[/pre]

Andrey: gfilatov2002 пишет: Рабочий пример использования demo.prg см. ниже Спасибо БОЛЬШОЕ !!! Только лучше объявление сделать так: local aIcons := ExtractIconEx( GetExeFileName(), 0, 0, 0, 1 ) А то пока понял, почему не работает....

Andrey: Можно ли в объекте GRID использовать иконки ? Пример \MiniGUI\SAMPLES\BASIC\Grid_6 работает с bmp. А как его переделать на иконки ? И допускает ли GRID использование картинок не с первой позиции, а в середине таблицы ?

gfilatov2002: Andrey пишет: Можно ли в объекте GRID использовать иконки ? Нет Andrey пишет: допускает ли GRID использование картинок не с первой позиции, а в середине таблицы ? Нет, только в первой позиции и только в формате bitmap. Если нужно снять это ограничение, то необходимо использовать TsBrowse в режиме Grid

Andrey: gfilatov2002 пишет: Если нужно снять это ограничение, то необходимо использовать TsBrowse в режиме Grid Спасибо !

Andrey: Очень хочется иметь в МиниГуи простую функцию вывода иконки на форму !!! Типа: DrawIconEx( _HMG_MainHandle, nCol, nRow, "РесурсныйФайлИконки", SMALL_ICON ) А то есть функции, а форму свернешь и нет иконок - пример тут: #include "minigui.ch" Procedure MAIN LOCAL cText, cIcon := System.SystemFolder + "\user32.dll" PRIVAT hIcon cText := 'hIcon := ExtractIcon( '+System.SystemFolder + "\user32.dll" + ', nI )' cText += CRLF + 'DrawIcon( Application.Handle, nCol, nRow, hIcon )' SET FONT TO "Tahoma", 9 DEFINE WINDOW Form_1 ; AT 0,0 WIDTH 700 - GetBorderWidth() HEIGHT 300 - GetBorderHeight() ; TITLE "Icons from user32.dll" ; MAIN ; ON INIT fgDraw() ; BACKCOLOR { 40,122,237} ; ON RELEASE DestroyIcon( hIcon ) @ 10, 10 LABEL Label_Info VALUE cText WIDTH Form_1.Width-20 HEIGHT 42 ; TRANSPARENT FONTCOLOR BLACK SIZE 12 CENTERALIGN @ Form_1.Height-90, Form_1.Width-100 BUTTON Button_Exit ; WIDTH 80 HEIGHT 50 ; ICON cIcon ; EXTRACT 3 ; TOOLTIP 'Exit the program' ; ACTION ThisWindow.Release() END WINDOW Form_1.Sizable := .F. // NOSIZE Form_1.MinButton := .F. // NOMINIMIZE Form_1.MaxButton := .F. // NOMAXIMIZE Form_1.Center Form_1.Activate Return ///////////////////////////////////////////////////////////////////////////////// Function fgDraw() LOCAL nI, cStr1, cStr2, cObj1, cObj2 LOCAL nRow := 70, nCol FOR nI := 1 TO 17 nCol := 20 + 90*(nI-1) hIcon := ExtractIcon( System.SystemFolder + "\user32.dll", nI ) Drawicon( Application.Handle, nCol, nRow, hIcon ) cObj1 := "Lbl1_a"+LTRIM(STR(nI)) cStr1 := "nI="+LTRIM(STR(nI)) @ nRow+40, nCol LABEL &cObj1 OF Form_1 VALUE cStr1 ; WIDTH 100 HEIGHT 12 TRANSPARENT FONTCOLOR BLUE cObj2 := "Lbl2_a"+LTRIM(STR(nI)) cStr2 := "hIcon="+ CRLF + LTRIM(STR(hIcon)) @ nRow+55, nCol LABEL &cObj2 OF Form_1 VALUE cStr2 ; WIDTH 120 HEIGHT 28 TRANSPARENT FONTCOLOR RED IF hIcon == 0 // if no icon EXIT ENDIF NEXT Return NIL ///////////////////////////////////////////////////////////////////////////////// #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" #define SMALL_ICON 16 /* убрал, т.к. не работает, чистится после проведения за границы экрана.... HB_FUNC( DRAWICON ) { HWND hwnd = (HWND) hb_parnl( 1 ); HDC hdc; hdc = GetDC( hwnd ); hb_retl( DrawIcon( (HDC) hdc, hb_parni( 2 ), hb_parni( 3 ), (HICON) hb_parnl( 4 ) ) ); ReleaseDC( hwnd, hdc ); } */ HB_FUNC( DRAWICON ) { HWND hwnd = (HWND) hb_parnl( 1 ); HDC hdc; hdc = GetDC( hwnd ); hb_retl( DrawIconEx( (HDC) hdc, hb_parni( 2 ), hb_parni( 3 ), (HICON) hb_parnl( 4 ), SMALL_ICON, SMALL_ICON, 0, 0, DI_NORMAL ) ); ReleaseDC( hwnd, hdc ); } HB_FUNC( DESTROYICON ) { DestroyIcon( (HICON) hb_parnl( 1 ) ); } #pragma ENDDUMP Может я что-то не понимаю с выводом иконок на форму ... Объясните пожалуйста как быть ? Иконки использую из-за того, что они НОРМАЛЬНО ложаться на форму с любым фоном. Т.е. если иконка круглая, то вокруг будет цвет фона, как и положенно. В случае использования PNG теряется качество картинки, т.к. приходиться делать для картинки BACKGROUNDCOLOR aBackgroundColor - и качество теряется, по краям получается черная окантовка....

gfilatov2002: Andrey пишет: Объясните пожалуйста как быть ? Надо заменить событие ON INIT на ON PAINT при определении формы. Рабочий пример см. ниже [pre2]#include "minigui.ch" Procedure MAIN LOCAL cText, cIcon := System.SystemFolder + "\user32.dll" PRIVAT aIcon := {} cText := 'hIcon := ExtractIcon( '+System.SystemFolder + "\user32.dll" + ', nI )' cText += CRLF + 'DrawIcon( Application.Handle, nCol, nRow, hIcon )' SET FONT TO "Tahoma", 9 DEFINE WINDOW Form_1 ; AT 0,0 WIDTH 700 - GetBorderWidth() HEIGHT 300 - GetBorderHeight() ; TITLE "Icons from user32.dll" ; MAIN ; ;//ON INIT fgDraw() ; ON PAINT fgDraw() ; BACKCOLOR { 40,122,237} ; ON RELEASE aEval(aIcon, {|hIcon| DestroyIcon( hIcon ) }) @ 10, 10 LABEL Label_Info VALUE cText WIDTH Form_1.Width-20 HEIGHT 42 ; TRANSPARENT FONTCOLOR BLACK SIZE 12 CENTERALIGN @ Form_1.Height-90, Form_1.Width-100 BUTTON Button_Exit ; WIDTH 80 HEIGHT 50 ; ICON cIcon ; EXTRACT 3 ; TOOLTIP 'Exit the program' ; ACTION ThisWindow.Release() END WINDOW Form_1.Sizable := .F. // NOSIZE Form_1.MinButton := .F. // NOMINIMIZE Form_1.MaxButton := .F. // NOMAXIMIZE Form_1.Center Form_1.Activate Return ///////////////////////////////////////////////////////////////////////////////// Function fgDraw() LOCAL nI, cStr1, cStr2, cObj1, cObj2 LOCAL nRow := 70, nCol FOR nI := 0 TO 6 nCol := 20 + 90*nI hIcon := ExtractIcon( System.SystemFolder + "\user32.dll", nI ) aAdd(aIcon, hIcon) Drawicon( Application.Handle, nCol, nRow, hIcon ) cObj1 := "Lbl1_a"+LTRIM(STR(nI)) cStr1 := "nI="+LTRIM(STR(nI)) if !_IsControlDefined(cObj1, 'Form_1') @ nRow+40, nCol LABEL &cObj1 OF Form_1 VALUE cStr1 ; WIDTH 100 HEIGHT 12 TRANSPARENT FONTCOLOR BLUE endif cObj2 := "Lbl2_a"+LTRIM(STR(nI)) cStr2 := "hIcon="+ CRLF + LTRIM(STR(hIcon)) if !_IsControlDefined(cObj2, 'Form_1') @ nRow+55, nCol LABEL &cObj2 OF Form_1 VALUE cStr2 ; WIDTH 120 HEIGHT 28 TRANSPARENT FONTCOLOR RED endif IF hIcon == 0 // if no icon EXIT ENDIF NEXT Return NIL ///////////////////////////////////////////////////////////////////////////////// #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" #define SMALL_ICON 16 HB_FUNC( DRAWICON ) { HWND hwnd = (HWND) hb_parnl( 1 ); HDC hdc; hdc = GetDC( hwnd ); hb_retl( DrawIconEx( (HDC) hdc, hb_parni( 2 ), hb_parni( 3 ), (HICON) hb_parnl( 4 ), SMALL_ICON, SMALL_ICON, 0, 0, DI_NORMAL ) ); ReleaseDC( hwnd, hdc ); } HB_FUNC( DESTROYICON ) { DestroyIcon( (HICON) hb_parnl( 1 ) ); } #pragma ENDDUMP [/pre2]

Andrey: 1) А как сделать переключатель для иконок 16х16, 32х32 и т.д. ? 2) А почему фон у букв не совпадает с фоном формы (я же указываю TRANSPARENT ) ? 3) Удалять иконки - aEval(aIcon, {|hIcon| DestroyIcon( hIcon ) }) после закрытия программы ОБЯЗАТЕЛЬНО ?

gfilatov2002: 1) например, использовать две функции EXTRACTICON16() и EXTRACTICON32(), а также соответственно две функции Drawicon16() и Drawicon32() 2) надо просто проверить размеры надписей - они перекрываются в Вашем примере. Можно поправить, например так: cObj1 := "Lbl1_a"+LTRIM(STR(nI)) cStr1 := "nI="+LTRIM(STR(nI)) if !_IsControlDefined(cObj1, 'Form_1') @ nRow+40, nCol LABEL &cObj1 OF Form_1 VALUE cStr1 ; autosize FONTCOLOR BLUE transparent endif cObj2 := "Lbl2_a"+LTRIM(STR(nI)) cStr2 := "hIcon="+ CRLF + LTRIM(STR(hIcon)) if !_IsControlDefined(cObj2, 'Form_1') @ nRow+65, nCol LABEL &cObj2 OF Form_1 VALUE cStr2 ; WIDTH 70 HEIGHT 28 BACKCOLOR { 40,122,237} FONTCOLOR RED endif 3) да, обязательно, для освобождения выделенных графических ресурсов

Andrey: Спасибо БОЛЬШОЕ за ответы ! gfilatov2002 пишет: 1) например, использовать две функции EXTRACTICON16() и EXTRACTICON32(), а также соответственно две функции Drawicon16() и Drawicon32() Вижу в вашей функции #define SMALL_ICON 16 А какое будет описание для иконок 32х32, 48х48, 96х96 ? Можно ли в библиотеку включить функцию типа: DrawIconMy( Application.Handle, nCol, nRow, hIcon, SMALL_ICON ) ? Или включить стандартную: DrawIconEx (hDC, X, Y, hIcon, 0, 0, 0, NULL, DI_NORMAL | DI_COMPAT | DI_DEFAULTSIZE) ? http://netcode.ru/cpp/?lang=&katID=11&skatID=131&artID=4462 Вот пример (заготовка) для показа разных размеров иконок на форме. У меня выходит только ОДИН размер, а нужно разные... И если иконка состоит из нескольких размеров, то ОНА не показывается на форме. http://files.mail.ru/EC2371A863DB46B9975C53B24D645F01 И еще отдельный вопрос: Как иконку из ресурсов (допустим 16х16) записать в bmp-файл ? Видел функции в c_bitmap.c // convert icon to bitmap. hBmp = Icon2Bmp( ( HICON ) hBmp ); А примеры работы - не нашел....

Andrey: В объектах IMAGE и LABEL можно менять ВИД КУРСОРА при наведении мышки на объект: @ 30,20 IMAGE Image_1 PICTURE 'LOGO' WIDTH 70 HEIGHT 70 STRETCH ; ACTION MsgInfo('Label Clicked!') OnMouseHover RC_CURSOR( "MINIGUI_FINGER" ) @ 40, 120 LABEL Label_Inf1 VALUE MiniGUIVersion() ; ON CLICK MsgInfo('Label Clicked!') ; ON MOUSEHOVER Rc_Cursor( "MINIGUI_FINGER" ) А как можно сделать так же с объектом BUTTONEX ? Т.е. хочу при наведении на кнопку изменить курсор, изменить иконку и изменить шрифт подписи иконки. Аналогично как в примере \MiniGUI\SAMPLES\BASIC\ON_MOUSEHOVER\demo.prg Как это сделать ?

Andrey: Разобрался с помощью Григория ! Ему отдельное СПАСИБО ! Вот такой пример теперь есть: Готовый пример - http://files.mail.ru/A0FD1D8B37FD4FD7829EC1139AC33B0D Народ, протестируйте этот пример пожалуйста !

SergKis: Andrey пишет:Народ, протестируйте этот пример пожалуйста ! На Win7 работает нормально, немного нелогичны клавиши, например стрелка вниз с меню 1 идет на меню 2, а просится меню 3 и т.д.

Andrey: SergKis пишет: немного нелогичны клавиши, например стрелка вниз с меню 1 идет на меню 2, а просится меню 3 и т.д. Понял, переделал. На это не обратил внимания с самого начала. Новый ехе-ник - http://files.mail.ru/ADC40020595240EC930A04F7DB90E5E7

SergKis: Andrey Еще, на мой взгляд не надо фокус на кнопки минимизации и выхода (верхние) переключать - основное это кнопки на окне. и при нажатии верхнего выхода - нет запроса, как на основной кнопки "выход"

SergKis: Andrey пишет:Понял, переделал Глянь внимательнее: -стрелки вверх\вниз переключают кнопки одной колонки -стрелки вправо\влево переключают кнопки между колонками одного ряда

Andrey: SergKis пишет: Глянь внимательнее: -стрелки вверх\вниз переключают кнопки одной колонки -стрелки вправо\влево переключают кнопки между колонками одного ряда А это я не знаю как сделать.... Посмотрите сами....

Andrey: SergKis пишет: Глянь внимательнее: -стрелки вверх\вниз переключают кнопки одной колонки -стрелки вправо\влево переключают кнопки между колонками одного ряда Теперь понял что нужно было сделать. Ваши исправления - классные ! http://files.mail.ru/8A9B66C885F8424A8277F9A4450B52FB Использовать у себя это меню в программах будете ?

SergKis: Andrey пишет:Использовать у себя это меню в программах будете ? у нас (~20 лет) в clipper такое 1 окно в задачах (только 2 ряда и 3 колонки и цвета от задачи) если руки дойдут, то да, надо сделать

Andrey: nick_mi пишет: А вы это исправление делали DEFINE IMAGE Image_1 PARENT Win_1 ROW 200 COL 140 WIDTH nWidth HEIGHT nHeight PICTURE aPicture [ i ] STRETCH lStretch TRANSPARENT .T. BACKGROUNDCOLOR win_1.backcolor ADJUSTIMAGE lAdjustImage END IMAGE у меня с этой строкой берет фон основного окна Перенес эту тему сюда, т.к. там писать не дело... Вот самодостаточный пример. http://files.mail.ru/C0CE5FDAA4764A2F802FDBF99A5B80CE Вокруг картинки ЧЕРНАЯ рамка. Это раз - недостаток, а во вторых, если PNG картинку выводить на фон заливки с градиентом, то вообще фигня получается... Как в таком случае быть ?

Andrey: Andrey пишет: Вокруг картинки ЧЕРНАЯ рамка. Григорий, если не решаемый этот вопрос - то фиг с ним, напишите что пока так будет ! Я понимаю, что одному ОЧЕНЬ тяжело тянуть такую разработку. Просто ответ - пока так будет, до следующих решений и все....

gfilatov2002: Andrey пишет: Просто ответ - пока так будет, до следующих решений Именно так Andrey пишет: Вокруг картинки ЧЕРНАЯ рамка. Эту проблему при прорисовке PNG создает режим HALFTONE, задаваемый Си-функцией SetStretchBltMode()

Andrey: Спасибо Григорий ! Будем ждать исправлений...

Andrey: Вот еще вопрос возник. Для окна есть соответствия: NOMAXIMIZE NOSIZE Form_Main.Sizable := .F. // NOSIZE Form_Main.MaxButton := .F. // NOMAXIMIZE Не могу найти соответствий: NOMINIMIZE NOCAPTION ?

SergKis: Andrey пишет:Не могу найти соответствий: NOMINIMIZE NOCAPTION ? глянь MiniGUI.chm раздел DEFINE WINDOW в самом конце: ... WINDOW METHODS: · Show · Hide · Center · Maximize · Minimize · Activate · Restore · Release · SetFocus · SaveAs

gfilatov2002: Andrey пишет: Не могу найти соответствий: NOMINIMIZE NOCAPTION ? Form_Main.MinButton := .F. // NOMINIMIZE Form_Main.TitleBar := .F. // NOCAPTION

Andrey: Спасибо ! Пытаюсь скрестить примеры \MiniGUI\SAMPLES\BASIC\SPLASHDEMO_3 и \MiniGUI\SAMPLES\Advanced\GetPassword Окно пароля выходит, но при случайном переключении мышкой уходит под окно задачи. Как сделать чтобы окно пароля ВСЕГДА было поверх всех окон ? Пример тут -> http://files.mail.ru/C541D54D08FD4704B8D0521ABE296705

nick_mi: Оказывается для PING черная окантовка - это не только беда MINIGUI. В последнем IrfanView (версия 4.37) есть возможность поменять любой цвет на любой другой выбранный. Так вот, после замены черного цвета на белый, окантовка остается. Похоже, это где-то на Win API уровне.

Vlad04: Andrey Окно пароля выходит, но при случайном переключении мышкой уходит под окно задачи. Я сделал так В Инициализации Главного окна скрываю его и открываю форму с вводом пароля. Если с паролем все Гуд, показываю главное окна, а иначе Конец работы. Окно главое ты можешь спрятать после прогрессБаров

SergKis: gfilatov2002 пишет:Form_Main.MinButton := .F. // NOMINIMIZE Form_Main.TitleBar := .F. // NOCAPTION а MODAL как можно задать таким же образом ?

SergKis: gfilatov2002 [pre2] This.TopMost := lTopMost // TOPMOST This.SysMenu := lSysMenu // NOSYSMENU This.Sizable := lSizable // NOSIZE This.MaxButton := lMaxButton // NOMAXIMIZE This.MinButton := lMinButton // NOMINIMIZE This.TitleBar := lTitleBar // NOCAPTION это нормально, а This.Hide := .F. // NOSHOW ThisWindow.Hide := .F. // NOSHOW выдает: Error E0022 invalid lvalue '()' DoMethod(_HMG_ThisFormName, 'Hide', .F.) // все нормально где я глючу ? [/pre2]

SergKis: SergKis пишет: This.Hide := .F. // NOSHOW ThisWindow.Hide := .F. // NOSHOW допер IF lHide This.Hide ELSE This.Show ENDIF пора выключаться ...

Andrey: Vlad04 пишет: Я сделал так В Инициализации Главного окна скрываю его и открываю форму с вводом пароля. Если с паролем все Гуд, показываю главное окна, а иначе Конец работы. Окно главое ты можешь спрятать после прогрессБаров Ларчик просто открывается оказывается ! Там указаны только ДВА варианта показа окна. Как всегда выбрал самый красивый, но с приключениями (красоту захотел навести при вводе пароля)... 1) GetPassword( , "My Message", "My Caption",.... 2) GetPassword( 0, "My Message", "My Caption", LoadBitmap("LOGO")...... Нолик убрать и будет ВСЕГДА висеть, пока пароль не вобьешь.... Хоть комментарий бы поставили, а то пока разберешься....

Softlog86: Подскажите , есть-ли команда чтоб ВСЕ контролы определенного окна включала/выключала ENABLED = .T. или .F. ?

Andrey: Softlog86 пишет: есть-ли команда чтоб ВСЕ контролы определенного окна включала/выключала Скорей всего нет такой команды. Нужно в цикле обойти все контролы на окне. А как, я тоже не знаю.

gfilatov2002: Andrey пишет: Нужно в цикле обойти все контролы на окне. Именно так [pre]/******************************************************************************/ Function _GetArrayOfAllControlsForForm ( cFormName ) /******************************************************************************/ Local nFormHandle , i , nControlCount , aRetVal := {} , x nFormHandle := GetFormHandle ( cFormName ) nControlCount := Len ( _HMG_aControlHandles ) For i := 1 To nControlCount If _HMG_aControlParentHandles == nFormHandle If ValType( _HMG_aControlHandles ) == 'N' IF ! Empty( _HMG_aControlNames ) If Ascan( aRetVal, _HMG_aControlNames ) == 0 Aadd( aRetVal, _HMG_aControlNames ) EndIf ENDIF ElseIf ValType( _HMG_aControlHandles ) == 'A' For x := 1 To Len ( _HMG_aControlHandles ) IF !Empty( _HMG_aControlNames ) If Ascan( aRetVal, _HMG_aControlNames ) == 0 Aadd( aRetVal, _HMG_aControlNames ) EndIf ENDIF Next x EndIf EndIf Next i Return Asort( aRetVal )[/pre] Полный текст примера см. в папке samples\Basic\Form_Controls

Andrey: 1) Как сделать так, чтобы из главного меню задачи (окно MAIN) другие окна при сворачивании - скидывались на панель задач ОТДЕЛЬНЫМ ОКНОМ со своим заголовком ? 2) А как узнать, есть ли такая функция в ехе-файле в программе на МиниГуи ? Почему то код в МиниГуи не прокатывает: IF .NOT.( cRun == 'UI' .OR. cRun == 'UE' ) MsgStop("Нет такой функции "+cRun+"() в ЕХЕ-нике !") ENDIF

gfilatov2002: Andrey пишет: скидывались на панель задач ОТДЕЛЬНЫМ ОКНОМ Для этого надо определять дочерние окна без слова CHILD (как определяется стандарное окно при работе в IDE). Andrey пишет: как узнать, есть ли такая функция в ехе-файле Надо использовать Харбор-функцию hb_IsFunction(<имя функции>) Пример использования из кода Харбора: [pre2]FUNCTION tip_SSL() RETURN hb_IsFunction( "__HBEXTERN__HBSSL__" )[/pre2]

Andrey: Спасибо БОЛЬШОЕ Григорий !

Andrey: gfilatov2002 пишет: Для этого надо определять дочерние окна без слова CHILD (как определяется стандарное окно при работе в IDE). Для ХР работает, а в Win8 нет. Я понял что сама Win8 группирует по названию ехе-ника. Как это убрать, кто знает ? Хотя это вопрос и не по МиниГуи.... gfilatov2002 пишет: hb_IsFunction() Спасибо БОЛЬШОЕ Григорий !

Andrey: Народ, подскажите кто знает, как лучше сделать меню настроек для своей задачи. Что бы не изобретать велосипед, решил делать в стиле Skype: Какие объекты из МиниГуи лучше использовать ? Про чекбоксы понятно. Как сделать меню слева, из каких объектов ?

Andrey: Как в МиниГуи зная хендл окна получить путь запущенной программы ? Или название ЕХЕ-ника по хендлу с путем... Нашел в MSDN http://msdn.microsoft.com/en-us/library/aa366789%28v=vs.85%29.aspx Как перевести для Харбора ?

Andrey: Есть ли функция для МиниГуи аналогичной MsgDebug() - но чтобы выводила значения в заданный файл ? Конечно можно сделать и самому, но может готовое есть ?

gfilatov2002: Andrey пишет: чтобы выводила значения в заданный файл ? Может подойдет такая [pre2] *-----------------------------------------------------------------------------* PROCEDURE LogFile( cFileName, acInfo ) *-----------------------------------------------------------------------------* LOCAL hFile, cLine := DToC( Date() ) + " " + Time() + " : ", n For n = 1 to Len( acInfo ) cLine += acInfo[ n ] + Chr( 9 ) Next cLine += CRLF if ! File( cFileName ) FClose( FCreate( cFileName ) ) endif if( ( hFile := FOpen( cFileName, FO_WRITE + FO_SHARED ) ) != -1 ) FSeek( hFile, 0, FS_END ) FWrite( hFile, cLine, Len( cLine ) ) FClose( hFile ) endif Return [/pre2] Полный пример использования есть в папке samples\Applications\SendMail

Andrey: gfilatov2002 пишет: Может подойдет такая Спасибо БОЛЬШОЕ ! А как насчет предыдущего вопроса ?

gfilatov2002: Andrey пишет: как насчет предыдущего вопроса ? По Вашей ссылке на MSDN лежит функция с хорошим названием, но предназначенная для другого случая. По секрету: ждите следующей сборки. В ней будет пример использования требуемой функции

SergKis: Andrey пишет:чтобы выводила значения в заданный файл ? вот еще пару вариантов : [pre2] FUNCTION MsgLog2( ... ) //! все переменные выводятся как : nVar -> "nVar", nVar //! Не нужно писать по два раза имя , значение - достаточно только один раз LOCAL i, k, aParams, nParams, xVal, cTp, cTx LOCAL hFile, cFile:="_MsgLog.txt" aParams := hb_aParams() nParams := PCount() IF nParams < 1 ; RETURN NIL ENDIF hFile := iif( File(cFile), FOpen(cFile,2) , FCreate(cFile) ) FSeek( hFile, 0, 2) k := nParams/2 FOR i := 1 TO k FWrite(hFile, aParams[ i+k ] + Chr(9) + _uVal2Txt( aParams[ i ] ) + Chr(9) ) NEXT FWrite(hFile, Chr(13)+Chr(10), 2 ) FClose( hFile ) RETURN FUNCTION MsgLog( ... ) LOCAL i, k, aParams, nParams, xVal, cTp, cTx LOCAL hFile, cFile:="_MsgLog.txt" aParams := hb_aParams() nParams := PCount() IF nParams < 1 ; RETURN NIL ENDIF hFile := iif( File(cFile), FOpen(cFile,2) , FCreate(cFile) ) FSeek( hFile, 0, 2) FOR i := 1 TO nParams FWrite(hFile, _uVal2Txt( aParams[ i ] ) + Chr(9) ) NEXT FWrite(hFile, Chr(13)+Chr(10), 2 ) FClose( hFile ) RETURN NIL STATIC FUNCTION _uVal2Txt( xVal ) LOCAL cTx, cTp:= ValType( xVal ) IF cTp=='C' ; cTx := AllTrim(xVal) ; RETURN iif(Empty(cTx), "'"+"'", cTx) ELSEIF cTp=='N' ; RETURN LTrim(Str(xVal)) ELSEIF cTp=='L' ; RETURN iif(xVal, ".T.", ".F.") ELSEIF cTp=='D' ; cTx := DToS( xVal ) ; RETURN Right(cTx,2)+'.'+subs(cTx,5,2)+'.'+Left(cTx,4) ELSEIF cTp=='A' ; RETURN "ARRAY[" + hb_NToS( Len(xVal) ) + "]" ELSEIF cTp=='H' ; RETURN "HASH[" + hb_NToS(Len(xVal)) + "]" ELSEIF cTp=='B' ; RETURN "{|| ... }" ELSEIF cTp=='O' ; RETURN "O:"+xVal:ClassName ELSEIF cTp=='T' ; RETURN hb_TSToStr( xVal, .T. ) ELSEIF cTp=='U' ; RETURN 'NIL' ENDIF RETURN "'" + cTp + "'" [/pre2]

Andrey: SergKis пишет: вот еще пару вариантов : Спасибо БОЛЬШОЕ ! Только хотелось бы имя файла иметь изменяемое !!! Наверно нужно сделать первый параметр ТОЛЬКО для имени файла. Я так у себя сделал уже... Вот еще возник вопрос, а как сделать ниспадающее меню ? Допустим для грида после нажатия мышки ?

gfilatov2002: Andrey пишет: как сделать ниспадающее меню ? Посмотри пример menudemo5 в папке samples\Basic\Menu Там используется такая команда: SHOW CONTEXTMENU OF Win_1

Andrey: gfilatov2002 пишет: Посмотри пример menudemo5 в папке samples\Basic\Menu То что надо ! Спасибо БОЛЬШОЕ !

Andrey: gfilatov2002 пишет: Посмотри пример menudemo5 в папке samples\Basic\Menu Меню сделал, но не совсем то что нужно. Нет возможности использовать крупный шрифт. Подскажите пожалуйста как можно сделать меню с иконкой и названием, типа объекта GRID ? Есть ли еще примеры для меню аналогичные объекту GRID ?

SergKis: Andrey может это \MiniGUI\SAMPLES\BASIC\MsgMenu

Andrey: SergKis пишет: может это \MiniGUI\SAMPLES\BASIC\MsgMenu Не совсем то, но попробую. В CONTEXT MENU я смог затолкать картинки 32x32 - выглядит получше ! Но опять беда, фон картинки нужно делать вручную под цвет МЕНЮ, иконка не подходит... На других компах, с другой цветовой темой то что делаю будет выглядеть КОРЯВО... Есть функции определения цвета по координатам окна ? И еще один вопрос, как сделать выход без выбора в CONTEXT MENU ? MENUITEM "Выход" ACTION {|| ?????? } IMAGE "EXIT32"

Andrey: Всем привет. Как переключиться на окно если оно находиться под другими открытыми окнами ? Имею такую конструкцию: IF !IsWindowActive( Form_Config ) DEFINE WINDOW Form_Config ; At 0, 0 ; ....... NOMAXIMIZE NOSIZE ......... END WINDOW // показываем форму ELSE RESTORE WINDOW Form_Config ENDIF // !IsWindowActive( Form_Config ) RESTORE WINDOW - срабатывает если окно свернуто. А если скрыто под другими окнами, то как сделать это окно ПОВЕРХ других окон задач ?

Dima: Andrey пишет: А если скрыто под другими окнами, то как сделать это окно ПОВЕРХ других окон задач ? Фокус ввода сделать на нужном окне

SergKis: Andrey пишет:Как переключиться на окно IF _IsWindowDefined('Form_Config') Form_Config.SetFocus Form_Config.Browse_1.SetFocus или др. нужный контрол Form_Config.Button_1.SetFocus ENDIF

Andrey: SergKis пишет: IF _IsWindowDefined('Form_Config') Form_Config.SetFocus Form_Config.Browse_1.SetFocus или др. нужный контрол Form_Config.Button_1.SetFocus ENDIF Не совсем понял... Окно уже открыто, но может быть несколько вариантов: 1) окно находиться под другими окнами задачи. 2) свернуто на панели задачи. как сделать код для этих 2х вариантов сразу ? IF _IsWindowDefined('Form_Config') // создание окна // показываем форму ACTIVATE WINDOW Form_Config ELSE // RESTORE WINDOW Form_Config // работает если окно свернуто на панели задач, НЕ работает если под другими окнами // Form_Config.SetFocus // Не работает если окно свернуто на панели задач, работает если под другими окнами ENDIF

gfilatov2002: Andrey пишет: Окно уже открыто, но может быть несколько вариантов: Попробуй так [pre2] *----------------------------------- Function SwitchToWin( cForm ) *----------------------------------- If _IsWindowDefined( cForm ) If IsIconic( GetFormHandle(cForm) ) _Restore( GetFormHandle(cForm) ) Else DoMethod( cForm, "SetFocus" ) EndIf EndIf Return Nil[/pre2]

Andrey: gfilatov2002 пишет: Попробуй так То что надо ! Спасибо ! А как насчет этого вопроса: Есть ли функции определения цвета по определённым координатам ?

gfilatov2002: Andrey пишет: Есть ли функции определения цвета по определённым координатам ? Да, есть. Это WinAPI функция GetPixel(). Рабочий пример ее использования см. в папке samples\Advanced\FillTriangle [pre2] Function ShowRGB() LOCAL hdc, x, y, aColor := {0,0,0} hdc := GetDC( _HMG_MainHandle ) x := _HMG_MouseCol y := _HMG_MouseRow IF GetPixelColor( hdc, x, y, @aColor ) Form_1.Title := "RGB (" ; + " r:" + str(aColor[1], 3 ) ; + " g:" + str(aColor[2], 3 ) ; + " b:" + str(aColor[3], 3 ) ; + " )" ELSE Form_1.Title := "RGB ( CLR_INVALID )" ENDIF ReleaseDC( _HMG_MainHandle, hdc ) Return Nil [/pre2]

Andrey: gfilatov2002 пишет: Рабочий пример ее использования см. в папке samples\Advanced\FillTriangle Спасибо БОЛЬШОЕ ! То что надо !!! Единственно что, если определение цвета нужно в дочернем окне, то наверно нужно сделать параметр для изменения _HMG_MainHandle ? Как написать вместо _HMG_MainHandle - хендл текущего окна ?

SergKis: Andrey пишет:Как написать вместо _HMG_MainHandle - хендл текущего окна ? по ситуации: Form_1.Handle ThisWindow.Handle GetFormHandle (cFom)

Andrey: Спасибо !!! Подскажите еще пожалуйста, как передать кодовый блок в объект кнопку ? Вот имею такой кодовый блок: aObjButton[2,11] := { || MyZip(), Form_Config.Release() } Передаю в функцию прорисовки кнопок: ////////////////////////////////////////////////////////////////////// Function METRO_BUTTON( aDim ) LOCAL bAction := aDim[11] cForm := _HMG_ThisFormName DEFINE BUTTONEX &cObject PARENT &cForm ..... ACTION ??? bAction // как здесь написать ?

SergKis: Andrey пишет:как передать кодовый блок в объект кнопку ? если aDim[11] := 'MyZip(), Form_Config.Release()', то ACTION &( aDim[11] ) в твоем случае можно DEFINE BUTTONEX &cObject PARENT &cForm ... END BUTTON _HMG_aControlProcedures [ GetControlIndex(cObject, cForm) ] := bAction

SergKis: вдогонку SetProperty(cForm, cObject, bAction) или Form_1.Button_1.Action := bAction

gfilatov2002: Andrey пишет: Function METRO_BUTTON( aDim ) LOCAL bAction := aDim[11] cForm := _HMG_ThisFormName DEFINE BUTTONEX &cObject PARENT &cForm ..... ACTION ??? bAction // как здесь написать ? Function METRO_BUTTON( aDim ) LOCAL bAction := aDim[11] cForm := _HMG_ThisFormName DEFINE BUTTONEX &cObject PARENT &cForm ..... ACTION Eval( bAction ) ... END BUTTONEX

SergKis: gfilatov2002 пишет: ACTION Eval( bAction ) оно так конечно, но блок кода на блок кода ...

Andrey: SergKis пишет: оно так конечно, но блок кода на блок кода ... Вот и я тоже об этом подумал... Работает, а вдруг не так нужно было делать...

Andrey: gfilatov2002 пишет: По Вашей ссылке на MSDN лежит функция с хорошим названием, но предназначенная для другого случая. По секрету: ждите следующей сборки. В ней будет пример использования требуемой функции А где искать в новой сборке эту функцию ?

gfilatov2002: Andrey пишет: где искать в новой сборке эту функцию ? В новом примере External Application Control из папки samples\Advanced\ExternalApp_2 есть функция GetFullFileNameByHandle() Вызывать так: GetFullFileNameByHandle( hWin , @cFullFileName )

Dima: gfilatov2002 а где то можно увидеть какие новые примеры добавились по сравнению с предыдущей сборкой ?

santy: ChangelogHMG2_37.doc - скачай с сайта Григория.

gfilatov2002: Dima пишет: какие новые примеры добавились См. последние изменения в файле changelog.txt, который находится в папке minigui\Doc

Dima: упс а слона то я и не заметил

Andrey: gfilatov2002 пишет: GetFullFileNameByHandle( hWin , @cFullFileName ) Спасибо, то что нужно !!! Но дальше облом... Есть ли пример в котором показано: как вместо названия bmp-ки подставить хендл bmp для меню ? Вот например: GetFullFileNameByHandle (hIDWin, @cFullFileName) hIcon := ExtractIcon( cFullFileName, 0 ) hBmp := BmpFromIcon( hIcon ) // a return handle bmp DEFINE CONTEXT MENU OF Form_1 MENUITEM cWinName ...... IMAGE "INFO" MENUITEM cFullFileName ......... IMAGE hBmp Да и для кнопок (BUTTONEX) тоже непонятно как делать ? hIcon := ExtractIcon( System.SystemFolder + "\shell32.dll", 232 ) @ 120, 460 BUTTONEX Button_Refresh ; CAPTION 'Refresh' ; ICON hIcon ??? ;

gfilatov2002: Andrey пишет: для кнопок (BUTTONEX) тоже непонятно как делать ? Для кнопок можно использовать следующую функцию: [pre2] *-----------------------------------------------------------------------------* Procedure SetBtnIcon (cFormName, cBtnName, hIcon) *-----------------------------------------------------------------------------* Local hWnd, k k := GetControlIndex (cBtnName, cFormName) IF k > 0 IF _HMG_aControlBrushHandle [k] <> 0 DeleteObject (_HMG_aControlBrushHandle [k]) ENDIF _HMG_aControlBrushHandle [k] := hIcon hWnd := GetControlHandle (cBtnName, cFormName) #define STM_SETIMAGE 0x0172 #define IMAGE_ICON 1 SendMessage (hWnd, STM_SETIMAGE, IMAGE_ICON, hIcon) #undef IMAGE_ICON #undef STM_SETIMAGE ENDIF Return [/pre2]

Andrey: gfilatov2002 пишет: Для кнопок можно использовать следующую функцию: Спасибо БОЛЬШОЕ !!! А как иконки/bmp -ки добавлять в меню ?

gfilatov2002: Andrey пишет: как иконки/bmp -ки добавлять в меню ? Попробуй использовать для bmp в меню функцию ниже [pre2] *--------------------------------------------------------* Function _SetMenuItemImage( ItemName , FormName , hBitmap ) *--------------------------------------------------------* Local i Local x := GetControlIndex ( ItemName , FormName ) Local h := _HMG_aControlPageMap [ x ] If _HMG_aControlType [ x ] == "MENU" i := _HMG_aControlIds [ x ] ElseIf _HMG_aControlType [ x ] == "POPUP" i := _HMG_aControlSpacing [ x ] EndIf Return SetChevronImage ( h, i , hBitmap ) // SetChevronImage(hMenu, id_Command, image) [/pre2]

Andrey: C иконками в меню и кнопками теперь понятно ! Спасибо БОЛЬШОЕ Григорий !!! Возник теперь другой вопрос. Можно ли как то передать на форму (которую еще не создали), то что нужно нарисовать ? Т.е. объекты произвольного значения, допустим: линию по координатам, надпись по координатам или допустим объект FRAME ? Ну вот так примерно: ACTION {|| nRet := MenuList(aCaptions, aIcons, aButton, aWindow, aImage, aNewObj ),; MsgInfo( 'Action menu = ' + hb_ntos(nRet), wMain.Button_1.Caption) } передаю в aNewObj массив чего надо нарисовать на форме. А как тогда на форме (которая будет новая) создавать это объекты ? Или это вообще неправильный подход ???? Нужно сначала нарисовать форму, объекты, а уж потом вызывать функцию обработки этого окна ?

gfilatov2002: Andrey пишет: объекты произвольного значения, допустим: линию по координатам, надпись по координатам или допустим объект FRAME Любой объект в минигуи сводится к вызову функции, поэтому ничего не мешает передать в массиве кодовый блок с вызовом этой функции с необходимыми параметрами, а затем выполнить этот блок, использовав событие формы ON INIT. Пример использования этих функций вместо минигуи-команд можно посмотреть в папке samples\Advanced\TSB_MENU. Но, конечно, это требует хорошего знания внутреннего устройства библиотеки и не рекомендуется из-за сложности использования

Andrey: Спасибо БОЛЬШОЕ ! Григорий, а если я в функции MenuList(cParent, aCaptions, aIcons, aButton, aRunFunc) добавлю идентификатор окна cParent (ну и соответственно везде поменять, где есть вызовы "Win_1"), то я смогу вызывать эту функцию и в других окнах ? Конфликтов не будет ?

Andrey: В FW на плитке есть возможность использования левой клавиши мыши. А на объекте ButtonEx можно задействовать левую клавишу мышки ? Есть ли обработчик какой ?

evgeny2006: Andrey пишет: Взялся смотреть примеры из МиниГуи, так не все работают. Может кто подскажет что там "допилить" нужно ? А заодно может и исправить и добавить новые.... Присоединяюсь к поставленному вопросу Одновременно хотел задать еще вопрос. Создается впечатление, что система либо очень сырая, или авторы молчаливо используют библиотеки, отличные от приведенных в примерах. Например, DIRECTORY. Должна выдавать пять компонент. Вроде бы она это делает, но второй и третий компонент - пустые. Скорее всего необходимо подключать дополнительные библиотеки, но как о них узнать?

evgeny2006: Andrey пишет: Взялся смотреть примеры из МиниГуи, так не все работают. Может кто подскажет что там "допилить" нужно ? А заодно может и исправить и добавить новые.... Присоединяюсь к поставленному вопросу Одновременно хотел задать еще вопрос. Создается впечатление, что система либо очень сырая, или авторы молчаливо используют библиотеки, отличные от приведенных в примерах. Например, DIRECTORY. Должна выдавать пять компонент. Вроде бы она это делает, но второй и третий компонент - пустые. Скорее всего необходимо подключать дополнительные библиотеки, но как о них узнать?

Andrey: evgeny2006 пишет: Создается впечатление, что система либо очень сырая, или авторы молчаливо используют библиотеки, отличные от приведенных в примерах. Нет, неправ ты. Просто Windows-программирование очень отличается от стандартного Клиперного. Это нужно понять, а на понятие уходит много времени. Я уже второй год (правда наскоками) разбираюсь. Просто у Григория в библиотеки нет руководства для новичков. Я сам разбирался с нуля, а потом уже с помощью всех присутствующих на форуме. Результатами сейчас доволен, много можно делать. Начни потихоньку осваивать примеры. Своё приложение сразу писать НЕТ СМЫСЛА, пока не поймешь как можно использовать МиниГуи. Вот выкладываю образцы первых шагов. https://cloud.mail.ru/public/e17020852d3f/1_OnInitWindows.7z

Haz: evgeny2006 пишет: Например, DIRECTORY а GUI то тут с какого боку ? Давайте по существу что именно не так в GUI ? Думаю вместе поможем разобраться. И поверьте авторам есть чем заняться кроме молчаливого использования каких то библиотек.

Andrey: Andrey пишет: А на объекте ButtonEx можно задействовать левую клавишу мышки ? Есть ли обработчик какой ? Для RightClick надо использовать DEFINE CONTEXT MENU CONTROL ... или DEFINE CONTEXT MENU CONTROLS <cControlName1> [, cControlNamen ] смотри \samples\Basic\ControlsContextMenu Спасибо большое SergKis ! А для TBROWSE есть обработка RightClick ?

Vlad04: evgeny2006 Например, DIRECTORY. Должна выдавать пять компонент. Вроде бы она это делает, но второй и третий компонент - пустые. все заполнено Проверил в хХарбор 1 и Харбор 3.2

Andrey: Блин, ну почему все пишут в моей теме ? Что нельзя отдельную ветку завести ? Повторяю свой вопрос: А для TBROWSE есть обработка RightClick ?

Dima: Andrey пишет: Блин, ну почему все пишут в моей теме ? Что нельзя отдельную ветку завести ? Те жалко ? Считаешь нужно завести еще одну такую же тему ?

Andrey: Dima пишет: Те жалко ? Да пишут про другое совершенно ! А мой вопрос просто теряется....

Haz: Andrey пишет: Повторяю свой вопрос: А для TBROWSE есть обработка RightClick ? есть

Andrey: Haz пишет: есть А если не сложно, пожалуйста ткните в пример !

Haz: Andrey пишет: пожалуйста ткните в пример не в пример, а опять же в исходник TSCOLUMN.PRG. В данных класса определены блоки реакции на разные клики. DATA bFLClicked // Block to be evaluated on footer left clicked DATA bFRClicked // Block to be evaluated on footer right clicked DATA bHLClicked // Block to be evaluated on header left clicked DATA bHRClicked // Block to be evaluated on header right clicked DATA bSLClicked // Block to be evaluated on Special header left clicked DATA bSRClicked // Block to be evaluated on Special header right clicked DATA bLClicked // Block to be evaluated on cell left clicked DATA bRClicked // Block to be evaluated on cell right clicked Все что нужно сделать так это назначить этот блок BRW:aColumns[n]:bFLClicked := { || Msgbox('Block to be evaluated on footer left clicked') } PS. Класс TSBROWS отлично прокомментирован в исходниках. Все данные и методы понятны и читаемы. на нем же легко сделать кнопку с реакцией на правый клик к примеру - как ответ на вопрос выше (бровс по массиву с одной ячейкой без скроллов и заголовка , плюс с возможность фантазий типа динамической смены цвета этой кнопки, ее активности и прочего вплоть до контекстного меню по ней ). Но для этого нужно смотреть исходник и разбираться в нем.

Andrey: Всем доброй ночи. Наконец то дошли руки до новых непоняток в МиниГуи. Моих непоняток конечно.... Как на "лету" (т.е. уже в запущенной программе поменять ЦВЕТ кнопок ? Замену цвета сделал через контексное меню, и возврат цвета тоже скорее всего не работает... Вот мой код (который не работает...): ////////////////////////////////////////////////////////////////////// Function METRO_BUTTON( aDim ) LOCAL cObject := aDim[1], nRow := aDim[2], nCol := aDim[3] LOCAL nWidth := aDim[4], nHeight := aDim[5], cCaption := aDim[6] LOCAL cResIco1 := aDim[7], cResIco2 := aDim[8] LOCAL aFontColor := aDim[9], aBACKCOLOR := aDim[10] LOCAL bAction := aDim[11], cTooltip := aDim[12] LOCAL cInfo0, cInfo1, cInfo2, aVal DEFINE BUTTONEX &cObject ROW nRow COL nCol WIDTH nWidth HEIGHT nHeight //PICTURE cResPicture ICON cResIco1 CAPTION cCaption ACTION IIF(bAction=='EXIT',ThisWindow.Release,&(bAction)) VERTICAL .T. LEFTTEXT .F. FLAT .F. FONTSIZE 12 FONTBOLD .F. FONTCOLOR aFontColor BACKCOLOR aBACKCOLOR UPPERTEXT .F. TOOLTIP cTooltip NOHOTLIGHT .F. NOXPSTYLE .T. ONGOTFOCUS ( SetProperty(ThisWindow.Name, cObject, "ICON", cResIco2), SetProperty(ThisWindow.Name, cObject, "fontbold", .t.) ) ONLOSTFOCUS ( SetProperty(ThisWindow.Name, cObject, "ICON", cResIco1), SetProperty(ThisWindow.Name, cObject, "fontbold", .f.) ) END BUTTONEX DEFINE CONTEXT MENU CONTROLS &cObject cInfo0 := "Object: "+cObject cInfo1 := "Object ID: "+ltrim(str(_HMG_xControlsContextMenuID)) //cInfo2 := "Object Control name: "+_HMG_aControlNames[_HMG_xControlsContextMenuID] - не РАБОТАЕТ !!! cInfo2 := "" MENUITEM cInfo0 DISABLED MENUITEM cInfo1 DISABLED MENUITEM cInfo2 DISABLED SEPARATOR MENUITEM "Change color button" ACTION { || aVal := GetColor(aBACKCOLOR), SetProperty(ThisWindow.Name, cObject, "BACKCOLOR", aBACKCOLOR) } MENUITEM "Color to default" ACTION { || SetProperty(ThisWindow.Name, cObject, "BACKCOLOR", aBACKCOLOR ) } END MENU Return NIL

gfilatov2002: Andrey пишет: Как на "лету" (т.е. уже в запущенной программе поменять ЦВЕТ кнопок ? ITEM 'Set OButton BackColor' ACTION Form_1.OButton.BackColor := GetColor() Так определена эта кнопка на форме: DEFINE BUTTONEX OButton ROW 200 COL 400 WIDTH 90 HEIGHT 23 CAPTION "Computer" VERTICAL .t. // ICON "res\comp.ico" FLAT .f. FONTNAME "MS Sans serif" FONTSIZE 9 FONTCOLOR {0,128,0} // FONTBOLD .t. BACKCOLOR {240,255,240} UPPERTEXT .t. TOOLTIP "OButton with icon - vertical - uppertext - nohotlight - noxpstyle" NOHOTLIGHT .t. NOXPSTYLE .t. END BUTTONEX

Andrey: Спасибо за подсказку, получилось. Цвет кнопки менять на лету получилось ! https://cloud.mail.ru/public/8bb7a4832b49/MiniGui-TEST Не получается сделать вызов: DEFINE CONTEXT MENU CONTROL Label_Color2 - строка 107 НЕ вызывается МЕНЮ ВООБЩЕ !!! Почему ? Что не так делаю ? И взял из примера \SAMPLES\BASIC\ControlsContextMenu\ccmenu.fmg // new syntax one menu for multi controls (ADV) DEFINE CONTEXT MENU CONTROLS Label_1, Button_1, CheckBtn_1, List_1, Combo_1 MENUITEM "Multi 1" ACTION MsgInfo( "Multi 1 ID: "+ltrim(str(_HMG_xControlsContextMenuID)) ) MENUITEM "Multi 2" ACTION MsgInfo( "Multi 2 Control name: "+ _HMG_aControlNames[_HMG_xControlsContextMenuID] ) а у меня не работает... //cInfo2 := "Object Control name: "+_HMG_aControlNames[_HMG_xControlsContextMenuID] Подскажите пожалуйста как сделать, чтобы заработало ?

Andrey: Andrey пишет: Не получается сделать вызов: DEFINE CONTEXT MENU CONTROL Label_Color2 - строка 107 Пошаговое разбирание примера (спасибо a_sidorov ) привело к неожиданному результату: В строке 72: @ 24, 0 LABEL Label_Color2 VALUE "" WIDTH nWidth HEIGHT 84 BACKCOLOR COLOR_BLUE_BLUE в конце нужно поставить TOOLTIP "" И меню начнет появляться. Это баг или так должно быть ?

Andrey: Вот это точно новый баг ! Если для объекта ставлю TOOLTIP "" то перестают работать Label_Inf1 и Label_Inf2: @ 40, 120 LABEL Label_Inf1 VALUE MiniGUIVersion() ; AUTOSIZE ; ON CLICK MsgInfo('Label-1 Clicked !') ; ON MOUSEHOVER ( Rc_Cursor( "MINIGUI_FINGER" ), Form_Main.Label_Inf1.Value := MiniGUIVersion(), ; iif(lOver, , (Form_Main.Label_Inf1.FontBold := .t., lOver := .T.)) ) ; ON MOUSELEAVE ( Form_Main.Label_Inf1.FontBold := .f., Form_Main.Label_Inf1.Value := MiniGUIVersion(), lOver := .f. ) ; FONT 'Arial' SIZE 14 FONTCOLOR YELLOW BACKCOLOR COLOR_BLUE_BLUE Новый пример тут: https://cloud.mail.ru/public/d17fa3f4f9c1/Menu_ButtonEx_2.7z Наверно что-то с наложением объектов.... Можно исправить ошибку до выхода новой версии (или всё таки у меня что-то не то в коде) ?

gfilatov2002: Andrey пишет: Можно исправить ошибку до выхода новой версии (или всё таки у меня что-то не то в коде) ? Ошибки здесь нет Вы переназначили свой объект из статического типа в активный, добавив TOOLTIP "", и теперь он обрабатывается в первую очередь, закрывая собой Label_Inf1 и Label_Inf2, которые лежат сверху на этом объекте. Выход: назначить контексное меню на изначально актмвные объекты Label_Inf1 и Label_Inf2, и вернуть статический тип Вашей цветной метке (т.е. убрать класс TOOLTIP "")

Andrey: Всем доброго вечера. Помню что где то здесь приводился пример, про то как определить кол-во объектов на форме, чтобы их всех перерисовать. Не смог найти. Подскажите пожалуйста какой пример в МиниГуи это демонстрирует ?

SergKis: Andrey пишет:Подскажите пожалуйста какой пример в МиниГуи это демонстрирует ? см. ...\BASIC\Form_Controls\demo.prg Function _GetArrayOfAllControlsForForm ( cFormName )

Andrey: Есть цвет 15790320 - как его превратить в массив {} ? Есть ли такая функция в МиниГуи ?

Haz: Andrey пишет: как его FUNC N2RGB(nColor) LOCAL nR := 0 LOCAL nG := 0 LOCAL nB := 0 LOCAL cColor := NTOC(nColor, 16) nR := CTON(SUBSTR( cColor, 5, 2 ), 16) nG := CTON(SUBSTR( cColor, 3, 2 ), 16) nB := CTON(SUBSTR( cColor, 1, 2 ), 16) RETURN {nR, nG, nB }

Andrey: Haz пишет: FUNC N2RGB(nColor) Спасибо БОЛЬШОЕ !

Andrey: Собираю программу под Win-8.1, запускаю на Win-XP и по бокам внизу остаётся фон формы: А под Win8 всё нормально: Методом подбора сделал окно TBROWSE вплотную к линии STATUSBAR и по ширине окна формы ! CreateBrowse( "oBrw_1", 'Form_0', 32, 2, Form_0.Width-19, Form_0.Height-93, 'LOG_DBF' ) Как исправить положение ? Как сделать, чтобы на всех компах было красиво ? Пробовал использовать функцию IsXPThemeActive(), но она под 8-кой выдает тоже .T. !

SergKis: Andrey пишет:Как исправить попробуй использовать: // BAA HB_FUNC( GETCLIENTWIDTH ) { RECT rect; LONG hWnd=hb_parnl(1); if(hWnd==0) SystemParametersInfo( SPI_GETWORKAREA, 0, &rect, 0); else GetClientRect( ( HWND ) hWnd, &rect ); hb_retni( ( INT ) rect.right - rect.left ); } // BAA HB_FUNC( GETCLIENTHEIGHT ) { RECT rect; LONG hWnd=hb_parnl(1); // SPI_GETWORKAREA == 0x0030 if(hWnd==0) SystemParametersInfo( SPI_GETWORKAREA, 0, &rect, 0); else GetClientRect( ( HWND ) hWnd, &rect ); hb_retni( ( INT ) rect.bottom - rect.top ); } GETCLIENTHEIGHT(0) - высота клиентской (внутренней) области Desktop с учетом наличия строки Start GETCLIENTWIDTH(0) - ширина клиентской (внутренней) области Desktop GETCLIENTHEIGHT(hWnd) - высота клиентской (внутренней) области окна (или контрола) GETCLIENTWIDTH(hWnd) - ширина клиентской (внутренней) области окна (или контрола) т.е.: hWnd := GetFormHandle('Form_0') CreateBrowse( "oBrw_1", 'Form_0', 32, 2, GetClientWidth(hWnd), GetClientHeight(hWnd), 'LOG_DBF' )

Andrey: SergKis пишет: попробуй использовать: Спасибо БОЛЬШОЕ за оперативность ! А как узнать размер STATUSBAR у себя в программе ? А то Browse по самый низ располагается.

SergKis: Andrey пишет:Как исправить другой способ (расчет): GetWindowWidth(hWnd) - ширина внешней области окна (или контрола) GetWindowHeight(hWnd)- высота внешней области окна (или контрола) т.е.: hWnd := GetFormHandle('Form_0') nClientWidth := GetWindowWidth(hWnd) - 2*GetBorderWidth() // если есть рамка вокруг окна nClientHeight := GetWindowHeight(hWd) - 2*GetBorderHeight() // --"---"--- nClientHeight -= GetTitleHeight() // если есть title окна nClientHeight -= GetMenuBarHeight() // если есть меню nClientHeight -= GetWindowHeight(GetControlHandle('STATUSBAR', 'Form_0')) // высота StatusBar при наличии ToolBar, то в обоих (из пред. моего поста тоже) случаях надо отнимать его размер как то так, если что то не забыл учесть. для окна начальные значения можно взять Form_0.Width, Form_0.Height, для MAIN Application.Width, Application.Height

Andrey: SergKis пишет: nClientHeight -= GetWindowHeight(GetControlHandle('STATUSBAR', 'Form_0')) // высота StatusBar То что нужно ! Спасибо БОЛЬШОЕ !

SergKis: Andrey пишет:То что нужно StatusBar - контрол, значит можно и Form_0.StatusBar.Height - по правилам OOP MiniGui

Andrey: Всем привет. Вопрос по шрифтам в программе. Если я у себя объявляю фонты в справочнике: DEFINE FONT Font_1 FONTNAME "Times New Roman" SIZE nSize1 DEFINE FONT Font_2 FONTNAME "Times New Roman" SIZE nSize2 BOLD ITALIC DEFINE FONT Font_3 FONTNAME "Times New Roman" SIZE nSize3 BOLD DEFINE FONT Font_4 FONTNAME 'Arial' SIZE nSize4 ITALIC DEFINE FONT Font_5 FONTNAME 'Tahoma' SIZE nSize5 BOLD и оставляю это окно открытым, то при открытие основной таблицы - НЕЛЬЗЯ заново определить другие шрифты с именами: Font_1, Font_2 и т.д. Как нужно определять шрифты у себя в программе ? Т.е. опредилить их всех в начале программы с разными именами, или каждый раз убивать шрифты при выходе из окна или еще как ? Поясните пожалуйста как нужно работать с ними.

SergKis: Andrey а если так в новом окне: #define Font_1 Font_7 #define Font_2 Font_8

Andrey: SergKis пишет: а если так в новом окне: Понял. Спасибо. А вообще как правильно делать - работать со шрифтами ? Я же перевожу свою программу с терминалки, и не знаю как лучше.

SergKis: Andrey пишет:Я же перевожу свою программу с терминалки у тебя в терминалке много фонтов ? мне хватает: #command SET FONT TO <fontname> , <fontsize> => _HMG_DefaultFontName := <fontname> ; _HMG_DefaultFontSize := <fontsize> и фонта на окно, который устанавливается (и наследуется на конролах): _HMG_ActiveFontName := IFCHARACTER( FontName, FontName, "" ) _HMG_ActiveFontSize := IFNUMBER( FontSize, FontSize, 0 ) и пару заголовков Times New Roman, указанных конкретно

Andrey: SergKis пишет: у тебя в терминалке много фонтов ? Да пару всего.... Просто я в TSBROWSE использовал 5 (как в примерах) , попытался открыть другой TSBROWSE и облом, там тоже определено 5 шрифтов. Вот и выходит конфликт шрифтов. А можно как нибудь проверить - установлен ли шрифт Font_1 ? И как можно получить размер шрифта ?

SergKis: Andrey пишет:А можно как нибудь проверить - установлен ли шрифт Font_1 hFont := GetFontHandle( FontName ) // даст handle или 0 и глянь i_font.ch

Andrey: SergKis пишет: и глянь i_font.ch Спасибо !

Andrey: Привет всем. Вот опять непонятка по доке. Использую у себя окно выбора: MsgYesNo( "Вы хотите добавить в СПРАВОЧHИК новую запись ?", "Добавление записей", .f. ) .f. - это же кнопка по умолчанию ? А при показе по умолчанию идет другая кнопка: Как исправить ? Или я не прав ?

SergKis: Andrey пишет:Как исправить ? Что исправлять ? .T. - кнопка Нет .F. - кнопка Да в фокусе

Andrey: SergKis пишет: .T. - кнопка Нет .F. - кнопка Да в фокусе Блин, всё наоборот. Я считал что .F. - кнопка нет. Да уж... Спасибо БОЛЬШОЕ !

Andrey: SergKis пишет: см. ...\BASIC\Form_Controls\demo.prg Function _GetArrayOfAllControlsForForm ( cFormName ) При использовании этой функции, возник такой вопрос. Что за странные имена объектов - DummyMenuName?? , если вывести список объектов формы ? Мне нужно перерисовать свои объекты на форме. Т.е. я тогда просто пропускаю эти объекты, а свои перерисовываю. Правильно ли это ?

SergKis: Andrey пишет:странные имена объектов - DummyMenuName строка меню имеет идентификатор (для обращения\управления этой строкой см. h_menu.prg), если не задано имя, то по формируется по default. Т.е. я тогда просто пропускаю эти объекты, а свои перерисовываю. Правильно ли это ? Да. Но я создаю свой массив для нужных контролов и пляшу от него. пример: [pre2] // oW:aKrt_Field - массив для нужных контролов y += nHn + nGapsH x := nWl cNm := 'VALSTS'; cTx := gTxt(cPref+'R_11A') // COUNTRY (СТРАНА) ТЕКСТ @ y, x LABEL &('Lbl_'+cNm) WIDTH nLn HEIGHT nHn VALUE cTx BACKCOLOR BC ; FONTCOLOR FC x += nLn + nGapsW // COUNTRY (СТРАНА КОД) cNm := 'VALSTSK'; nLen := oSt:W('05') + 5 @ y, x GETBOX &cNm WIDTH nLen HEIGHT nHn VALUE '' ACTION oW:BtnGet() ; VALID VldValsts() ; BACKCOLOR BG ; FONTCOLOR FC nNm := GetControlIndex (cNm, oW:cWnd) hNm := GetControlHandle(cNm, oW:cWnd) oNm := _HMG_aControlHeadClick[ nNm ] oNm:OnDblClick := {|oGet| oSelfObj:SelRecEdit('VALSTSK')} oNm:OnF5 := {|oGet| oSelfObj:BtnGet( oGet ) } // VK_F5 CONTROLREADONLY(hNm, .T.) CONTROLTABSTOP (hNm, .F.) aAdd(oW:aKrt_Field, { cNm, nNm, hNm, 'R_11A', .T., , , }) // .T. - снимаем ReadOnly, R_11A - FieldName x += nLen // + nGapsW cNm := 'VALSTSN'; nLen := oSt:W('30') - 5 // COUNTRY (СТРАНА НАИМЕН.) @ y, x GETBOX &cNm WIDTH nLen HEIGHT nHn VALUE '' READONLY BACKCOLOR BG ; FONTCOLOR FC nNm := GetControlIndex (cNm, oW:cWnd) hNm := GetControlHandle(cNm, oW:cWnd) oNm := _HMG_aControlHeadClick[ nNm ] // object GetBox oNm:OnDblClick := {|oGet| oSelfObj:SelRecEdit('VALSTSK')} CONTROLTABSTOP(hNm, .F.) aAdd(oW:aKrt_Field, { cNm, nNm, hNm, 'R_12A', .F., , , }) // .F. - не снимаем ReadOnly, R_12A - FieldName ... вот включаю корректировку по массиву: METHOD SelRecEdit( cFocus ) CLASS Child_Mdi_UMZ_KLI LOCAL a,i,j,k,n, nF, cC, oW := oSelfObj LOCAL aBColor := oW:aBColorGet LOCAL aFColor := oW:aFColorGet ::lSetKrtEdit := .T. // вошли в редактирование k := len(::aKrt_Field) FOR i := 1 TO k a := ::aKrt_Field[ i ] IF a[ 5 ] // { cNm, nNm, hNm, 'R_1' , .F., , , } cC := a[ 1 ] // Name controlа IF nF == NIL; nF := a[ 2 ] // Index controlа для SetFocus ENDIF a[ 6 ] := _GetBackColor( cC, ::cWnd ) // сохраняем цвета Getbox a[ 7 ] := _GetFontColor( cC, ::cWnd ) // --"--- CONTROLREADONLY( a[ 3 ], .F. ) // включаем корректировку и CONTROLTABSTOP ( a[ 3 ], .T. ) // переход по TabStop _SetBackColor( cC, ::cWnd, aBColor ) // ставим цвета GetBox _SetFontColor( cC, ::cWnd, aFColor ) // в коректировке ENDIF NEXT SetProperty(::cWnd, 'BTN_OK' , 'Visible', .T.) SetProperty(::cWnd, 'BTN_CANCEL', 'Visible', .T.) SetProperty(::cWnd, ::oBr1:cBrw , 'Enabled', .F.) CONTROLTABSTOP(::oBr1:hBrw, .F.) IF ! empty(cFocus) nF := GetControlIndex(cFocus, ::cWnd) ENDIF IF ! empty(nF); _SetFocus(nF) // ставим на первый или указанный ENDIF RETURN [/pre2]

SergKis: Andrey вдогонку завершение корректировки: [pre2] METHOD PressBtn( nBtn ) CLASS Child_Mdi_UMZ_KLI LOCAL a,f,i,j,k,n,o, cN, cC, nC, oC, cF, uV, uF, aM := {} IF ::lPressBtn; RETURN ENDIF ::lPressBtn := .T. // начали PressBtn k := len(::aKrt_Field) IF nBtn == 1 // button OK. save values FOR i := 1 TO k a := ::aKrt_Field[ i ] IF ! a[ 5 ]; LOOP // { cNm, nNm, hNm, 'R_1' , .F., , , } ENDIF cC := a[ 1 ] // control name nC := a[ 2 ] // control index oC := _HMG_aControlHeadClick[ nC ] // control object GetBox cF := a[ 4 ] // control FieldName uF := mFieldGet(cF, ::cAlias) // FieldName value uV := oC:VarGet() // control value IF hb_IsChar(uV) IF ! trim(uF) == trim(uV) // изменено значение aAdd(aM, { cF, uV }) cN := '' IF cC == 'VALSTSK' // код страны cN := left(cC, len(cC)-1)+'N' ENDIF IF ! empty(cN) // данные наименований от кода n := ascan(::aKrt_Field, {|aX,nX| aX[1] == cN }) IF n > 0 j := ::aKrt_Field[ n ][2] // index o := _HMG_aControlHeadClick[ j ] // object f := ::aKrt_Field[ n ][4] // field aAdd(aM, { f, o:VarGet() }) // изменены ENDIF ENDIF ENDIF ELSE IF ! uF == uV // изменено значение aAdd(aM, { cF, uV }) ENDIF ENDIF NEXT IF ! empty(aM) dbSelectArea(::cAlias) IF mRLock() // save modify values mFieldPut(aM, , , .F.) ELSE // Lock error ::lPressBtn := .F. // завершили PressBtn MsgStop(upper(gTxt('#'+::cAlias+'_Kod'))+': '+R_1+' NOT SAVE !', ; 'Lock record error.') RETURN ENDIF ENDIF ENDIF FOR i := 1 TO k a := ::aKrt_Field[ i ] IF a[ 5 ] // { cNm, nNm, hNm, 'R_1' , .F., , , } cC := a[ 1 ] CONTROLREADONLY(a[ 3 ], .T.) // выключаем корректировку и CONTROLTABSTOP (a[ 3 ], .F.) // переход по TabStop IF ! a[ 6 ] == NIL; _SetBackColor( cC, ::cWnd, a[ 6 ] ) ENDIF IF ! a[ 7 ] == NIL; _SetFontColor( cC, ::cWnd, a[ 7 ] ) ENDIF ENDIF NEXT SetProperty(::cWnd, 'BTN_OK' , 'Visible', .F.) SetProperty(::cWnd, 'BTN_CANCEL', 'Visible', .F.) SetProperty(::cWnd, ::oBr1:cBrw , 'Enabled', .T.) CONTROLTABSTOP(::oBr1:hBrw, .T.) ::oBr1:Refresh() ::OnChange() _MdiWindowsActivate( ::hWnd ) ::oBr1:SetFocus() ::lSetKrtEdit := .F. // вышли из редактирования ::lPressBtn := .F. // завершили PressBtn RETURN [/pre2]

Andrey: Спасибо БОЛЬШОЕ за разъяснения !

Andrey: Как сделать запрет/разрешение на контекстном меню ? Вот так не проходит: MENUITEM "Включить показ удаленных записей" ACTION { || RecnoViewDel(.T.) } IF( M->nOperat # 101, DISABLED ) MENUITEM "Отключить показ удаленных записей" ACTION { || RecnoViewDel(.F.) } IF( M->nOperat # 101, DISABLED ) Выдает ошибку: Harbour 3.2.0dev (r1406261642) Copyright (c) 1999-2014, http://harbour-project.org/ Sel_DimHmg.prg(581) Error E0030 Syntax error "syntax error at '┬ъы■ўшЄ№ яюърч єфрыхээ√ї чряшёхщ'" Sel_DimHmg.prg(582) Error E0030 Syntax error "syntax error at '┬╬╤╤╥└═╬┬╚╥▄ єфрыхээє■ чряшё№'"

SergKis: Andrey ITEM 'Item 1' NAME Item_menu1 ACTION ... ... MENUITEM 'Item 1' NAME Item_menu1 ACTION ... ... функции (см. h_menu.prg): _DisableMenuItem ( ItemName , FormName ) _EnableMenuItem ( ItemName , FormName ) _CheckMenuItem ( ItemName , FormName ) _UncheckMenuItem ( ItemName , FormName )

Andrey: Не совсем понял как сделать в моем случае ? DEFINE CONTEXT MENU CONTROL oBrw_5 // для моего TBROWSE ..... SEPARATOR MENUITEM "Включить показ удаленных записей" ACTION ... NAME RecDelete_menu1 MENUITEM "Отключить показ удаленных записей" ACTION ... NAME RecDelete_menu2 END MENU IF M->nOperat # 101 _DisableMenuItem ( "RecDelete_menu1" , "oBrw_5" ) _DisableMenuItem ( "RecDelete_menu2" , "oBrw_5" ) ENDIF

SergKis: Andrey пишет:Не совсем понял как из MiniGui.chm: [pre2] SYNTAX DEFINE CONTEXT MENU CONTROL <cControlName>[ OF<cParentWindowName> ] MENUITEM <cItemCaption> ACTION <ActionProvedureName> | <bBlock> [ NAME <MenuItemName>] [ IMAGE <cImageName> ] [ CHECKED ] [ DISABLED ] [ MESSAGE <cMessage> ] ... ... [ SEPARATOR ] ... [/pre2] END MENU т.е. [pre2] IF M->nOperat # 101 MENUITEM "Включить показ удаленных записей" ACTION ... NAME RecDelete_menu1 DISABLED MENUITEM "Отключить показ удаленных записей" ACTION ... NAME RecDelete_menu2 DISABLED ELSE MENUITEM "Включить показ удаленных записей" ACTION ... NAME RecDelete_menu1 MENUITEM "Отключить показ удаленных записей" ACTION ... NAME RecDelete_menu2 ENDIF [/pre2] а функции применяешь на каких то событиях (нажатие кнопки, click, ...) oBrw_5 - это FormName или объект tsbrowse. должен быть FormName

SergKis: Andrey можно сделать все пункты disable, а в ON ININ после определения всех условий, для нужных сделать enable, (или наоборот) через функции и в местах изменения условия(установки) так же функциями сделать изменения

Andrey: SergKis пишет: oBrw_5 - это FormName или объект tsbrowse. должен быть FormName Спасибо БОЛЬШОЕ ! Разобрался. Ставил условие неправильное, из-за этого и не получалось у меня. SergKis пишет: ON ININ после определения всех условий, для нужных сделать enable, (или наоборот) Вот это самый лучший вариант !

Andrey: Нашел выражение при котором программа на МиниГуи вешается наглухо !!! cStroka := "Затрачено всего времени: " + SECTOTIME(SECONDS()-nTime + " !" ) И даже ошибки не выдает.

Haz: Andrey пишет: SECTOTIME(SECONDS()-nTime + " !" ) Andrey пишет: И даже ошибки не выдает. всеж ругается и правильно ругается тк к числу плюсуем строку Time from start: 0 days 0 hours 0 mins 0 secs<BR> Error BASE/1081 Argument error: +</p><BR>

petr707: Возможно, неудачно модифицирован ERRORSYS (или заменен при выполнении ERRORBLOCK ) и сообщения ошибок при выполнении не видны. Как вариант, иметь в софте вызов управляемого свала, типа этого или a:= "2"+2 для проверки системы сообщений. Вызов этой "ошибки" можно делать по "секретной" для юзеров клавише(кнопке) или в отладочном режиме выполнения софта.

Andrey: Haz пишет: всеж ругается и правильно ругается тк к числу плюсуем строку В моей системе не ругается вообще. Вешает прогу и все. Хотя исходников пока немного - 350Кб. petr707 пишет: Возможно, неудачно модифицирован ERRORSYS (или заменен при выполнении ERRORBLOCK ) и сообщения ошибок при выполнении не видны. Ничего не менял и не заменял.

Andrey: Как на МиниГуи сделать правильно индексацию БД с бегунком ? На локальном компе сделанная мною индексация БД работает нормально, а по сети вешается.... Причем на разных файлах. Кол-во файлов для индексации примерно 200 штук.

gfilatov2002: Andrey пишет: Как на МиниГуи сделать правильно индексацию БД с бегунком ? У меня работает такой пример (см.ниже) [pre]/* MINIGUI - Harbour Win32 GUI library Demo */ #include "minigui.ch" #include "dbstruct.ch" DECLARE WINDOW Form_PrgBar PROCEDURE Main filltable( 500 ) GO TOP DEFINE WINDOW Form1 ; AT 0 , 0 ; WIDTH 600 HEIGHT 400 ; TITLE "ProgressBar Demo" ; MAIN DEFINE BUTTON Button_1 ROW 20 COL 20 WIDTH 80 HEIGHT 28 CAPTION "Process 1" ACTION NtxCreate( FIELD(2), FIELD(2) ) DEFAULT .T. END BUTTON ON KEY ESCAPE ACTION ThisWindow.Release END WINDOW CENTER WINDOW Form1 ACTIVATE WINDOW Form1 RETURN /////////////////////////////////////////////////////////////////// FUNCTION NtxCreate( cField, cNtxName ) CreateProgressBar( "Create index " + cNtxName + "..." ) INDEX ON (cField) TO (cNtxName) EVAL NtxProgress() EVERY LASTREC()/10 Form_PrgBar.PrgBar_1.Value := 100 Form_PrgBar.Label_1.Value := "Completed 100%" // final waiting INKEYGUI(1000) CloseProgressBar() RETURN NIL /////////////////////////////////////////////////////////////////// FUNCTION NtxProgress() LOCAL nComplete := INT((RECNO()/LASTREC()) * 100) Form_PrgBar.PrgBar_1.Value := nComplete Form_PrgBar.Label_1.Value := "Completed "+ +HB_NTOS(nComplete) + "%" // refreshing INKEYGUI(100) RETURN .T. ////////////////////////////////////////////////////////////////////// FUNCTION CreateProgressBar( cTitle ) DEFINE WINDOW Form_PrgBar ; ROW 0 COL 0 ; WIDTH 428 HEIGHT 200 ; TITLE cTitle ; WINDOWTYPE MODAL ; NOSIZE ; FONT 'Tahoma' SIZE 11 @ 10,80 ANIMATEBOX Avi_1 ; WIDTH 260 HEIGHT 40 ; FILE 'filecopy.avi' ; AUTOPLAY TRANSPARENT NOBORDER @ 75,10 LABEL Label_1 ; WIDTH 400 HEIGHT 20 ; VALUE '' ; CENTERALIGN VCENTERALIGN @ 105,20 PROGRESSBAR PrgBar_1 ; RANGE 0,100 ; VALUE 0 ; WIDTH 380 HEIGHT 34 END WINDOW Form_PrgBar.Center Activate Window Form_PrgBar NoWait RETURN NIL ////////////////////////////////////////////////////////////////////// FUNCTION CloseProgressBar() Form_PrgBar.Release DO MESSAGE LOOP RETURN NIL ////////////////////////////////////////////////////////////////////// PROCEDURE filltable ( nCount ) LOCAL aDbf[11][4], i if !file('test.dbf') aDbf[1][ DBS_NAME ] := "First" aDbf[1][ DBS_TYPE ] := "Character" aDbf[1][ DBS_LEN ] := 20 aDbf[1][ DBS_DEC ] := 0 // aDbf[2][ DBS_NAME ] := "Last" aDbf[2][ DBS_TYPE ] := "Character" aDbf[2][ DBS_LEN ] := 20 aDbf[2][ DBS_DEC ] := 0 // aDbf[3][ DBS_NAME ] := "Street" aDbf[3][ DBS_TYPE ] := "Character" aDbf[3][ DBS_LEN ] := 30 aDbf[3][ DBS_DEC ] := 0 // aDbf[4][ DBS_NAME ] := "City" aDbf[4][ DBS_TYPE ] := "Character" aDbf[4][ DBS_LEN ] := 30 aDbf[4][ DBS_DEC ] := 0 // aDbf[5][ DBS_NAME ] := "State" aDbf[5][ DBS_TYPE ] := "Character" aDbf[5][ DBS_LEN ] := 2 aDbf[5][ DBS_DEC ] := 0 // aDbf[6][ DBS_NAME ] := "Zip" aDbf[6][ DBS_TYPE ] := "Character" aDbf[6][ DBS_LEN ] := 10 aDbf[6][ DBS_DEC ] := 0 // aDbf[7][ DBS_NAME ] := "Hiredate" aDbf[7][ DBS_TYPE ] := "Date" aDbf[7][ DBS_LEN ] := 8 aDbf[7][ DBS_DEC ] := 0 // aDbf[8][ DBS_NAME ] := "Married" aDbf[8][ DBS_TYPE ] := "Logical" aDbf[8][ DBS_LEN ] := 1 aDbf[8][ DBS_DEC ] := 0 // aDbf[9][ DBS_NAME ] := "Age" aDbf[9][ DBS_TYPE ] := "Numeric" aDbf[9][ DBS_LEN ] := 2 aDbf[9][ DBS_DEC ] := 0 // aDbf[10][ DBS_NAME ] := "Salary" aDbf[10][ DBS_TYPE ] := "Numeric" aDbf[10][ DBS_LEN ] := 6 aDbf[10][ DBS_DEC ] := 0 // aDbf[11][ DBS_NAME ] := "Notes" aDbf[11][ DBS_TYPE ] := "Character" aDbf[11][ DBS_LEN ] := 70 aDbf[11][ DBS_DEC ] := 0 DBCREATE("test", aDbf) endif if select('test') == 0 dbusearea(.t.,,'test') endif for i := 1 to nCount append blank replace first with 'first' + str(i) replace last with 'last' + str(i) replace street with 'street' + str(i) replace city with 'city' + str(i) replace state with chr( HB_RANDOMINT( 65,90 ) ) + chr( HB_RANDOMINT( 65,90 ) ) replace zip with alltrim( str( HB_RANDOMINT( 9999 ) ) ) replace hiredate with date() - 20000 + i replace married with ( HB_RANDOMINT() == 1 ) replace age with HB_RANDOMINT( 99 ) replace salary with HB_RANDOMINT( 10000 ) replace notes with 'notes' + str(i) next i RETURN[/pre]

Andrey: gfilatov2002 пишет: У меня работает такой пример (см.ниже) Посмотрел код, я также делаю. Единственно добавлен у меня еще один бегунок по общему кол-ву файлов. Буду переделывать тогда этот код. О результатах сообщу. Спасибо большое за помощь !

Andrey: gfilatov2002 пишет: У меня работает такой пример (см.ниже) Сделал тест на базе этого примера - https://cloud.mail.ru/public/fb23fc2d8f87%2FPROGRESSBAR_4.7z По сети работает без ошибок ! Единственно что не смог сделать - это корректное прекращение индексации по крестику. Подскажите пожалуйста как это сделать ?

Dima: Andrey пишет: Единственно что не смог сделать - это корректное прекращение индексации по крестику Если оборвать индексацию файла , то индекс будет битым или я чего не понял.... PS Пример не смотрел.

Andrey: Dima пишет: Если оборвать индексацию файла , то индекс будет битым или я чего не понял.... Подождать пока не закончится индексация этого файла, а остальные прервать.

gfilatov2002: Andrey пишет: Подождать пока не закончится индексация этого файла, а остальные прервать. Посмотри, как прерывается цикл в примере из папки samples\Basic\StopWatch и попробуй использовать эту идею в цикле индексации

Andrey: gfilatov2002 пишет: Посмотри, как прерывается цикл в примере из папки samples\Basic\StopWatch Идея понятна, спасибо ! Пример исправил - https://cloud.mail.ru/public/1b3427b9e886%2FPROGRESSBAR_4a.7z А как по крестику отловить нажатие мышки ? Там в функции CreateDualProgressBar() окно модальное, не знаю как сделать обработку.

gfilatov2002: Andrey пишет: как по крестику отловить нажатие мышки ? Попробуй использовать для этого событие ON INTERACTIVECLOSE

Andrey: gfilatov2002 пишет: Попробуй использовать для этого событие ON INTERACTIVECLOSE Я и поставил его туда уже ! Не собирается исходник !!! См. пример выше !

SergKis: Andrey вот так собирает:[pre2] DEFINE WINDOW Form_2Index ; ROW 0 COL 0 ; WIDTH 455 HEIGHT 320 ; TITLE cTitle ; MODAL NOSIZE ; ON INTERACTIVECLOSE MyExitIndex() ; FONT 'Tahoma' SIZE 12 [/pre2] MyExitIndex() - должен возвращать .T./.F. для ON INTERACTIVECLOSE, определи lExit - она NIL

gfilatov2002: Andrey пишет: См. пример выше Попробуй изменить так: [pre2] DEFINE WINDOW Form_2Index ; ROW 0 COL 0 ; WIDTH 455 HEIGHT 320 ; TITLE cTitle ; /*WINDOWTYPE*/ MODAL ; NOSIZE ; FONT 'Tahoma' SIZE 12 ; ON INTERACTIVECLOSE { || MyExitIndex() } [/pre2]

Andrey: SergKis пишет: MyExitIndex() - должен возвращать .T./.F. для ON INTERACTIVECLOSE, определи lExit - она NIL Это я просто сократил уже после проб. Просмотрел. Первоначально было: lExit := MsgYesNo( cMsg, "Exit", .T. ) IF lExit

Andrey: Все теперь собирается, а прерывать индексацию не получается ! Вылетает программа: Error MGERROR/0 Window: Form_2Index is not defined. Program terminated. Called from MSGMINIGUIERROR(72) Called from DOMETHOD(4648) Called from CLOSEDUALPROGRESSBAR(336) Called from NTXCREATE100(191) Вот исправленный исходник - https://cloud.mail.ru/public/5a291a67d2e6%2FPROGRESSBAR_4b.7z

gfilatov2002: Andrey пишет: Вылетает программа Попробуй изменить функцию так: [pre2] FUNCTION CloseDualProgressBar() if iswindowdefined(Form_2Index) Form_2Index.Release endif DO MESSAGE LOOP RETURN NIL [/pre2]

Andrey: gfilatov2002 пишет: Попробуй изменить функцию так: Один раз работает, Окно MsgInfo("Нажата отмена индексации !") не выводит. И на третий раз при отказе - сваливается !!! Error MGERROR/0 Control: PrgBar_1 Of Form_2Index Not defined. Program terminated. Called from MSGMINIGUIERROR(72) Called from SETPROPERTY(3662) Called from NTXDUALPROGRESS(212) Может вообще убрать этот крестик закрытия окна ?

gfilatov2002: Andrey пишет: Может вообще убрать этот крестик закрытия окна ? Вероятно, это лучший вариант - не будет соблазна нажать Или попробуй использовать класc NOAUTORELEASE

Andrey: Ну тогда окончательный вариант - http://file.qip.ru/file/SOZpSDp3/demo2en.html Можно размещать в библиотеке. По сетке работает без ошибок и очень шустро !

Andrey: Можно ли пример MiniGUI\SAMPLES\Applications\SendMail переделать для отправки по почте mail.ru или yandex.ru ? То есть исправить для протокола SSL ? Там используется oSocket := TSMTP():New()

gfilatov2002: Andrey пишет: То есть исправить для протокола SSL ? Нет, поскольку класс TSMTP не поддерживает SSL Поддержка SSL есть только в библиотеке HBTIP в связке с библиотекой HBSSL. Также потребуются две доп.библиотеки из поставки OpenSSL (инсталлятор Win32OpenSSL_Light-1_0_0g.exe). Итого команда сборки выглядит так: hbmk2 -lhbtip -lhbssl -llibeay32 -lssleay32 mail.prg Пример отправки почты выглядит так: [pre] #require "hbssl" #require "hbtip" REQUEST __HBEXTERN__HBSSL__ #include "simpleio.ch" PROCEDURE Main( cFrom, cPassword, cTo ) IF ! tip_SSL() ? "Error: Requires SSL support" wait RETURN ENDIF hb_default( @cFrom , "test@yandex.ru" ) hb_default( @cPassword, "parol" ) hb_default( @cTo , "mail@mail.ru" ) ? hb_SendMail( ; "smtp.yandex.ru", ; 465, ; cFrom, ; cTo, ; NIL /* CC */, ; {} /* BCC */, ; "It is a test message", ; "It is a test subject", ; NIL /* attachment */, ; cFrom, ; cPassword, ; "", ; NIL /* nPriority */, ; NIL /* lRead */, ; .T. /* lTrace */, ; .F., ; NIL /* lNoAuth */, ; NIL /* nTimeOut */, ; NIL /* cReplyTo */, ; .T. ) wait RETURN[/pre] Вот такие дела

Dima: gfilatov2002 пишет: Вот такие дела И еще возможно придется ставить пакет Visual C++ Redistributables вот от сюда http://slproweb.com/products/Win32OpenSSL.html У меня прога падала c ошибкой 0xc015002 ,пока его не установил.

Andrey: Dima пишет: И еще возможно придется ставить пакет Visual C++ Redistributables вот от сюда Это для компиляции, или для каждого клиента (юзера) где стоит программа ?

Dima: Andrey пишет: для каждого клиента (юзера) где стоит программа ? Для каждого , ну если Винда не обновляется конечно. Проверять надо.

Andrey: Меня тут спрашивают: Просто я хочу сделать чтоб По клику на объекте IMAGE запускался браузер и открывалась указанная страгичка в Интернете . Наподобие HYPERLINK ..... Вот как я сделал у себя: DEFINE IMAGE Image_MiniGUI Row 5 Col 5 WIDTH 50 HEIGHT 50 PICTURE "MINIGUI" ACTION ShellExecute( 0, "open", "http://hmgextended.com/" ) OnMouseHover RC_CURSOR( "MINIGUI_FINGER" ) END IMAGE

Andrey: Andrey пишет: Ну тогда окончательный вариант - http://file.qip.ru/file/SOZpSDp3/demo2en.html Можно размещать в библиотеке. По сетке работает без ошибок и очень шустро ! По поводу этого алгоритма. Переделал индексацию своих баз из хХарбора 1.2.3 под МиниГуи. У меня индексируется 208 баз. Время локальной индексации, на одном компе: под хХарбором 1 мин. под МиниГуи 3.5 мин. По сетке времени еще больше затрачивается: под хХарбором 3 мин. под МиниГуи 13 мин. Вот что значит красоту (авишку и бегунок) наводить... Да и еще INKEYGUI увеличивает время индексации. Надо бы как то ускорить это дело, не гоже юзеру ждать... Не знаю где то читал, что средний пользователь может ожидать отклика от программы в среднем менее 2х минут, потом начинает нервничать...

Dima: Andrey пишет: Вот что значит красоту (авишку и бегунок) наводить... Красота требует жертв Andrey пишет: Да и еще INKEYGUI увеличивает время индексации. Может в нем таймаут уменьшить........?

Haz: Andrey пишет: Надо бы как то ускорить это дело, Андрей, в NtxProcess незачем выводить каждое значение nComplete . Нужно только измененное т.к. экранный вывод и в консоли и в гуи операция не быстрая У себя делаю примерно так Static n := 0 nComplete := INT((RECNO()/LASTREC()) * 100) IF n <> nComplete n := nComplete cRecno := "(" + HB_NTOS(RECNO()) + "/" + HB_NTOS(LASTREC()) + ") - " Form_Index.PrgBar_1.Value := nComplete Form_Index.Label_1.Value := "Completed " + cRecno + HB_NTOS(nComplete) + "%" END ЗЫ и не пойму зачем там INKEYGUI

Andrey: Haz пишет: ЗЫ и не пойму зачем там INKEYGUI Без него PROGRESSBAR не отображается правильно !

Haz: Andrey пишет: Без него PROGRESSBAR не отображается правильно ! всегда без него делаю вот кусок кода IF Int((i)/(nRecCount)*100) <> nGauge nGauge := Int((i)/(nRecCount)*100) SetProperty("WList", "ProgressBar_MT", "Value", nGauge ) END processMessages() правда использую DO EVENTS ( оно же processMessages() ) может в этом дело ?

Andrey: Haz пишет: вот кусок кода IF Int((i)/(nRecCount)*100) <> nGauge Чему равно nGauge ?

PSP: Haz пишет: правда использую DO EVENTS ( оно же processMessages() ) может в этом дело ? Конечно в этом

gfilatov2002: Andrey пишет: У меня индексируется 208 баз. Не пойму, зачем периндексировать такое количество баз при старте программы Для этого должен быть отдельный режим переиндексации ВСЕХ баз

Haz: Andrey пишет: Чему равно nGauge ? это статик переменная для отлова изменения целого процента. На большой базе , к примеру 1 000 000 записей значение выражения INT( Recno()/RecCount()*100) будет меняться только через каждые 10 000 записей. Совершенно бесполезно 10 000 раз обновлять прогрессбар одним и тем же значением, это только лишний тормоз.

Andrey: gfilatov2002 пишет: Не пойму, зачем периндексировать такое количество баз при старте программы Для этого должен быть отдельный режим переиндексации ВСЕХ баз Да это и есть мой режим переиндексации ВСЕХ моих баз. Неправильно выразился...

Andrey: Haz пишет: вот кусок кода IF Int((i)/(nRecCount)*100) <> nGauge nGauge := Int((i)/(nRecCount)*100) SetProperty("WList", "ProgressBar_MT", "Value", nGauge ) END processMessages() Тогда может так нужно было написать ? nGauge := Int((i)/(nRecCount)*100) IF Int((i)/(nRecCount)*100) <> nGauge SetProperty("WList", "ProgressBar_MT", "Value", nGauge ) END

Haz: Andrey пишет: Тогда может так нужно было написать ? нет не нужно тогда nGauge всегда будет равно Int((i)/(nRecCount)*100) и в тело IF не войдет никогда. в моем варианте изначально nGauge = 0 и как только Int((i)/(nRecCount)*100) станет равно 1% условие IF Int((i)/(nRecCount)*100) <> nGauge выполнится, в теле IF этот 1% присвоится новым значением в nGauge и все сначала пока не тикнет 2%. Переменная nGauge - STATIC переменная и сохраняет свое значение между вызовами функции. По завершении прогрессбара nGauge останется 100 , но при повторном вызове функции 0% <> 100 и все повториться PS для простоты в примере i следует рассматривать как Reno() а nRecCount - RecCount() соответственно

Andrey: Dima пишет: Может в нем таймаут уменьшить........? Убрал совсем INKEYGUI(), собираю теперь с ключом -mt ! AVI-ка не тормозит, бегунки красиво (до конца) не доходят. Зато быстро стало, аж меньше минуты.

Dima: Andrey пишет: Убрал совсем INKEYGUI(), собираю теперь с ключом -mt ! Не вижу связи ключа -mt и тормоза что был. Думаю без него будет так же работать. Попробуй.

Andrey: Dima пишет: Не вижу связи ключа -mt и тормоза что был. Думаю без него будет так же работать. Попробуй. Работать будет, АВИшка подвисать будет.

Andrey: Столкнулся с еще одной непоняткой, вот картинка: На рис.1 окно создано с флагом Form_Dim.Sizable := .T. // разрешить растягивание окна Когда перехожу в режим редактирования справочника делаю Form_Dim.Sizable := .F. // NOSIZE - запретить растягивание окна ! Результат на рис.2 - изображение на окне делает "прыг" и справа и снизу появляется свободная область окна Как убрать эту свободную область ? Или можно делать как то по другому ?

Andrey: Это что-то TBROWSE "скачет" .... Сделал после смены режима пересчет окна TBROWSE и все нормально стало...

gfilatov2002: Andrey пишет: Может можно вычислить ЭТОТ дурацкий отступ ? Отступ по вертикали - GetBorderHeight() Отступ по горизонтали - GetBorderWidth() Пробуй

Andrey: gfilatov2002 пишет: Пробуй Спасибо, попробую !!!

Andrey: Привет всем ! Подскажите пожалуйста, как на свою форму вывести всплывающее окно ? Примерно как в примере \MiniGUI\SAMPLES\Advanced\TrayBalloon_2

Andrey: Как убрать в окне ТОЛЬКО элемент закрытия окна [x] ?

gfilatov2002: Andrey пишет: Как убрать в окне ТОЛЬКО элемент закрытия окна [x] ? Попробуй SetProperty( ThisWindow.Name, 'Closable', .F. )

Andrey: gfilatov2002 пишет: Попробуй SetProperty( ThisWindow.Name, 'Closable', .F. ) Спасибо БОЛЬШОЕ !!! А как насчет предыдущего вопроса ? Есть такой пример или нет ?

Andrey: Использую функции GetIni() и WriteIni() для работы с ини-файлами. Как хранить массив в ини-файле ? И как тогда его записывать/считывать ? Типа: Color_1 = {11048235,6174208} Можно конечно массив держать как строку с разделителем Color_1 = 11048235;6174208 и считывать её как aDim := HB_ATOKENS( GetIni( cSection , "Color_1" , "", cFileConfig ) ,";", .T. ) // массив Но тогда массив будет строковый ! А нужно числовой !!! И еще замечание массив должен быть ВСЕГДА однородным, а бывают случаи что нужно содержать - число, строку и вложенный массив. Как быть ? Поделитесь своим опытом.

Dima: Andrey Сохранить можно так в INI hb_Valtoexp(massiv) а восстановить , считываем из INI этот параметр в переменную C:=&Переменная

Andrey: Dima пишет: Сохранить можно так в INI Спасибо БОЛЬШОЕ !!! Облегчил ты мне работу ! aDim := {11048235,6174208,12856,"test",{"dim"}, "test2" } WriteIni( cSection, "Color_1" , hb_Valtoexp(aDim), cFileConfig ) aDim := &( GetIni( cSection , "Color_1" , '{}', cFileConfig ) ) // массив А как записать блок кода в ини-файл ?

Dima: hb_Valtoexp тут не поможет так как не допилили его в плане блоков. делай так. c:={|x| x+1} а вот так пиши в ini '{|x| x+1}' , на вскидку более красивого решения пока не вижу.

Andrey: Борьба с огромными шрифтами у себя в программе ! Юзера иногда ставят у себя на компе в системе увеличенный шрифт 120 точек на дюйм или выше. Из-за этого у меня в программе шрифты вылазиют за кнопки, а то и обрезаются названия кнопок и т.д. Как определить какой шрифт установлен в системе: обычный или увеличенный ? Вот примерно так выглядит программа:

Marquis031: http://clipper.borda.ru/?1-20-0-00000523-000-0-0-1114701644

Andrey: Marquis031 пишет: http://clipper.borda.ru/?1-20-0-00000523-000-0-0-1114701644 То что нужно ! Спасибо !

Haz: Зависает TSBROWSE Никак не могу понять где проблема ... Если создать TSBROWSE с количеством колонок примерно 300 в режимеCELL ( GRID ) и гонять его курсор вправо -влево до упора ( нажать стрелку на клавиатуре и держать ), то бровс перестает перерисовывать весь экран, рисует только текущую строку и начинает грузить проц под 100%. При этом задача имеет все признаки зависа . Как бороться с этой не пойму. Складывается впечатление что бровс не успевает отрабатывать нажатие клавиш и мрет Отдельные нажатия на стрелки отрабатывает отлично , виснет только если нажать и держать. Видимо нужна временная задержка , а вот куда ее сунуть не знаю. Мож есть у кого мысли, как победить PS. Вариант не давить на стрелки - отпадает, т.к. пользователям на это пофиг вот пример на всякий случай, собирается с hbsqldd.lib #include "minigui.ch" #include "tsbrowse.ch" #include "common.ch" REQUEST SQLMIX Procedure Main() Public oBrw1 DEFINE WINDOW Form1 ; AT 0,0 ; WIDTH (RR_GetDesktopArea()[4] * 0.99) ; HEIGHT (RR_GetDesktopArea()[3] * 0.91) ; TITLE "TsBrowse Array Bug Test" ; MAIN ; FONT 'Tahoma' SIZE 9 Test() END WINDOW Form1.Center Form1.ACTIVATE Return *-------------------------------------------------------------- Function Test() local i := 0 local j := 0 Local aStr := {} local cAlias := "TEST" local cBrw := "BRW" local aField := {} PUBLIC &cBrw FOR j := 1 TO 300 AADD( aStr, {"F_" + NTOC(j) , "N", 14, 2 }) END rddSetDefault( "SQLMIX" ) dbCreate( cAlias, aStr,, .T., cAlias ) FOR i := 1 TO 100 (cAlias)->(DbAppend()) FOR j := 1 TO 300 (cAlias)->(FieldPut(j, i*j)) END END rddSetDefault( "SQLMIX" ) DEFINE TBROWSE &cBrw At 50, 5 ALIAS cAlias ; OF Form1 ; WIDTH (Form1.Width - 20) ; HEIGHT (Form1.Height - 70) ; COLORS { CLR_BLACK, CLR_BLUE } ; FONT "MS Sans Serif" ; SIZE 8 ; CELL; SELECTOR .T. END TBROWSE &cBrw:LoadFields( FALSE ) Return Nil

gfilatov2002: Haz пишет: Видимо нужна временная задержка , а вот куда ее сунуть не знаю. Игорь, Попробуй пример ниже - возможно, поможет [pre2]#include "minigui.ch" #include "tsbrowse.ch" REQUEST SQLMIX Procedure Main() DEFINE WINDOW Form1 ; AT 0,0 ; WIDTH (RR_GetDesktopArea()[4] * 0.99) ; HEIGHT (RR_GetDesktopArea()[3] * 0.91) ; TITLE "TsBrowse Array Bug Test" ; MAIN ; FONT 'Tahoma' SIZE 9 END WINDOW Test() Form1.Center Form1.ACTIVATE Return *-------------------------------------------------------------- Function Test() local i := 0 local j := 0 Local aStr := {} local cAlias := "TEST" local cBrw := "BRW" PUBLIC &cBrw FOR j := 1 TO 300 AADD( aStr, {"F_" + NTOC(j) , "N", 14, 2 } ) NEXT rddSetDefault( "SQLMIX" ) dbCreate( cAlias, aStr,, .T., cAlias ) FOR i := 1 TO 100 (cAlias)->( DbAppend() ) FOR j := 1 TO 300 (cAlias)->( FieldPut(j, i*j) ) NEXT NEXT rddSetDefault( "SQLMIX" ) DEFINE TBROWSE &cBrw ; At 20, 5 ; ALIAS cAlias ; OF Form1 ; WIDTH (Form1.Width - 20) ; HEIGHT (Form1.Height - 70) ; COLORS { CLR_BLACK, CLR_BLUE } ; FONT "MS Sans Serif" ; SIZE 8 ; CELL; SELECTOR .T. END TBROWSE &cBrw:LoadFields( FALSE ) FOR i := 1 TO LEN(&cBrw:aColumns) &cBrw:aColumns[ i ]:bGotFocus := {|| ProcessMessages()} NEXT Return Nil[/pre2]

Haz: gfilatov2002 пишет: Попробуй пример ниже - возможно, поможет К сожалению не помогает , и по bLostFocus и по bOnChange уже пихал ( ProcessMessages(), SysRefresh(), Millisec(100 ) и пр ) где-то затык , уменя бровс помирает примерно на 60 -63 колонке при скроле в право. Помогает только одно , ДО достижения колонки 60 успеть отжать клавишу стрелка вправо и можно держать еще 60 колонок Понимаю что бессмысленно туда сюда гонять курсор, но уверен что пользователи будут кричать что без этого никак и главное - процесс зависает так что только через диспетчер задач рубится То что что-то с задержкой - понял по запущенному RemoteDesktop , когда он работает - есть у клавиатуры "инерционность" когда он запущен то кнопки отрабатывают с опозданием типа палец отжал, а оно еще двигается зато бровс не виснет

gfilatov2002: Haz пишет: есть у клавиатуры "инерционность" В таком случае попробуй уменьшить частоту повтора символа при нажатии клавиш в настройках Винды

Haz: gfilatov2002 пишет: В таком случае попробуй уменьшить частоту повтора символа при нажатии клавиш в настройках Винды Это помогает , хоть и напрягает тормоз И НЕКРАСИВОСТЬ РЕШЕНИЯ но НЕ ВИСНЕТ. Можно как то это из программы сделать ?

gfilatov2002: Haz пишет: Можно как то это из программы сделать ? Настройка параметров клавиатуры Формат команды: mode CON: RATE=r DELAY=d Параметры: CON: — указание команде MODE, что она должна настраивать параметры клавиатуры; R АТЕ=d — задание частоты повтора символов после того, как нажатая клавиша клавиатуры удерживается пользователем. Значения параметра d лежат в пределах от 1 до 32. Это соответствует примерно частоте повторения от 2 до 30 символов в секунду. По умолчанию частота повтора установлена равной 20 для клавиатур, совместимых с клавиатурой машин IBM PC/AT, и равной 21 для клавиатур, совместимых с клавиатурой компьютера IBM PS/2. При задании в команде MODE частоты повторения символов необходимо указывать и задержку перед их повтором; DELAY=d — указание времени задержки перед повтором символов после нажатия клавиши. Этот параметр может быть равным следующим числам: 1, 2, 3 и 4. Приведенные значения задержки примерно соответствуют 0.25, 0.50, 0.75 и 1-секундной задержке соответственно. Пример использования: mode con: delay=2 rate=3 После выполнения этой команды для клавиатуры устанавливаются следующие характеристики: - частота повтора символов — 10 символов в секунду; - задержка перед автоповтором — 0.5 с. Общие примечания к команде MODE: В команде MODE при изменении кодовых страниц дисплея не допускается использовать кодовую таблицу, назначенную драйверу DISPLAY.SYS, если он подключен к ОС в файле CONFIG.SYS. Команду MODE в различных вариантах очень удобно использовать в файле AUTOEXEC.BAT для изменения параметров работы устройств вашего компьютера при загрузке ОС.

Dima: KBDSPEED([<nDelay>], [<nFrequency>]) --> lAmended Не ? ;) Упс...она не реализована.

Haz: Dima пишет: KBDSPEED([<nDelay>], [<nFrequency>]) Дим привет. не нашел где живет эта функция , есть похожая NF_SetRate() в hbnf.lib но внутри нее только для OS_DOS по любому это заплатка , проблема кроется в классе TSBROWS который судя по всему не успевает отработать автоповтор клавиш про скроллинге по горизонтали и где-то затыкается. Мне бы это "где-то" найти , попробую с внутренним методом :KeyDown() поколдовать

Dima: Haz пишет: не нашел где живет эта функция Это HBCT Ранее юзал ее в Clipper

Haz: mode CON: RATE=r DELAY=d Григорий спасибо. Работает буду иметь ввиду как вариант "Б"



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