Форум » 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

gfilatov2002: Andrey пишет: Взялся смотреть примеры из МиниГуи, так не все работают Andrey пишет: \MiniGUI\SAMPLES\Advanced\AVI_Animation - не работает под Win7 Посмотрю, что можно сделать... Andrey пишет: Пример: \MiniGUI\SAMPLES\Advanced\Tsb_filter - вылетает на ХР Похоже, у Вас есть некорректно установленные программы Но все равно попробую поправить... Andrey пишет: Пример: \MiniGUI\SAMPLES\BASIC\MsgEdit - не собирается Устаревшая информация! Проверьте на текущей версии 2.0.3 - дата файла demo.prg должна быть 11.10.2011

Andrey: Пример: \MiniGUI\SAMPLES\Advanced\Tsb_filter - в версии 2.0.3 работает ! Классный пример ! Хочу также и для хХарбора !!! gfilatov2002 пишет: Устаревшая информация! Проверьте на текущей версии 2.0.3 - дата файла demo.prg должна быть 11.10.2011 Точно в версии 2.0.3 работает ! Классный пример ! Остался \MiniGUI\SAMPLES\Advanced\AVI_Animation И еще: Можно ли добавить еще один пример с отдельным AVI-файлом в ресурсах проекта и показом такого же бегунка ?

gfilatov2002: Andrey пишет: Остался \MiniGUI\SAMPLES\Advanced\AVI_Animation Переработал этот пример: - avi-файл хранится в ресурсах проекта; - элемент управления ANIMATERES определен как пользовательский компонент и теперь его можно вызвать из своей программы, подключив в нее файл animate.prg


Andrey: Пример: \MiniGUI\SAMPLES\BASIC\Menu_2>demo2.exe Выглядит так: Как сделать чтоб само меню было с левой стороны ?

Andrey: Столкнулся с непоказом иконки на форме. Какой максимальны размер иконки можно выводить ? Если использую одну иконку 128х128 в ICO-файле и записываю ее в ресурсный файл, то не показывает. Как можно выводить из ICO-файла конкретную иконку, т.е. нужно допустим 128х128 ? Может я чего то не понимаю, объясните мне пожалуйста как происходит показ иконок из ресурсов. Заранее спасибо.

PSP: Если не ошибаюсь, то набор размеров для винды такой: 256х256, 48х48, 32х32 и 16х16. 128х128 используется в Mac OS. Винда сама выбирает размер в зависимости от того, в каком месте интерфейса рисуется иконка. Если нужного размера нет, то ничего и не нарисует. Имхо.

Andrey: PSP пишет: 128х128 используется в Mac OS. Т.е. если я использую одну иконку 128х128 в ICO-файле и записываю ее в ресурсный файл, то при показе ICO на форме ничего показываться не будет ?

PSP: http://www.allok.ru/?id=10

Andrey: PSP Спасибо большое !

Andrey: Вопрос по примеру samples\Advanced\MenuEx По хелпу читал, так и не понял. Как задать шрифт (по умолчанию он 10) в верхнем меню программы ?

Softlog86: Andrey По моему эти вопросы решает сама Винда ....

Andrey: Softlog86 пишет: По моему эти вопросы решает сама Винда .... А почему тогда можно увеличить и изменить шрифт в ниспадающем меню ? Значит можно увеличить и шрифт верхнего меню программы ! Но вот только как ?

gfilatov2002: Andrey пишет: Значит можно увеличить и шрифт верхнего меню программы http://windows.microsoft.com/ru-RU/windows7/Change-Windows-fonts

Andrey: Судя по ссылке, программно (из МиниГуи) никак ! Очень жалко... Спасибо за терпение....

vovchok: Andrey Кажись я таки нашел Вас... Это Ваш пример? У меня пара ламерских вопросов (потому как клиппером 17 лет не занимался и основательно забыл его). Скачал MiniGUI с того поста, но скомпилировать вышеупомянутый пример так и не удалось - ругается "unresolved external _hd_fun_adosettable_" и "unresolved external _hd_fun_adordd_". Добавил #include "c:\MiniGUI\Harbour\lib\adordd.lib" - прежние ошибки при компиляции сменились кучей ошибок c:\MiniGUI\Harbour\lib\adordd.lib(1) Error E0001 Illegal character '\x00' и в конце c:\MiniGUI\Harbour\lib\adordd.lib(1) Error E0030 Syntax error "syntax error at 'Ё'" Еще одна проблема - взял пример tutor20.prg из того же MiniGUI и наткнулся на невозможность включить 866 кодировку, в которой почему-то работает Excel с файлами dbase4. Получается, что то, что в dbf занесено в Excel не читабельно в BROWSE от Harbour и наоборот. Вставлял REQUEST HB_CODEPAGE_RU866 после #include и hb_SetCodepage( "RU866" ) после main - никакой реакции: ни на что не ругается но выдает всю кирилицу в 1251. Как победить?

AlexMyr: vovchok пишет: Скачал MiniGUI с того поста, но скомпилировать вышеупомянутый пример так и не удалось - ругается "unresolved external _hd_fun_adosettable_" и "unresolved external _hd_fun_adordd_". Minigui тут ни причем! Чистый harbour. Попробуйте тот же пример, только без adordd и создания базы access, а просто база dbf [pre2]REQUEST HB_LANG_RUWIN REQUEST HB_CODEPAGE_RU1251 Function Main() Local nI:=45, nK:=32 // - объявление переменных hb_SetCodepage( "RU1251" ) // - переключение на русскую кодировку (доступны и др.языки, со всеми сортировками, датами и .д.) DbCreate( "test2", { { "FIRST", "C", 10, 0 },; { "LAST", "C", 10, 0 },; { "AGE", "N", 8, 0 } } ) // - создать таблицу USE test2 // - открыть таблицу APPEND BLANK // - добавить запись в таблицу test2->First := "Вася" // - запись в поле test2->Last := "Сидоров" test2->Age := nI APPEND BLANK test2->First := "Коля" test2->Last := "Пупкин" test2->Age := nK GO TOP // переместить указатель на первую запись в таблице Browse() // показать таблицу со всеми записями..... return nil[/pre2]

vovchok: Попробуйте тот же пример, только без adordd и создания базы access, а просто база dbf Что-то все равно не то... В процессе компиляции не ругается, но созданный EXEшник зависает в памяти ничего не выдавая на экран (видимо Browse() глючит) и его приходится снимать принудительно. Кроме того созданная база выглядит в Excel таким образом (крякозябы) FIRST LAST AGE ┬рё  ╤шфюЁют 45 ╩юы  ╧єяъшэ 32 А все потому, что кирилица в DBF в понимании мелкософтов должна быть в кодировке 866, а не 1251. Но включить 866 не получается - как это сделать? Minigui тут ни причем! Чистый harbourMiniGUI - это виндовый оконный интерфейс, а чистый Harbour работает лишь с системной консолью? Что же все-таки должна выдавать функция Browse()?

AlexMyr: Вот рабочий пример, проверил func main() Local nI:=45, nK:=32 // - объявление переменных REQUEST HB_CODEPAGE_RU1251 REQUEST HB_CODEPAGE_RU866 HB_CDPSELECT( "RU866" ) // - переключение на русскую кодировку (доступны и др.языки, со всеми сортировками, датами и .д.) DbCreate( "test2", { { "FIRST", "C", 10, 0 },{ "LAST", "C", 10, 0 },{ "AGE", "N", 8, 0 } } ) // - создать таблицу USE test2 // - открыть таблицу APPEND BLANK // - добавить запись в таблицу test2->First := "Вася" // - запись в поле test2->Last := "Сидоров" test2->Age := nI APPEND BLANK test2->First := "Коля" test2->Last := "Пупкин" test2->Age := nK GO TOP // переместить указатель на первую запись в таблице Browse() // показать таблицу со всеми записями..... return nil вот browse [pre2]╒═════════════════════════════════════════════════════════════════════ │ Record 1/2 │ FIRST LAST AGE ╞══════════════════════════════════ ══════════ ═══════════════════════ │ Вася Сидоров 45 │ Коля Пупкин 32 │ │ │ │[/pre2]

Andrey: vovchok пишет: Скачал MiniGUI с того поста Какая версия ? vovchok пишет: MiniGUI - это виндовый оконный интерфейс, а чистый Harbour работает лишь с системной консолью? Harbour работает везде - и в МиниГуи и Qt и в терминалке. Это язык программирования. Более подробно читайте: http://ru.wikipedia.org/wiki/Harbour Почитайте также как установить: http://clipper.borda.ru/?1-4-0-00000515-000-0-0-1267900828 А потом напишите - какую задачу вы хотите сделать: терминалку под Win32 или полноценное приложение Win32 на МиниГуи ?

AlexMyr: Andrey пишет: Harbour работает везде - и в МиниГуи это как?

vovchok: Чувствую себя в танке в башне и в шлемофоне... AlexMyr пишет:Вот рабочий пример, проверил Эффект все тот же - Browse() не работает и вешает программу с блокировкой базы. Пробовал запускать в системной консоли - результат не меняется - на экран вообще ничего не выводится, а в диспетчере задач висит процесс с именем проги и блокирует базу. Когда Browse() комментирую - создает файл без зависания, но все с теми же крякозябами. Видимо Harbour у Вас не такой, как у меня. Andrey пишет:Какая версия ? не знаю где это посмотреть - файл hmg-1.7-79-setup.zip, BCC55 Andrey А почему с базами Access у меня в Вашем примере не получается ничего?

AlexMyr: vovchok пишет: не знаю где это посмотреть - файл hmg-1.7-79-setup.zip, BCC55 Ищите папку harbour/bin потом команда harbour -build результат сюда. Начните лучше с Harbour http://sourceforge.net/projects/harbour-project/files/binaries-windows/3.0.0/harbour-3.0.0-win.exe/download

vovchok: AlexMyr пишет: Ищите папку harbour/bin потом команда c:\MiniGUI\Harbour\bin>harbour -build Harbour 2.0.0 (Rev. 13372) Copyright (c) 1999-2010, http://www.harbour-project.org/ Harbour MiniGUI Extended Distribution AlexMyr пишет: Начните лучше с Harbour Это я тоже разворачивал и harbour-nightly-win (3.1), но хотел выполнить пример Андрея, а оно не дается мне никак - вот и взял его же дистрибутив из поста с примером. К тому же в том пакете MiniGUI есть пакетники для компиляции, а в чистом Harbour я их не обнаружил... Хотя может плохо искал... Кстати примеры, которые в том MiniGIU компилируются и выполняются без проблем, довольно таки поучительно, если что-то писать под винды.

AlexMyr: В harbour есть утилита hbmk2, ее и используете для сборки prg в exe: Допустим мой пример, имя файла test1.prg, выполняете комманду: hbmk2 test1.prg, должно получиться test1.exe, никаких батников не нужно.

vovchok: AlexMyr пишет: выполняете комманду: hbmk2 test1.prg, должно получиться test1.exe Выполнил на HB31 - заработало в системной консоли, но крякозябы все равно и в окне программы и в Excel. REQUEST HB_CODEPAGE_RU866 HB_CDPSELECT( "RU866" ) не работает

AlexMyr: Я давал пример в дос кодировке, потому у меня и выбирается дос кодировка HB_CDPSELECT( "RU866" ), если Вы скопировали текст с форума и вставили его в редактор в вин кодировке, то нужно и выбирать вин кодировку HB_CDPSELECT( "RU1251" )

Andrey: AlexMyr пишет: Andrey пишет: цитата: Harbour работает везде - и в МиниГуи это как? Я имел ввиду, что МиниГуи (HMG EE) это библиотека, с которой можно работать на языках: Харбор и хХарбор. Петр пишет: Дать точное описание HMG EE трудно и на русском. Для меня это набор который состоит из компилятора Harbour, ряда библиотек, конечно же главной из которых является одноименная HMG EE GUI библиотека для платформы Windows базирующаяся на WinAPI, утилит и огромного числа примеров использования как самой библиотеки, так и WinAPI. Ну и IDE. http://clipper.borda.ru/?1-1-160-00000188-000-0-0-1248515674

Andrey: Да. vovchok пишет: Andrey А почему с базами Access у меня в Вашем примере не получается ничего? Посмотрите примеры в папках: \MiniGUI\SAMPLES\BASIC\Adordd ............... \MiniGUI\SAMPLES\BASIC\ADORDD_4

vovchok: Andrey пишет: Посмотрите примеры в папках: \MiniGUI\SAMPLES\BASIC\Adordd Я имею ввиду конкретный Ваш пример - почему он не работает? Или Вы его там привели просто как абстрактный образец исходника на Harbour не предполагая, что кто-то его надумает компилировать и он должен быть рабочим? AlexMyr пишет: если Вы скопировали текст с форума и вставили его в редактор в вин кодировке, то нужно и выбирать вин кодировку т.е. выбор кодировки в программе не предполагает введение содержимого в этой кодировке, а только устанавливает порядок сортировки? Что нужно сделать, чтобы текст кирилицы, вводимой в поле БД DBF сохранялся в нем в DOS кодировке, как это происходит, если ту же базу заполнять в Excel? Меня интересует вот этот пример из MiniGUI: http://zalil.ru/32797519 - попробуйте заполнить имеющуюся в нем базу из скомпилированной программы и из Excel. Как добиться, чтобы прога вводила так же как Excel?

Andrey: vovchok пишет: Или Вы его там привели просто как абстрактный образец исходника на Harbour не предполагая, что кто-то его надумает компилировать и он должен быть рабочим? Именно так !

Andrey: vovchok пишет: т.е. выбор кодировки в программе не предполагает введение содержимого в этой кодировке, а только устанавливает порядок сортировки? Да ! Если вы используете MINIGUI ! Для терминалки - нет ! vovchok пишет: Что нужно сделать, чтобы текст кирилицы, вводимой в поле БД DBF сохранялся в нем в DOS кодировке, как это происходит, если ту же базу заполнять в Excel? Меня интересует вот этот пример из MiniGUI: http://zalil.ru/32797519 - попробуйте заполнить имеющуюся в нем базу из скомпилированной программы и из Excel. Как добиться, чтобы прога вводила так же как Excel? Если вы начали работать с МиниГуи, то необходимо почитать документацию \MiniGUI\Doc Или посмотрите примеры по базам (:\MiniGUI\SAMPLES\Applications\DBFview) Я в МиниГуи не работал сам еще с базами. Пока еще не перешел на МиниГуи. Так что ваш вопрос адресуйте gfilatov2002 ! Могу помочь только с ТЕРМИНАЛКАМИ. EXCEL вводит кодировку RU1251, зачем использовать DOS-кодировку ?

vovchok: Andrey пишет: EXCEL вводит кодировку RU1251, зачем использовать DOS-кодировку ? Простите мне мою дерзость, т.к. мне приходится Вам перечить, но у меня, если я создаю файл в Excel, ввожу в нем кирилицу и сохраняю его как dbf - вся кирилица получается в dos кодировке и через проги, написанные с применением MiniGUI, не просматривается (office2003). Собственно поэтому я и спросил - что надо указать в проге на MiniGIU, чтобы кирилица в графических окнах была в кодировке 866, и то, что набрано в Excel было читабельно?

gustow: vovchok , может быть, хоть в чем-то "для старта с ноля" поможет начатый да заброшенный мной "курс мол.бойца по МиниГУИ"? хоть немного вопросов снимет? оно тут: http://gustow.narod.ru/harbour/MiniGUI_help/welcome.htm . Заодно и отрецензировали бы имеющееся там - как уж явно самый "молодой боец" (в смысле - с МиниГУИ). :)

Andrey: vovchok пишет: Простите мне мою дерзость, т.к. мне приходится Вам перечить Да не заморачивайся, причем тут дерзость и перечить... Я просто спросил. vovchok пишет: Собственно поэтому я и спросил - что надо указать в проге на MiniGIU, чтобы кирилица в графических окнах была в кодировке 866, и то, что набрано в Excel было читабельно? Подправил ваш исходник. Да все равно не показывает DOS-кодировку. Хотя \MiniGUI\SAMPLES\Applications\DBFview показывает правильно. Там наверно что-то в BROWSE передавать надо.... Увы, моих знаний не хватает. Так что ваш вопрос адресуйте gfilatov2002 !

vovchok: AlexMyr пишет:В harbour есть утилита hbmk2, ее и используете для сборки prg в exe: Все было хорошо, пока в программе не было ошибок... (компилировал готовые примеры, но когда начал ваять свое...) Теперь оно быстро моргает окном на экране и ничего не делает - где посмотреть почему? (exeшник не создается, ругательств не видно - просто запускается и тут же закрывается...)

AlexMyr: vovchok пишет: Все было хорошо, пока в программе не было ошибок... hbmk2 test1.prg -trace >err.log 2>&1

Vlad04: В MiniGU я использую IDE. Там ведется лог ошибок. Все собирается. А с DOS кодировкой не получилось.Но работать с Excel можно как угодно. Используй для ввода данных в дбф специальные программы - здесь ПАША выкладывал свою, много есть чужих , поддерживающих обе кодировки( я применяю еще DBF dESKTOP)

vovchok: Сори за оффтоп - маленький вопрос не по теме, но не хотел начинать новую. Нужен генератор случайных чисел - в клиппере такого не встречал, есть это в Harbour, или нужно использовать С? ps:Вопрос снимаю - нашел: round(HB_RANDOM(),10) возвращает случайное число от 0 до 1 с точностью 10 знаков.

AlexMyr: vovchok пишет: Нужен генератор случайных чисел - в клиппере такого не встречал, есть это в Harbour в hbmk2 используется hb_rand32()

Andrey: Vlad04 пишет: А с DOS кодировкой не получилось. Что тогда получается НЕЛЬЗЯ использовать @ 5,5 BROWSE Browse_1 ; WIDTH 930 ; HEIGHT 423 ; HEADERS { 'Code' , 'First Name' , 'Last Name', 'Birth Date', 'Married' , 'Biography' } ; WIDTHS { 50 , 120 , 120 , 70 , 60 , 490 } ; WORKAREA Test ; FIELDS { 'Test->Code' , 'Test->First' , 'Test->Last' , 'Test->Birth' , 'Test->Married' , 'Test->Bio' } ; DELETE ; LOCK ; EDIT INPLACE для DOS-кодировки ? Кто может помочь в решении этой проблемы ? Пример здесь. http://files.mail.ru/X77OOJ

gfilatov2002: Andrey пишет: Кто может помочь в решении этой проблемы ? Скорая помощь прибыла См. рабочий пример ниже [pre2]REQUEST HB_CODEPAGE_RU1251, HB_CODEPAGE_RU866 #include "minigui.ch" Function Main hb_SetCodepage( "RU1251" ) DEFINE WINDOW Win_1 ; AT 0,0 ; WIDTH 950 HEIGHT 480 ; TITLE 'Tutor 20: BROWSE Test' ; MAIN NOMAXIMIZE ; ON INIT OpenTables() ; ON RELEASE CloseTables() ; DEFINE MAIN MENU POPUP 'File' ITEM 'Set Browse Value' ACTION Win_1.Browse_1.Value := Val ( InputBox ('Set Browse Value','') ) ITEM 'Get Browse Value' ACTION MsgInfo ( Str ( Win_1.Browse_1.Value ) ) SEPARATOR ITEM 'Exit' ACTION Win_1.Release END POPUP POPUP 'Help' ITEM 'About' ACTION MsgInfo ("Tutor 20: BROWSE Test") END POPUP END MENU @ 5,5 BROWSE Browse_1 ; WIDTH 930 ; HEIGHT 423 ; HEADERS { 'Code' , 'First Name' , 'Last Name', 'Birth Date', 'Married' , 'Biography' } ; WIDTHS { 50 , 120 , 120 , 70 , 60 , 490 } ; WORKAREA Test ; FIELDS { 'Code' , 'First' , 'Last' , 'Birth' , 'Married' , 'Bio' } ; DELETE ; LOCK ; EDIT INPLACE ; FONT "Courier Cur" SIZE 10 END WINDOW Win_1.Browse_1.Value := 1 Win_1.Browse_1.Refresh CENTER WINDOW Win_1 ACTIVATE WINDOW Win_1 Return Nil Procedure OpenTables() Use Test Codepage "RU866" Shared New Return Procedure CloseTables() Use Return [/pre2]

Andrey: gfilatov2002 пишет: Скорая помощь прибыла Ну что мы без тебя делали .... Спасибо большое ! 2 правильные строчки и все работает.... Чувствуется рука мастера....

SergKis: Пример: \MiniGUI\SAMPLES\BASIC\Mdi_2>demo.exe В browse по Up/Dn курсор двигается через строку (как будто dbSkip(2)). Это только у меня или это err ? HB 2.0, MiniGUI 2.07

Andrey: SergKis пишет: HB 2.0, MiniGUI 2.07 Если установлен MiniGUI 2.0.7, то там используется Харбор - Version: 3.1.0dev ! У меня тоже через строку курсор двигается. И в добавок на большой базе (200 полей и 242 Mb) вешается программа.

SergKis: Andrey пишет: Если установлен MiniGUI 2.0.7, то там используется Харбор - Version: 3.1.0dev ! У нас VC9. Все, что надо на данный момент (опробовано примерами) работает без проблем. В MiniGUI MDI немного похоже сыроват (неточность с проскоком строки в browse мой товарищ уже нашел. Он основной c++ в нашей команде). Но полезли еще фишки ... . MDI child окно три browse в работе проблемы: 1. VK_TAB реагирует, но НЕ переходит в фокус след. окна (в обычном режиме переключает) и т.д. 2. ON KEY ESCAPE на окно реагирует нормально, но при включении EDIT [INPLACE] (внутри browse идет переназначение ESC на контрол ввода), то при возврате в окно теряется первоначальное назначение (нет сохранения/восстановления ON KEY в edit).

Andrey: SergKis пишет: Но полезли еще фишки ... Это только Григорий вам поможет, я очень слаб пока в МиниГуи....

SergKis: Andrey пишет: Это только Григорий вам поможет Если Григорий учтет это в след. версия будет отлично. А т.к. нам надо срочно и быстро будем пилить что-то под себя. Спасибо, что посмотрел MDI, а то сначала думали, что сами занесли что-то при адаптации к vc.

Andrey: Непонятка по иконкам в диалоговых окнах.... Можно задать одну иконку на все диалоговые окна ? И где можно посмотреть пример ?

gfilatov2002: Andrey пишет: Почему нет иконки ? Не верно, иконка на рисунке есть - просто она стандартная Andrey пишет: где можно посмотреть пример ? Рабочий пример для задания своей иконки в диалоговых окнах есть в папке samples\Basic\MsgBox (см. пункт меню 'Extend HMG MsgBox')

Andrey: Спасибо. А можно ли (в ХР) программно поменять цвет окна на другой для некоторых окон ? Или для всей программы ? Я знаю что в темах Windows изменить цвета можно. Я просто хочу для своей программы цвет изменить !

AndreyZh: gfilatov2002 пишет: Рабочий пример для задания своей иконки в диалоговых окнах есть в папке samples\Basic\MsgBox (см. пункт меню 'Extend HMG MsgBox') Весело... всё таки: 1. Иконка ICON "name.ico" при размещении не после title даёт ошибку компиляции 2. В примерах расширение для файла иконок не обязательно, но если менять другие примеры... иконки (имя) без расширения не воспринимается

Andrey: Пытаюсь сделать программу на несколько разрешений экрана: 1) 800 на 600 2) 1024 на 768 3) и выше Как НУЖНО (правильно) сделать программу на разное разрешение экрана ??? Приведите примерный код пожалуйста !

Andrey: Какая функция в МиниГуи возвращает разрешение экрана и размеры рабочего стола ?

Петр: Просмотр среди примеров, поставляемых с библиотекой и поиск по форуме, ключевое слово desktop, тема "Размеры экрана" - помогут вам

SergKis: Для Andrey. Вот примерная выборка функций: GETACTIVEWINDOW() SETACTIVEWINDOW(hWnd) SETFOREGROUNDWINDOW(hWnd) GETFOREGROUNDWINDOW() C_CENTER(hWnd[,.T./.F.]) // if( hb_parl( 2 ) ); CenterIntoParent( hwnd ); GETFOCUS() GETDESKTOPWIDTH() GETDESKTOPHEIGHT() GETWINDOWRECT(hWnd) GETVSCROLLBARWIDTH() GETHSCROLLBARHEIGHT() GETWINDOWROW(hWnd) GETWINDOWCOL(hWnd) GETWINDOWWIDTH(hWnd) GETWINDOWHEIGHT(hWnd) GETTITLEHEIGHT() GETBORDERHEIGHT() GETBORDERWIDTH() GETMENUBARHEIGHT() Для расчета размеров колонок (browse) и др.контролов: nWidth := GETTEXTWIDTH(NIL, repl('B', 30), InitFont("Arial", 9)) nWidth := GETTEXTWIDTH(NIL, repl('B', 30), _HMG_aControlFontHandle[nIndex] )) nHeigth := GETTEXTHEIGHT(NIL, "B", InitFont("Arial", 9))

Andrey: SergKis пишет: Вот примерная выборка функций Спасибо большое !

Andrey: А как насчет этого вопроса: Пытаюсь сделать программу на несколько разрешений экрана: 1) 800 на 600 2) 1024 на 768 3) и выше Как НУЖНО (правильно) сделать программу на разное разрешение экрана ??? Приведите примерный код пожалуйста !

gfilatov2002: Andrey пишет: Приведите примерный код Внимательно посмотри изменения, внесенные в стандарный пример Алексеем Густовым (функция Def_Pubs() и использование в коде коэффициентов gu_hk и gu_vk): [pre2]/* * 2009-Apr-01 (it's not joke! it's today!) * modified for "windows/controls auto-zoom" by * Alex Gustow < gustow33 @ mail.ru > * < http://gustow.narod.ru/harbour/harbour.htm > * * + little code modifications (by Gustow too) * * code reindenting made with "Indent.exe" from MiniGUI\UTILS\Code_ReIndent */ /* * MINIGUI - Harbour Win32 GUI library Demo * * Copyright 2002 Roberto Lopez <harbourminigui@gmail.com> * http://harbourminigui.googlepages.com/ * * Update 2002 Interativo Networks <xharbour@terra.com.br> * Daniel Crocciari * http://www.ihpz.net * * * Modified by Roberto Lopez <harbourminigui@gmail.com> 2007.12.02 * */ * Value property selects a record by its number (RecNo()) * Value property returns selected record number (recNo()) * Browse control does not change the active work area * Browse control does not change the record pointer in any area * (nor change selection when it changes) * You can programatically refresh it using refresh method. * Variables called <MemVar>.<WorkAreaName>.<FieldName> are created for * validation in browse editing window. You can use it in VALID array. * Using APPEND clause you can add records to table associated with WORKAREA * clause. The hotkey to add records is Alt+A. * Append Clause Can't Be Used With Fields Not Belonging To Browse WorkArea * Using DELETE clause allows to mark selected record for deletion pressing <Del> key * The leftmost column in a browse control must be left aligned. #include "minigui.ch" //------------------------- Function Main set century ON set date BRITISH set delete ON Def_Pubs() // PUBLICs definition & zoom calculating define window Form_1 ; at 0,0 ; width 550 height 535 + if(IsXPThemeActive(), 8, 0) ; title 'MiniGUI Browse Demo' ; MAIN nomaximize ; on init { || OpenTables(), Fun_1() } ; // edited by Gustow, was "OpenTables()" on release CloseTables() define main menu popup 'File' item 'New' action if( Form_1.ButtonNew.Enabled == .t., ButtonNewClick(), Nil ) item 'Delete' action if( Form_1.ButtonDelete.Enabled == .t., ButtonDeleteClick(), Nil ) separator item 'Exit' action Form_1.Release end popup popup 'Help' item 'About' action MsgInfo ( "MINIGUI - Browse Demo" + CRLF + ; "Copyright 2002 Roberto Lopez <harbourminigui@gmail.com>" + CRLF + ; "http://harbourminigui.googlepages.com/" + CRLF + CRLF + ; "Update 2002 Interativo Networks <xharbour@terra.com.br>" + CRLF + ; "Daniel Crocciari" + CRLF + ; "http://www.ihpz.net", "About" ) end popup end menu end window // center window Form_1 Gustow: move this to Fun_1() activate window Form_1 Return Nil //------------------------- Function Def_Pubs() * definitions of PUBLICs (Gustow) public gu_vk := 1, gu_hk := 1 // horizontal & vertical zoom public gu_th := GetTitleHeight(), ; gu_bw := GetBorderHeight() gu_hk := (0.8 * GetDesktopWidth() ) / (0.8 * 800) gu_vk := (0.8 * GetDesktopHeight()) / (0.8 * 600) /* MsgInfo( "Your screen resolution is: " + ; ltrim(str( GetDesktopWidth() )) + " * " + ; ltrim(str( GetDesktopHeight() )) + CRLF + CRLF + ; "Design-time screen resolution is: 800 * 600" + CRLF + CRLF + ; "Hor.zoom: gu_hk =" + str(gu_hk, 10, 2) + CRLF + ; "Ver.zoom: gu_vk =" + str(gu_vk, 10, 2) ) */ Return Nil //------------------------- Function Fun_1() * controls definitions (with autozoom) Public gu_fs := 9 * gu_hk // for fontsize Form_1.Width := int( Form_1.Width * gu_hk ) Form_1.Height := int( Form_1.Height * gu_vk ) Form_1.Center // move here from Main() @ 05 * gu_vk, 10 * gu_hk browse Browse_1 ; of Form_1 ; width 515 * gu_hk ; height 180 * gu_vk ; headers { 'Married', 'Code', 'First Name', 'Last Name', 'Birth Date' } ; widths { 40*gu_hk, 50*gu_hk, 150*gu_hk, 150*gu_hk, 90*gu_hk } ; workarea Teste ; fields { 'Teste->Married', 'Teste->Code' , 'Teste->First' , 'Teste->Last' , 'Teste->Birth'} ; value 1 ; on change { || BrowseChange() } ; on dblclick { || BrowseEdit() } ; nolines; justify { BROWSE_JTFY_LEFT, BROWSE_JTFY_RIGHT, BROWSE_JTFY_LEFT, BROWSE_JTFY_LEFT, BROWSE_JTFY_CENTER }; image {"br_no","br_ok"} ; font "Arial" size 9 * gu_hk // line added by Gustow @ 200 * gu_vk, 010 * gu_hk label LabelCode of Form_1 ; // don't forget "OF"! value "Code" ; width 95 * gu_hk height 25 * gu_vk ; font "Arial" size 9 * gu_hk @ 200 * gu_vk, 105 * gu_hk textbox TextBoxCode of Form_1 ; value "" ; width 100 * gu_hk height 25 * gu_vk ; font "Arial" size 9 * gu_hk @ 230 * gu_vk, 010 * gu_hk label LabelFirst of Form_1 ; value "First Name" ; width 95 * gu_hk height 25 * gu_vk ; font "Arial" size 9 * gu_hk @ 230 * gu_vk, 105 * gu_hk textbox TextBoxFirst of Form_1 ; value "" ; width 300 * gu_hk height 25 * gu_vk ; font "Arial" size 9 * gu_hk @ 260 * gu_vk, 010 * gu_hk label LabelLast of Form_1 ; value "Last Name" ; width 95 * gu_hk height 25 * gu_vk ; font "Arial" size 9 * gu_hk @ 260 * gu_vk, 105 * gu_hk textbox TextBoxLast of Form_1 ; value "" ; width 300 * gu_hk height 25 * gu_vk ; font "Arial" size 9 * gu_hk @ 290 * gu_vk, 012 * gu_hk label LabelBirthdate of Form_1 ; value "Birth Date" ; width 85 * gu_hk height 25 * gu_vk ; // was 95, 25 (shadowed "DatePickerBirth") font "Arial" size 9 * gu_hk @ 295 * gu_vk, 105 * gu_hk ; // was 290, 105 datepicker DatePickerBirth of Form_1 ; width 100 * gu_hk ; // what about auto-zoom for HEIGHT? value date() ; font "Arial" size 9 * gu_hk // line added by Gustow @ 320 * gu_vk, 012 * gu_hk label LabelMarried of Form_1 ; value "Married" ; width 95 * gu_hk height 25 * gu_vk ; font "Arial" size 9 * gu_hk @ 320 * gu_vk, 105 * gu_hk checkbox CheckBoxMarried of Form_1 ; caption "Yes Married" ; width 100 * gu_hk height 25 * gu_vk ; value .T. ; font "Arial" size 9 * gu_hk @ 350 * gu_vk, 012 * gu_hk label LabelBio of Form_1 ; value "Bio" ; width 95 * gu_hk height 25 * gu_vk ; font "Arial" size 9 * gu_hk @ 350 * gu_vk, 105 * gu_hk editbox EditBoxBio of Form_1 ; width 300 * gu_hk height 130 * gu_vk ; value "" ; nohscroll ; font "Arial" size 9 * gu_hk @ 325 * gu_vk, 425 * gu_hk image ImagePhoto of Form_1 ; picture "0.bmp" ; width 100 height 125 // no auto-zoom @ 455 * gu_vk, 425 * gu_hk textbox TextBoxPhoto of Form_1 ; value "" ; width 100 * gu_hk height 25 * gu_vk ; font "Arial" size 9 * gu_hk @ 200 * gu_vk, 425 * gu_hk button ButtonNew of Form_1 ; caption "&New" ; action ButtonNewClick() ; width 100 * gu_hk height 25 * gu_vk ; font "Arial" size 9 * gu_hk @ 230 * gu_vk, 425 * gu_hk button ButtonSave of Form_1 ; caption "&Save" ; action ButtonSaveClick() ; width 100 * gu_hk height 25 * gu_vk ; font "Arial" size 9 * gu_hk @ 260 * gu_vk, 425 * gu_hk button ButtonCancel of Form_1 ; caption "&Cancel" ; action ButtonCancelClick() ; width 100 * gu_hk height 25 * gu_vk ; font "Arial" size 9 * gu_hk @ 290 * gu_vk, 425 * gu_hk button ButtonDelete of Form_1 ; caption "&Delete" ; action ButtonDeleteClick() ; width 100 * gu_hk height 25 * gu_vk ; font "Arial" size 9 * gu_hk on key ESCAPE of Form_1 ; action if( Form_1.ButtonCancel.Enabled == .T., ButtonCancelClick(), Nil ) Form_1.TextBoxCode.Enabled := .F. Form_1.TextBoxFirst.Enabled := .F. Form_1.TextBoxLast.Enabled := .F. Form_1.DatePickerBirth.Enabled := .F. Form_1.CheckBoxMarried.Enabled := .F. Form_1.TextBoxPhoto.Enabled := .F. Form_1.EditBoxBio.Enabled := .F. Form_1.ButtonSave.Enabled := .F. Form_1.ButtonCancel.Enabled := .F. Form_1.Browse_1.SetFocus Return Nil //------------------------- Function OpenTables() use Test alias Teste new Return Nil //------------------------- Function CloseTables() close all Return Nil //------------------------- Function BrowseEdit() BrowseChange() Form_1.TextBoxFirst.Enabled := .T. Form_1.TextBoxLast.Enabled := .T. Form_1.DatePickerBirth.Enabled := .T. Form_1.CheckBoxMarried.Enabled := .T. Form_1.TextBoxPhoto.Enabled := .T. Form_1.EditBoxBio.Enabled := .T. Form_1.ButtonNew.Enabled := .F. Form_1.ButtonSave.Enabled := .T. Form_1.ButtonCancel.Enabled := .T. Form_1.ButtonDelete.Enabled := .F. // Form_1.Browse_1.Enabled := .F. Form_1.TextBoxFirst.SetFocus Return Nil //------------------------- Function ButtonNewClick() Form_1.TextBoxCode.Value := "" Form_1.TextBoxFirst.Value := "" Form_1.TextBoxLast.Value := "" Form_1.DatePickerBirth.Value := date() Form_1.TextBoxPhoto.Value := "0.bmp" Form_1.CheckBoxMarried.Value := .T. Form_1.EditBoxBio.Value := "" Form_1.ImagePhoto.Picture := "0.bmp" Form_1.TextBoxFirst.Enabled := .T. Form_1.TextBoxLast.Enabled := .T. Form_1.DatePickerBirth.Enabled := .T. Form_1.CheckBoxMarried.Enabled := .T. Form_1.TextBoxPhoto.Enabled := .T. Form_1.EditBoxBio.Enabled := .T. Form_1.ButtonNew.Enabled := .F. Form_1.ButtonSave.Enabled := .T. Form_1.ButtonCancel.Enabled := .T. Form_1.ButtonDelete.Enabled := .F. Form_1.Browse_1.Enabled := .F. Form_1.TextBoxFirst.SetFocus Return Nil //------------------------- Function ButtonDeleteClick() Local vRecno := Form_1.Browse_1.Value goto vRecno If MsgYesNo( ; "Delete This Record?" + CRLF + CRLF + ; "Code: " + alltrim( str( Teste->Code ) ) + CRLF + ; "First Name: " + alltrim( Teste->First ) + CRLF + ; "Last Name: " + alltrim( Teste->Last ), "Confirmation" ) delete skip -1 Form_1.Browse_1.Value := Teste->(Recno()) Form_1.Browse_1.Refresh Form_1.Browse_1.SetFocus endif Return Nil //------------------------- Function ButtonSaveClick() Local vTextBoxCode := val( Form_1.TextBoxCode.Value ), ; vTextBoxFirst := Form_1.TextBoxFirst.Value, ; vTextBoxLast := Form_1.TextBoxLast.Value, ; vDatePickerBirth := Form_1.DatePickerBirth.Value, ; vCheckBoxMarried := Form_1.CheckBoxMarried.Value, ; vTextBoxPhoto := Form_1.TextBoxPhoto.Value, ; vEditBoxBio := Form_1.EditBoxBio.Value if vTextBoxCode <= 0 goto bottom vTextBoxCode := Teste->Code + 1 append blank replace Teste->Code with vTextBoxCode endif replace Teste->First with vTextBoxFirst, ; Teste->Last with vTextBoxLast, ; Teste->Birth with vDatePickerBirth, ; Teste->Married with vCheckBoxMarried, ; Teste->Photo with vTextBoxPhoto, ; Teste->Bio with vEditBoxBio commit // Gustow: // DbCommit() is better // (COMMIT flushes data in _all_ databases, DbCommit() - in current only. // great speed decreasing in XP ! ) Form_1.TextBoxCode.Value := alltrim(str(Teste->Code)) Form_1.TextBoxFirst.Enabled := .F. Form_1.TextBoxLast.Enabled := .F. Form_1.DatePickerBirth.Enabled := .F. Form_1.CheckBoxMarried.Enabled := .F. Form_1.TextBoxPhoto.Enabled := .F. Form_1.EditBoxBio.Enabled := .F. Form_1.ButtonNew.Enabled := .T. Form_1.ButtonSave.Enabled := .F. Form_1.ButtonCancel.Enabled := .F. Form_1.ButtonDelete.Enabled := .T. Form_1.Browse_1.Enabled := .T. Form_1.ImagePhoto.Picture := alltrim(Teste->Photo) Form_1.Browse_1.Value := Teste->(Recno()) Form_1.Browse_1.Refresh Form_1.Browse_1.SetFocus Return NIL //------------------------- Function ButtonCancelClick() Form_1.TextBoxFirst.Enabled := .F. Form_1.TextBoxLast.Enabled := .F. Form_1.DatePickerBirth.Enabled := .F. Form_1.CheckBoxMarried.Enabled := .F. Form_1.TextBoxPhoto.Enabled := .F. Form_1.EditBoxBio.Enabled := .F. Form_1.ButtonNew.Enabled := .T. Form_1.ButtonSave.Enabled := .F. Form_1.ButtonCancel.Enabled := .F. Form_1.ButtonDelete.Enabled := .T. Form_1.Browse_1.Enabled := .T. BrowseChange() Form_1.Browse_1.SetFocus Return NIL //------------------------- Function BrowseChange() Local vRecno := Form_1.Browse_1.Value goto vRecno Form_1.TextBoxCode.Value := alltrim(str(Teste->Code)) Form_1.TextBoxFirst.Value := alltrim(Teste->First) Form_1.TextBoxLast.Value := alltrim(Teste->Last) Form_1.DatePickerBirth.Value := Teste->Birth Form_1.CheckBoxMarried.Value := Teste->Married Form_1.EditBoxBio.Value := Teste->Bio Form_1.TextBoxPhoto.Value := alltrim(Teste->Photo) Form_1.ImagePhoto.Picture := ; if( file( alltrim(Teste->Photo) ), alltrim(Teste->Photo), "0.bmp" ) Return NIL[/pre2] Возможно, это натолкнет на собственные идеи

Andrey: gfilatov2002 пишет: Возможно, это натолкнет на собственные идеи Спасибо большое за помощь !

Петр: GPF Application Internal Error - C:\MiniGUI\SAMPLES\BASIC\IMAGE_2\DEMO.exe Terminated at: 2012.04.22 11:12:00 Info: Harbour MiniGUI Extended Edition 2.0.9 - 2012.04.04 Unrecoverable error 6005: Exception error: Exception Code:C0000005 Exception Address:7C9101B3 EAX:0002000A EBX:00150000 ECX:00000146 EDX:00070001 ESI:00020000 EDI:0001FFF8 EBP:0012F284 CS:EIP:001B:7C9101B3 SS:ESP:0023:0012F064 DS:0023 ES:0023 FS:003B GS:0000 Flags:00010216 CS:EIP: 88 47 06 8B C7 C1 E8 03 32 43 04 88 47 04 F6 45 SS:ESP: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 C stack: EIP: EBP: Frame: OldEBP, RetAddr, Params... 7C9101B3 0012F284 0012F2D0 7C80FF0F 00150000 00100008 00000146 B9011A4B 00000000 00000000 00000000 00000001 7C80FF0F 0012F2D0 0012F360 0040EE99 00000040 00000146 004DB8FA 00000000 005218B4 000065C0 004DB8A9 005218B4 0040EE99 0012F360 0012F3A0 0040EB35 004A3547 0000007B 000000A0 002B0476 00000000 00000001 00000000 005218B4 0040EB35 0012F3A0 0012F4A4 0043621C 00000007 004DE275 00000000 005218B4 0000007D FFFFFFF0 0012F648 00000000 0043621C 0012F4A4 0012F4CC 00414B60 004DB854 004D3760 0043C068 0000004B 00000000 00000000 00000000 000009DC 00414B60 0012F4CC 0012F5D0 00436199 00000003 004A354F 00000000 005218B4 FFFFFFFF 0012F544 5B263357 00330496 00436199 0012F5D0 0012F5F8 00414DA4 004DDC5E 004D3760 0043C068 00000048 00000000 00000000 00000000 00000E83 00414DA4 0012F5F8 0012F6FC 0043621C 00000004 005218B4 FFFFFFFE 00A3B764 00000002 004F2421 00000000 005218B4 0043621C 0012F6FC 0012F734 0043C3E1 004A3526 004A325C 004F24C6 00000000 004EDCE4 0043C225 005218B4 00000041 0043C3E1 0012F734 0012F838 004362D6 00000001 0050FA1A 00000000 005218B4 000000F4 00000001 00000001 773E8EBF 004362D6 0012F838 0012F860 004156D8 004F23E7 004ED8E4 0043C068 00000012 00000000 00A3FBBC 00000000 00000626 004156D8 0012F860 0012F964 00436199 00000002 00000000 00000111 0050B310 00000000 0015FAB8 00000000 00159A50 00436199 0012F964 0012F990 00418920 0050C1F4 0050B310 0043C185 008603F4 00000010 00000000 00000000 00000000 00418920 0012F990 0012F9A8 0040C266 00000004 0012FA10 0040C1E8 00000000 0040C266 0012F9A8 0012F9D4 7E368734 008603F4 00000111 00000000 00330496 0040C1E8 DCBAABCD 00000000 0012FA10 7E368734 0012F9D4 0012FA3C 7E368816 0040C1E8 008603F4 00000111 00000000 00330496 00000111 007825F8 0078260C 7E368816 0012FA3C 0012FA78 7E37927B 00000000 0040C1E8 008603F4 00000111 00000000 00330496 0078260C 00000001 7E37927B 0012FA78 0012FA98 7E3792E3 007825F8 00782578 00000000 00330496 00000000 001599E0 7E3792E3 0012FA98 0012FAB8 773E735F 008603F4 00000111 00000000 00330496 00000001 001599E0 773E735F 0012FAB8 0012FAD4 773E7441 001599E0 00000000 00100028 001599E0 00000001 Modules: 0x00400000 0x00145000 C:\MiniGUI\SAMPLES\BASIC\IMAGE_2\DEMO.exe 0x7C900000 0x000B3000 C:\WINDOWS\system32\ntdll.dll 0x7C800000 0x000F8000 C:\WINDOWS\system32\kernel32.dll 0x75A40000 0x00021000 C:\WINDOWS\system32\MSVFW32.DLL 0x7E360000 0x00091000 C:\WINDOWS\system32\USER32.dll 0x77F10000 0x00049000 C:\WINDOWS\system32\GDI32.dll 0x76B20000 0x0002E000 C:\WINDOWS\system32\WINMM.dll 0x77DC0000 0x000AC000 C:\WINDOWS\system32\ADVAPI32.dll 0x77E70000 0x00093000 C:\WINDOWS\system32\RPCRT4.dll 0x77FE0000 0x00011000 C:\WINDOWS\system32\Secur32.dll 0x7C9C0000 0x0081C000 C:\WINDOWS\system32\SHELL32.dll 0x77C00000 0x00058000 C:\WINDOWS\system32\msvcrt.dll 0x77F60000 0x00076000 C:\WINDOWS\system32\SHLWAPI.dll 0x773C0000 0x00103000 C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.6028_x-ww_61e65202\COMCTL32.dll 0x774D0000 0x0013E000 C:\WINDOWS\system32\OLE32.DLL 0x5F2F0000 0x00017000 C:\WINDOWS\system32\OLEPRO32.DLL 0x77110000 0x0008B000 C:\WINDOWS\system32\OLEAUT32.dll 0x76360000 0x0001D000 C:\WINDOWS\system32\IMM32.DLL 0x5D270000 0x00007000 C:\WINDOWS\system32\serwvdrv.dll 0x5B590000 0x00007000 C:\WINDOWS\system32\umdmxfrm.dll 0x5B260000 0x00038000 C:\WINDOWS\system32\uxtheme.dll 0x746E0000 0x0004C000 C:\WINDOWS\system32\MSCTF.dll 0x75310000 0x0002E000 C:\WINDOWS\system32\msctfime.ime Called from C_SETPICTURE(0) Called from _SETPICTURE(2524) in h_controlmisc.prg Called from SETPROPERTY(3715) in h_controlmisc.prg Called from (b)MAIN(28) in DEMO.prg Called from _DOCONTROLEVENTPROCEDURE(1574) in h_windows.prg Called from EVENTS(1433) in h_events.prg Called from _DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(1311) in h_windows.prg Called from MAIN(33) in DEMO.prg

gfilatov2002: Петр, Благодарю за сообщение об ошибке! Догадываюсь, что этот сбой получен на Win7 Можно попробовать запустить этот пример в режиме совместимости с WinXP, как вариант У меня на Win7 64bit Ultimate C:\MiniGUI\SAMPLES\BASIC\IMAGE_2\DEMO.exe при изменении картинки типа .CUR отрабатывает без ошибки, поэтому, возможно, что есть проблемы с локальной системой. В любом случае, Ваши предложения по исправлению возникшей ошибки всегда приветствуются

Петр: gfilatov2002 пишет: Догадываюсь, что этот сбой получен на Win7 Нет, XP SP3. Просто, после запуска программы начните "тыкать" мышкой по всем кнопкам, слева направо или наоборот - без разницы. У меня где-то после 20 щелчков валилась. gfilatov2002 пишет: В любом случае, Ваши предложения по исправлению возникшей ошибки всегда приветствуются Уже исправил, осталось только по просьбе Андрея Верченко вывод PNG для систем поддерживающих gdiplus (XP и выше) прикрутить. Опубликую здесь или сброшу куда-то, по желанию.

Andrey: Петр пишет: осталось только по просьбе Андрея Верченко поддержу вывода PNG для систем поддерживающих gdiplus (XP и выше) прикрутить. Ура... Жду с нетерпением...

gfilatov2002: Петр пишет: Опубликую здесь Ждем...

Петр: Петр пишет: Опубликую здесь click here

Andrey: В примере DEMOGDIP.exe перестал работать показ кнопки "Set cur" И очень хотелось бы для таких подключений библиотек делать файлы проектов *.hbp Ну нет пока практики у меня (начинающего) включения разных библиотек в свои проекты. Заранее спасибо !

Петр: Andrey пишет: В примере DEMOGDIP.exe перестал работать показ кнопки "Set cur" Спасибо за подробное тестирование c_image.obj и RTFM И очень хотелось бы для таких подключений библиотек делать файлы проектов *.hbp вообще-то, автор hbmk2 для "таких подключений библиотек" *.hbc файлы рекомендует

Andrey: Петр пишет: вообще-то, автор hbmk2 для "таких подключений библиотек" *.hbc файлы рекомендует Можно и *.hbc

gfilatov2002: Петр пишет: Опубликую здесь Идея понятна - надо использовать GdiPlus.Dll вместо функции LoadImage() для вывода картинок из файлов в форматах, отличных от BMP. Но в бинарной форме это можно рассматривать только в качестве примера Замечание по поводу ошибки в примере Image_2 для файлов типа CUR и ICO. Проблема при частом обновлении этих картинок возникает только под WinXP. При работе в Win7 или Win98 этой проблемы не возникает

Петр: gfilatov2002 пишет: Но в бинарной форме это можно рассматривать только в качестве примера c_image.obj в стандартном режиме работы, без инициализации библиотеки gdi+, устраняет проблему разрушения памяти программы. К тому же, он позволяет вводить поддержку элементом управления Image формата PNG без перекомпиляции библиотеки, см. пример. Крайне полезная вещь для пользователей bcc55, в поставке которых нет gdiplus*.h (232 kB). Ну и напоследок, я выложу код c_image.c после окончательной пришлифовки, т.е. более точного копирования поведения loadolepicture, с этим нет проблем.

gfilatov2002: Петр пишет: я выложу код c_image.c после окончательной пришлифовка, т.е. более точного копирования поведения loadolepicture Большое спасибо! Но тогда уже это будет включено в следующую сборку

Петр: gfilatov2002 пишет: Но тогда уже это будет включено в следующую сборку Нет вопросов, пока же для желающих - модифицированная версия c_image.c (non-GDI+) click here

Andrey: gfilatov2002 пишет: Но тогда уже это будет включено в следующую сборку Желательно отдельным примером и файл для сборки hbmk2 !

gfilatov2002: Петр пишет: модифицированная версия c_image.c Огромное спасибо за переработанный код: чувствуется рука профи! Но я немного поправил, чтобы убрать предупреждение, которое выдает компилятор MinGW (см.ниже). [pre2]/*---------------------------------------------------------------------------- MINIGUI - Harbour Win32 GUI library source code Copyright 2002-2010 Roberto Lopez <harbourminigui@gmail.com> http://harbourminigui.googlepages.com/ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/). As a special exception, you have permission for additional uses of the text contained in this release of Harbour Minigui. The exception is that, if you link the Harbour Minigui library with other files to produce an executable, this does not by itself cause the resulting executable to be covered by the GNU General Public License. Your use of that executable is in no way restricted on account of linking the Harbour-Minigui library code into it. Parts of this project are based upon: "Harbour GUI framework for Win32" Copyright 2001 Alexander S.Kresin <alex@belacy.belgorod.su> Copyright 2001 Antonio Linares <alinares@fivetech.com> www - http://harbour-project.org "Harbour Project" Copyright 1999-2012, http://harbour-project.org/ "WHAT32" Copyright 2002 AJ Wos <andrwos@aust1.net> "HWGUI" Copyright 2001-2009 Alexander S.Kresin <alex@belacy.belgorod.su> ---------------------------------------------------------------------------*/ #ifndef CINTERFACE #define CINTERFACE #endif #define _WIN32_IE 0x0500 #ifdef __POCC__ #define _WIN32_WINNT 0x0500 #else #define _WIN32_WINNT 0x0400 #endif #include <windows.h> #include <commctrl.h> #include "olectl.h" #include "hbapi.h" #include "hbapiitm.h" #include "hbinit.h" #include "hbvm.h" HBITMAP loadolepicture ( char *filename, int width, int height, HWND handle, int scalestrech, int whitebackground, int transparent ); LRESULT APIENTRY PictSubClassFunc ( HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam ); static WNDPROC LabelOldWndProc; static BOOL read_image ( char *filename, DWORD *nFileSize, HGLOBAL *hMem ); static BOOL read_image_rsrc ( HINSTANCE hInstance, HRSRC hResInfo, HGLOBAL *hMem ); static void calc_rect ( HWND handle, int width, int height, int scalestrech, LONG lWidth, LONG lHeight, RECT *rect, RECT *rect2 ); HB_FUNC( INITIMAGE ) { HWND wndhandle; HWND wndparent = ( HWND ) hb_parnl( 1 ); int Style = WS_CHILD | SS_BITMAP; if( !hb_parl( 5 ) ) Style |= WS_VISIBLE; if( hb_parl( 6 ) || hb_parl( 7 ) ) Style |= SS_NOTIFY; wndhandle = CreateWindowEx( 0, "static", NULL, Style, hb_parni( 3 ), hb_parni( 4 ), 0, 0, wndparent, ( HMENU ) hb_parni( 2 ), GetModuleHandle( NULL ), NULL ); if( hb_parl( 7 ) ) LabelOldWndProc = ( WNDPROC ) SetWindowLong( wndhandle, GWL_WNDPROC, ( LONG ) PictSubClassFunc ); hb_retnl( ( LONG ) wndhandle ); } HB_FUNC( C_SETPICTURE ) { HBITMAP hBitmap; if( hb_parclen( 2 ) == 0 ) hb_retnl( ( LONG ) NULL ); hBitmap = loadolepicture( ( char * ) hb_parc( 2 ), hb_parni( 3 ), hb_parni( 4 ), ( HWND ) hb_parnl( 1 ), hb_parni( 5 ), hb_parni( 6 ), hb_parni( 7 ) ); if( hBitmap != NULL ) SendMessage( ( HWND ) hb_parnl( 1 ), ( UINT ) STM_SETIMAGE, ( WPARAM ) IMAGE_BITMAP, ( LPARAM ) hBitmap ); hb_retnl( ( LONG ) hBitmap ); } #define _OLD_STYLE 0 LRESULT APIENTRY PictSubClassFunc ( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ) { TRACKMOUSEEVENT tme; static PHB_SYMB pSymbol = NULL; static BOOL bMouseTracking = FALSE; long int r = 0; #if _OLD_STYLE BOOL bCallUDF = FALSE; #endif if( Msg == WM_MOUSEMOVE || Msg == WM_MOUSELEAVE ) { if( Msg == WM_MOUSEMOVE ) { if( bMouseTracking == FALSE ) { tme.cbSize = sizeof( TRACKMOUSEEVENT ); tme.dwFlags = TME_LEAVE; tme.hwndTrack = hWnd; tme.dwHoverTime = HOVER_DEFAULT; if( _TrackMouseEvent( &tme ) == TRUE ) { #if _OLD_STYLE bCallUDF = TRUE; #endif bMouseTracking = TRUE; } #if _OLD_STYLE } else { bCallUDF = FALSE; #endif } } else { #if _OLD_STYLE bCallUDF = TRUE; #endif bMouseTracking = FALSE; } #if _OLD_STYLE if( bCallUDF == TRUE ) { #endif if( !pSymbol ) pSymbol = hb_dynsymSymbol( hb_dynsymGet( "OLABELEVENTS" ) ); if( pSymbol ) { hb_vmPushSymbol( pSymbol ); hb_vmPushNil(); hb_vmPushLong( ( LONG ) hWnd ); hb_vmPushLong( Msg ); hb_vmPushLong( wParam ); hb_vmPushLong( lParam ); hb_vmDo( 4 ); r = hb_parnl( -1 ); } #if _OLD_STYLE } #endif return ( r != 0 ) ? r : CallWindowProc( LabelOldWndProc, hWnd, 0, 0, 0 ); } return CallWindowProc( LabelOldWndProc, hWnd, Msg, wParam, lParam ); } #undef _OLD_STYLE HBITMAP loadolepicture ( char *filename, int width, int height, HWND handle, int scalestrech, int whitebackground, int transparent ) { UINT fuLoad = ( transparent == 0 ) ? LR_CREATEDIBSECTION : LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS | LR_LOADTRANSPARENT; IStream *iStream; IPicture *iPicture = NULL; HGLOBAL hMem = ( HGLOBAL ) NULL; HRSRC hResInfo; HRESULT hr; DWORD nFileSize = 0; RECT rect, rect2; BITMAP bm; HBITMAP bitmap, bitmap2; LONG lWidth, lHeight; // TODO HINSTANCE hInstance = GetModuleHandle( NULL ); /* MSDN: An application must not delete a DC whose handle was obtained * by calling the GetDC function. * Instead, it must call the ReleaseDC function to free the DC */ HDC imgDC = GetDC( handle ); HDC tmpDC; HDC tmp2DC = ( HDC ) NULL; bitmap2 = ( HBITMAP ) LoadImage( hInstance, filename, IMAGE_BITMAP, 0, 0, fuLoad ); if( bitmap2 == NULL ) bitmap2 = ( HBITMAP ) LoadImage( NULL, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | fuLoad ); if( bitmap2 == NULL ) { hResInfo = FindResource( hInstance, filename, "JPG" ); if( hResInfo == NULL ) hResInfo = FindResource( hInstance, filename, "GIF" ); if( hResInfo == NULL ) { if( read_image( filename, &nFileSize, &hMem ) == FALSE ) { ReleaseDC( handle, imgDC ); return NULL; } } else if( read_image_rsrc( hInstance, hResInfo, &hMem ) == FALSE ) { ReleaseDC( handle, imgDC ); return NULL; } hr = CreateStreamOnHGlobal( hMem, TRUE, &iStream ); if( hr != S_OK || iStream == NULL ) { GlobalFree( hMem ); ReleaseDC( handle, imgDC ); return NULL; } #if defined( __cplusplus ) hr = OleLoadPicture( iStream, nFileSize, FALSE, IID_IPicture, ( LPVOID * ) &iPicture ); iStream->Release(); #else hr = OleLoadPicture( iStream, nFileSize, FALSE, &IID_IPicture, ( LPVOID * ) &iPicture ); iStream->lpVtbl->Release( iStream ); #endif if( hr != S_OK || iPicture == NULL ) { GlobalFree( hMem ); ReleaseDC( handle, imgDC ); return NULL; } iPicture->lpVtbl->get_Width( iPicture, &lWidth ); iPicture->lpVtbl->get_Height( iPicture, &lHeight ); } else { GetObject( bitmap2, sizeof( BITMAP ), &bm ); lWidth = bm.bmWidth; lHeight = bm.bmHeight; tmp2DC = CreateCompatibleDC( imgDC ); SelectObject( tmp2DC, bitmap2 ); } calc_rect( handle, width, height, scalestrech, lWidth, lHeight, &rect, &rect2 ); tmpDC = CreateCompatibleDC( imgDC ); bitmap = CreateCompatibleBitmap( imgDC, width, height ); SelectObject( tmpDC, bitmap ); if( whitebackground == 1 ) FillRect( tmpDC, &rect2, ( HBRUSH ) GetStockObject( WHITE_BRUSH ) ); else FillRect( tmpDC, &rect2, ( HBRUSH ) GetSysColorBrush( COLOR_BTNFACE ) ); if( iPicture != NULL ) { iPicture->lpVtbl->Render( iPicture, tmpDC, rect.left, rect.top, rect.right, rect.bottom, 0, lHeight, lWidth, -lHeight, NULL ); iPicture->lpVtbl->Release( iPicture ); GlobalFree( hMem ); } else { StretchBlt( tmpDC, rect.left, rect.top, rect.right, rect.bottom, tmp2DC, 0, 0, lWidth, lHeight, SRCCOPY ); DeleteDC( tmp2DC ); DeleteObject( bitmap2 ); } ReleaseDC( handle, imgDC ); DeleteDC( tmpDC ); return bitmap; } static BOOL read_image ( char *filename, DWORD *nFileSize, HGLOBAL *hMem ) { HANDLE hFile; LPVOID lpDest; DWORD nSize, nRead; hFile = CreateFile( filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if( hFile == INVALID_HANDLE_VALUE ) return FALSE; nSize = GetFileSize( hFile, NULL ); if( nSize == INVALID_FILE_SIZE || ( *hMem = GlobalAlloc( GHND, nSize ) ) == NULL ) { CloseHandle( hFile ); return FALSE; } *nFileSize = nSize; lpDest = GlobalLock( *hMem ); if( lpDest == NULL ) { GlobalFree( *hMem ); CloseHandle( hFile ); return FALSE; } if( ReadFile( hFile, lpDest, nSize, &nRead, NULL ) == FALSE ) { GlobalUnlock( *hMem ); GlobalFree( *hMem ); CloseHandle( hFile ); return FALSE; } GlobalUnlock( *hMem ); CloseHandle( hFile ); return TRUE; } static BOOL read_image_rsrc ( HINSTANCE hInstance, HRSRC hResInfo, HGLOBAL *hMem ) { HGLOBAL hRes; DWORD nSize; LPVOID lpRes, lpDest; hRes = LoadResource( hInstance, hResInfo ); if( hRes == NULL ) return FALSE; nSize = SizeofResource( hInstance, hResInfo ); lpRes = LockResource( hRes ); if( lpRes == NULL || ( *hMem = GlobalAlloc( GHND, nSize ) ) == NULL ) { FreeResource( hRes ); return FALSE; } lpDest = GlobalLock( *hMem ); if( lpDest == NULL ) { GlobalFree( *hMem ); FreeResource( hRes ); return FALSE; } CopyMemory( lpDest, lpRes, ( SIZE_T ) nSize ); GlobalUnlock( *hMem ); FreeResource( hRes ); return TRUE; } static void calc_rect ( HWND handle, int width, int height, int scalestrech, LONG lWidth, LONG lHeight, RECT *rect, RECT *rect2 ) { if( ( width == 0 ) & ( height == 0 ) ) GetClientRect( handle, rect ); else SetRect( rect, 0, 0, width, height ); SetRect( rect2, 0, 0, rect->right, rect->bottom ); if( scalestrech == 0 ) { if( ( int ) lWidth * rect->bottom / lHeight <= rect->right ) rect->right = ( int ) lWidth * rect->bottom / lHeight; else rect->bottom = ( int ) lHeight * rect->right / lWidth; } rect->left = ( int ) ( width - rect->right ) / 2; rect->top = ( int ) ( height - rect->bottom ) / 2; }[/pre2]

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

Andrey: Вопрос возник такой: Есть главное окно программы Form_1, делаю: MINIMIZE WINDOW Form_1 Inkey(60) RESTORE WINDOW Form_1 Программа успешно "скидывается" на панель задач, но мышкой (если юзер захочет) поднять ее невозможно !!! Что нужно использовать вместо INKEY() или нужно по другому делать ?

Dima: Andrey пишет: Что нужно использовать вместо INKEY() или нужно по другому делать ? А какова цель вообще ? ;) Ну скинул ее на панель задач и хорошо. Мешает что ли ? На фига туда еще и задержку лепить.....:)

Andrey: Dima пишет: Ну скинул ее на панель задач и хорошо. Мешает что ли ? На фига туда еще и задержку лепить.....:) Ну хотелось бы чтоб через минуту "поднялась" программа... Для дальнейших действий юзера. И как сделать чтоб эта программа была "под" запущенной программой - типа SW_SHOWNOACTIVATE ???

Петр: Я представляю шок юзера, у которого сначала улетает, а потом откуда не возьмись появляется окно.. MINIMIZE WINDOW Form_1 создать событие таймера с интервалом 60 сек. в событии проверить, распахнуто или нет окно, если нет RESTORE WINDOW грохнуть таймер.

Andrey: Петр пишет: MINIMIZE WINDOW Form_1 создать событие таймера с интервалом 60 сек. в событии проверить, распахнуто или нет окно, если нет RESTORE WINDOW грохнуть таймер. Не знаю как "создать событие таймера" ? Петр, набросай пожалуйста примерный код, (я пока только осваиваю Минигуи) ! Или ткни в пример где это делается...

Dima: Andrey Пошукай по примерам "DEFINE TIMER"

Andrey: Dima пишет: Пошукай по примерам "DEFINE TIMER" Спасибо БОЛЬШОЕ Дима ! Нашел !

Andrey: Видимость переменных или как сделать следующее ? Имею код: FUNCTION Main() Local hWnd, nI, cTask, cButt, cMess Local aButton := {} AADD( aButton, {170, 20,170,35,'Menu 1','Task-1'} ) AADD( aButton, {220, 20,170,35,'Menu 2','Task-2'} ) AADD( aButton, {270, 20,170,35,'Menu 3','Task-3'} ) AADD( aButton, {320, 20,170,35,'Menu 4','Task-4'} ) AADD( aButton, {170,230,170,35,'Menu 5','Task-5'} ) AADD( aButton, {220,230,170,35,'Menu 6','Task-6'} ) AADD( aButton, {270,230,170,35,'Menu 7','Task-7'} ) ...................... FOR nI := 1 TO LEN(aButton) cButt := "RUN"+LTRIM(STR(nI)) cMess := 'Command: ShellExecute( , "open", "TaskTest2.exe", ..... )' cTask := aButton[nI,6] DEFINE BUTTON &cButt ROW aButton[nI,1] COL aButton[nI,2] WIDTH aButton[nI,3] HEIGHT aButton[nI,4] CAPTION aButton[nI,5] ACTION { || ExecTask(cTask,hWnd) } TOOLTIP cMess FONTNAME "MS Sans serif" FONTSIZE 14 FONTBOLD .t. LEFTTEXT .t. BACKCOLOR WHITE END BUTTON NEXT Так вот, при вызове ExecTask(cTask,hWnd) - cTask всегда возвращает последний элемент массива ... Почему ? Как нужно правильно сделать ? Полный пример здесь: http://files.mail.ru/SNQMZ9

gfilatov2002: Andrey пишет: при вызове ExecTask(cTask,hWnd) - cTask всегда возвращает последний элемент массива ... Как нужно правильно сделать ? Отправил исправленный рабочий вариант по почте

Andrey: gfilatov2002 пишет: Отправил исправленный рабочий вариант по почте Спасибо большое... А как нужно правильно описывать переменные в МиниГуи ? PRIVATE можно использовать в коде программы ? Разбираюсь с чужим рабочим кодом... Вот выдержка из него: kol_button := Len( arr_menu_button ) AAdd( arr_kol_button, kol_button ) ......... font_button := { "Times Roman", 12, .T., { 155, 155, 155 }, { 155, 0, 0 }, { 200, 200, 200 }, { 50, 50, 50 } } font_button := chk_font( font_button, 1 ) font_marker_button := { "Times Roman", 12, .T., { 155, 155, 155 }, { 155, 0, 0 }, { 200, 200, 200 }, { 50, 50, 50 } } font_marker_button := chk_font( font_marker_button, 1 ) FOR i_button := 1 TO kol_button nam_exe_button := "act_exe_but0" + IIF(i_page<10, Str( i_page, 1 ), Str( i_page, 2 ) ) + AllTrim( Str( i_button, 2 ) ) PRIVATE &nam_exe_button IF Len( arr_menu_button[ i_button ] ) > 9.and. ! Empty( arr_menu_button[ i_button, 10 ] ) &nam_exe_button := arr_menu_button[ i_button, 10 ] ELSE &nam_exe_button := "" ENDIF AAdd( curs_arr_size[ i_page, 3 ], &nam_exe_button ) IF i_button == 1 AAdd( curs_arr_size[ i_page, 4 ], 1 ) //i_button max_button := 1//i_button ELSE IF arr_menu_button[ i_button, 1 ] > arr_menu_button[ max_button, 1 ] + arr_menu_button[ max_button, 4 ] AAdd( curs_arr_size[ i_page, 4 ], i_button ) max_button := i_button ENDIF ENDIF image_ch1 := "CH2Image_" + AllTrim( Str( i_page, 3 ) ) + AllTrim( Str( i_button, 3 ) ) PRIVATE &image_ch1 &image_ch1 := AllTrim( Str( i_page, 3 ) ) + AllTrim( Str( i_button, 3 ) ) DEFINE BUTTONEX &( "ButtonEX_" + AllTrim( Str( i_page, 3 ) ) + AllTrim( Str( i_button, 3 ) ) ) // PICTURE arr_menu_button[i_button,7]//choice_bmp1 ICON arr_menu_button[ i_button, 7 ] //choice_bmp1 Row arr_menu_button[ i_button, 1 ] + 25 Col arr_menu_button[ i_button, 2 ] WIDTH arr_menu_button[ i_button, 4 ] HEIGHT arr_menu_button[ i_button, 3 ] BACKCOLOR BROWN //для расцветки по градиенту, иначе не работает FONTSIZE 12//&(font_button[2]) VERTICAL .T. ADJUST .F. ACTION ( Sect_Run_Tasks( &nam_exe_button ), Form_1.Setfocus, form_graph_tab() ) END BUTTONEX //MsgInfo(Conv_Profile(nam_exe_button)) Form_1. & ( "ButtonEX_" + AllTrim( Str( i_page, 3 ) ) + AllTrim( Str( i_button, 3 ) ) ) .cargo := arr_menu_button[ i_button ] // Название задачи DEFINE LABEL &( "Label_" + AllTrim( Str( i_page, 3 ) ) + AllTrim( Str( i_button, 3 ) ) ) Row arr_menu_button[ i_button, 1 ] + arr_menu_button[ i_button, 3 ] + 25 drab_y := ( arr_menu_button[ i_button, 6 ] - arr_menu_button[ i_button, 4 ] ) / 2 rab_y := arr_menu_button[ i_button, 2 ] - drab_y IF rab_y < 0 rab_y := 2 ENDIF Col rab_y WIDTH arr_menu_button[ i_button, 6 ] HEIGHT arr_menu_button[ i_button, 5 ] FONTNAME font_button[ 1 ] FONTSIZE font_button[ 2 ] FONTBOLD font_button[ 3 ] FONTCOLOR font_button[ 4 ] BACKCOLOR font_button[ 5 ] VERTICAL .T. CENTERALIGN .T. ADJUST .F. ONMOUSEHOVER { || ch_property( &image_ch1, .F. ), s_form_graph_tab() } ONMOUSELEAVE { || ch_property( &image_ch1, .T. ), s_form_graph_tab() } VALUE AtRepl( ";", arr_menu_button[ i_button, 9 ], Chr( 10 ) ) //"Кнопка " +str(i_page,3) +str(i_button,3) ACTION { || Sect_Run_Tasks( &nam_exe_button ), form_graph_tab() } END LABEL Form_1. & ( "Label_" + AllTrim( Str( i_page, 3 ) ) + AllTrim( Str( i_button, 3 ) ) ) .cargo := { font_button, font_marker_button } NEXT // FOR i_button := 1 TO kol_button Подскажите как нужно правильно писать код в таких случаях ?

Vlad04: Что за программа ? Всю выложить можешь?

gfilatov2002: Andrey пишет: PRIVATE можно использовать в коде программы ? Да, если они связаны с использованием макро-переменных. Andrey пишет: Подскажите как нужно правильно писать код в таких случаях ? О каких случаях идет речь

Andrey: gfilatov2002 пишет: О каких случаях идет речь Объявление переменных в цикле, т.е. на ходу ? FOR i_button := 1 TO kol_button nam_exe_button := "act_exe_but0" + IIF(i_page<10, Str( i_page, 1 ), Str( i_page, 2 ) ) + AllTrim( Str( i_button, 2 ) ) PRIVATE &nam_exe_button ...... AAdd( curs_arr_size[ i_page, 3 ], &nam_exe_button ) ........ ACTION ( Sect_Run_Tasks( &nam_exe_button ), Form_1.Setfocus, form_graph_tab() ) ................ NEXT или FOR i_button := 1 TO kol_button ........... image_ch1 := "CH2Image_" + AllTrim( Str( i_page, 3 ) ) + AllTrim( Str( i_button, 3 ) ) PRIVATE &image_ch1 &image_ch1 := AllTrim( Str( i_page, 3 ) ) + AllTrim( Str( i_button, 3 ) ) DEFINE BUTTONEX &( "ButtonEX_" + AllTrim( Str( i_page, 3 ) ) + AllTrim( Str( i_button, 3 ) ) ) // PICTURE arr_menu_button[i_button,7]//choice_bmp1 ICON arr_menu_button[ i_button, 7 ] //choice_bmp1 Row arr_menu_button[ i_button, 1 ] + 25 Col arr_menu_button[ i_button, 2 ] WIDTH arr_menu_button[ i_button, 4 ] HEIGHT arr_menu_button[ i_button, 3 ] BACKCOLOR BROWN //для расцветки по градиенту, иначе не работает FONTSIZE 12//&(font_button[2]) VERTICAL .T. ADJUST .F. ACTION ( Sect_Run_Tasks( &nam_exe_button ), Form_1.Setfocus, form_graph_tab() ) END BUTTONEX ........... NEXT Да Клипер и Харбор позволяет такое делать. А как же общие рекомендации - объявлять все переменные в начале функции. Какие последствия бывают за это ? Ну скорость может чуток падает или еще что-то есть ? Код рабочий, работает... Но по моему не читаемый. Как правильно оформить его ? Я для себя хочу понять, как правильно писать на МиниГуи... Извиняюсь за свое косноязычие....

gfilatov2002: Andrey пишет: Объявление переменных в цикле Вопрос понятен. Посмотрите, как это сделано в коде библиотеки без использования частных переменных: FOR nJ := 1 TO nMax(aData) cName := "yVal_Name_"+Ltrim(Str(nJ)) @ nBottom + 8, nI - IF(l3D, nDeep, nDeep + 8) LABEL &cName OF &parent; VALUE aYVals[nJ] AUTOSIZE; FONTCOLOR aClrFore; BACKCOLOR IF( lPrint, WHITE, aClrBack ); FONT _HMG_DefaultFontName SIZE _HMG_DefaultFontSize-1 nI += nWideB NEXT

Andrey: gfilatov2002 пишет: Посмотрите, как это сделано в коде библиотеки без использования частных переменных: Спасибо БОЛЬШОЕ !

Andrey: gfilatov2002 пишет: Петр пишет: цитата: я выложу код c_image.c после окончательной пришлифовка, т.е. более точного копирования поведения loadolepicture Большое спасибо! Но тогда уже это будет включено в следующую сборку А где в новой версии этот пример ?

gfilatov2002: Andrey пишет: А где в новой версии этот пример ? Нету Увы, так и не получил от Петра обещанный отшлифованный код c_image.c

Andrey: Григорий, а где можно посмотреть примеры вывода иконок на окно из ресурсов или файлов ? Так как иконки не имеют фона, то их можно выводить на форму - пока вместо PNG файлов. Только как выводить иконки без кнопок ? Пример: MiniGUI\SAMPLES\BASIC\ButtonEx - не подходит.

gfilatov2002: Andrey пишет: где можно посмотреть примеры вывода иконок на окно из ресурсов или файлов ? Посмотри, например, пример в папке samples\Advanced\IcoView

Andrey: gfilatov2002 пишет: Посмотри, например, пример в папке samples\Advanced\IcoView Что-то пример какой то замороченный, в смысле - много кода который не нужен. Как просто вывести иконку на форму ?

Vladimir: @ ... IMAGE <ControlName> Пример SAMPLES\BASIC\IMAGE_2 не оно?

Andrey: Vladimir пишет: Пример SAMPLES\BASIC\IMAGE_2 не оно? А ты туда попробуй иконку 64х64 поставить ! У меня не получилось ...

Vladimir: Виноват. Похоже, пропускает не все иконки. Иконка 128х128. Скачана из Интернет, но преобразована в XnView в полноцветную.

Andrey: А у меня ни в какую не идет ! Берет только 256 colors - а другие нет ! @ 230,270 IMAGE Image_2 PICTURE 'res\comp32x32.ico' Исходник здесь: http://files.mail.ru/P14ZZE

Andrey: Vladimir пишет: Иконка 128х128. Скачана из Интернет, но преобразована в XnView в полноцветную. 256-colors или Windows-XP формат цвета иконки ? Выложи иконку и программу. Глянуть хочется как нужно делать. Заранее спасибо.

Andrey: Привет. Подскажите как можно сделать следующее.... В начале программы всегда идет объявления ОКНA: DEFINE WINDOW Form_1 AT 0, 344 WIDTH 410 HEIGHT 411 ... и т.д. Изменение параметров и расположение, чтение значений делается через Form_1 Ну например: Function ChangeVersion() Local TypeVersion := Form_1.RadioGroup_1.Value Function SetValue(cDescription,cImage,cPath) Form_1.Label_3.Value := cDescription Form_1.Icon_Big.Icon := cImage Form_1.Text_1.Value := cPath А как можно прочитать/изменить ОКНО если его задать внешне, т.е. имя ОКНА приходит из другой программы ? Макроподстановка не проходит... STATIC MyForm FUNCTION MyEditVers( cWindows ) MyForm := cWindows ...... DEFINE WINDOW &MyForm AT 0, 344 WIDTH 410 HEIGHT 411 ... и т.д. ...... Center WINDOW &MyForm ACTIVATE WINDOW &MyForm Function ChangeVersion() Local TypeVersion := &MyForm.RadioGroup_1.Value // - не работает Function SetValue(cDescription,cImage,cPath) &MyForm.Label_3.Value := cDescription // - не работает &MyForm.Icon_Big.Icon := cImage // - не работает &MyForm.Text_1.Value := cPath // - не работает Заранее спасибо за ответ ! В новой документации MiniGuiPdf.pdf - не нашел. Есть только глава 16. Test Function

gfilatov2002: Andrey пишет: В новой документации MiniGuiPdf.pdf - не нашел. По-видимому, плохо искал Обрати внимание на команду DECLARE WINDOW <Form>, которая прямо предназначена для таких вещей Также в таких случаях удобнее использовать функцию SetProperty() вместо псевдо-ООП комманд: Function SetValue(cDescription,cImage,cPath) SetProperty('MyForm','Label_3','Value', cDescription) SetProperty('MyForm','Icon_Big','Icon', cImage) SetProperty('MyForm',Text_1','Value', cPath) и функцию GetProperty(): Function ChangeVersion() Local TypeVersion := GetProperty('MyForm','RadioGroup_1','Value')

Andrey: gfilatov2002 пишет: По-видимому, плохо искал Согласен .... gfilatov2002 пишет: Обрати внимание на команду DECLARE WINDOW <Form>, которая прямо предназначена для таких вещей А есть пример, а то из описания плохо пока понимаю. gfilatov2002 пишет: Также в таких случаях удобнее использовать функцию SetProperty() вместо псевдо-ООП комманд: Спасибо БОЛЬШОЕ, то что надо !

Andrey: А как сделать form_1.refesh() для моего случая ? Напоминаю, у меня идет определение окна через статик переменную: MyForm := cWindows ...... DEFINE WINDOW &MyForm AT 0, 344 WIDTH 410 HEIGHT 411 ... и т.д. Дело в том что я цвет ОКНА меняю по ходу работы самой программы: SetProperty( MyForm, "BackColor", aNewColor )

Dima: Andrey пишет: А как сделать form_1.refesh() для моего случая ? Ни как ;) Может все таки refresh ?

Andrey: Dima пишет: Может все таки refresh ? Ошибся малость при переносе на форум.... Дело в том что такое не проходит: &MyForm.refesh() Пробовал: Domethod( MyForm, "Refresh" ) - ничего не происходит. То есть мне нужно перерисовать форму, все объекты которые на ней лежат. Как это сделать ?

gfilatov2002: Andrey пишет: мне нужно перерисовать форму, все объекты которые на ней лежат. Обшей команды Refresh для всей формы не существует, но Вы можете использовать перерисовку каждого элемента формы по отдельности, как это сделано в примере Color из папки samples\Basic\Color. ITEM 'Set Form_1 BackColor' ACTION ( Form_1.BackColor := GetColor(), ; Form_1.Label_1.BackColor := Form_1.BackColor, ; Form_1.Check_1.BackColor := Form_1.BackColor, ; Form_1.Radio_1.BackColor := Form_1.BackColor, ; Form_1.Frame_1.BackColor := Form_1.BackColor, ; Form_1.Slider_1.BackColor := Form_1.BackColor, ; Form_1.Hide, Form_1.Show ) Если не хочется перечислять все элементы формы вручную, то можно использовать массив с именами всех этих элементов из примера Form Controls в папке samples\Basic\Form_Controls: [pre2]/******************************************************************************/ 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 )[/pre2]

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

Andrey: Можно ли с помощью МиниГуи сделать следующее: 1) PNG файл 128х128 загрузить в память и преобразовать в 128х128 ICO и сохранить файл ? 2) PNG файл любого размера "нарезать" на заданные размеры (для примера 128х128) ?

Andrey: Сделал обучающий пример по иконкам. Не могу заставить компилироваться 2 примера из одного файла: build.bat call hbmk2.bat %* demo1.hbp call hbmk2.bat %* demo2.hbp Пишет ошибку: building... S:\SAMPLES\IconsToForm\build.log Процесс не может получить доступ к файлу, так как этот файл занят другим процессом. Процесс не может получить доступ к файлу, так как этот файл занят другим процессом. Harbour 3.2.0dev (Rev. 17966) Как побороть это ? Содержание: demo1.hbp # Incremental-режим компиляции -inc # папка где будут все *.obj -workdir=OBJ1 # Имя EXE-модуля -odemo1.exe # включить путь к MiniGui и своим *.ch и *.fmg -incpath=Z:\MiniGUI\Include # перечисляем все *.prg demo.prg # Ресурсы demo.rc # Пути к основным и добавочным *.lib -lminigui -LZ:\MiniGUI\LIB\ Содержание: demo2.hbp # Incremental-режим компиляции -inc # папка где будут все *.obj -workdir=OBJ2 # Имя EXE-модуля -odemo2.exe # включить путь к MiniGui и своим *.ch и *.fmg -incpath=Z:\MiniGUI\Include # перечисляем все *.prg demo.prg # Ресурсы demo.rc # Пути к основным и добавочным *.lib -lminigui -LZ:\MiniGUI\LIB\

AlexMyr: Посмотрел hbp файлы, вопрос: demo.prg это один файл или он разный и лежит в разных папках? где содержимое hbmk2.bat? Так пробовал? call hbmk2.bat %* demo*.hbp

Andrey: AlexMyr пишет: вопрос: demo.prg это один файл или он разный и лежит в разных папках? Это один и тот же файл. AlexMyr пишет: Так пробовал? call hbmk2.bat %* demo*.hbp Попробовал ! Получилось !!! Спасибо БОЛЬШОЕ !!!

Andrey: Всем привет ! Подскажите пожалуйста, как задавать цвет STATUSBAR-а ? И изменять цвет STATUSBAR по надобности ? Типа: DoMethod( MyForm,"Statusbar","Refresh") ??? а есть ли такой метод ??? Заранее спасибо.

Andrey: МиниГуи - пример SAMPLES\BASIC\DirectoryRecurse Если в папки записать файлы без расширений, то ничего НЕ ПОКАЗЫВАЕТ ! Почему ? Папка для пробы здесь http://files.mail.ru/QJS1VX

Andrey: Можно ли узнать какой тип картинки записан в ресурсе EXE-ника ? Т.е. у меня в rc файле лежат два разных файла: DEMO1 BITMAP "res\LOGO_DEMO.BMP" DEMO2 JPG "res\harbour-logo.jpg" А в программе я хочу определить какой тип файла, чтобы вычислить размер рисунка: // если тип файла "BMP" IF ???? ______aSize := BmpSize( cFile ) ELSE ______aSize := JpgSize( cFile ) ENDIF nWidth := aSize[1] nHeight := aSize[2] И почему в ХЕЛПЕРе нет описание функции JpgSize( cFile ) и hb_GetImageSize() ? Нашел только в примере \MiniGUI\SAMPLES\Advanced\JpgViewer, да и то с переназначением(вызовом) функции hb_GetImageSize() ? Да и то эта функция выдает размер файла на диске, а не в ресурсе !!! Облом... Что нельзя было сделать общую функцию определения размера картинки независимо от типа файла и типа размещения (т.е. файл на диске или файл в ресурсе) ??? Может уже есть такая функция, а я не нашел...

Andrey: Всем привет. Как реализовать следующее: Имею объект ГРИД: DEFINE GRID Grid_Report ............... HEADERS {'№','Наименование отчета', 'Файл' } WIDTHS { 30,430, 120 } ITEMS LoadReport() VALUE 1 HEADERIMAGES aImages BACKCOLOR { 159, 191, 236 } TOOLTIP 'Выбор отчета/F4-Редактирование отчета' ONDBLCLICK LoadViewFr3() END GRID ....... ///////////////// FUNCTION LoadViewFr3() ??? Как узнать выбранный элемент массива и название файла ? Как можно назначить клавишу (допустим F4) - чтобы вызывалась отдельная функция ?

Andrey: Разобрался я с элементами меню ГРИДА... И как назначить горячую клавишу на форме.. вот результат, если кому интересно... http://files.mail.ru/RNWL47

gfilatov2002: Andrey пишет: Разобрался я с элементами меню ГРИДА... И как назначить горячую клавишу на форме Супер! Но вместо дополнительной функции GetColValue( xObj, xForm, nCol ) можно использовать стандарный объект Cell (row, col) Например, так: FUNCTION LoadViewFr3() LOCAL cMsg := Form_1.Grid_Report.Cell( this.value, 3 ) LOCAL cMsg2 := Form_1.Grid_Report.Cell( this.value, 2 ) MsgInfo( cMsg ) MsgInfo( cMsg2 ) //MsgInfo( GetColValue( "Grid_Report", "Form_1", 3 ) ) //MsgInfo( GetColValue( "Grid_Report", "Form_1", 2 ) ) RETURN NIL

Andrey: gfilatov2002 пишет: Например, так: Спасибо БОЛЬШОЕ ! Как насчет моего письма ?

Andrey: gfilatov2002 пишет: можно использовать стандарный объект Cell (row, col) Для мышки и ENTER это работает ! А по горячей клавише F4 - вылетает с ошибкой.... Как можно исправить ? Исходник здесь. http://files.mail.ru/42OT6H

gfilatov2002: Andrey пишет: А по горячей клавише F4 - вылетает с ошибкой А если попробовать так: [pre]#include "minigui.ch" #define PROGRAM 'Тест-Grid' #define COPYRIGHT MiniGUIVersion()+","+Version()+","+hb_compiler() REQUEST HB_CODEPAGE_RU1251 Function MAIN() Local cResPicture, nWidth, nHeight LOCAL fColor := { | Val, CellRowIndex | IF ( CellRowIndex / 2 == Int( CellRowIndex / 2 ) , RGB( 0, 0, 255 ) , RGB( 0, 255, 0 ) ) } LOCAL fColor2 := { | Val, CellRowIndex | IF ( CellRowIndex / 2 == Int( CellRowIndex / 2 ) , RGB( 159, 191, 236 ) , RGB( 159, 191, 236 ) ) } SET LANGUAGE TO RUSSIAN SET CODEPAGE TO RUSSIAN SET DATE TO GERMAN DEFINE WINDOW Form_1; AT 0,0 ; WIDTH 650 HEIGHT 500 ; ICON "ICO_AAA" ; TITLE PROGRAM ; NOMAXIMIZE NOSIZE ; MAIN @ 0,10 LABEL Label_9 WIDTH 500 HEIGHT 40 ; VALUE 'MiniGUI ТЕСТ объекта GRID !' TRANSPARENT FONT "ARIAL" ; SIZE 18 BOLD FONTCOLOR BLACK BACKCOLOR YELLOW CENTERALIG DEFINE GRID Grid_Report Row 110 Col 15 WIDTH 590 HEIGHT 250 HEADERS {'№','Наименование отчета', 'Файл' } WIDTHS { 30,430, 120 } ITEMS LoadReport() VALUE 1 HEADERIMAGES {} BACKCOLOR { 159, 191, 236 } FONTSIZE 16 FONTBOLD .T. FONTCOLOR { 255, 0, 255 } DYNAMICFORECOLOR { fColor , fColor, fColor } DYNAMICBACKCOLOR { fColor2, fColor2, fColor2 } TOOLTIP 'Выбор отчета/F4-Редактирование отчета' ONHEADCLICK { {|| MsgInfo('Header 1 Clicked !')} , { || MsgInfo('Header 2 Clicked !')} } ONDBLCLICK LoadViewFr3(1) END GRID DEFINE STATUSBAR FONT "MS Sans serif" SIZE 10 BOLD STATUSITEM COPYRIGHT DATE CLOCK END STATUSBAR ON KEY F4 ACTION LoadViewFr3(2) END WINDOW SetProperty( "Form_1", "BackColor" , { 159, 191, 236 } ) CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return Nil ///////////////////////////////////////////////////////////// FUNCTION LoadViewFr3(nK) //MsgInfo( GetColValue( "Grid_Report", "Form_1", 3 ),"GetColValue ->" ) //MsgInfo( GetColValue( "Grid_Report", "Form_1", 2 ),"GetColValue ->" ) IF nK == 1 MsgInfo( Form_1.Grid_Report.Cell( this.value, 3 ) ,"this.value, 3 ->") MsgInfo( Form_1.Grid_Report.Cell( this.value, 2 ),"this.value, 2 ->" ) ELSE MsgInfo( Form_1.Grid_Report.Cell( GetProperty("Form_1", "Grid_Report", "value"), 3 ) ,"value, 3 ->") MsgInfo( Form_1.Grid_Report.Cell( GetProperty("Form_1", "Grid_Report", "value"), 2 ),"value, 2 ->" ) ENDIF RETURN NIL //////////////////////////////////////////////////////////// FUNCTION LoadReport() LOCAL aRows := { } AAdd( aRows, {"1.", "Свод по поступлению из банка", "prixod.fr3" } ) AAdd( aRows, {"2.", "Свод по начислению из банка" , "nachis.fr3" } ) AAdd( aRows, {"3.", " резерв..............3 ", "*3.fr3" } ) AAdd( aRows, {"4.", " резерв..............4 ", "*4.fr3" } ) RETURN aRows *--------------------------------------------------------------* Function GetColValue( xObj, xForm, nCol ) *--------------------------------------------------------------* Local nPos:= GetProperty(xForm, xObj, 'Value') Local aRet:= GetProperty(xForm, xObj, 'Item', nPos) Return aRet[nCol] [/pre]

Andrey: gfilatov2002 пишет: А если попробовать так: Спасибо ! Я понял как делать...

Andrey: Есть красивый пример \MiniGUI\SAMPLES\Advanced\Tsb_filter\demo.prg Пробовал его переделать под себя и не получилось: 1) Как запретить вывод(показ) всех полей базы (т.е. поля NOT1, NOT2, NOT3 - не показывать в TsBrowse) ? 2) Как разрешить редактировать ВСЕ поля в TsBrowse ? 3) Как разрешить редактировать ТОЛЬКО выборочные поля (KVIEWUK, KOD_EIRC, EIRC) в TsBrowse ? Заранее спасибо за ответ. Пример и база здесь. http://files.mail.ru/AEKHPY

gfilatov2002: Andrey пишет: 1) Как запретить вывод(показ) всех полей базы (т.е. поля NOT1, NOT2, NOT3 - не показывать в TsBrowse) ? Можно просто скрыть их (как сделано в примере ниже) или не загружать вовсе (с помошью функции LoadFields()). Andrey пишет: 2) Как разрешить редактировать ВСЕ поля в TsBrowse ? Вызвать метод oBrw:LoadFields( .T. ) c параметром .T. - и все поля редактируемые Andrey пишет: 3) Как разрешить редактировать ТОЛЬКО выборочные поля (KVIEWUK, KOD_EIRC, EIRC) в TsBrowse ? Для этого надо разрешить перемещение по полям внутри строки данных и установить флажок редактирования для требуемых полей. Рабочий пример см. ниже (все изменения сделаны в FUNCTION CreateBrowse): [pre]#include "minigui.ch" #include "tsbrowse.ch" REQUEST HB_CODEPAGE_RU1251, HB_CODEPAGE_RU866 STATIC aFont := {} MEMVAR oBrw_1 FUNCTION Main() LOCAL cIndex, cFilter LOCAL cDbf := GetStartupFolder() + '\test_2.dbf' LOCAL cFileIndex := GetStartupFolder() + '\test_200.cdx' REQUEST DBFCDX , DBFFPT SET LANGUAGE TO RUSSIAN // язык SET CODEPAGE TO RUSSIAN // кодовая страница RDDSETDEFAULT('DBFCDX') SET CENTURY ON SET DELETED ON DEFINE FONT Font_1 FONTNAME "Times New Roman" SIZE 12 DEFINE FONT Font_2 FONTNAME "Times New Roman" SIZE 11 DEFINE FONT Font_3 FONTNAME "Times New Roman" SIZE 10 BOLD AAdd( aFont, GetFontHandle( "Font_1" ) ) AAdd( aFont, GetFontHandle( "Font_2" ) ) AAdd( aFont, GetFontHandle( "Font_3" ) ) DEFINE WINDOW Form_0 ; At 0, 0 ; WIDTH 790 ; HEIGHT 450 ; TITLE 'TsBrowse sample: Incremental search' ; ICON 'lupa.ico' ; MAIN ; NOMAXIMIZE ; NOSIZE DEFINE LABEL Message ROW 7 COL 10 WIDTH 80 HEIGHT 16 VALUE 'Поиск:' FONTBOLD .T. END LABEL DEFINE TEXTBOX Text_1 ROW 5 COL 90 WIDTH 345 HEIGHT 21 ON CHANGE {|| RefreshBrowse()} END TEXTBOX ON KEY ESCAPE ACTION ThisWindow.Release END WINDOW DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 600 ; HEIGHT 40 ; CHILD ; NOSYSMENU ; NOCAPTION DEFINE LABEL Label_1 ROW iif( IsVista().or.IsSeven(), 5, 10 ) COL 10 WIDTH 580 HEIGHT 24 VALUE '' CENTERALIGN .T. END LABEL END WINDOW //ScanSoft( cDbf ) USE (cDbf) ALIAS 'B1' SHARED NEW CODEPAGE("RU866") cIndex := "UPPER(FIELD->Name_UK)" cFilter := "FIELD->Kod_UK > 0 .AND. DELETED()==.F." INDEX ON &cIndex TAG KODVIEW TO (cFileIndex) ; FOR &cFilter ADDITIVE ORDLISTADD( cFileIndex ) DBSETORDER(1) GOTO TOP CreateBrowse( "oBrw_1", 'Form_0', 30, 2, Form_0.Width-10, Form_0.Height-60, 'B1' ) oBrw_1:aColumns[1]:cHeading := "Код" + CRLF + "Упр.Комп." oBrw_1:SetColSize(1, 60) oBrw_1:aColumns[1]:nAlign := DT_CENTER oBrw_1:aColumns[2]:cHeading := "Наименование Упр.Комп." oBrw_1:SetColSize(2, 350) oBrw_1:aColumns[2]:nAlign := DT_LEFT oBrw_1:aColumns[3]:cHeading := "Код" + CRLF + "показа" oBrw_1:SetColSize(3, 60) oBrw_1:aColumns[3]:nAlign := DT_CENTER oBrw_1:aColumns[4]:cHeading := "Код" + CRLF + "ЕИРЦ" oBrw_1:SetColSize(4, 60) oBrw_1:aColumns[4]:nAlign := DT_RIGHT oBrw_1:aColumns[5]:cHeading := "Наименование ЕИРЦ г.Москвы" oBrw_1:SetColSize(5, 250) oBrw_1:aColumns[5]:nAlign := DT_LEFT Form_0.Text_1.Setfocus CENTER WINDOW Form_0 ACTIVATE WINDOW ALL RETURN Nil FUNCTION CreateBrowse( cBrw, cParent, nRow, nCol, nWidth, nHeight, cAlias ) LOCAL i PUBLIC &cBrw DEFINE TBROWSE &cBrw ; AT nRow, nCol ; ALIAS cAlias ; OF &cParent ; WIDTH nWidth ; HEIGHT nHeight ; COLORS { CLR_BLACK, CLR_BLUE } ; FONT "MS Sans Serif" ; SIZE 8 ; SELECTOR .T. END TBROWSE &cBrw:LoadFields( .F. ) // &cBrw:LoadFields( .T. ) - все поля редактируемые &cBrw:HideColumns( {6,7,8}, .T.) &cBrw:lNoHScroll := .T. &cBrw:lCellBrw := .T. &cBrw:aColumns[3]:lEdit := .T. &cBrw:aColumns[4]:lEdit := .t. &cBrw:aColumns[5]:lEdit := .T. &cBrw:nSelWidth := 16 &cBrw:ChangeFont( aFont[ 1 ], , 1 ) &cBrw:ChangeFont( aFont[ 3 ], 1 , 1 ) &cBrw:ChangeFont( aFont[ 3 ], , 2 ) &cBrw:nHeightCell += 6 &cBrw:nHeightHead += 14 &cBrw:nWheelLines := 1 &cBrw:SetColor( { 16 }, { Rgb( 43, 149, 168 )}) // Цвет фона в суперхидере &cBrw:SetColor( { 3 }, { Rgb( 255, 255, 255 )}) // шрифт в шапке &cBrw:SetColor( { 4 }, { { || { Rgb( 43, 149, 168 ), Rgb( 0, 54, 94 )}}}) // Шапка &cBrw:SetColor( { 17 }, { Rgb( 255, 255, 255 )}) // Цвет шрифта в суперхидере &cBrw:SetColor( { 6 }, { { || { Rgb( 255, 255, 74 ), Rgb( 240, 240, 0 )}}}) // фон курсора &cBrw:SetColor( { 12 }, { { || { Rgb( 128, 128, 128 ), Rgb( 250, 250, 250 )}}}) // фон курсора неактивного &cBrw:SetColor( { 2 }, { { || Rgb( 230, 240, 255 )}}) // фон не в курсоре &cBrw:SetColor( { 1 }, { { || Rgb( 0, 0, 0 )}}) // текст в ячейках &cBrw:SetColor( { 5 }, { { || Rgb( 0, 0, 255 )}}) // текст в ячейках с фокусом &cBrw:SetColor( { 11 }, { { || Rgb( 0, 0, 0 )}}) // цвет текста в курсоре неактивном &cBrw:nClrLine := COLOR_GRID &cBrw:SetAppendMode( .F. ) &cBrw:SetDeleteMode( .F. ) &cBrw:ResetVScroll() RETURN Nil STATIC FUNCTION RefreshBrowse() LOCAL cSeek := Alltrim( Form_0.Text_1.Value ) LOCAL cExp := "'" + UPPER(cSeek) + "' $ UPPER(B1->Name_Uk)" IF !Empty(cSeek) B1->( DbSetFilter( &("{||" + cExp + "}"), cExp ) ) ELSE B1->( DbClearFilter() ) END oBrw_1:Reset() RETURN Nil [/pre]

Andrey: gfilatov2002 пишет: Рабочий пример см. ниже Спасибо БОЛЬШОЕ !!! Чувствуется рука мастера !!! А еще вопрос по этому примеру: зачем нужно в этом примере следующая конструкция ? DEFINE LABEL Label_1 ROW iif( IsVista().or.IsSeven(), 5, 10 ) COL 10 WIDTH 580 HEIGHT 24 VALUE '' CENTERALIGN .T. END LABEL

Andrey: Добавил этот пример к своему проекту. ОДИН раз работает, при повторном вызове - вылетает с ошибкой: 53 строка: DEFINE FONT Font_1 FONTNAME "Times New Roman" SIZE 12 DEFINE FONT Font_2 FONTNAME "Times New Roman" SIZE 11 DEFINE FONT Font_3 FONTNAME "Times New Roman" SIZE 10 BOLD Я так понимаю, что шрифт повторно переопределяется ? Я нашел что нужно делать RELEASE FONT <cName>. В примере для выхода есть: ON KEY ESCAPE ACTION ThisWindow.Release Вместо неё (ThisWindow.Release) нужно написать свою функцию и там УДАЛИТЬ фонты ? Или можно как то по другому сделать ?

subbota: У меня вопрос простой. Можно ли в MiniGui запускать ide сразу с проектом по щелчку мышки на файле проекта *.hpj или *.hbp ?

SergKis: Andrey пишет:Или можно как то по другому сделать ? Можно: ON RELEASE ( <свои действия> ) ... ON KEY ESCAPE ACTION ThisWindow.Release // не менять Применяя команды препроцессора (как в Clipper std.ch ), надо смотреть, что внутри - сильно помогает в понимании MiniGui, которая устроена довольно стройно: I_<Контрл>.CH - команды препроцессора H_<Контрл>.PRG - функции создания контрола и работы с ним C_<Контрл>.C - HB_FUN для работы с контролом Примеры: DEFINE FONT ... из i_font.ch вызывает _DefineFont(...) из h_font.prg , @ <row>,<col> LABEL ... из i_Label.ch вызывает _DefineLabel(...) из h_Label.prg , @ <row>,<col> GRID ... из i_grid.ch вызывает _DefineGrid(...) из h_Grid.prg и так далее. Посмотрев на функцию _Define...(...) можно увидеть, что назначено по умолчанию, а самое главное, как используются переменные _HMG_... ( полный список в I_VAR.CH). В примере с GRID была использована доп. функция GetColValue( xObj, xForm, nCol ), а можно было использовать готовую функцию из h_grid.prg _GetGridCellValue ( ControlName , ParentForm , Row , Col ) и для замены _SetGridCellValue ( ControlName , ParentForm , Row , Col , CellValue ).

Andrey: SergKis спасибо БОЛЬШОЕ !

Andrey: В примере MiniGUI\SAMPLES\Advanced\CHECKMAILBOX используется функция для пароля CHARXOR(): PUBLIC cCryptKey := REPL( "#$@%&", 2 ) ........... cPass := CHARXOR( GetIni( NTRIM(nI)+"/16", "Password", "", cIniFile ), cCryptKey ) Я её к себе в программу поставил и обнаружил фигню.... Если пароль из цифр ставить, то все.... ! Перестает работать пароль. С чем связано, не знаю, наверно из ини-файла эту строку Харбор считать не может. Я с таким еще на Клипере сталкивался. Чем можно заменить эту функцию, чтобы можно было считывать/записывать любой пароль в ини-файл ? Пример здесь. http://files.mail.ru/VAPIMT

a_sidorov: Вы пишете в текстовой ини файл бинарный код. Для некоторых символов Вы получаете в ини файле коды 10, 13 и т.д. которые при считывании GetPrivateProfileString воспринимаются как конец строки и пароль обрезается. Нужно писать не коды символов, а их представление, например \u0013 -код 13

Andrey: Я понял это еще в клипере. Просто думал что есть готовая функция в Харборе для таких целей... А так получается, что строку нужно писать в кодах ascii или еще как нибудь. Наверно достаточно будет воспользоваться функциями HB_StrToHEX() и HB_HexToStr() !

SergKis: Andrey пишет: Наверно достаточно будет воспользоваться функциями HB_StrToHEX() и HB_HexToStr() Никогда не скрывал пароли разными способами, запоминал как есть. Рано или поздно всегда, кто нибудь забудет и тогда просто глянул и проблема снята !

Andrey: SergKis пишет: Рано или поздно всегда, кто нибудь забудет и тогда просто глянул Для этого есть пароль Админа в программе (для изменения и просмотра).

SergKis: Andrey пишет:Для этого есть пароль Админа в программе (для изменения и просмотра) Это когда ты один, а если Админами являются люди "внедренцы" со своими паролями Админ (я не знаю эти пароли) и когда они не доступны, по разным причинам, обращаются ко мне и достаточно по удаленке просто глянуть ини и ВСЕ ... , а не разбираться что и где надо запустить с паролем Админ. Но все это субъективно и дело привычки.

Andrey: Подскажите пожалуйста пример (или функции), где можно запомнить координаты своей задачи на рабочем столе (в файл ini), а затем восстановить окно в этих координатах.

Avf: ResizeIt из Samples\Advanced

Andrey: Avf пишет: ResizeIt из Samples\Advanced Спасибо БОЛЬШОЕ !!!

Andrey: Подскажите, как можно проверить ввод 2-х паролей и если они не одинаковы, то вернуться назад ? Имею такую конструкцию: Local cPwd, cPwd2 ...... @ 173,155 TEXTBOX Text_Pass1 HEIGHT 24 WIDTH 190 VALUE cPwd PASSWORD ; ON LOSTFOCUS {|| cPwd := Form_1.Text_Pass1.Value } ; ON ENTER Form_1.Text_Pass2.SetFocus @ 214,30 LABEL Label_Pass2 VALUE "Повтор:" WIDTH 120 HEIGHT 24 ; @ 211,155 TEXTBOX Text_Pass2 HEIGHT 24 WIDTH 190 VALUE cPwd2 PASSWORD ; ON LOSTFOCUS {|| cPwd2 := Form_1.Text_Pass2.Value } ; ON ENTER {|| IF( cPwd2#cPwd,MsgInfo("Пароли не одинаковы ! Повторите ввод заново !") , SaveConfig(cUsr,cPwd) ) }

Avf: Можно, например, так while .t. ввод если пароли совпадают выйти иначе сбросить контролы end

Andrey: Avf пишет: Можно, например, так while .t. Нельзя так. Это на форме редактируется.

SergKis: Andrey пишет:Подскажите, как можно проверить ввод 2-х паролей Примерно так: [pre2] SET NAVIGATION EXTENDED // вкл.навигацию по Enter дополнительно к кл. TAB ... DEFINE WINDOW MyWnd ... // описание окна и контролов окна ... ON INIT ( ... ) // выполняется когда Show окна выполнен в ACTIVATE WINDOW ON RELEASE ( ... ) // выполняется перед разрушением окна ... @ 173,155 TEXTBOX Text_Pass1 HEIGHT 24 WIDTH 190 VALUE cPwd PASSWORD @ 214, 30 LABEL Label_Pass2 VALUE "Повтор:" WIDTH 120 HEIGHT 24 @ 211,155 TEXTBOX Text_Pass2 HEIGHT 24 WIDTH 190 VALUE cPwd2 PASSWORD ... DEFINE BUTTON OK ... ACTION PressOk() // действия по окончании ввода DEFINE BUTTON Cancel ... ACTION ThisWindow.Release // действия по завершению работы с окном ... END WINDOW // конец описания. ОТОБРАЖЕНИЯ ЕЩЕ НЕТ ! ... ACTIVATE WINDOW MyWnd // здесь выполняется Show(). ОТОБРАЖЕНИЕ окна появилось и // включается цикл обработки сообщений из очереди. // Обработчик - функция Event(hWnd, nMsg, wParam, lParam) // см. h_events.prg // если попали сюда окна уже нет, ThisWindow.Release уже отработал RETURN FUNCTION PressOk() Local cUsr, cPwd, cPwd2 cUsr := GetProperty("MyWnd", "Text_User" , "Value") cPwd := GetProperty("MyWnd", "Text_Pass1", "Value") cPwd2 := GetProperty("MyWnd", "Text_Pass2", "Value") IF cPwd == cPwd2 SaveConfig(cUsr, cPwd) ELSE MsgInfo("Пароли не одинаковы ! Повторите ввод заново !") DoMethod("MyWnd", "Text_Pass1", "SetFocus") ENDIF RETURN [/pre2]

Andrey: SergKis пишет: Примерно так: Спасибо БОЛЬШОЕ ! Очень подробно и с разъяснениями !!! Просто супер !

Andrey: Не нравиться порядок написания программ в МиниГуи... уж очень растянуто получается... Подскажите можно ли как то уменьшить или изменить это ? Вот например: DEFINE WINDOW Form_1 ; ON INIT MyInitColor() DEFINE TAB Tab_1 ; ON CHANGE (ChangeColor(), Form_1.Button_Save.Visible := (Form_1.Tab_1.Value < 4), ; Form_1.Button_Exit.Visible := (Form_1.Tab_1.Value < 4), ; Form_1.Button_Exit.Visible := (Form_1.Tab_1.Value < 4) ) PAGE ' Сайт ' @ 34, 20 LABEL Label_1 VALUE "Filling color:" WIDTH 370 HEIGHT 26 TRANSPARENT @ 66,20 FRAME Frame_1a CAPTION "Адрес сайта" ; BACKCOLOR aBackColors ; WIDTH 470 HEIGHT 52 OPAQUE @ 88,30 TEXTBOX Text_Adres ; WIDTH 450 ; VALUE cHttp ; TOOLTIP "Адрес сайта куда отправлять данные."; FONT "Courier New" Size 12 ; MAXLENGTH 60 LOWERCASE ; ON LOSTFOCUS {|| Form_1.Button_Save.Enabled := .T. } ON ENTER Form_1.Spinner_2.SetFocus @ 166,20 FRAME Frame_1s CAPTION "Пересчет и отправка на сайт" ; BACKCOLOR aBackColors ; WIDTH 470 HEIGHT 52 OPAQUE @ 188,30 LABEL Label_Time VALUE "Время пересчета" ; FONT "Courier New" Size 12 ; WIDTH 180 HEIGHT 24 @ 185,195 SPINNER Spinner_2 RANGE 5,900 VALUE nInterval ; FONT "Courier New" Size 12 ; WIDTH 58 HEIGHT 24 INCREMENT 5 ON LOSTFOCUS {|| Form_1.Button_Save.Enabled := .T. } ON ENTER Form_1.Button_Save.SetFocus @ 188,255 LABEL Label_Sec VALUE "секунд" ; FONT "Courier New" Size 12 ; WIDTH 75 HEIGHT 24 END PAGE PAGE ' Пути ' @ 34, 20 LABEL Label_2 VALUE "Filling color:" WIDTH 370 HEIGHT 26 TRANSPARENT @ 66, 20 LABEL Label_2Za VALUE "Путь к БД-Заявка:" WIDTH 370 HEIGHT 26 TRANSPARENT BOLD @ 88, 20 TEXTBOX Text_PathZa WIDTH 440 VALUE "C:\TEMP\" TOOLTIP "Путь к БД-Заявка." ; FONT "Courier New" Size 12 BOLD ; MAXLENGTH 60 LOWERCASE READONLY @ 88, 465 BUTTONEX Button_PathZa WIDTH 28 HEIGHT 28 ; ICON "OPEN24" ACTION Button_Path() @ 126, 20 LABEL Label_2Spr VALUE "Путь к БД-справочникам:" WIDTH 370 HEIGHT 26 TRANSPARENT BOLD @ 148, 20 TEXTBOX Text_PathSpr WIDTH 440 VALUE "C:\TEMP\" TOOLTIP "Путь к БД-справочникам." ; FONT "Courier New" Size 12 BOLD ; MAXLENGTH 60 LOWERCASE READONLY @ 148, 465 BUTTONEX Button_PathSpr WIDTH 28 HEIGHT 28 ; ICON "OPEN24" ACTION Button_Path() @ 186, 20 LABEL Label_2TD VALUE "Путь к БД-статистики заявок за текущий день:" WIDTH 430 HEIGHT 26 TRANSPARENT BOLD @ 208, 20 TEXTBOX Text_PathTD WIDTH 440 VALUE "C:\TEMP\" TOOLTIP "Путь к БД-статистики заявок за текущий день." ; FONT "Courier New" Size 12 BOLD ; MAXLENGTH 60 LOWERCASE READONLY @ 208, 465 BUTTONEX Button_PathTD WIDTH 28 HEIGHT 28 ; ICON "OPEN24" ACTION Button_Path() @ 246, 20 LABEL Label_2TY VALUE "Путь к БД-статистики заявок за год:" WIDTH 430 HEIGHT 26 TRANSPARENT BOLD @ 268, 20 TEXTBOX Text_PathTY WIDTH 440 VALUE "C:\TEMP\" TOOLTIP "Путь к БД-статистики заявок за год." ; FONT "Courier New" Size 12 BOLD ; MAXLENGTH 60 LOWERCASE READONLY @ 268, 465 BUTTONEX Button_PathTY WIDTH 28 HEIGHT 28 ; ICON "OPEN24" ACTION Button_Path() END PAGE PAGE ' Пароли ' @ 34, 20 LABEL Label_3 VALUE "Filling color:" WIDTH 370 HEIGHT 26 TRANSPARENT @ 66, 20 LABEL Label_4Pass VALUE "Путь к БД-паролей:" WIDTH 370 HEIGHT 26 TRANSPARENT BOLD @ 88, 20 TEXTBOX Text_4Pass WIDTH 440 VALUE "C:\TEMP\" TOOLTIP "Путь и БД-паролей (password.dbf)" ; FONT "Courier New" Size 12 BOLD ; MAXLENGTH 60 LOWERCASE READONLY @ 88, 465 BUTTONEX Button_4Pass WIDTH 28 HEIGHT 28 ; ICON "OPEN24" ACTION Button_Path() @ 126,20 FRAME Frame_Direct CAPTION "Руководитель фирмы" ; BACKCOLOR aBackColors ; WIDTH 470 HEIGHT 185 OPAQUE @ 160, 45 BUTTONEX Button_User WIDTH 68 HEIGHT 68 ; ICON "USER64" @ 170,90 LABEL Label_DirLog VALUE "Логин:" ; WIDTH 150 HEIGHT 24 RIGHTALIGN ; FONT "Courier New" Size 12 @ 170,245 TEXTBOX Text_Direct ; WIDTH 190 ; VALUE "User" ; FONT "Courier New" Size 12 ; MAXLENGTH 40 ; ON LOSTFOCUS {|| Form_1.Button_Save.Enabled := .T. } ON ENTER Form_1.Spinner_Firma.SetFocus @ 210,90 LABEL Label_DirPass1 VALUE "Пароль:" WIDTH 150 HEIGHT 24 ; FONT "Courier New" SIZE 12 RIGHTALIGN @ 210,245 TEXTBOX Text_DirPass1 HEIGHT 24 WIDTH 190 VALUE cPwd PASSWORD ; ON LOSTFOCUS {|| cPwd := Form_1.Text_DirPass1.Value } ; ON ENTER Form_1.Text_DirPass2.SetFocus @ 250,90 LABEL Label_DirPass2 VALUE "Повтор пароля:" WIDTH 150 HEIGHT 24 ; FONT "Courier New" SIZE 12 RIGHTALIGN @ 250,245 TEXTBOX Text_DirPass2 HEIGHT 24 WIDTH 190 VALUE cPwd2 PASSWORD ; ON LOSTFOCUS {|| cPwd2 := Form_1.Text_DirPass2.Value } ; ON ENTER {|| IF( cPwd2#cPwd,MsgInfo("Пароли не одинаковы ! Повторите ввод заново !") , SaveConfig() ) } END PAGE END TAB @ 10,480 ANIMATEBOX Avi_1 ; WIDTH 32 ; HEIGHT 32 ; FILE 'LOGO' AUTOPLAY @ 420, 284 BUTTONEX Button_Save ; CAPTION 'Запись' ; ACTION SaveConfig() ; WIDTH 90 ; HEIGHT 34 ; FONT 'Tahoma' ; SIZE 12 @ 420, 416 BUTTONEX Button_Exit ; CAPTION 'Выход' ; ACTION ReleaseAllWindows() ; WIDTH 90 ; HEIGHT 34 ; FONT 'Tahoma' ; SIZE 12 END WINDOW На более читаемую версию: DEFINE WINDOW Form_1 ; ON INIT MyInitColor() DEFINE TAB Tab_1 ; ON CHANGE (ChangeColor(), Form_1.Button_Save.Visible := (Form_1.Tab_1.Value < 4), ; Form_1.Button_Exit.Visible := (Form_1.Tab_1.Value < 4), ; Form_1.Button_Exit.Visible := (Form_1.Tab_1.Value < 4) ) PAGE ' Сайт ' MyPage_Site() END PAGE PAGE ' Пути ' MyPage_Path() END PAGE PAGE ' Пароли ' MyPage_Pass() END PAGE END TAB MyKnopki() END WINDOW Return /////////////////////////////////////// Function MyPage_Site() @ 34, 20 LABEL Label_1 VALUE "Filling color:" WIDTH 370 HEIGHT 26 TRANSPARENT @ 66,20 FRAME Frame_1a CAPTION "Адрес сайта" ; BACKCOLOR aBackColors ; WIDTH 470 HEIGHT 52 OPAQUE @ 88,30 TEXTBOX Text_Adres ; WIDTH 450 ; VALUE cHttp ; TOOLTIP "Адрес сайта куда отправлять данные."; FONT "Courier New" Size 12 ; MAXLENGTH 60 LOWERCASE ; ON LOSTFOCUS {|| Form_1.Button_Save.Enabled := .T. } ON ENTER Form_1.Spinner_2.SetFocus @ 166,20 FRAME Frame_1s CAPTION "Пересчет и отправка на сайт" ; BACKCOLOR aBackColors ; WIDTH 470 HEIGHT 52 OPAQUE @ 188,30 LABEL Label_Time VALUE "Время пересчета" ; FONT "Courier New" Size 12 ; WIDTH 180 HEIGHT 24 @ 185,195 SPINNER Spinner_2 RANGE 5,900 VALUE nInterval ; FONT "Courier New" Size 12 ; WIDTH 58 HEIGHT 24 INCREMENT 5 ON LOSTFOCUS {|| Form_1.Button_Save.Enabled := .T. } ON ENTER Form_1.Button_Save.SetFocus @ 188,255 LABEL Label_Sec VALUE "секунд" ; FONT "Courier New" Size 12 ; WIDTH 75 HEIGHT 24 Return Nil //////////////////////////////////////// Functiom MyPage_Path() @ 34, 20 LABEL Label_2 VALUE "Filling color:" WIDTH 370 HEIGHT 26 TRANSPARENT @ 66, 20 LABEL Label_2Za VALUE "Путь к БД-Заявка:" WIDTH 370 HEIGHT 26 TRANSPARENT BOLD @ 88, 20 TEXTBOX Text_PathZa WIDTH 440 VALUE "C:\TEMP\" TOOLTIP "Путь к БД-Заявка." ; FONT "Courier New" Size 12 BOLD ; MAXLENGTH 60 LOWERCASE READONLY @ 88, 465 BUTTONEX Button_PathZa WIDTH 28 HEIGHT 28 ; ICON "OPEN24" ACTION Button_Path() @ 126, 20 LABEL Label_2Spr VALUE "Путь к БД-справочникам:" WIDTH 370 HEIGHT 26 TRANSPARENT BOLD @ 148, 20 TEXTBOX Text_PathSpr WIDTH 440 VALUE "C:\TEMP\" TOOLTIP "Путь к БД-справочникам." ; FONT "Courier New" Size 12 BOLD ; MAXLENGTH 60 LOWERCASE READONLY @ 148, 465 BUTTONEX Button_PathSpr WIDTH 28 HEIGHT 28 ; ICON "OPEN24" ACTION Button_Path() @ 186, 20 LABEL Label_2TD VALUE "Путь к БД-статистики заявок за текущий день:" WIDTH 430 HEIGHT 26 TRANSPARENT BOLD @ 208, 20 TEXTBOX Text_PathTD WIDTH 440 VALUE "C:\TEMP\" TOOLTIP "Путь к БД-статистики заявок за текущий день." ; FONT "Courier New" Size 12 BOLD ; MAXLENGTH 60 LOWERCASE READONLY @ 208, 465 BUTTONEX Button_PathTD WIDTH 28 HEIGHT 28 ; ICON "OPEN24" ACTION Button_Path() @ 246, 20 LABEL Label_2TY VALUE "Путь к БД-статистики заявок за год:" WIDTH 430 HEIGHT 26 TRANSPARENT BOLD @ 268, 20 TEXTBOX Text_PathTY WIDTH 440 VALUE "C:\TEMP\" TOOLTIP "Путь к БД-статистики заявок за год." ; FONT "Courier New" Size 12 BOLD ; MAXLENGTH 60 LOWERCASE READONLY @ 268, 465 BUTTONEX Button_PathTY WIDTH 28 HEIGHT 28 ; ICON "OPEN24" ACTION Button_Path() Return Nil /////////////////////////////// и т.д.

Andrey: И еще вопрос вдогонку к предыдущему сообщению. Видимость объектов на форме какая (допустим Label_1 )? Это Public переменная или другая ? В любом месте только одного модуля PRG можно обращаться к Form_1.Label_1.Value или в других модулях PRG тоже можно обращаться к объектам объявленных ранее ?

Andrey: Подскажите пожалуйста, как в GRID'e можно сделать заголовки в 2-3 строчки ? HEADERS { '№;№','1-строка;2-строка'..... } знак ";" как в TBROWSE() для Харбора не прокатывает... Пробовал { '№'+CHR(13)+CHR(10)+'№', '1-строка'+CHR(13)+CHR(10)+'2-строка' ... } тоже не работает....

SergKis: Andrey пишет:Видимость объектов ... Пока существует окно (не разрушено), существуют и контролы его и они всегда доступны. Хранятся данные в переменных _HMG_... (см. i_var.ch). [pre2]Как заполняются данные на окно в переменных _HMG_aForm... см. h_windows.prg: _DefineWindow(...) ... _HMG_aFormNames [k] := FormName _HMG_aFormHandles [k] := FormHandle ... _HMG_aFormMiscData1 [k] := { cTx } ... там же см. другие полезные функции. Пример: IF _IsWindowDefined ( FormName ) // окно есть - можно работать ENDIF Пока существуют контролы окна они всегда доступны. Как заполняются данные контрола в переменных _HMG_aControl... см. в h_<Контрол>.prg функцию _Define<Контрол>(...) (где то я это уже писал). Пример: h_grid.prg: _DefineGrid(...) ... _HMG_aControlType [k] := if ( multiselect , "MULTIGRID" , "GRID" ) _HMG_aControlNames [k] := ControlName _HMG_aControlHandles [k] := ControlHandle _HMG_aControlParenthandles [k] := ParentFormHandle ... _HMG_aControlMiscData2 [k] := '' ... Как работать с переменными_HMG_aControl... смотри h_controlmisc.prg : _GetValue( ControlName, ParentForm , Index ) _SetValue( ControlName, ParentForm, Value , index ) GetProperty(...) SetProperty(...) DoMethod (...) и т.д. . Пример: IF _IsControlDefined ( ControlName, FormName ) // контрол есть - можно работать ENDIF Пример функции подключаемой в контролах по On LostFocus: Function MyLostFocus() Local i, n, h, cFormName, nFormHandle, cControlName, cControlType, nControlHandle h := GetFocus() // handle контрола в фокусе i := ascan(_HMG_aControlHandles, h) // ищем в массиве всех контролов MiniGui IF i == 0; Return // не нашли - фокус где то ... ENDIF cControlType := _HMG_aControlType cControlName := _HMG_aControlNames cControlHandle := _HMG_aControlHandles n := ascan(_HMG_aFormHandles, _HMG_aControlHandles ) nFormHandle := _HMG_aFormHandles [n] cFormName := _HMG_aFormNames [n] ... Return [/pre2]

Andrey: SergKis пишет: Пока существует окно (не разрушено), существуют и контролы его и они всегда доступны. Т.е. доступны в любых PRG файлах данной программы, как Public переменные ?

SergKis: Andrey пишет:как Public переменные ? Да как Public переменные. См. h_init.prg: Procedure Init ... Public _HMG_SYSDATA [ _HMG_SYSDATA_SIZE ] ... Повторю пример функции (вчера пропустил пропажу [ i ] и ошибку): [pre2] Function MyLostFocus() Local k, n, h, cFormName, nFormHandle, cControlName, cControlType, nControlHandle h := GetFocus() // handle контрола в фокусе i := ascan(_HMG_aControlHandles, h) // ищем в массиве всех контролов MiniGui IF i == 0; Return // не нашли - фокус где то ... ENDIF cControlType := _HMG_aControlType [ i ] cControlName := _HMG_aControlNames [ i ] nControlHandle := _HMG_aControlHandles [ i ] nFormHandle := _HMG_aControlParenthandles [ i ] n := ascan(_HMG_aFormHandles, _HMG_aControlParenthandles [ i ]) nFormHandle := _HMG_aFormHandles [n] cFormName := _HMG_aFormNames [n] ... Return [/pre2]

Andrey: Подскажите, как можно на форме сделать мигающую надпись типа "Выбор здесь !" ? MiniGUI\SAMPLES\BASIC\BLINK - не совсем красивый... цветами бы разными перерисовывался... Или периодически всплывающее окошко с интервалом 5-10 сек. ?

SergKis: Andrey пишет: как можно на форме сделать мигающую надпись Примерно так: [pre2] DEFINE WINDOW MyWnd ... @ 10, 100 LABEL MyLabel VALUE "Hello !" ... DEFINE TIMER MyWndTimer INTERVAL 2000 ACTION MyWndTimer() ... END WINDOW ... Function MyWndTimer() Local cTx,aFc Static lRu := .T., aFo, aBo IF aFo == NIL aFo := GetProperty("MyWnd", "MyLabel", "FontColor") aBo := GetProperty("MyWnd", "MyLabel", "BackColor") ENDIF IF lRu cTx := "Привет !" aFc := aFo ELSE cTx := "Hello !" aFc := {255, 0, 0} aBc := {255, 0, 0} ENDIF lRu := ! lRu SetProperty("MyWnd", "MyLabel", cTx) SetProperty("MyWnd", "MyLabel", "FontColor", aFc) // SetProperty("MyWnd", "MyLabel", "BackColor", aBc) Return [/pre2]

Andrey: SergKis пишет: Примерно так: Спасибо БОЛЬШОЕ !!! Что-то медленно мигает, да и 2 цвета всего... и нет цикличности... #include "minigui.ch" Function MAIN() DEFINE WINDOW MyWnd AT 0,0 ; WIDTH 320 ; HEIGHT 300 - IF(_HMG_IsXP .And. IsXPThemeActive(), 0, 7) ; TITLE 'Blink Color Label' ; MAIN ; NOMAXIMIZE @ 50, 50 LABEL MyLabel VALUE "Hello !" WIDTH 180 HEIGHT 32 ; FONT "Courier New" Size 24 @ 100, 30 LABEL Label_1 VALUE 'Blink Label !' WIDTH 260 HEIGHT 32 Blink ; FONT "Courier New" Size 24 DEFINE TIMER MyWndTimer INTERVAL 2000 ACTION MyWndTimer() END WINDOW CENTER WINDOW MyWnd ACTIVATE WINDOW MyWnd Return nil Function MyWndTimer() Local cTx,aFc Static lRu := .T., aFo, aBo IF aFo == NIL aFo := GetProperty("MyWnd", "MyLabel", "FontColor") aBo := GetProperty("MyWnd", "MyLabel", "BackColor") ENDIF IF lRu cTx := "Привет !" aFc := aFo ELSE cTx := "Hello !" aFc := {255, 0, 0} aBc := {255, 0, 0} ENDIF lRu := ! lRu SetProperty("MyWnd", "MyLabel", cTx) SetProperty("MyWnd", "MyLabel", "FontColor", aFc) //SetProperty("MyWnd", "MyLabel", "BackColor", aBc) Return nil

SergKis: Andrey пишет:Что-то медленно мигает Так INTERVAL 2000 - это две секунды (1000 * 2), надо задать как надо. 2 цвета всего Можно сделать: [pre2] aColor : {{255,0,0}, {...}, ...} // цифры цвета взять с MS Paint режим Edit colors, поля {Red,Green,Blue} Добавить: Static nPos := 0 nPos += 1 IF nPos > len(aColor); nPos := 1 ENDIF aFc := aColor [ nPos ] ... Можно текст не менять, а менять цвет букв, бегая по циклу текста и массиву цветов, можно переставлять Label: SetProperty(cWndName, cControlName, "Row", 70) // MyWnd.MyLabel.Row := 100 SetProperty(cWndName, cControlName, "Col", 10) // MyWnd.MyLabelCol := 10 или придумать что то еще. [/pre2]

Andrey: SergKis пишет: цифры цвета взять с MS Paint режим Edit colors, поля {Red,Green,Blue} Я по вашим ранним рекомендациям поступил, взял цвета с i_color.ch Вот готовый результат : #include "minigui.ch" Static nPos := 0 Function MAIN() DEFINE WINDOW MyWnd AT 0,0 ; WIDTH 320 ; HEIGHT 300 - IF(_HMG_IsXP .And. IsXPThemeActive(), 0, 7) ; TITLE 'Blink Color Label' ; MAIN ; NOMAXIMIZE @ 50, 40 LABEL MyLabel VALUE "Color Label !" WIDTH 180 HEIGHT 32 ; FONT "Tahona" BOLD Size 22 @ 100, 40 LABEL Label_1 VALUE 'Blink Label !' WIDTH 260 HEIGHT 32 Blink ; FONT "Tahona" BOLD Size 22 DEFINE TIMER MyWndTimer INTERVAL 500 ACTION MyWndTimer() END WINDOW CENTER WINDOW MyWnd ACTIVATE WINDOW MyWnd Return nil Function MyWndTimer() Local aColor // colors look i_color.ch aColor := {YELLOW,PINK,RED,FUCHSIA,BROWN,ORANGE,GREEN,PURPLE,BLACK,WHITE,GRAY,BLUE,SILVER,MAROON,OLIVE,LGREEN,AQUA,NAVY,TEAL} nPos += 1 IF nPos > len(aColor) nPos := 1 ENDIF SetProperty("MyWnd", "MyLabel", "FontColor", aColor[ nPos ]) Return nil Спасибо БОЛЬШОЕ за подсказку !!!

SergKis: Andrey пишет:взял цвета с i_color.ch ОТЛИЧНО !!! А цвета взять с MS Paint - это дополнение к i_color.ch (если нужны разнообразные оттенки). Используя TIMER, надо приостанавливать его выполнение в вызовах своих функций для блокирования повторного выполнения TIMER (это особенно важно при дисковых операциях). Пример: Function MyWndTimer() SetProperty("MyWnd", "MyWndTimer", "Enabled", .F.) ... SetProperty("MyWnd", "MyWndTimer", "Enabled", .T.) Return

Andrey: SergKis пишет: Используя TIMER, надо приостанавливать его выполнение в вызовах своих функций для блокирования повторного выполнения TIMER (это особенно важно при дисковых операциях) Спасибо большое ! Я бы не додумался ...

Andrey: А как реализовать вот такую трехцветную форму ? Это еще при том что на ней будут кнопки, списки, лабел и т.д. Нашел вот только это: SAMPLES\BASIC\WindowBackground DEFINE BKGBRUSH <brush> SOLID IN [ WINDOW ] <form> - similar to window Backcolor property DEFINE BKGBRUSH <brush> HATCHED IN [ WINDOW ] <form> DEFINE BKGBRUSH <brush> PATTERN IN [ WINDOW ] <form> Я так понимаю, нужно залить одним цветом, а потов в OnInit() докрасить ? Типа: LOCAL aColor1 := {251, 250, 174} ; aYX1 := {0,0,210,Координата-Ширины-Окна-как-Узнать?} LOCAL aColor2 := {255, 0, 255} LOCAL aColor3 := {178, 227, 137} ; aYX3 := {300,0,Координата-Высоты-Окна-как-Узнать?,Координата-Ширины-Окна-как-Узнать?} DEFINE WINDOW Form_7 ; ...... ; BACKCOLOR aColor2 ; ..... ; ON INIT MyFormCOLOR(aColor1,aYX1, aColor3, aYX2) .................... FUNCTION MyFormCOLOR(aColor1,aYX1, aColor3, aYX2) // Координата-Высоты-Окна-как-Узнать? - Форма же не инициализирована, т.е. её еще нет !!! // Координата-Ширины-Окна-как-Узнать?}

SergKis: Andrey пишет:А как реализовать вот такую трехцветную форму Как-то так: [pre] #include "minigui.ch" Function Main() Local i,j,y,x,w,h,t Local cWnd,hWnd,nCliW,nCliH Local cLblN1,nLblW1,nLblH1,nLblY1,nLblX1,aLblC1 Local cLblN2,nLblW2,nLblH2,nLblY2,nLblX2,aLblC2 Local cLblN3,nLblW3,nLblH3,nLblY3,nLblX3,aLblC3 cWnd := "MyWnd" DEFINE WINDOW &cWnd ; AT 40, 50 ; WIDTH 480 ; HEIGHT 410 ; TITLE 'Test Label box' ; MAIN hWnd := GetFormHandle(cWnd) nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) cLblN1 := cWnd + '_Frame_Lbl1' nLblW1 := nCliW nLblH1 := int(nCliH * 0.4) nLblY1 := 0 nLblX1 := 0 aLblC1 := {251, 250, 174} cLblN2 := cWnd + '_Frame_Lbl2' nLblW2 := nCliW nLblH2 := int(nCliH * 0.2) nLblY2 := nLblY1 + nLblH1 nLblX2 := nLblX1 aLblC2 := {255, 0, 255} cLblN3 := cWnd + '_Frame_Lbl3' nLblW3 := nCliW nLblH3 := nCliH - (nLblH1 + nLblH2) nLblY3 := nLblY2 + nLblH2 nLblX3 := nLblX1 aLblC3 := {178, 227, 137} @ nLblY1, nLblX1 LABEL &cLblN1 VALUE "" OF &cWnd ; WIDTH nLblW1 HEIGHT nLblH1 ; BACKCOLOR aLblC1 BORDER CLIENTEDGE i := GetControlIndex(cLblN1, cWnd) j := cWnd + '_Frame_Text1' t := "Hello Frame 1" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h @ nLblY2, nLblX2 LABEL &cLblN2 VALUE "" OF &cWnd ; WIDTH nLblW2 HEIGHT nLblH2 ; BACKCOLOR aLblC2 BORDER CLIENTEDGE i := GetControlIndex(cLblN2, cWnd) j := cWnd + '_Frame_Text2' t := "Hello Frame 2" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h @ nLblY3, nLblX3 LABEL &cLblN3 VALUE "" OF &cWnd ; WIDTH nLblW3 HEIGHT nLblH3 ; BACKCOLOR aLblC3 BORDER CLIENTEDGE i := GetControlIndex(cLblN3, cWnd) j := cWnd + '_Frame_Text3' t := "Hello Frame 3" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h END WINDOW ACTIVATE WINDOW &cWnd Return /* C функции, если их нет HB_FUNC( GETCLIENTWIDTH ) { RECT rect; GetClientRect( ( HWND ) hb_parnl(1), &rect ); hb_retni( ( INT ) rect.right - rect.left ); } HB_FUNC( GETCLIENTHEIGHT ) { RECT rect; GetClientRect( ( HWND ) hb_parnl(1), &rect ); hb_retni( ( INT ) rect.bottom - rect.top ); } */ [/pre]

SergKis: Andrey пишет:Я бы не додумался ... В MiniGUI.chm есть раздел Timer (Controls Command) и в конце описания (и так практически везде) есть: [pre2] PROPERTIES (свойства): // GetProperty(...) или SetProperty(...) используем ... EVENTS (события): // вызываются сами в определенных местах ... METHODS (методы): // DoMethod(...) используем ... [/pre2] Здесь смотрим, что есть в компонентах и пляшем отсюда ...

Andrey: Спасибо БОЛЬШОЕ ! Программа заработала.. А как бы сделать динамически эту заливку ? А то когда форму раздвигаешь, то белый цвет появляется ....

SergKis: Andrey пишет:когда форму раздвигаешь ... Вопрос Resize довольно сложный ... Мы решаем в основном за счет изменения размеров Browse, оставляя остальные части неизменными или как в данном примере - за счет нижней части: [pre] #include "minigui.ch" Function Main() Local i,j,y,x,w,h,t Local cWnd,hWnd,nCliW,nCliH Local cLblN1,nLblW1,nLblH1,nLblY1,nLblX1,aLblC1 Local cLblN2,nLblW2,nLblH2,nLblY2,nLblX2,aLblC2 Local cLblN3,nLblW3,nLblH3,nLblY3,nLblX3,aLblC3 cWnd := "MyWnd" DEFINE WINDOW &cWnd ; AT 40, 50 ; WIDTH 480 ; HEIGHT 410 ; TITLE 'Test Label box' ; MAIN ; ON SIZE ReSize() ; ON MAXIMIZE ReSize() hWnd := GetFormHandle(cWnd) nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) cLblN1 := cWnd + '_Frame_Lbl1' nLblW1 := nCliW nLblH1 := int(nCliH * 0.4) nLblY1 := 0 nLblX1 := 0 aLblC1 := {251, 250, 174} cLblN2 := cWnd + '_Frame_Lbl2' nLblW2 := nCliW nLblH2 := int(nCliH * 0.2) nLblY2 := nLblY1 + nLblH1 nLblX2 := nLblX1 aLblC2 := {255, 0, 255} cLblN3 := cWnd + '_Frame_Lbl3' nLblW3 := nCliW nLblH3 := nCliH - (nLblH1 + nLblH2) nLblY3 := nLblY2 + nLblH2 nLblX3 := nLblX1 aLblC3 := {178, 227, 137} @ nLblY1, nLblX1 LABEL &cLblN1 VALUE "" OF &cWnd ; WIDTH nLblW1 HEIGHT nLblH1 ; BACKCOLOR aLblC1 BORDER CLIENTEDGE i := GetControlIndex(cLblN1, cWnd) j := cWnd + '_Frame_Text1' t := "Hello Frame 1" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h @ nLblY2, nLblX2 LABEL &cLblN2 VALUE "" OF &cWnd ; WIDTH nLblW2 HEIGHT nLblH2 ; BACKCOLOR aLblC2 BORDER CLIENTEDGE i := GetControlIndex(cLblN2, cWnd) j := cWnd + '_Frame_Text2' t := "Hello Frame 2" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h @ nLblY3, nLblX3 LABEL &cLblN3 VALUE "" OF &cWnd ; WIDTH nLblW3 HEIGHT nLblH3 ; BACKCOLOR aLblC3 BORDER CLIENTEDGE i := GetControlIndex(cLblN3, cWnd) j := cWnd + '_Frame_Text3' t := "Hello Frame 3" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h END WINDOW ACTIVATE WINDOW &cWnd Return Function ReSize() Local cWnd,hWnd,nCliW,nCliH Local cLblN1,nLblW1,nLblH1,nLblY1,nLblX1 Local cLblN2,nLblW2,nLblH2,nLblY2,nLblX2 Local cLblN3,nLblW3,nLblH3,nLblY3,nLblX3 cWnd := _HMG_ThisFormName hWnd := _HMG_aFormHandles [ _HMG_ThisFormIndex ] nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) cLblN1 := cWnd + '_Frame_Lbl1' nLblW1 := nCliW cLblN2 := cWnd + '_Frame_Lbl2' nLblW2 := nCliW cLblN3 := cWnd + '_Frame_Lbl3' nLblW3 := nCliW nLblH3 := nCliH - ( GetProperty(cWnd, cLblN1, "Height") + ; GetProperty(cWnd, cLblN2, "Height") ) SetProperty(cWnd, cLblN1, "Width" , nLblW1) SetProperty(cWnd, cLblN2, "Width" , nLblW2) SetProperty(cWnd, cLblN3, "Width" , nLblW3) SetProperty(cWnd, cLblN3, "Height", nLblH3) Return [/pre]

Andrey: SergKis пишет: Вопрос Resize довольно сложный ... Спасибо БОЛЬШОЕ ! То что надо !!! Очень многое Вы мне прояснили.... Очень жалко что нет таких примеров в поставке Минигуи !

SergKis: Andrey пишет:Очень многое Вы мне прояснили.... Рад был помочь. Сами недавно сталкивались с такими вопросами. Помогла работа на VO. Andrey пишет:Очень жалко что нет таких примеров в поставке Минигуи ! Оформите и отдайте Григорию, если он сочтет полезным - включит.

gfilatov2002: Andrey пишет: Очень жалко что нет таких примеров в поставке Минигуи Ну, почему же нет ? Подобный пример использования события ON RESIZE есть в папке samples\Basic\GetClientSize

Andrey: gfilatov2002 пишет: Подобный пример использования события ON RESIZE есть в папке samples\Basic\GetClientSize Ой, не нашел... Спасибо Григорий !

Andrey: Видоизменил 1-ый пример (без RESIZE), положил на форму 3 кнопки. Не работают эти новые кнопки !!! Что не так делаю ? #include "minigui.ch" Function Main() Local i,j,y,x,w,h,t Local cWnd,hWnd,nCliW,nCliH Local cLblN1,nLblW1,nLblH1,nLblY1,nLblX1,aLblC1 Local cLblN2,nLblW2,nLblH2,nLblY2,nLblX2,aLblC2 Local cLblN3,nLblW3,nLblH3,nLblY3,nLblX3,aLblC3 cWnd := "MyWnd" DEFINE WINDOW &cWnd ; AT 40, 50 ; WIDTH 480 ; HEIGHT 410 ; TITLE 'Test Label box' ; NOMAXIMIZE NOSIZE ; MAIN hWnd := GetFormHandle(cWnd) nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) cLblN1 := cWnd + '_Frame_Lbl1' nLblW1 := nCliW nLblH1 := int(nCliH * 0.4) nLblY1 := 0 nLblX1 := 0 aLblC1 := {251, 250, 174} cLblN2 := cWnd + '_Frame_Lbl2' nLblW2 := nCliW nLblH2 := int(nCliH * 0.2) nLblY2 := nLblY1 + nLblH1 nLblX2 := nLblX1 aLblC2 := {255, 0, 255} cLblN3 := cWnd + '_Frame_Lbl3' nLblW3 := nCliW nLblH3 := nCliH - (nLblH1 + nLblH2) nLblY3 := nLblY2 + nLblH2 nLblX3 := nLblX1 aLblC3 := {178, 227, 137} @ nLblY1, nLblX1 LABEL &cLblN1 VALUE "" OF &cWnd ; WIDTH nLblW1 HEIGHT nLblH1 ; BACKCOLOR aLblC1 BORDER CLIENTEDGE i := GetControlIndex(cLblN1, cWnd) j := cWnd + '_Frame_Text1' t := "Hello Frame 1" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h BACKCOLOR aLblC1 @ nLblY2, nLblX2 LABEL &cLblN2 VALUE "" OF &cWnd ; WIDTH nLblW2 HEIGHT nLblH2 ; BACKCOLOR aLblC2 BORDER CLIENTEDGE i := GetControlIndex(cLblN2, cWnd) j := cWnd + '_Frame_Text2' t := "Hello Frame 2" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h BACKCOLOR aLblC2 @ nLblY3, nLblX3 LABEL &cLblN3 VALUE "" OF &cWnd ; WIDTH nLblW3 HEIGHT nLblH3 ; BACKCOLOR aLblC3 BORDER CLIENTEDGE i := GetControlIndex(cLblN3, cWnd) j := cWnd + '_Frame_Text3' t := "Hello Frame 3" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h BACKCOLOR aLblC3 @ 20 , 160 BUTTON Button_1 CAPTION 'BORDER ON' ; ACTION { || SetProperty(cWnd, cLblN3, "BORDER" , .T.), SetProperty(cWnd, "Label_2", "Value" , "ON" ) } @ 60 , 160 BUTTON Button_2 CAPTION 'BORDER OFF' ; ACTION { || SetProperty(cWnd, cLblN3, "BORDER" , .F.), SetProperty(cWnd, "Label_2", "Value" , "OFF" ) } @ nCliH - 60 , nCliW - 120 BUTTON Button_3 CAPTION 'Cancel' ; ACTION ThisWindow.Release @ 40,300 LABEL Label_1 ; VALUE 'BORDER:'AUTOSIZE BACKCOLOR aLblC1 @ 40,410 LABEL Label_2 ; VALUE '' BACKCOLOR aLblC1 END WINDOW ACTIVATE WINDOW &cWnd Return #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" // C функции, если их нет HB_FUNC( GETCLIENTWIDTH ) { RECT rect; GetClientRect( ( HWND ) hb_parnl(1), &rect ); hb_retni( ( INT ) rect.right - rect.left ); } HB_FUNC( GETCLIENTHEIGHT ) { RECT rect; GetClientRect( ( HWND ) hb_parnl(1), &rect ); hb_retni( ( INT ) rect.bottom - rect.top ); } #pragma ENDDUMP

SergKis: Andrey пишет:Не работают эти новые кнопки !!! Работает пример: [pre] #include "minigui.ch" Function Main() Local i,j,y,x,w,h,t Local cWnd,hWnd,nCliW,nCliH Local cLblN1,nLblW1,nLblH1,nLblY1,nLblX1,aLblC1 Local cLblN2,nLblW2,nLblH2,nLblY2,nLblX2,aLblC2 Local cLblN3,nLblW3,nLblH3,nLblY3,nLblX3,aLblC3 cWnd := "MyWnd" DEFINE WINDOW &cWnd ; AT 40, 50 ; WIDTH 480 ; HEIGHT 410 ; TITLE 'Test Label box' ; MAIN ; ON SIZE ReSize() ; ON MAXIMIZE ReSize() hWnd := GetFormHandle(cWnd) nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) cLblN1 := cWnd + '_Frame_Lbl1' nLblW1 := nCliW nLblH1 := int(nCliH * 0.4) nLblY1 := 0 nLblX1 := 0 aLblC1 := {251, 250, 174} cLblN2 := cWnd + '_Frame_Lbl2' nLblW2 := nCliW nLblH2 := int(nCliH * 0.2) nLblY2 := nLblY1 + nLblH1 nLblX2 := nLblX1 aLblC2 := {255, 0, 255} cLblN3 := cWnd + '_Frame_Lbl3' nLblW3 := nCliW nLblH3 := nCliH - (nLblH1 + nLblH2) nLblY3 := nLblY2 + nLblH2 nLblX3 := nLblX1 aLblC3 := {178, 227, 137} @ nLblY1, nLblX1 LABEL &cLblN1 VALUE "" OF &cWnd ; WIDTH nLblW1 HEIGHT nLblH1 ; BACKCOLOR aLblC1 BORDER CLIENTEDGE i := GetControlIndex(cLblN1, cWnd) j := cWnd + '_Frame_Text1' t := "Hello Frame 1" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h x += 10 + GetProperty(cWnd, j, "Width") j := cWnd + '_Frame_Btn1_Ok' @ y, x BUTTON &( j ) CAPTION "OK" WIDTH w HEIGHT h ; ACTION ( SetProperty(cWnd, "Label_1", "Value", "LINE"), ; SetProperty(cWnd, "Label_2", "Value", "ON" ) ) @ nLblY2, nLblX2 LABEL &cLblN2 VALUE "" OF &cWnd ; WIDTH nLblW2 HEIGHT nLblH2 ; BACKCOLOR aLblC2 BORDER CLIENTEDGE i := GetControlIndex(cLblN2, cWnd) j := cWnd + '_Frame_Text2' t := "Hello Frame 2" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h x += 10 + GetProperty(cWnd, j, "Width") j := cWnd + '_Frame_Btn2_Ok' @ y, x BUTTON &( j ) CAPTION "OK" WIDTH w HEIGHT h ; ACTION ( SetProperty(cWnd, "Label_1", "Value", "BORDER"), ; SetProperty(cWnd, "Label_2", "Value", "OFF" ) ) @ nLblY3, nLblX3 LABEL &cLblN3 VALUE "" OF &cWnd ; WIDTH nLblW3 HEIGHT nLblH3 ; BACKCOLOR aLblC3 BORDER CLIENTEDGE i := GetControlIndex(cLblN3, cWnd) j := cWnd + '_Frame_Text3' t := "Hello Frame 3" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h x += 10 + GetProperty(cWnd, j, "Width") j := cWnd + '_Frame_Btn3_Ok' @ y, x BUTTON &( j ) CAPTION "OK" WIDTH w HEIGHT h ; ACTION ( MsgInfo("Press button "+j) ) @ 40, 110 LABEL Label_1 VALUE 'BORDER:' ; WIDTH w HEIGHT h ; BACKCOLOR aLblC1 @ 70, 110 LABEL Label_2 VALUE 'OFF' ; WIDTH w HEIGHT h ; BACKCOLOR aLblC1 END WINDOW ACTIVATE WINDOW &cWnd Return Function ReSize() Local cWnd,hWnd,nCliW,nCliH Local cLblN1,nLblW1,nLblH1,nLblY1,nLblX1 Local cLblN2,nLblW2,nLblH2,nLblY2,nLblX2 Local cLblN3,nLblW3,nLblH3,nLblY3,nLblX3 cWnd := _HMG_ThisFormName hWnd := _HMG_aFormHandles [ _HMG_ThisFormIndex ] nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) cLblN1 := cWnd + '_Frame_Lbl1' nLblW1 := nCliW cLblN2 := cWnd + '_Frame_Lbl2' nLblW2 := nCliW cLblN3 := cWnd + '_Frame_Lbl3' nLblW3 := nCliW nLblH3 := nCliH - ( GetProperty(cWnd, cLblN1, "Height") + ; GetProperty(cWnd, cLblN2, "Height") ) SetProperty(cWnd, cLblN1, "Width" , nLblW1) SetProperty(cWnd, cLblN2, "Width" , nLblW2) SetProperty(cWnd, cLblN3, "Width" , nLblW3) SetProperty(cWnd, cLblN3, "Height", nLblH3) Return [/pre] Andrey пишет: ACTION { || SetProperty(cWnd, cLblN3, "BORDER" , .T.), SetProperty(cWnd, "Label_2", "Value" , "ON" ) } Что такое SetProperty(cWnd, cLblN3, "BORDER" , .T.) ? Мы AUTOSIZE не используем в нашей версии он глючит при отображении ...

SergKis: Andrey пишет:Не нравиться порядок написания программ в МиниГуи... уж очень растянуто получается... Подскажите можно ли как то уменьшить или изменить это ? Можно пойти по такому пути: [pre2] В реальной программе, я думаю, имена переменных контролов НЕ НАДО писать cWnd+'_Frame_Text2' и т.д. Можно писать смысловое название переменной без названия окна, сгруппировав по темам. Расмотрим поля базы клиентов: Текст для Label : FieldName : Label переменная : GetBox переменная ------------------------------------------------------------------- Код организации INN Klient_Lbl_INN Klient_Get_INN Наименование NAME Klient_Lbl_NAME Klient_Get_NAME ... Можно написать функции на эти контролы: Function Klient_Lbl_INN( y, x, Value, ... ) Local w := 100, h := 24, cElm, cWnd, nW, nH Default Value To "Код организации" cWnd := _HMG_ThisFormName cElm := 'Klient_Lbl_INN' @ y, x LABEL &cElm VALUE Value WIDTH w HEIGHT h nW := GetProperty(cWnd, cElm, "Width") nH := GetProperty(cWnd, cElm, "Height") Return { nW, nH } Function Klient_Get_INN( y, x, cFld, ... ) Local w := 100, h := 24, cElm, cWnd, nW, nH cWnd := _HMG_ThisFormName cElm := 'Klient_Get_INN' cFld := 'KLI->INN' @ y, x GETBOX &cElm HEIGHT h WIDTH w ; FIELD cFld ; VALID ( ... ) ; VALIDMESSAGE "Error INN" ; ... nW := GetProperty(cWnd, cElm, "Width") nH := GetProperty(cWnd, cElm, "Height") Return { nW, nH } и т.д. Тогда на разных окнах можно использовать эти функции. Окна: - Справочник cWnd := Klient_Spr - Документы: cWnd := Dokum_Prixod, cWnd := Dokum_Raxod ... Пример: Local nGapsW := 10 // промежуток между контролами Widtn Local nGapsH := 10 // промежуток между контролами Height ... @ nLblY1, nLblX1 LABEL &cLblN1 VALUE "" OF &cWnd ; WIDTH nLblW1 HEIGHT nLblH1 ; BACKCOLOR aLblC1 BORDER CLIENTEDGE i := GetControlIndex(cLblN1, cWnd) y := _HMG_aControlRow [ i ] + nGapsW x := _HMG_aControlCol [ i ] + nGapsW j := Klient_Lbl_INN( y, x ); x += j[1] + nGapsW j := Klient_Get_INN( y, x ) y += j[2] + nGapsH x := _HMG_aControlCol [ i ] + nGapsW j := Klient_Lbl_Name( y, x ); x += j[1] + nGapsW j := Klient_Get_Name( y, x ) y += j[2] + nGapsH x := _HMG_aControlCol [ i ] + nGapsW ... [/pre2]

Andrey: SergKis пишет: Что такое SetProperty(cWnd, cLblN3, "BORDER" , .T.) ? Да я хотел на кнопку повесить включение/отключение бордюра ..... BORDER CLIENTEDGE как в примере MiniGUI\SAMPLES\BASIC\BLINK Только по доку потом увидел что нет такого свойства у LABEL .... А жалко...

SergKis: Andrey пишет:А жалко.. Вы хотите типа такое: [pre] #include "minigui.ch" Function Main() Local i,j,y,x,w,h,t Local cWnd,hWnd,nCliW,nCliH,nGapsW,nGapsH Local cLblN1,nLblW1,nLblH1,nLblY1,nLblX1,aLblC1 Local cLblN2,nLblW2,nLblH2,nLblY2,nLblX2,aLblC2 Local cLblN3,nLblW3,nLblH3,nLblY3,nLblX3,aLblC3 cWnd := "MyWnd" nGapsW := 14 nGapsH := 14 DEFINE WINDOW &cWnd ; AT 40, 50 ; WIDTH 480 ; HEIGHT 410 ; TITLE 'Test Label box' ; MAIN ; ON SIZE ReSize() ; ON MAXIMIZE ReSize() hWnd := GetFormHandle(cWnd) nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) cLblN1 := cWnd + '_Frame_Lbl1' nLblW1 := nCliW nLblH1 := int(nCliH * 0.4) nLblY1 := 0 nLblX1 := 0 aLblC1 := {251, 250, 174} cLblN2 := cWnd + '_Frame_Lbl2' nLblW2 := nCliW nLblH2 := int(nCliH * 0.2) nLblY2 := nLblY1 + nLblH1 nLblX2 := nLblX1 aLblC2 := {255, 0, 255} cLblN3 := cWnd + '_Frame_Lbl3' nLblW3 := nCliW nLblH3 := nCliH - (nLblH1 + nLblH2) nLblY3 := nLblY2 + nLblH2 nLblX3 := nLblX1 aLblC3 := {178, 227, 137} @ nLblY1, nLblX1 LABEL &cLblN1 VALUE "" OF &cWnd ; WIDTH nLblW1 HEIGHT nLblH1 ; BACKCOLOR aLblC1 BORDER CLIENTEDGE i := GetControlIndex(cLblN1, cWnd) y := 0 x := int(nGapsH / 2) w := GetClientWidth (_HMG_aControlHandles [ i ]) - int(nGapsW / 2) h := GetClientHeight(_HMG_aControlHandles [ i ]) @ y, x FRAME &( cWnd + '_Frame_Frm1' ) CAPTION "" ; WIDTH w HEIGHT h ; OPAQUE j := cWnd + '_Frame_Text1' t := "Hello Frame 1" y := _HMG_aControlRow [ i ] + nGapsH x := _HMG_aControlCol [ i ] + nGapsW w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h x += 10 + GetProperty(cWnd, j, "Width") j := cWnd + '_Frame_Btn1_Ok' @ y, x BUTTON &( j ) CAPTION "OK" WIDTH w HEIGHT h ; ACTION ( SetProperty(cWnd, "Label_1", "Value", "LINE"), ; SetProperty(cWnd, "Label_2", "Value", "ON" ) ) @ nLblY2, nLblX2 LABEL &cLblN2 VALUE "" OF &cWnd ; WIDTH nLblW2 HEIGHT nLblH2 ; BACKCOLOR aLblC2 BORDER CLIENTEDGE i := GetControlIndex(cLblN2, cWnd) j := cWnd + '_Frame_Text2' t := "Hello Frame 2" y := _HMG_aControlRow [ i ] + nGapsH x := _HMG_aControlCol [ i ] + nGapsW w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h x += 10 + GetProperty(cWnd, j, "Width") j := cWnd + '_Frame_Btn2_Ok' @ y, x BUTTON &( j ) CAPTION "OK" WIDTH w HEIGHT h ; ACTION ( SetProperty(cWnd, "Label_1", "Value", "BORDER"), ; SetProperty(cWnd, "Label_2", "Value", "OFF" ) ) @ nLblY3, nLblX3 LABEL &cLblN3 VALUE "" OF &cWnd ; WIDTH nLblW3 HEIGHT nLblH3 ; BACKCOLOR aLblC3 BORDER CLIENTEDGE i := GetControlIndex(cLblN3, cWnd) j := cWnd + '_Frame_Text3' t := "Hello Frame 3" y := _HMG_aControlRow [ i ] + nGapsH x := _HMG_aControlCol [ i ] + nGapsW w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h x += 10 + GetProperty(cWnd, j, "Width") j := cWnd + '_Frame_Btn3_Ok' @ y, x BUTTON &( j ) CAPTION "OK" WIDTH w HEIGHT h ; ACTION ( SetProperty(cWnd, cWnd + '_Frame_Frm1', "Visible", ; ! GetProperty(cWnd, cWnd + '_Frame_Frm1', "Visible")) ) // ACTION ( MsgInfo("Press button "+j) ) @ 40, 110 LABEL Label_1 VALUE 'BORDER:' ; WIDTH w HEIGHT h ; BACKCOLOR aLblC1 @ 70, 110 LABEL Label_2 VALUE 'OFF' ; WIDTH w HEIGHT h ; BACKCOLOR aLblC1 END WINDOW ACTIVATE WINDOW &cWnd Return Function ReSize() Local cWnd,hWnd,nCliW,nCliH Local cLblN1,nLblW1,nLblH1,nLblY1,nLblX1 Local cLblN2,nLblW2,nLblH2,nLblY2,nLblX2 Local cLblN3,nLblW3,nLblH3,nLblY3,nLblX3 cWnd := _HMG_ThisFormName hWnd := _HMG_aFormHandles [ _HMG_ThisFormIndex ] nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) cLblN1 := cWnd + '_Frame_Lbl1' nLblW1 := nCliW cLblN2 := cWnd + '_Frame_Lbl2' nLblW2 := nCliW cLblN3 := cWnd + '_Frame_Lbl3' nLblW3 := nCliW nLblH3 := nCliH - ( GetProperty(cWnd, cLblN1, "Height") + ; GetProperty(cWnd, cLblN2, "Height") ) SetProperty(cWnd, cLblN1, "Width" , nLblW1) SetProperty(cWnd, cLblN2, "Width" , nLblW2) SetProperty(cWnd, cLblN3, "Width" , nLblW3) SetProperty(cWnd, cLblN3, "Height", nLblH3) Return [/pre] Можно смотреть в сторону команд (i_graph.ch): DRAW LINE IN WINDOW ... DRAW RECTANGLE IN WINDOW ...

Andrey: А как тогда сделать перерисовку всего лабела ? Типа: IF nFlagBorder == 1 @ nLblY1, nLblX1 LABEL &cLblN1 VALUE "" OF &cWnd ; WIDTH nLblW1 HEIGHT nLblH1 ; BACKCOLOR aLblC1 ELSEIF nFlagBorder == 2 @ nLblY1, nLblX1 LABEL &cLblN1 VALUE "" OF &cWnd ; WIDTH nLblW1 HEIGHT nLblH1 ; BACKCOLOR aLblC1 BORDER ELSEIF nFlagBorder == 3 @ nLblY1, nLblX1 LABEL &cLblN1 VALUE "" OF &cWnd ; WIDTH nLblW1 HEIGHT nLblH1 ; BACKCOLOR aLblC1 BORDER CLIENTEDGE ENDIF

SergKis: Andrey пишет:А как тогда сделать перерисовку всего лабела ? Пример: [pre] #include "minigui.ch" Function Main() Local i,j,y,x,w,h,t Local cWnd,hWnd,nCliW,nCliH,nGapsW,nGapsH Local cLblN1,nLblW1,nLblH1,nLblY1,nLblX1,aLblC1 Local cLblN2,nLblW2,nLblH2,nLblY2,nLblX2,aLblC2 Local cLblN3,nLblW3,nLblH3,nLblY3,nLblX3,aLblC3 cWnd := "MyWnd" nGapsW := 14 nGapsH := 14 DEFINE WINDOW &cWnd ; AT 40, 50 ; WIDTH 480 ; HEIGHT 410 ; TITLE 'Test Label box' ; MAIN ; NOMINIMIZE ; NOMAXIMIZE ; NOSIZE // ON SIZE ReSize() ; // ON MAXIMIZE ReSize() hWnd := GetFormHandle(cWnd) nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) cLblN1 := cWnd + '_Frame_Lbl1' nLblW1 := nCliW nLblH1 := int(nCliH * 0.4) nLblY1 := 0 nLblX1 := 0 aLblC1 := {251, 250, 174} cLblN2 := cWnd + '_Frame_Lbl2' nLblW2 := nCliW nLblH2 := int(nCliH * 0.2) nLblY2 := nLblY1 + nLblH1 nLblX2 := nLblX1 aLblC2 := {255, 0, 255} cLblN3 := cWnd + '_Frame_Lbl3' nLblW3 := nCliW nLblH3 := nCliH - (nLblH1 + nLblH2) nLblY3 := nLblY2 + nLblH2 nLblX3 := nLblX1 aLblC3 := {178, 227, 137} @ nLblY1, nLblX1 LABEL &( cLblN1 + "1") VALUE "" OF &cWnd ; WIDTH nLblW1 HEIGHT nLblH1 ; BACKCOLOR aLblC1 BORDER CLIENTEDGE SetProperty(cWnd, cLblN1 + "1", "Visible", .F.) @ nLblY1, nLblX1 LABEL &( cLblN1 + "0") VALUE "" OF &cWnd ; WIDTH nLblW1 HEIGHT nLblH1 ; BACKCOLOR aLblC1 // BORDER CLIENTEDGE i := GetControlIndex(cLblN1 + "0", cWnd) j := cWnd + '_Frame_Text1' t := "Hello Frame 1" y := _HMG_aControlRow [ i ] + nGapsH x := _HMG_aControlCol [ i ] + nGapsW w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h x += 10 + GetProperty(cWnd, j, "Width") j := cWnd + '_Frame_Btn1_Ok' @ y, x BUTTON &( j ) CAPTION "OK" WIDTH w HEIGHT h ; ACTION ( SetProperty(cWnd, "Label_1", "Value", "LINE"), ; SetProperty(cWnd, "Label_2", "Value", "ON" ) ) @ nLblY2, nLblX2 LABEL &cLblN2 VALUE "" OF &cWnd ; WIDTH nLblW2 HEIGHT nLblH2 ; BACKCOLOR aLblC2 BORDER CLIENTEDGE i := GetControlIndex(cLblN2, cWnd) j := cWnd + '_Frame_Text2' t := "Hello Frame 2" y := _HMG_aControlRow [ i ] + nGapsH x := _HMG_aControlCol [ i ] + nGapsW w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h x += 10 + GetProperty(cWnd, j, "Width") j := cWnd + '_Frame_Btn2_Ok' @ y, x BUTTON &( j ) CAPTION "OK" WIDTH w HEIGHT h ; ACTION ( SetProperty(cWnd, "Label_1", "Value", "BORDER"), ; SetProperty(cWnd, "Label_2", "Value", "OFF" ) ) @ nLblY3, nLblX3 LABEL &cLblN3 VALUE "" OF &cWnd ; WIDTH nLblW3 HEIGHT nLblH3 ; BACKCOLOR aLblC3 BORDER CLIENTEDGE i := GetControlIndex(cLblN3, cWnd) j := cWnd + '_Frame_Text3' t := "Hello Frame 3" y := _HMG_aControlRow [ i ] + nGapsH x := _HMG_aControlCol [ i ] + nGapsW w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h x += 10 + GetProperty(cWnd, j, "Width") j := cWnd + '_Frame_Btn3_Ok' @ y, x BUTTON &( j ) CAPTION "OK" WIDTH w HEIGHT h ; ACTION ( SetProperty(cWnd, cLblN1 + "0", "Visible", ! GetProperty(cWnd, cLblN1 + "0", "Visible")), ; SetProperty(cWnd, cLblN1 + '1', "Visible", ! GetProperty(cWnd, cLblN1 + "1", "Visible")), ; Lbl1Refr() ) @ 40, 110 LABEL Label_1 VALUE 'BORDER:' ; WIDTH w HEIGHT h ; BACKCOLOR aLblC1 @ 70, 110 LABEL Label_2 VALUE 'OFF' ; WIDTH w HEIGHT h ; BACKCOLOR aLblC1 END WINDOW ACTIVATE WINDOW &cWnd Return Function Lbl1Refr() Local cWnd := _HMG_ThisFormName DoMethod(cWnd, cWnd + '_Frame_Text1', "Refresh") SetProperty(cWnd, cWnd + '_Frame_Btn1_Ok', "Enabled", .T.) Return [/pre]

Andrey: Нет, не перерисовывается ! Кнопка закрыта и все ! Вот даже если взять предыдущий пример, кнопка Cancel - не работает ! А почему ? #include "minigui.ch" Function Main() Local i,j,y,x,w,h,t Local cWnd,hWnd,nCliW,nCliH Local cLblN1,nLblW1,nLblH1,nLblY1,nLblX1,aLblC1 Local cLblN2,nLblW2,nLblH2,nLblY2,nLblX2,aLblC2 Local cLblN3,nLblW3,nLblH3,nLblY3,nLblX3,aLblC3 cWnd := "MyWnd" DEFINE WINDOW &cWnd ; AT 40, 50 ; WIDTH 480 ; HEIGHT 410 ; MINWIDTH 480 MINHEIGHT 410 ; TITLE 'Test Label box' ; MAIN ; ON SIZE ReSize() ; ON MAXIMIZE ReSize() hWnd := GetFormHandle(cWnd) nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) cLblN1 := cWnd + '_Frame_Lbl1' nLblW1 := nCliW nLblH1 := int(nCliH * 0.4) nLblY1 := 0 nLblX1 := 0 aLblC1 := {251, 250, 174} cLblN2 := cWnd + '_Frame_Lbl2' nLblW2 := nCliW nLblH2 := int(nCliH * 0.2) nLblY2 := nLblY1 + nLblH1 nLblX2 := nLblX1 aLblC2 := {255, 0, 255} cLblN3 := cWnd + '_Frame_Lbl3' nLblW3 := nCliW nLblH3 := nCliH - (nLblH1 + nLblH2) nLblY3 := nLblY2 + nLblH2 nLblX3 := nLblX1 aLblC3 := {178, 227, 137} @ nLblY1, nLblX1 LABEL &cLblN1 VALUE "" OF &cWnd ; WIDTH nLblW1 HEIGHT nLblH1 ; BACKCOLOR aLblC1 BORDER CLIENTEDGE i := GetControlIndex(cLblN1, cWnd) j := cWnd + '_Frame_Text1' t := "Hello Frame 1" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h @ nLblY2, nLblX2 LABEL &cLblN2 VALUE "" OF &cWnd ; WIDTH nLblW2 HEIGHT nLblH2 ; BACKCOLOR aLblC2 BORDER CLIENTEDGE i := GetControlIndex(cLblN2, cWnd) j := cWnd + '_Frame_Text2' t := "Hello Frame 2" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h @ nLblY3, nLblX3 LABEL &cLblN3 VALUE "" OF &cWnd ; WIDTH nLblW3 HEIGHT nLblH3 ; BACKCOLOR aLblC3 BORDER CLIENTEDGE i := GetControlIndex(cLblN3, cWnd) j := cWnd + '_Frame_Text3' t := "Hello Frame 3" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h @ nCliH - 40 , nCliW - 120 BUTTON Button_3 CAPTION 'Cancel' ; ACTION ThisWindow.Release END WINDOW ACTIVATE WINDOW &cWnd Return Function ReSize() Local cWnd,hWnd,nCliW,nCliH Local cLblN1,nLblW1,nLblH1,nLblY1,nLblX1 Local cLblN2,nLblW2,nLblH2,nLblY2,nLblX2 Local cLblN3,nLblW3,nLblH3,nLblY3,nLblX3 cWnd := _HMG_ThisFormName hWnd := _HMG_aFormHandles [ _HMG_ThisFormIndex ] nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) cLblN1 := cWnd + '_Frame_Lbl1' nLblW1 := nCliW cLblN2 := cWnd + '_Frame_Lbl2' nLblW2 := nCliW cLblN3 := cWnd + '_Frame_Lbl3' nLblW3 := nCliW nLblH3 := nCliH - ( GetProperty(cWnd, cLblN1, "Height") + ; GetProperty(cWnd, cLblN2, "Height") ) SetProperty(cWnd, cLblN1, "Width" , nLblW1) SetProperty(cWnd, cLblN2, "Width" , nLblW2) SetProperty(cWnd, cLblN3, "Width" , nLblW3) SetProperty(cWnd, cLblN3, "Height", nLblH3) // сдвиг кнопки Button_3 SetProperty(cWnd, "Button_3", "Row", nCliH - 40 ) SetProperty(cWnd, "Button_3", "Col" , nCliW - 120 ) Return #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" HB_FUNC( GETCLIENTWIDTH ) { RECT rect; GetClientRect( ( HWND ) hb_parnl(1), &rect ); hb_retni( ( INT ) rect.right - rect.left ); } HB_FUNC( GETCLIENTHEIGHT ) { RECT rect; GetClientRect( ( HWND ) hb_parnl(1), &rect ); hb_retni( ( INT ) rect.bottom - rect.top ); } #pragma ENDDUMP

SergKis: Andrey пишет:не работает Собрал примеры Сборка hb20, msvc, miniGui 2.07 сборка своя. В Label след.изменения:[pre] Function OLABELEVENTS( hWnd, nMsg, wParam, lParam ) *-----------------------------------------------------------------------------* Local i := ascan ( _HMG_aControlHandles, hWnd ) HB_SYMBOL_UNUSED( wParam ) HB_SYMBOL_UNUSED( lParam ) if i > 0 If nMsg == WM_MOUSEMOVE _DoControlEventProcedure ( _HMG_aControlGotFocusProcedure , i ) ElseIf nMsg == WM_MOUSELEAVE _DoControlEventProcedure ( _HMG_aControlLostFocusProcedure , i ) ElseIf nMsg == WM_HMG_NOTIFY_LBL // BAA IF ValType( _HMG_aControlMiscData1 [4] )=='B' _DoControlEventProcedure( _HMG_aControlMiscData1[4], i ) ELSE MoveWindow( _HMG_aControlHandles, ; // hWnd _HMG_aControlCol, ; // X _HMG_aControlRow, ; // Y _HMG_aControlWidth, ; // W _HMG_aControlHeight, .T. ) // W SetWindowText( _HMG_aControlHandles, ; // hWnd _HMG_aControlCaption ) // Text ENDIF EndIf endif Return 0 [/pre]

SergKis: В догонку. Еще изменен h_label.prg: [pre2] Function _DefineLabel (...) ... _HMG_aControlMiscData1 [k] := ; { 0, ; blink, ; // 2. .T. - нужно моргать .T., ; // 3. .T./.F. - при моргании состояние Вкл./Выкл. NIL } // 4. Блок или NIL - выполнить перепоказ имея в виду что возможно изменились x,y,w,h текст [/pre2] // 4. Блок или NIL - выполнить ... в данных примерах не использовалось.

SergKis: И еще вдогонку: #define WM_APP 0x8000 // Это WinAPI #define WM_HMG_NOTIFY (WM_APP+100) #define WM_HMG_NOTIFY_LBL (WM_HMG_NOTIFY+1) // Перепоказ для Label

SergKis: Andrey пишет:не работает Каюсь. Совсем забыл об изменениях, сделанных в своей сборке, но это было май-июнь прошлого года. Если Григорий почитает это полезным, то: // 4. Блок или NIL - выполнить перепоказ ... - это блок кода, вызываемый при изменении (например текста) в котором можно обновить данные других контролов, связанных с измененным Label. Например при смене кода карточки запустить перепоказ остальных данных по ней.

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

SergKis: Andrey в сборке примеров, как ведет себя demo.exe (demo.prg) - нормально работает или нет (рамка на первом Label меняется по нижней кнопке Ok) ? Если да, то у Вас тоже сборка должна работать ( нет ReSize() ). Попробуйте.

SergKis: SergKis пишет:это блок кода, вызываемый при изменении ... Я поговорил со своим товарищем - это были мысль неправильная, по знаниям на май прошлого года, нигде не примененная. Короче, эту отсебятину надо игнорировать. А нормальный ON CHANGE не помешал бы.

SergKis: SergKis пишет:В Label след.изменения: Function OLABELEVENTS(...) ... MoveWindow( _HMG_aControlHandles [ i ], ; // hWnd _HMG_aControlCol [ i ], ; // X _HMG_aControlRow [ i ], ; // Y _HMG_aControlWidth [ i ], ; // W _HMG_aControlHeight [ i ], .T. ) // W SetWindowText( _HMG_aControlHandles [ i ], ; // hWnd _HMG_aControlCaption [ i ] ) // Text Сам в ночи запутался и других путаю. Сейчас спокойно посмотрел - эти изменения никакого отношения к resze не имеют. Это ускоренный вариант вместо SetProperty(cForm, cControl, "Value", "Text label") (длинная цепочка команд). На форме много Label, Browse с OnChage заменяет данные в Label-ах по стандартному SetProperty(...) очень медленно. На медленных PC еле ползает. Поэтому мы применяем такой ускоренный вариант в OnChange замены текста в Label: i := GetControlIndex(cLabelName, cFormName) _HMG_aControlCaption [ i ] := "New text label" h := PostMessage( _HMG_aControlHandles [ i ], WM_HMG_NOTIFY_LBL, 0, 0 ) и выполняется в OLABELEVENTS(...) ElseIf nMsg == WM_HMG_NOTIFY_LBL. Эти команды не на виду (лежат в libe) и поэтому куда-то меня вчера унесло. Извиняте товарищи ...

Andrey: SergKis пишет: как ведет себя demo.exe (demo.prg) - нормально работает или нет (рамка на первом Label меняется по нижней кнопке Ok) Да, нормально работает ! Только собранная на стандартном MiniGUI Extended Edition 2.1.8 - 2012.12.12 НЕ РАБОТАЕТ ! А что делать с моим примером ? Почему не работает положенная на Label кнопка Cancel или Message ? #include "minigui.ch" Function Main() Local i,j,y,x,w,h,t Local cWnd,hWnd,nCliW,nCliH Local cLblN1,nLblW1,nLblH1,nLblY1,nLblX1,aLblC1 Local cLblN2,nLblW2,nLblH2,nLblY2,nLblX2,aLblC2 Local cLblN3,nLblW3,nLblH3,nLblY3,nLblX3,aLblC3 cWnd := "MyWnd" DEFINE WINDOW &cWnd ; AT 40, 50 ; WIDTH 480 ; HEIGHT 410 ; MINWIDTH 480 MINHEIGHT 410 ; TITLE 'Test Label box' ; MAIN ; ON SIZE ReSize() ; ON MAXIMIZE ReSize() hWnd := GetFormHandle(cWnd) nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) cLblN1 := cWnd + '_Frame_Lbl1' nLblW1 := nCliW nLblH1 := int(nCliH * 0.4) nLblY1 := 0 nLblX1 := 0 aLblC1 := {251, 250, 174} cLblN2 := cWnd + '_Frame_Lbl2' nLblW2 := nCliW nLblH2 := int(nCliH * 0.2) nLblY2 := nLblY1 + nLblH1 nLblX2 := nLblX1 aLblC2 := {255, 0, 255} cLblN3 := cWnd + '_Frame_Lbl3' nLblW3 := nCliW nLblH3 := nCliH - (nLblH1 + nLblH2) nLblY3 := nLblY2 + nLblH2 nLblX3 := nLblX1 aLblC3 := {178, 227, 137} @ nLblY1, nLblX1 LABEL &cLblN1 VALUE "" OF &cWnd ; WIDTH nLblW1 HEIGHT nLblH1 ; BACKCOLOR aLblC1 BORDER CLIENTEDGE i := GetControlIndex(cLblN1, cWnd) j := cWnd + '_Frame_Text1' t := "Hello Frame 1" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h @ nLblY2, nLblX2 LABEL &cLblN2 VALUE "" OF &cWnd ; WIDTH nLblW2 HEIGHT nLblH2 ; BACKCOLOR aLblC2 BORDER CLIENTEDGE @ 40 , 120 BUTTON Button_1 CAPTION 'Message' ; ACTION MsgInfo("ACTION - Message Button_1 !") i := GetControlIndex(cLblN2, cWnd) j := cWnd + '_Frame_Text2' t := "Hello Frame 2" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h @ nLblY3, nLblX3 LABEL &cLblN3 VALUE "" OF &cWnd ; WIDTH nLblW3 HEIGHT nLblH3 ; BACKCOLOR aLblC3 BORDER CLIENTEDGE i := GetControlIndex(cLblN3, cWnd) j := cWnd + '_Frame_Text3' t := "Hello Frame 3" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h @ nCliH - 40 , nCliW - 120 BUTTON Button_3 CAPTION 'Cancel' ; ACTION ThisWindow.Release END WINDOW ACTIVATE WINDOW &cWnd Return Function ReSize() Local cWnd,hWnd,nCliW,nCliH Local cLblN1,nLblW1,nLblH1,nLblY1,nLblX1 Local cLblN2,nLblW2,nLblH2,nLblY2,nLblX2 Local cLblN3,nLblW3,nLblH3,nLblY3,nLblX3 cWnd := _HMG_ThisFormName hWnd := _HMG_aFormHandles [ _HMG_ThisFormIndex ] nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) cLblN1 := cWnd + '_Frame_Lbl1' nLblW1 := nCliW cLblN2 := cWnd + '_Frame_Lbl2' nLblW2 := nCliW cLblN3 := cWnd + '_Frame_Lbl3' nLblW3 := nCliW nLblH3 := nCliH - ( GetProperty(cWnd, cLblN1, "Height") + ; GetProperty(cWnd, cLblN2, "Height") ) SetProperty(cWnd, cLblN1, "Width" , nLblW1) SetProperty(cWnd, cLblN2, "Width" , nLblW2) SetProperty(cWnd, cLblN3, "Width" , nLblW3) SetProperty(cWnd, cLblN3, "Height", nLblH3) // сдвиг кнопки Button_3 SetProperty(cWnd, "Button_3", "Row", nCliH - 40 ) SetProperty(cWnd, "Button_3", "Col" , nCliW - 120 ) Return #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" HB_FUNC( GETCLIENTWIDTH ) { RECT rect; GetClientRect( ( HWND ) hb_parnl(1), &rect ); hb_retni( ( INT ) rect.right - rect.left ); } HB_FUNC( GETCLIENTHEIGHT ) { RECT rect; GetClientRect( ( HWND ) hb_parnl(1), &rect ); hb_retni( ( INT ) rect.bottom - rect.top ); } #pragma ENDDUMP Как сделать чтоб кнопки заработали в стандартном MiniGUI Extended Edition 2.1.8 - 2012.12.12 ???

SergKis: Andrey пишет:А что делать с моим примером ? В моей сборке это DemoA.exe (prg не положил в архив). Думаю он работает. Почему не работает demo.prg на сборке 2.1.8. не знаю. Одна панель Visible := .F. (с окантовкой), вторая Visible := .T. (без окантовки) по кнопке меняем Visible := ! Visible у обоих панелей. Возможно Visible не вызывает Refresh ? Попробуйте: [pre2] @ y, x BUTTON &( j ) CAPTION "OK" WIDTH w HEIGHT h ; ACTION ( SetProperty(cWnd, cLblN1 + "0", "Visible", ! GetProperty(cWnd, cLblN1 + "0", "Visible")), ; SetProperty(cWnd, cLblN1 + '1', "Visible", ! GetProperty(cWnd, cLblN1 + "1", "Visible")), ; DoMethod(cWnd, cLblN1 + iif(GetProperty(cWnd, cLblN1+"1", "Visible"), "1", "0"), "Refresh"), ; Lbl1Refr() ) [/pre2]

Andrey: SergKis пишет: В моей сборке это DemoA.exe (prg не положил в архив). Думаю он работает. Да он у меня тоже работает. А можете PRG выложить ?

SergKis: Andrey пишет:А можете PRG выложить ? [pre] #include "minigui.ch" Function Main() Local i,j,y,x,w,h,t Local cWnd,hWnd,nCliW,nCliH Local cLblN1,nLblW1,nLblH1,nLblY1,nLblX1,aLblC1 Local cLblN2,nLblW2,nLblH2,nLblY2,nLblX2,aLblC2 Local cLblN3,nLblW3,nLblH3,nLblY3,nLblX3,aLblC3 cWnd := "MyWnd" DEFINE WINDOW &cWnd ; AT 40, 50 ; WIDTH 480 ; HEIGHT 410 ; MINWIDTH 480 MINHEIGHT 410 ; TITLE 'Test Label box' ; MAIN ; ON SIZE ReSize() ; ON MAXIMIZE ReSize() hWnd := GetFormHandle(cWnd) nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) cLblN1 := cWnd + '_Frame_Lbl1' nLblW1 := nCliW nLblH1 := int(nCliH * 0.4) nLblY1 := 0 nLblX1 := 0 aLblC1 := {251, 250, 174} cLblN2 := cWnd + '_Frame_Lbl2' nLblW2 := nCliW nLblH2 := int(nCliH * 0.2) nLblY2 := nLblY1 + nLblH1 nLblX2 := nLblX1 aLblC2 := {255, 0, 255} cLblN3 := cWnd + '_Frame_Lbl3' nLblW3 := nCliW nLblH3 := nCliH - (nLblH1 + nLblH2) nLblY3 := nLblY2 + nLblH2 nLblX3 := nLblX1 aLblC3 := {178, 227, 137} @ nLblY1, nLblX1 LABEL &cLblN1 VALUE "" OF &cWnd ; WIDTH nLblW1 HEIGHT nLblH1 ; BACKCOLOR aLblC1 BORDER CLIENTEDGE i := GetControlIndex(cLblN1, cWnd) j := cWnd + '_Frame_Text1' t := "Hello Frame 1" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h @ nLblY2, nLblX2 LABEL &cLblN2 VALUE "" OF &cWnd ; WIDTH nLblW2 HEIGHT nLblH2 ; BACKCOLOR aLblC2 BORDER CLIENTEDGE i := GetControlIndex(cLblN2, cWnd) j := cWnd + '_Frame_Text2' t := "Hello Frame 2" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h @ nLblY3, nLblX3 LABEL &cLblN3 VALUE "" OF &cWnd ; WIDTH nLblW3 HEIGHT nLblH3 ; BACKCOLOR aLblC3 BORDER CLIENTEDGE i := GetControlIndex(cLblN3, cWnd) j := cWnd + '_Frame_Text3' t := "Hello Frame 3" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( j ) VALUE t WIDTH w HEIGHT h @ nCliH - 40 , nCliW - 120 BUTTON Button_3 CAPTION 'Cancel' ; ACTION ThisWindow.Release END WINDOW ACTIVATE WINDOW &cWnd Return Function ReSize() Local cWnd,hWnd,nCliW,nCliH Local cLblN1,nLblW1,nLblH1,nLblY1,nLblX1 Local cLblN2,nLblW2,nLblH2,nLblY2,nLblX2 Local cLblN3,nLblW3,nLblH3,nLblY3,nLblX3 cWnd := _HMG_ThisFormName hWnd := _HMG_aFormHandles [ _HMG_ThisFormIndex ] nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) cLblN1 := cWnd + '_Frame_Lbl1' nLblW1 := nCliW cLblN2 := cWnd + '_Frame_Lbl2' nLblW2 := nCliW cLblN3 := cWnd + '_Frame_Lbl3' nLblW3 := nCliW nLblH3 := nCliH - ( GetProperty(cWnd, cLblN1, "Height") + ; GetProperty(cWnd, cLblN2, "Height") ) SetProperty(cWnd, cLblN1, "Width" , nLblW1) SetProperty(cWnd, cLblN2, "Width" , nLblW2) SetProperty(cWnd, cLblN3, "Width" , nLblW3) SetProperty(cWnd, cLblN3, "Height", nLblH3) // сдвиг кнопки Button_3 SetProperty(cWnd, "Button_3", "Row", nCliH - 40 ) SetProperty(cWnd, "Button_3", "Col" , nCliW - 120 ) Return /* #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" HB_FUNC( GETCLIENTWIDTH ) { RECT rect; GetClientRect( ( HWND ) hb_parnl(1), &rect ); hb_retni( ( INT ) rect.right - rect.left ); } HB_FUNC( GETCLIENTHEIGHT ) { RECT rect; GetClientRect( ( HWND ) hb_parnl(1), &rect ); hb_retni( ( INT ) rect.bottom - rect.top ); } #pragma ENDDUMP */ [/pre] он взят из Вашего поста где-то выше. Andrey попробуйте у себя в demo.prg заменить текст кнопки третьей на текст: [pre2] @ y, x BUTTON &( j ) CAPTION "OK" WIDTH w HEIGHT h ; ACTION ( SetProperty(cWnd, cLblN1 + "0", "Visible", ! GetProperty(cWnd, cLblN1 + "0", "Visible")), ; SetProperty(cWnd, cLblN1 + '1', "Visible", ! GetProperty(cWnd, cLblN1 + "1", "Visible")), ; DoMethod(cWnd, cLblN1 + iif(GetProperty(cWnd, cLblN1+"1", "Visible"), "1", "0"), "Refresh"), ; // new line Lbl1Refr() ) [/pre2]

SergKis: SergKis пишет:в demo.prg заменить текст demo.prg из архива моей сборки.

Andrey: SergKis пишет: он взят из Вашего поста где-то выше. Да это я помню. Я его собрал заново на сборке 2.1.8. - НЕ РАБОТАЕТ !!! Т.е. вы внесли изменения в свою сборку и теперь в стандартных сборках кнопки положенные на LABEL не работают, а у вас работает. Правильно или нет ?

SergKis: Andrey пишет:Правильно или нет ? Я взял Ваш текст prg из поста, закоментировал hb_fun GetClient...() (они в lib у меня), собрал demoA.exe и все.

SergKis: Andrey попробуйте собрать у себя пример:http://zalil.ru/34179692

a_sidorov: Это известная проблема - Мышка в minigui работает на объекте, который положил раньше, то есть нижнем. Попробуй сделать nLblY1 := 50 , чтобы половина кнопки была не на label, тогда мышка будет работать на половине кнопки (верхней)

a_sidorov: Поставь самым первым объектом кнопку - тогда будет работать. То есть объект, на который должна срабатывать кнопка нужно класть на форму раньше. Мышка срабатывает не по видимости на экране, а по порядку выкладки на форму. Это неправильно, но это так.

Andrey: a_sidorov пишет: Мышка срабатывает не по видимости на экране, а по порядку выкладки на форму. Это неправильно, но это так. Спасибо БОЛЬШОЕ !!!

SergKis: Andrey попробуйте собрать у себя этот пример и мне exe глянуть дайте ( если это возможно ? ): http://zalil.ru/34180183

Andrey: Собрал. Вот он http://files.mail.ru/33539C1DCBC1456B90BFA2B5E511E358

SergKis: Andrey пишет:Собрал. Спасибо, не мог понять, что не работает. Думаю это к Григорию надо обращаться. У нас ComboBox и GetBox (его мы правили) на таком Label работают.

Andrey: a_sidorov пишет: Мышка срабатывает не по видимости на экране, а по порядку выкладки на форму. Это неправильно, но это так. SergKis пишет: Думаю это к Григорию надо обращаться. Григорий, подскажите что делать ?

gfilatov2002: Andrey пишет: Григорий, подскажите что делать ? Хе-хе... Я так понимаю, что SergKis удалось решить эту проблему в своей сборке Так что ждем от него описание выполненных модификаций по поводу Andrey пишет: в стандартных сборках кнопки положенные на LABEL не работают

SergKis: gfilatof2002 пишет:Хе-хе... Я уже сам понял - надо у себя рыть и вспоминать, что меняли (воз и маленькую тележку) ...

Andrey: Конечно если пользоваться MiniGUI\SAMPLES\Advanced\BosTaurus то там есть хорошие и понятные функции: BT_DrawLine (hDC, 0, 0, Height, Width, ORANGE, 5) BT_DrawEllipse (hDC, 140, 200, 400, 230, WHITE, 5) BT_DrawFillRectangle (hDC, 20, 250, 300, 100, ORANGE, RED, 3) BT_DrawFillRoundRect (hDC, 400, 250, 300, 100, 10, 10, ORANGE, RED, 3) и т.д. Но для простых примеров хочется использовать обычные функции МиниГуи....

Andrey: Имею такой код: DEFINE WINDOW Form_7 ; AT 0,0 ; WIDTH 525 ; HEIGHT IF(IsXPThemeActive(), 562, 562-4); ...... Как дальше определить MAXHEIGHT и MAXWIDTH окна ? Вверху по примерам можно пользоваться для этого ВНЕШНИМИ функциями: hWnd := GetFormHandle(cWnd) nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) Но я где то по примерам встречал более простое написание... Типа такого: x := _HMG_MouseCol y := _HMG_MouseRow

SergKis: Andrey пишет:Как дальше определить MAXHEIGHT и MAXWIDTH Как я понимаю - это размеры, меньше которых, окно не может быть. Т.е. из default размеров контролов считаете эти значения, а пользователь может менять размеры окна и могут меняться размеры контролов со всеми последствиями. Функции: GetClientWidth (hWnd), GetClientHeight(hWnd) дают внутренние (клиентская область) размеры окна, контрола - в зависимости от переданного handle. Функции: GetWindowWidth (hWnd), GetWindowHeight(hWnd) дают внешние размеры окна, контрола - в зависимости от переданного handle и при их использовании для попадания в клиентскую область надо производить вычисления, используя GetBorderWidth(), GetBorderHeight(), GetTitleHeight(), ... Используя GetWindowWidth (hWnd) для окна, получим Width клиентской области, для Label получим Width клиентской области контрола, ... и можно строить относительные координаты, для используемых контролов, в определенной плоскости и при необходимости изменения дизайна окна - достаточно переставлять плоскости, а не контролы.

SergKis: gfilatov2002 пишет:Так что ждем от него описание выполненных модификаций ... Вот они: [pre2] HB_FUNC( INITLABEL ) { HWND hwnd; HWND hbutton; int Style = WS_CHILD; // | SS_NOTIFY убрали ... if( hb_parl(10) ) Style = Style | SS_NOTIFY; // добавили LabelOldWndProc = ( WNDPROC ) SetWindowLong( ( HWND ) hbutton, GWL_WNDPROC, ( LONG ) LabelSubClassFunc ); ... } [/pre2]

gfilatov2002: SergKis пишет: int Style = WS_CHILD; // | SS_NOTIFY убрали Благодарю за подсказку! Поправил для новой сборки, которая выйдет завтра

Andrey: gfilatov2002 пишет: Поправил для новой сборки, которая выйдет завтра Ура ! Наконец то... А то уже вторую неделю бьюсь с этим... Вот экран задачи сразу после запуска: А вот экран после сброса на панель задач:

SergKis: gfilatov2002 пишет:Поправил для новой сборки, которая выйдет завтра Григорий, есть еще такое в GetBox: [pre2] Function OGETEVENTS(...) ... CASE nMsg == WM_COMMAND // Вариант нажата одна из кнопок в oGet ... n := AScan ( aHandle, HwndBtn ) IF n==GBB1 ; _DoControlEventProcedure ( _HMG_aControlProcedures, i) ELSEIF n==GBB2 ; _DoControlEventProcedure ( _HMG_aControlDblClick, i) ENDIF SendMessage ( HwndBtn , BM_SETSTYLE , LOWORD ( BS_PUSHBUTTON ) , 1 ) SetFocus( aHandle[1] ) ... У нас это место так: n := AScan ( aHandle, HwndBtn ) SetFocus( aHandle[1] ) // фокус на GetBox (иначе в процедурах GetFocus() на нажатую кнопку) oGet:lSaveFocusEdit := .T. // new переменная для определения, что делать с фокусом после процедуры IF n==GBB1 ; _DoControlEventProcedure ( _HMG_aControlProcedures, i) ELSEIF n==GBB2 ; _DoControlEventProcedure ( _HMG_aControlDblClick, i) ENDIF SendMessage ( HwndBtn , BM_SETSTYLE , LOWORD ( BS_PUSHBUTTON ) , 1 ) IF oGet:lSaveFocusEdit ; SetFocus( aHandle[1] ) // если в процедуре окно ChildMdi, то SetFocus( aHandle[1] ) делать не надо, т.е. ENDIF // в процедуре ChildMdi делаем: oGet:lSaveFocusEdit := .F. [/pre2]

gustow: SergKis, хммм... опять употребилось где-то "[ i ]", написанное БЕЗ пробелов (похоже, в конце IF после первого CASE). Извиняйте за "граммарнацизм" ;) просто иногда трудновато понять, "что сказать-то этим хотел?.." :)

SergKis: gustow пишет:иногда трудновато понять Согласен, недосмотрел, брал с исходника как есть, а там "[ i ]", написанное БЕЗ пробелов и это строчки:[pre2] IF n==GBB1 ; _DoControlEventProcedure ( _HMG_aControlProcedures [ i ], i) ELSEIF n==GBB2 ; _DoControlEventProcedure ( _HMG_aControlDblClick [ i ], i) ENDIF [/pre2] но дело не в них (текст в версиях 2.1.8, 2.1.9 несколько другой, смысл такой же) см. h_getbox.prg. Сказать этим хотел: 1.если в GetBox назначены Action [ и Action2], а так же кл. (например) F5 как Action, то происходит: - нажатие кнопок Action [ или Action2] в процедуре получим ( i := ascan(_HMG_aContolHandles, getfocus()) ) == 0, т.к. действительно фокус находится на нажатой кнопке (дополнение к GetBox), но работаем мы с GetBox - логичнее иметь и фокус на нем, криминала нет по _HMG_ThisFormName, _HMG_ThisControlName получим индекс ... - нажатие кнопки F5 (фокус на том же GetBox) - получим _HMG_ThisFormName, _HMG_ThisControlName и т.д. на HOTKEY, достаем контрол, с которым работаем ( i := ascan(_HMG_aContolHandles, getfocus()) ) > 0 т.е. из-за мелочи имеем два алгоритма обработки. 2.установка фокуса на GetBox после процедур, должна быть управляемая, а не безусловная: [pre2] oGet:lSaveFocusEdit := .T. // new переменная для определения, что делать с фокусом после процедуры ...... IF oGet:lSaveFocusEdit ; SetFocus( aHandle[1] ) // если в процедуре окно ChildMdi, то SetFocus( aHandle[1] ) делать не надо, т.е. ENDIF // в процедуре ChildMdi делаем: oGet:lSaveFocusEdit := .F. [/pre2] т.е. если в процедуре окно MDICHILD (вызов и работа со справочником на документах), после активации Child окна (фокус устанавливаем на какой-то контрол этого окна) процедура заканчивается (activate window в Mdi MAIN) и срабатывает SetFocus( aHandle[1] ), устанавливая фокус на GetBox, убирая с окна MDICHILD, т.е. получаем проблему. Мы ее решили так, как я изложил. Будет ли решаться в базовой MiniGUI - дело Григория.

SergKis: Andrey пишет:Да я хотел на кнопку повесить включение/отключение бордюра ..... BORDER CLIENTEDGE как в примере MiniGUI\SAMPLES\BASIC\BLINK Только по доку потом увидел что нет такого свойства у LABEL .... А жалко... Свойства есть, надо использовать: - менять стиль SetWindowStyle(h, WS_BORDER, .T./.F.) - .T. устанавливать, .F. снимать - менять Ext стиль ChangeStyle(h, WS_EX_CLIENTEDGE, 0, .T.) - устанавливать или ChangeStyle(h, 0, WS_EX_CLIENTEDGE, .T.) - снимать У меня получалось менять или Ext стиль или стиль ( одновременно менять - срабатывал только стиль ). Примеры:[pre2]Пример 1: ... @ y, x BUTTON ... ACTION ( MyBorder(cWnd, cLbl) ) ... Function MyBorder( cWnd, cLbl ) Local lB,h := GetControlHandle(cLbl, cWnd) lB := ! IsWindowStyle(h, WS_BORDER) SetWindowStyle(h, WS_BORDER, lB) DoMethod(cWnd, cLbl, "Refresh") Return Пример 2: STATIC lEdge := .T. ... @ y, x BUTTON ... ACTION ( MyEdge(cWnd, cLbl) ) ... Function MyEdge( cWnd, cLbl ) Local lB,h := GetControlHandle(cLbl, cWnd) lEdge := ! lEdge If lEdge ChangeStyle(h, WS_EX_CLIENTEDGE, 0, .T.) Else ChangeStyle(h, 0, WS_EX_CLIENTEDGE, .T.) EndIf DoMethod(cWnd, cLbl, "Refresh") Return [/pre2]

Andrey: SergKis пишет: Свойства есть, надо использовать: Супер ! Спасибо БОЛЬШОЕ !

Andrey: SergKis опять у меня проблема с инициализацией до создания окна... Я сделал пример (еще не отладил), подправьте его пожалуйста. #include "minigui.ch" #define PROGRAM '3-color form and resize the window' #define VERSION ' version 1.0' STATIC lEdge := .T. Function Main() Local aColors1 := {178, 227, 137}, aColors2 := {255, 0, 255}, aColors3 := {251, 250, 174} LOCAL aLabel1, aLabel2, aLabel3, nH1 Local cWnd,hWnd,nCliW,nCliH cWnd := "MyWnd" DEFINE WINDOW &cWnd ; AT 40, 50 ; WIDTH 480 ; HEIGHT 410 ; MINWIDTH 480 MINHEIGHT 410 ; TITLE PROGRAM ; MAIN ; ON SIZE ReSize() ; ON MAXIMIZE ReSize() ; ON INIT ReSize() hWnd := GetFormHandle(cWnd) nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) nH1 := nCliH/3 aLabel1 := { 0,0,nCliW,nH1 , "LabelColor_1", cWnd+"_Frame_Text1" } aLabel2 := { nH1,0,nCliW,nH1*2 , "LabelColor_2", cWnd+"_Frame_Text2" } aLabel3 := { nH1*2,0,nCliW,nCliH, "LabelColor_3", cWnd+"_Frame_Text3" } MySayColorLabel(aLabel1,aColors1) MySayColorLabel(aLabel2,aColors2) MySayColorLabel(aLabel3,aColors3) @ 40 , nCliW - 120 BUTTON Button_1 CAPTION 'Message_1' ; ACTION MsgInfo("ACTION - Message Button_1 !") @ 180 , nCliW - 120 BUTTON Button_2 CAPTION 'Message_2' ; ACTION MsgInfo("ACTION - Message Button_2 !") @ nCliH - 40 , nCliW - 120 BUTTON Button_3 CAPTION 'Cancel' ; ACTION ThisWindow.Release // ьхэ Є№ ёЄшы№/change style @ 20, 70 BUTTON Button_Style CAPTION 'Label Style' ; ACTION {|| MyBorder(cWnd, aLabel1[5]), MyBorder(cWnd, aLabel2[5]), MyBorder(cWnd, aLabel3[5]) } @ 40, 70 BUTTON Button_Edge CAPTION 'Label Edge' ; ACTION {|| MyEdge(cWnd, aLabel1[5]), MyEdge(cWnd, aLabel2[5]), MyEdge(cWnd, aLabel3[5]) } END WINDOW ACTIVATE WINDOW &cWnd Return Function MySayColorLabel(cWnd,aLabel,aColor) LOCAL cLabelName := aLabel[5] LOCAL cLabelTitle := aLabel[6] LOCAL i,j,y,x,w,h,t @ aLabel[1], aLabel[2] LABEL &cLabelName VALUE "" OF &cWnd ; WIDTH aLabel[3] HEIGHT aLabel[4] ; BACKCOLOR aColor BORDER CLIENTEDGE i := GetControlIndex(cLabelName, cWnd) j := cWnd + cLabelTitle t := "Hello - " + cLabelName + " { "+STR(aColor[1],3)+"," t := t + STR(aColor[2],3)+","+STR(aColor[3],3)+" }" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &( cLabelTitle ) VALUE t WIDTH w HEIGHT h BACKCOLOR aColor RETURN NIL Function ReSize() Local cWnd,hWnd,nCliW,nCliH LOCAL aLabel1, aLabel2, aLabel3, nH1 cWnd := _HMG_ThisFormName hWnd := _HMG_aFormHandles [ _HMG_ThisFormIndex ] nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) nH1 := nCliH/3 aLabel1 := { 0,0,nCliW,nH1 , "LabelColor_1", cWnd+"_Frame_Text1" } aLabel2 := { nH1,0,nCliW,nH1*2 , "LabelColor_2", cWnd+"_Frame_Text2" } aLabel3 := { nH1*2,0,nCliW,nCliH, "LabelColor_3", cWnd+"_Frame_Text3" } // change the position of the Label-Color SetProperty(cWnd, aLabel1[5], "Width" , aLabel1[3]) SetProperty(cWnd, aLabel1[5], "Height", aLabel1[4]) SetProperty(cWnd, aLabel2[5], "Width" , aLabel2[3]) SetProperty(cWnd, aLabel2[5], "Height", aLabel2[4]) SetProperty(cWnd, aLabel3[5], "Width" , aLabel3[3]) SetProperty(cWnd, aLabel3[5], "Height", aLabel3[4]) // change the position of the buttons SetProperty(cWnd, "Button_1", "Row" , 40 ) SetProperty(cWnd, "Button_1", "Col" , nCliW - 120 ) SetProperty(cWnd, "Button_2", "Row" , 180 ) SetProperty(cWnd, "Button_2", "Col" , nCliW - 120 ) SetProperty(cWnd, "Button_3", "Row" , nCliH - 40 ) SetProperty(cWnd, "Button_3", "Col" , nCliW - 120 ) SETFOCUS Button_3 OF &cWnd Return Function MyBorder( cWnd, cLbl ) Local lB,h := GetControlHandle(cLbl, cWnd) lB := ! IsWindowStyle(h, WS_BORDER) SetWindowStyle(h, WS_BORDER, lB) DoMethod(cWnd, cLbl, "Refresh") Return Nil Function MyEdge( cWnd, cLbl ) Local lB,h := GetControlHandle(cLbl, cWnd) lEdge := ! lEdge If lEdge ChangeStyle(h, WS_EX_CLIENTEDGE, 0, .T.) Else ChangeStyle(h, 0, WS_EX_CLIENTEDGE, .T.) EndIf DoMethod(cWnd, cLbl, "Refresh") Return Nil #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" HB_FUNC( GETCLIENTWIDTH ) { RECT rect; GetClientRect( ( HWND ) hb_parnl(1), &rect ); hb_retni( ( INT ) rect.right - rect.left ); } HB_FUNC( GETCLIENTHEIGHT ) { RECT rect; GetClientRect( ( HWND ) hb_parnl(1), &rect ); hb_retni( ( INT ) rect.bottom - rect.top ); } #pragma ENDDUMP И хотелось бы избавиться от двойного дублирования массивов: nH1 := nCliH/3 aLabel1 := { 0,0,nCliW,nH1 , "LabelColor_1", cWnd+"_Frame_Text1" } aLabel2 := { nH1,0,nCliW,nH1*2 , "LabelColor_2", cWnd+"_Frame_Text2" } aLabel3 := { nH1*2,0,nCliW,nCliH, "LabelColor_3", cWnd+"_Frame_Text3" } в функциях Main() и ReSize(), если это возможно....

SergKis: Andrey пишет:опять у меня проблема с инициализацией до создания окна... Ошибочное утверждение. Всего навсего : MySayColorLabel(aLabel1,aColors1) вызов, а Function MySayColorLabel(cWnd,aLabel,aColor) - параметров 3 однако. И хотелось бы избавиться от двойного дублирования массивов: Делаем как и раньше в Clipper STATIC переменные. [pre2] #include "minigui.ch" #include "i_winuser.ch" #define PROGRAM '3-color form and resize the window' #define VERSION ' version 1.0' #define _Y 1 #define _X 2 #define _W 3 #define _H 4 #define _N 5 #define _T 6 STATIC lEdge := .T. STATIC aLbl STATIC aClr Function Main() Local hWnd,nCliW,nCliH,nH1, cWnd := "MyWnd" DEFINE WINDOW &cWnd ; AT 40, 50 ; WIDTH 480 ; HEIGHT 410 ; MINWIDTH 480 MINHEIGHT 410 ; TITLE PROGRAM ; MAIN ; ON SIZE ReSize() ; ON MAXIMIZE ReSize() ; ON INIT ReSize() Test_This(cWnd) aLblClrInit() aEval(aLbl, {|a,n| MySayColorLabel( n, n ) }) hWnd := GetFormHandle (cWnd) nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) @ 40 , nCliW - 120 BUTTON Button_1 CAPTION 'Message_1' ; ACTION MsgInfo("ACTION - Message Button_1 !") @ 180 , nCliW - 120 BUTTON Button_2 CAPTION 'Message_2' ; ACTION MsgInfo("ACTION - Message Button_2 !") @ nCliH - 40 , nCliW - 120 BUTTON Button_3 CAPTION 'Cancel' ; ACTION ThisWindow.Release // мен ть стиль/change style @ 20, 70 BUTTON Button_Style CAPTION 'Label Style' ; ACTION ( MyBorder(cWnd, aLbl[1][ _N ]), ; MyBorder(cWnd, aLbl[2][ _N ]), ; MyBorder(cWnd, aLbl[3][ _N ]) ) @ 40, 70 BUTTON Button_Edge CAPTION 'Label Edge' ; ACTION ( MyEdge(cWnd, aLbl[1][ _N ]), ; MyEdge(cWnd, aLbl[2][ _N ]), ; MyEdge(cWnd, aLbl[3][ _N ]) ) END WINDOW ACTIVATE WINDOW &cWnd Return Static Function aLblClrInit() Local cWnd,hWnd,nCliW,nCliH,nH1 cWnd := _HMG_ThisFormName hWnd := GetFormHandle (cWnd) nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) nH1 := nCliH/3 If aLbl == NIL aLbl := {} aAdd( aLbl, { 0 , 0, nCliW, nH1 , "LabelColor_1", cWnd+"_Frame_Text1" } ) aAdd( aLbl, { nH1 , 0, nCliW, nH1*2, "LabelColor_2", cWnd+"_Frame_Text2" } ) aAdd( aLbl, { nH1*2, 0, nCliW, nCliH, "LabelColor_3", cWnd+"_Frame_Text3" } ) Else aLbl[ 1] [ _W ] := nCliW; aLbl[ 1] [ _H ] := nH1 aLbl[ 2] [ _W ] := nCliW; aLbl[ 2] [ _H ] := nH1 * 2 aLbl[ 3] [ _W ] := nCliW; aLbl[ 3] [ _H ] := nCliH Endif If aClr == NIL aClr := {} aAdd( aClr, {178, 227, 137} ) aAdd( aClr, {255, 0, 255} ) aAdd( aClr, {251, 250, 174} ) Endif Return Function Test_This( cWnd ) If empty(_HMG_ThisFormName) _HMG_ThisFormName := cWnd _HMG_ThisFormIndex := GetFormIndex(cWnd) ElseIf _HMG_ThisFormName != cWnd _HMG_ThisFormName := cWnd _HMG_ThisFormIndex := GetFormIndex(cWnd) Endif Return Function MySayColorLabel( nLabel, nColor ) LOCAL cLabelName, cLabelTitle, aColor LOCAL cWnd,i,j,y,x,w,h,t Default nColor To nLabel cWnd := _HMG_ThisFormName aColor := aClr[ nColor ] cLabelName := aLbl[ nLabel ][ _N ] cLabelTitle := aLbl[ nLabel ][ _T ] @ aLbl[ nLabel ][ _Y ], aLbl[ nLabel ][ _X ] LABEL &cLabelName VALUE "" OF &cWnd ; WIDTH aLbl[ nLabel ][ _W ] HEIGHT aLbl[ nLabel ][ _H ] ; BACKCOLOR aColor BORDER CLIENTEDGE i := GetControlIndex(cLabelName, cWnd) j := cWnd + cLabelTitle t := "Hello - " + cLabelName + " { "+STR(aColor[ 1 ], 3)+"," t += STR(aColor[ 2 ], 3) + "," + STR(aColor[ 3 ], 3)+" }" y := _HMG_aControlRow [ i ] + 10 x := _HMG_aControlCol [ i ] + 10 w := 100 h := 24 @ y, x LABEL &cLabelTitle VALUE t WIDTH w HEIGHT h BACKCOLOR aColor RETURN NIL Function ReSize() Local i,j,k Local cWnd,hWnd,nCliW,nCliH ,nH1 cWnd := _HMG_ThisFormName hWnd := GetFormHandle (cWnd) nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) nH1 := nCliH/3 aLblClrInit() // change the position of the Label-Color k := len(aLbl) For i := 1 To k SetProperty(cWnd, aLbl[ i ][ _N ], "Width" , aLbl[ i ][ _W ]) SetProperty(cWnd, aLbl[ i ][ _N ], "Height", aLbl[ i ][ _H ]) Next // change the position of the buttons SetProperty(cWnd, "Button_1", "Row" , 40 ) SetProperty(cWnd, "Button_1", "Col" , nCliW - 120 ) SetProperty(cWnd, "Button_2", "Row" , 180 ) SetProperty(cWnd, "Button_2", "Col" , nCliW - 120 ) SetProperty(cWnd, "Button_3", "Row" , nCliH - 40 ) SetProperty(cWnd, "Button_3", "Col" , nCliW - 120 ) SETFOCUS Button_3 OF &cWnd Return Function MyBorder( cWnd, cLbl ) Local lB,h := GetControlHandle(cLbl, cWnd) lB := ! IsWindowStyle(h, WS_BORDER) SetWindowStyle(h, WS_BORDER, lB) DoMethod(cWnd, cLbl, "Refresh") Return Nil Function MyEdge( cWnd, cLbl ) Local lB,h := GetControlHandle(cLbl, cWnd) lEdge := ! lEdge If lEdge ChangeStyle(h, WS_EX_CLIENTEDGE, 0, .T.) Else ChangeStyle(h, 0, WS_EX_CLIENTEDGE, .T.) EndIf DoMethod(cWnd, cLbl, "Refresh") Return Nil #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" HB_FUNC( GETCLIENTWIDTH ) { RECT rect; GetClientRect( ( HWND ) hb_parnl(1), &rect ); hb_retni( ( INT ) rect.right - rect.left ); } HB_FUNC( GETCLIENTHEIGHT ) { RECT rect; GetClientRect( ( HWND ) hb_parnl(1), &rect ); hb_retni( ( INT ) rect.bottom - rect.top ); } #pragma ENDDUMP [/pre2]

Andrey: SergKis пишет: Ошибочное утверждение. Всего навсего : MySayColorLabel(aLabel1,aColors1) вызов, а Function MySayColorLabel(cWnd,aLabel,aColor) - параметров 3 однако. Спасибо, БОЛЬШОЕ ! Как обычно, простые , заработался однако... С примером понятно. А почему форма не делится на 3-цвета одинаково ? Я же задаю: nCliW := GetClientWidth (hWnd) nCliH := GetClientHeight(hWnd) nH1 := nCliH/3 If aLbl == NIL ......................... Else aLbl[ 1] [ _W ] := nCliW; aLbl[ 1] [ _H ] := nH1 aLbl[ 2] [ _W ] := nCliW; aLbl[ 2] [ _H ] := nH1 * 2 aLbl[ 3] [ _W ] := nCliW; aLbl[ 3] [ _H ] := nCliH Endif

SergKis: Andrey пишет:А почему форма не делится на 3-цвета одинаково ? Делая: aLbl[ 1] [ _H ] := nH1; aLbl[ 1] [ _H ] := nH1*2; aLbl[ 1] [ _H ] := nCliH мы должны задать высоту конкретного Label, а здесь ... ? В DemoA.prg было: nLblH3 := nCliH - ( GetProperty(cWnd, cLblN1, "Height") + GetProperty(cWnd, cLblN2, "Height") ) . Здесь надо как то так: nH1 := int(nCliH/3) nH2 := nH1 nH3 := nCliH - ( nH1 + nH2 ) и aLbl[ 1] [ _H ] := nH1; aLbl[ 1] [ _H ] := nH2; aLbl[ 1] [ _H ] := nH3

SergKis: SergKis пишет:aLbl[ 1] [ _H ] := nH1; aLbl[ 1] [ _H ] := nH2; aLbl[ 1] [ _H ] := nH3 Скопровал, а исправить забыл. Надо: aLbl[ 1] [ _H ] := nH1; aLbl[ 2] [ _H ] := nH2; aLbl[ 3] [ _H ] := nH3

Andrey: Понял. все получилось. Еще добавил исправление координат по ROW. Только не полностью работают: @ 40, 70 BUTTON Button_Style CAPTION 'Label Style' ; ACTION ( MyBorder(cWnd, aLbl[1][ _N ]), ; MyBorder(cWnd, aLbl[2][ _N ]), ; MyBorder(cWnd, aLbl[3][ _N ]) ) @ 80, 70 BUTTON Button_Edge CAPTION 'Label Edge' ; ACTION ( MyEdge(cWnd, aLbl[1][ _N ]), ; MyEdge(cWnd, aLbl[2][ _N ]), ; MyEdge(cWnd, aLbl[3][ _N ]) ) Скорее всего там тоже надо ставить сразу изменение 3-х объектов ? Правильно ? И еще, подправьте пожалуйста 11 строчку ! Почти готовый пример .... http://files.mail.ru/5F3EA2EABBE647E38CF1718BEA943D3C

SergKis: Andrey пишет:Скорее всего там тоже надо ставить сразу изменение 3-х объектов ? Правильно ? Да. Но все не так просто. Что бы менять resize во всех трех Label одновременно, надо придумать алгоритм расчета размеров (по % например): - Left, Top, Right, Bottom - отступы от краев Label до контролов - nGapsWidth, nGapsHeight - расстояния по горизонтали, вертикали между контролами - nBtnWidth, nBtnHeight - размеры Button - nGetWidth, nGetHeight - размеры GetBox - и т.д. - размеры фонтов учитывать или нет после получения размеров контролов, можно располагать их в своем Label и ... все равно всего не учтешь, 5 GetBox или Button как не располагай, а во весь экран смотреться не будут. Словом, как бы весь пар в свисток не вышел. И еще, подправьте пожалуйста 11 строчку ! Это я не понял - в какой функции ?

Andrey: SergKis пишет: Да. Но все не так просто. Что бы менять resize во всех трех Label одновременно, надо придумать алгоритм расчета размеров (по % например): - Left, Top, Right, Bottom - отступы от краев Label до контролов Давайте пока без отступов ! Просто: nCliH := GetClientHeight(hWnd) nH1 := int(nCliH/3) nH2 := nH1*2 nH3 := nCliH If aLbl == NIL aLbl := {} aAdd( aLbl, { 0, 0, nCliW, nH1, "LabelColor_1", cWnd+"_Frame_Text1" } ) aAdd( aLbl, { nH1, 0, nCliW, nH2, "LabelColor_2", cWnd+"_Frame_Text2" } ) aAdd( aLbl, { nH2, 0, nCliW, nH3, "LabelColor_3", cWnd+"_Frame_Text3" } ) И еще, подправьте пожалуйста 11 строчку ! Это просто 11 строка в файле, с самого начала PRG !!!

SergKis: Andrey пишет:Это просто 11 строка в файле, с самого начала PRG !!! Я совсем туплю - как она хоть выглядит ? В Почти готовый пример это комментарий. В предыдущем скрытом тексте это #define ...

Andrey: SergKis пишет: Я совсем туплю - как она хоть выглядит ? * Copyright ..... SergKis <????????> Ваши данные нужны.

SergKis: Andrey пишет:Ваши данные нужны Смело удаляйте эту строку !

Andrey: Почти готовый пример .... http://files.mail.ru/FD03497F32DC4A309C7F85866BD39FDF SergKis, я переделал пример, но БОРДЮР работает через один цвет. Я пробовал несколько вариантов, ничего не получается. Посмотрите пожалуйста. SergKis, а зачем функция Test_This( cWnd ) в примере ? И еще вопрос, кто знает: cWnd := _HMG_ThisFormName nWidth := ? nHeight := ? А в МиниГуи есть переменные типа _HMG_ThisFormName.MaxWidth и _HMG_ThisFormName.MaxHeight ? Я нашел в \Include\i_var.ch #xtranslate _HMG_LoadWindowRow => _HMG_SYSDATA\[427\] #xtranslate _HMG_LoadWindowCol => _HMG_SYSDATA\[428\] #xtranslate _HMG_LoadWindowWidth => _HMG_SYSDATA\[429\] #xtranslate _HMG_LoadWindowHeight => _HMG_SYSDATA\[430\] а для чего эти переменные ?

Dima: Andrey пишет: А зачем функция Test_This( cWnd ) в примере ? Это ты сам себя спросил ? ;)

SergKis: Andrey пишет:а для чего эти переменные ? Это базовые переменные, используемые в MiniGUI для хранения информации - это регистрация окон, контролов, HotKey, ... в массивах MiniGUI (не путать с регистацией в windows). См. h_windows.prg, h_<control>.prg, ... . есть переменные типа _HMG_ThisFormName.MaxWidth и _HMG_ThisFormName.MaxHeight ? Препроцессор преобразует команды This... (см. i_this.ch) в вызов функций с использованием переменных _HMG_This... ThisWindow.Width ==> GetProperty ( _HMG_THISFORMNAME , "Width") и т.д. В событиях (OnInit, OnGotFocus, Action, ...) перед выполнением блока кода, устанавливаются переменные _HMG_This..., см. функции: _DoWindowEventProcedure(...), _DoControlEventProcedure(...). А зачем функция Test_This( cWnd ) в примере ? Это моя приблуда (для своей lib), но после нее, я уверен в _HMG_ThisFormName.

SergKis: Andrey пишет:... Посмотрите пожалуйста. Подправил: http://zalil.ru/34214553

Andrey: SergKis пишет: Это моя приблуда (для своей lib), но после нее, я уверен в _HMG_ThisFormName. В этом (моем) примере можно её (Test_This( cWnd )) убрать ?

Andrey: SergKis пишет: Подправил: http://zalil.ru/34214553 Не понял.... А почему через один цвет бордюр не меняется ? Я хочу чтобы, если меняем "Label Style" то было бы так:

SergKis: Andrey пишет:Не понял.... А почему через один цвет бордюр не меняется ? Border ставится\снимается нормально, из-за ClientEdge визуальный обман получается для 2-го Label. SergKis писал: Свойства есть, надо использовать: - менять стиль SetWindowStyle(h, WS_BORDER, .T./.F.) - .T. устанавливать, .F. снимать - менять Ext стиль ChangeStyle(h, WS_EX_CLIENTEDGE, 0, .T.) - устанавливать или ChangeStyle(h, 0, WS_EX_CLIENTEDGE, .T.) - снимать У меня получалось менять или Ext стиль или стиль ( одновременно менять - срабатывал только стиль ). В примере, я полагал, для каждого Label, одной кнопкой снимаем\ставим Border, другой - CLIENTEDGE. Для решения Вашей задачи надо иметь в aLbl Label-ы таких же размеров со свойством Visible:=.F. (скрытый) и по кнопке переводить в Visible:=.T. (свойство добавить 9-м элементом), а Label-ы с BORDER и CLIENTEDGE в Visible:=.F. В этом (моем) примере можно её (Test_This( cWnd )) убрать ? Да. Я его оставлял как пример манипулирования This... переменными.

Andrey: Как сделать украинский язык (UA866) для программ на МиниГуи ? Для русского делаю так: FUNCTION Main() ......... SET LANGUAGE TO RUSSIAN // язык/lang SET CODEPAGE TO RUSSIAN // кодовая страница/codepage

AlexMyr: Andrey пишет: Как сделать украинский язык (UA866) для программ на МиниГуи ? Вот что говорит дока, к-ю наверное никто не читает Select language for interface messages. SYNTAX SET LANGUAGE TO SPANISH | ENGLISH | FRENCH | PORTUGUESE | GERMAN | RUSSIAN | ITALIAN | FINNISH | CROATIAN | BASQUE | POLISH | DUTCH | SLOVENIAN | GREEK | CZECH | UKRAINIAN | BULGARIAN И снова таки, причем тут minigui?

Andrey: AlexMyr пишет: И снова таки, причем тут minigui? А там несколько вариантов было включения русского языка. Вот и спросил как включить украинский язык (UA866) ? Хотя тут МиниГуи не причем, это точно... AlexMyr пишет: Вот что говорит дока, к-ю наверное никто не читает Это в точку !

Andrey: Последний вариант 3х цветной формы и изменения размера формы. Для тех кому интересно. http://files.mail.ru/A70681C9CE544B58A255E360B1E373CD

SergKis: Andrey пишет:Последний вариант 3х цветной формы и изменения размера формы. Примеры работают не корректно - при увеличении окна вниз - контролы и label-color наезжают друг на друга. Исправить можно так: [pre2] FUNCTION ReSize() ... // change the position of the Label-Color FOR i := 1 TO Len( aLbl ) SetProperty( cWnd, aLbl[ i ][ _T ], "Visible", .F. ) // label-text hide SetProperty( cWnd, aLbl[ i ][ _N ], "Visible", .F. ) // label-color hide SetProperty( cWnd, aLbl[ i ][ _N ], "Row" , aLbl[ i ][ _Y ] ) SetProperty( cWnd, aLbl[ i ][ _N ], "Width" , aLbl[ i ][ _W ] ) SetProperty( cWnd, aLbl[ i ][ _N ], "Height", aLbl[ i ][ _H ] ) SetProperty( cWnd, aLbl[ i ][ _N ], "Visible", .T. ) // label-color show // change the position of the Label-Text SetProperty( cWnd, aLbl[ i ][ _T ], "Row" , aLbl[ i ][ _Y ] + 10 ) SetProperty( cWnd, aLbl[ i ][ _T ], "Visible", .T. ) // label-text show NEXT /* // change the position of the Label-Text FOR i := 1 TO Len( aLbl ) SetProperty( cWnd, aLbl[ i ][ _T ], "Row" , aLbl[ i ][ _Y ] + 10 ) NEXT */ [/pre2]

Andrey: SergKis пишет: Исправить можно так: Спасибо БОЛЬШОЕ ! Кстати функцию Test_This( cWnd ) убрать нельзя ! Пример перестает работать....

SergKis: Andrey пишет:Пример перестает работать.... Все правильно. Переменные _HMG_This... формируются в вызываемых процедурах (events) окна, контролов: pre2] Procedure _ProcessInitProcedure(i) ... _HMG_ThisEventType := 'WINDOW_INIT' _HMG_ThisFormIndex := iIndex _HMG_ThisType := 'W' _HMG_ThisIndex := iIndex _HMG_ThisFormName := _HMG_aFormNames [ iIndex ] _HMG_ThisControlName := "" Eval( bInit ) ... Function _DoWindowEventProcedure ( bBlock , i , cEventType ) ... _HMG_ThisFormIndex := i _HMG_ThisEventType := cEventType _HMG_ThisType := 'W' _HMG_ThisIndex := i _HMG_ThisFormName := _HMG_aFormNames [ _HMG_ThisFormIndex ] _HMG_ThisControlName := "" lRetVal := Eval( bBlock ) ... Function _DoControlEventProcedure ( bBlock , i , cEventType , nParam ) ... _HMG_ThisFormIndex := ascan ( _HMG_aFormHandles , _HMG_aControlParentHandles ) _HMG_ThisType := 'C' _HMG_ThisIndex := i _HMG_ThisFormName := _HMG_aFormNames [ _HMG_ThisFormIndex ] _HMG_ThisControlName := _HMG_aControlNames [ _HMG_ThisIndex ] If _HMG_BeginWindowActive == .F. .or. !( cEventType == 'CONTROL_ONCHANGE' ) .or. _HMG_MainClientMDIHandle != 0 Eval( bBlock, nParam ) EndIf ... [/pre2] Мы после DEFINE WINDOW &cWnd ; вызывали: aLblClrInit() AEval( aLbl, { | a, n | MySayColorLabel( n, n ) } ) и чтобы одинаково работать в своих вызовах и events процедурах Test_This(cWnd) устанавливает _HMG_ThisFormName, _HMG_ThisFormIndex. Если бы мы все проделывали только в events процедурах, то Test_This(cWnd) не нужна.

Andrey: Вот столкнулся с тем что не могу поменять цвет в RADIOGROUP Вроде по доке там 2 параметра по цвету, а у меня только черным выводит.... Вот код: DEFINE RADIOGROUP RadioGroup_CodeEIRC ........................... OPTIONS {' ячейка (1:А)',' ячейка (2:А)'} READONLY { .F. , .F. } FONTNAME 'Arial Black' FONTSIZE 14 SPACING 10 FONTCOLOR ORANGE BACKCOLOR aFonColor[ 2 ] HORIZONTAL .T. END RADIOGROUP Как поменять цвет в RADIOGROUP ? И как увеличить размер "кружка" ? P.S. Если не ставить первый пробел в OPTIONS {' ячейка (1:А)',' ячейка (2:А)'}, то труба, текст не появится ! НЕ ЛЮБИТ МИНИГУИ маленькую букву "я" !!! Час убил на выяснения этого ФЕНОМЕНА !!! Надо бы сообщить разработчикам... Григорий сообщи им пожалуйста !

Andrey: Разобрался я с цветом в RADIOGROUP ! В Win8 не меняется цвет, а в Win2003 и Win2008 все работает нормально !!! До ХР пока не дошел...

SergKis: Andrey пишет:Разобрался я с цветом в RADIOGROUP ! В Win8 не меняется цвет, а в Win2003 и Win2008 все работает нормально !!! До ХР пока не дошел... Когда подстрагивали под себя MiniGui, обратили внимание, что в некоторых контролах управление цветами, фонтами заложено, но не до конца - т.е. для развития. Можно потратить кучу времени и без результата, если очень надо с цветами, то использовать альтернативные решения - Label, Image, Combobox,Browse или Grid (без линий и header, но с Image), и т.д. ...

Andrey: SergKis пишет: Можно потратить кучу времени и без результата, если очень надо с цветами Да не надо. Спасибо за разъяснения. Просто начал делать и не получается, думал что я что-то не так делаю...

Andrey: Есть ли ПРИМЕР копирования файла с бегунком (PROGRESSBAR) ? Можно конечно и самому написать, но хочется посмотреть правильный код....

Dima: Andrey пишет: Есть ли ПРИМЕР копирования файла с бегунком (PROGRESSBAR) Где то выкладывали уже и тоже по твоей просьбе.

Softlog86: А меня интересует регулировка прозрачности элемента управления "Slider" :) Хочу его запрятать за картинку

Andrey: Dima пишет: Где то выкладывали уже и тоже по твоей просьбе. Да я просмотрел все свои программки на МиниГуи, так и не нашел. Индексация есть, а вот копирования файла нет. Пришлось псевдокопирование сделать - бегунок в цикле до 50%, потом копирование, потом остаток бегунка.

Haz: не втех примерах искал MiniGUI\SAMPLES\BASIC\Filecopy\

Andrey: Haz пишет: не втех примерах искал MiniGUI\SAMPLES\BASIC\Filecopy\ Это точно не в тех... Спасибо большое !

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

Andrey: Как можно получить размеры AVI-файла, показываемый на форме из ресурсов EXE ?

Andrey: Как узнать запущена ли чужая программа или нет ? Нужно узнать по названию EXE файла. Функция IsExeRunning() не работает ! Проверял на MiniGUI\SAMPLES\Advanced\IsExeRunning\demo.prg модифицированный немного: cRun := "WINWORD.EXE" l1 := IsExeRunning( cRun ) l2 := IsExeRunning( cFileNoPath( HB_ArgV( 0 ) ) ) cR3 := "demo2.exe" l3 := IsExeRunning( cR3 ) MsgDebug(cRun, l1,cFileNoPath( HB_ArgV( 0 ) ), l2, cR3, l3 ) (запускал WINWORD и demo2.exe )

Dima: Andrey пишет: Как узнать запущена ли чужая программа или нет ? Запущенные процессы надо анализировать

Andrey: Можно ли вывести в функциях BrowseForFolder() или GetFolder() ТОЛЬКО подключенные флешки к компьютеру ? Или нужно писать самому такую функцию ? Может у кого есть уже такая функция ?

Andrey: Haz пишет: не втех примерах искал MiniGUI\SAMPLES\BASIC\Filecopy\ Посмотрел этот пример и не понял, ошибка или в новой версии БЕГУНОК не работает ? Собирал с помощью MiniGUI 2.2.3 - 2013.06.12 Кто подскажет как исправить ошибку ?

gfilatov2002: Andrey пишет: Кто подскажет как исправить ошибку ? Надо заменить вызов команды DO EVENTS на вызов функции inkey(.1) или InkeyGUI() в этом месте [pre2]************************************ Function SHOW_IT(nDl) ************************************ Local nPos := int(nDl*100) if nPos % _SHOW_PERCENT == 0 Form_1.Label_3.Value := ltrim(str(nPos))+" % complete" Form_1.ProgressBar_1.Value := nPos // DO EVENTS inkey(.1) endif return NIL [/pre2]

Andrey: gfilatov2002 пишет: Надо заменить вызов команды DO EVENTS на вызов функции inkey(.1) или InkeyGUI() в этом мест Спасибо БОЛЬШОЕ !!!

Andrey: Пример MiniGUI\SAMPLES\BASIC\Filecopy\ - заработал... Для теста пробую копировать файл размером 160 Мб на флешку... Идет копирование медленно даже при #define _LARGE_BLOCK 16384*10 (при 20 прога вешается...) Если еще при этом сделать копирование другого файла на эту же флешку, то труба... Программа "подвисает" вот с таким сообщением: Стандартная харборовская функция FILECOPY( cSource, cDestination ) - работает в разы лучше... Вопрос: как увеличить скорость записи и убрать подвисание программы ?

Dima: Andrey пишет: Стандартная харборовская функция FILECOPY( cSource, cDestination ) - работает в разы лучше... Вопрос: как увеличить скорость записи и убрать подвисание программы ? Переработать этот пример на Filecopy , Hb_fcopy ....и тд и тп А вообще если шибко надо можно и свою функцию по копированию сваять.

Andrey: На форме использую объект ANIMATEBOX: @ 10,80 ANIMATEBOX Avi_1 ; WIDTH 340 HEIGHT 60 ; FILE 'AVI1' AUTOPLAY TRANSPARENT NOBORDER Работает отлично. Закончилась одна обработка, перехожу к другой обработке. Как сменить AVI1 на другой, допустим AVI2 ? В примерах и доке не нашел ничего.... Все AVI-файлы уже загружены в ресурсы программы....

a_sidorov: Попробуй так: Form_Main.Avi_1.Stop() Form_Main.Avi_1.Open('Avi2') Form_Main.Avi_1.Play()

Andrey: Спасибо, получилось !

Andrey: Как изменить цвета букв после вывода на форму ? Т.е. я не хочу выводить слово побуквенно, а вывести надпись целиком, а потом изменить цвет у некоторых букв. Например: @ 10,120 LABEL Label_1 VALUE "Test color label" ; WIDTH 500 HEIGHT 60 FONT "Times Roman" SIZE 24 BOLD и выборочно изменить цвет нескольких букв "e" и "o".

Andrey: Работаю с базой, через объект GRID. После обновления базы обновляю GRID, так: aList := LoadLogZaiv() // загрузка базы (маленькая) в массив Form_9.Grid_Log.DeleteAllItems Form_9.Grid_Log.DisableUpdate FOR nI := 1 to LEN(aList) Form_9.Grid_Log.AddItem( aList[nI] ) NEXT Form_9.Grid_Log.EnableUpdate Вопрос: а как сделать чтобы в окне GRID отображались самые нижние записи ? Может метод какой то есть ? Заранее спасибо за ответ !

Haz: Andrey пишет: а как сделать чтобы в окне GRID отображались самые нижние записи ? Это так ? Form_9.Grid_log.Value := Len(aList)

Andrey: Haz пишет: Form_9.Grid_log.Value := Len(aList) Спасибо БОЛЬШОЕ !

Andrey: Всем доброй ночи... Подскажите как проконтролировать ввод названия папки: M->cPubDirFlaska := "TEST\" ...... @ 128, 20 + 60 TEXTBOX Text_2 ; WIDTH 500 ; VALUE M->cPubDirFlaska ; FONT "Courier New" Size 12 BOLD ; ON LOSTFOCUS {|| M->cPubDirFlaska := AllTrim(Form_5.Text_2.Value) } Т.е. если юзер забыл в конце добавить знак "\", то нужно его добавить автоматом... Заранее спасибо за помощь !

Dima: Andrey пишет: Т.е. если юзер забыл в конце добавить знак "\", то нужно его добавить автоматом... Тупо проверить символ справа например или устроить разбор строки.

Andrey: Dima пишет: Тупо проверить символ справа например или устроить разбор строки. А как ? Я не могу понять как это реализовать в МиниГуи ? Где ставить вызов обрабатываемой функции ? Сама функция есть: Function MyFixDir(cDir) cDir := AllTrim(cDir) IF SubStr(cDir,Len(cDir),1) # "\" cDir := cDir + "\" ENDIF RETURN cDir

PSP: Andrey пишет: Я не могу понять как это реализовать в МиниГуи ? Где ставить вызов обрабатываемой функции ? У тебя ж есть блок кода в ON LOSTFOCUS. Туда и вставь.

Dima: Andrey пишет: А как ? Andrey пишет: M->cPubDirFlaska := "TEST\" Вот так наверное M->cPubDirFlaska :=Твоя функция

Andrey: PSP пишет: У тебя ж есть блок кода в ON LOSTFOCUS. Туда и вставь. Dima пишет: Вот так наверное M->cPubDirFlaska :=Твоя функция Не пашет !!! Только потом сообразил, что нужно перепоказать значение в TEXTBOX Text_2 .... Вот так работает: @ 128, 20 + 60 TEXTBOX Text_2 ; WIDTH 500 ; VALUE M->cPubDirFlaska ; ON LOSTFOCUS {|| M->cPubDirFlaska := MyFixDir(Form_5.Text_2.Value) } Сама функция: Function MyFixDir(cDir) cDir := AllTrim(cDir) IF SubStr(cDir,Len(cDir),1) # "\" cDir := cDir + "\" ENDIF Form_5.Text_2.Value := cDir RETURN cDir Спасибо за подсказку !

Andrey: Возможно ли выведенный объект на форме поменять цвет ? Допустим есть объект @ 275,20 PROGRESSBAR Progress_1 ; RANGE 0,100 ; VALUE 0; WIDTH 530 HEIGHT 25 После завершения пробега бегунка, я хочу закрасить его другим цветом. Как это сделать ? Может пример есть ?

Andrey: В Клипере и Харборе есть отличная функция: ColorWin() Replaces a color attribute in a screen region Есть ли аналог такой функции в МиниГуи ?

Andrey: Помогите понять ошибку. Прога сваливается с непонятной периодичностью... Ошибка вот такая: Time from start: 0 days 0 hours 5 mins 0 secs Error: Non Modal Window Win_Zaiv can't be activated when a Modal window is active. Called from _ACTIVATEWINDOW(1303) Called from DOMETHOD(4654) Called from CHANGE_ZAIVKI(343) Программа "сидит" в трее и функцию CHANGE_ZAIVKI(343) вызываю по таймеру через каждые 5 минут. Как долго работает прога, не знаю... Может свалиться и через 5 минут или через час... Непонятки сплошные...

Dima: Andrey пишет: Non Modal Window Win_Zaiv can't be activated when a Modal window is active. Не модальное окно Win_Zaiv не может быть активировано когда модальное окно активно. PS Прошу прощения за мой плохой англо русский перевод

Andrey: Dima пишет: Не модальное окно Win_Zaiv не может быть активировано когда модальное окно активно. Как такое может быть ? Работает прога нормально, посылает на сайт данные... а потом бац: Non Modal Window Win_Zaiv can't be activated when a Modal window is active.

Haz: Андрей , а что за окно Win_Zaiv? судя по ошибке ты пытаешься его активировать при активном модальном окне Проверь все окна

Andrey: Andrey пишет: Программа "сидит" в трее и функцию CHANGE_ZAIVKI(343) вызываю по таймеру через каждые 5 минут. Не правильно написал. Основной модуль: DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 0 HEIGHT 0 ; TITLE PROGRAM ; MAIN NOSHOW ; NOTIFYICON '1MAIN_ICON' ; ..... DEFINE TIMER Timer_1 ; INTERVAL (M->TimeUpdate * 60) * 1000 ; ACTION AutoCheckZaiv() END WINDOW ..... Procedure AutoCheckZaiv() If !lActive lActive := .T. lInet := IsConnected() // см. InetState.prg IF lInet // Проверка доступности интернета ZaivkaSite_NoWin() // Выбираю и копирую из базы записи на сайт ....................... lActive := .F. Endif Return /////////////////////// Другой файл: FUNCTION ZaivkaSite_NoWin() LOCAL cDbfZaivIzm,cDbfZaivZip cDbfZaivIzm := "test_site.dbf" // создание БД измененных записей cDbfZaivZip := CHANGE_ZAIVKI(cDbfZaivIzm,M->cPubPathTemp,M->dPubZaivChancg,"NoWin") IF LEN(cDbfZaivZip) > 0 SaveToSiteZaivka2(cDbfZaivZip,M->cPubPathTemp,"NoWin") // отправка архива на сайт ENDIF RETURN NIL ............... FUNCTION CHANGE_ZAIVKI(cDbfZaivIzm,cPathDbf,dZaivka,cTypeWin) LOCAL cTitle := "Подготовка измененных записей" LOCAL cDbfZip := "" DEFAULT cTypeWin TO "" DEFINE WINDOW Win_Zaiv ; ROW 0 COL 0 ; WIDTH 480 ; HEIGHT 240 ; TITLE cTitle ; ICON "ICON2SITE" ; CHILD ; NOSIZE NOMAXIMIZE NOMINIMIZE; FONT 'Tahoma' SIZE 10 ; ON INIT { || cDbfZip := InitChangeZaivki(cDbfZaivIzm,cPathDbf,dZaivka,cTypeWin) } ............. END WINDOW Win_Zaiv.Center Win_Zaiv.Activate RETURN cDbfZip //////////////////////////////////////////////////////////// // Инициализация формы FUNCTION InitChangeZaivki(cDbfZaivIzm,cPathDbf,dZaivka,cTypeWin) ........... // открытие общей базы cFileDbf := M->cPubPathZaiv + "dbase.dbf" bErrHandler := ErrorBlock( { | VAR | BREAK( VAR ) } ) BEGIN SEQUENCE USE ( cFileDbf ) Alias BASEMAIN CODEPAGE "RU866" NEW SHARED RECOVER cMsg := "Ошибка ! НЕ могу открыть базу !" + CRLF + CRLF + cFileDbf MsgStop( cMsg , MSGTITLE ) Win_Zaiv.Release() RETURN "" END SEQUENCE ErrorBlock( bErrHandler ) // IF MyOpenSprav(@cErr) //открытие справочников ELSE cMsg := "Ошибка ! НЕ смог открыть СПРАВОЧНИКИ !" + CRLF + CRLF + cErr MsgStop( cMsg , MSGTITLE ) Win_Zaiv.Release() RETURN "" ENDIF ....... и т.д. Вроде всегда при ошибках делаю закрытие окна Win_Zaiv.Release() ! Вот прога уже три часа нормально в трее сидит, не ломается. Или нужно еще что-то делать, для обработок ошибок ?

Haz: самое простое - сделать Win_Zaiv модальным окном а не CHILD

SergKis: Andrey пишет:Или нужно еще что-то делать В AutoCheckZaiv() надо отключать timer на время выполнения работ и включать timer по завершению снова, где-то на эту тему мы уже общались

sashaBG: Я тоже так думаю

Andrey: Haz пишет: самое простое - сделать Win_Zaiv модальным окном а не CHILD Не ставиться ! Если меняю на: DEFINE WINDOW Win_Zaiv ; ........... TITLE cTitle ; MODAL; NOSIZE NOMAXIMIZE NOMINIMIZE; ........ То при сборке выдает кучу ошибок: Source\Zaiv_to_Site.prg(310) Error E0030 Syntax error "syntax error at 'WINDOW'" Source\Zaiv_to_Site.prg(341) Error E0030 Syntax error "syntax error at '.'" Source\Zaiv_to_Site.prg(342) Error E0030 Syntax error "syntax error at '.'" и т.д. SergKis пишет: В AutoCheckZaiv() надо отключать timer на время выполнения работ и включать timer по завершению снова, где-то на эту тему мы уже общались Пересмотрел форум, не нашел. Помню что вы рекомендовали, а что точно не помню. Если несложно, пожалуйста повторите что и как нужно сделать ? Заранее БОЛЬШОЕ спасибо.

Haz: Andrey пишет: TITLE cTitle ; MODAL; NOSIZE NOMAXIMIZE NOMINIMIZE; Синтаксис описания модального окна отличается от не модального. Сравни по мануалу. В частности там нет NOMAXIMIZE NOMINIMIZE

SergKis: Andrey пишет: повторите что и как нужно сделать Procedure AutoCheckZaiv() SetProperty('Form_1', 'Timer_1', 'Enabled', .F.) // выкл. или Form_1.Timer_1.Enabled := .F. ... SetProperty('Form_1', 'Timer_1', 'Enabled', .T.) // вкл. или Form_1.Timer_1.Enabled := .T. Return

Andrey: Спасибо БОЛЬШОЕ. Сделал, работает. Теперь другой вопрос. Как вернуть текущему окну (в котором работает юзер) фокус ввода из моей задачи ? А то, после запуска моей задачи из трея, приходится мышкой тыкать в то окно, с которым работал.

Haz: на вскидку два варианта 1) получить указатель окна пользователя ( ShrinkIt из примеров минигуи в помощь ) и читать типа этого http://www.wasm.ru/forum/viewtopic.php?pid=123607 2) Вообще не забирать фокус у окна пользователя а писать статистику в лог ( базу ). Из программы пользователя анализировать этот лог ( базу ) и выводить сообщения из нее.

Andrey: Haz пишет: на вскидку два варианта Спасибо БОЛЬШОЕ ! Второй вариант лучше. Меньше "париться" !

Andrey: Если я создаю объект: DEFINE WINDOW Win_Zaiv ; MODAL ; NOSHOW ; ..... END WINDOW Win_Zaiv.Center Win_Zaiv.Activate То почему то окно все равно показывается на экран. Что не так делаю ?

Haz: вроде все так, без живого примера не понять перед Win_Zaiv.Center добавь Win_Zaiv.Hide и забудь

Andrey: Haz пишет: перед Win_Zaiv.Center добавь Win_Zaiv.Hide и забудь Не получается ! Окно все равно выводиться. Почему ? Я же ставлю при создание окна NOSHOW ! А окно появляется: Вот полный код: //////////////////////////////////////////////////////////// // создание БД измененных записей FUNCTION CHANGE_ZAIVKI(cDbfZaivIzm,cPathDbf,dZaivka,cTypeWin) LOCAL cTitle := "Подготовка измененых записей" LOCAL cDbfZip := "" DEFAULT cTypeWin TO "" DEFINE WINDOW Win_Zaiv ; ROW 0 COL 0 ; WIDTH 480 ; HEIGHT 240 ; TITLE cTitle ; ICON "ICON2SITE" ; MODAL ; NOSHOW ; NOSIZE NOSYSMENU ; FONT 'Tahoma' SIZE 10 ; ON INIT { || cDbfZip := InitChangeZaivki(cDbfZaivIzm,cPathDbf,dZaivka,cTypeWin) } @ 80, 0 LABEL Label_Up VALUE "" ; WIDTH 480 HEIGHT 260 ; BACKCOLOR COLOR_BUTTONE_LIGHT_RED @ 10,80 ANIMATEBOX Avi_1 ; WIDTH 32 HEIGHT 40 ; FILE 'AVICHECK' AUTOPLAY TRANSPARENT NOBORDER @ 120,20 PROGRESSBAR Progress_1 ; RANGE 0,100 ; VALUE 0; WIDTH 430 HEIGHT 34 @ 100,10 LABEL Label_1 ; WIDTH 450 HEIGHT 16 ; VALUE '0%' ; BOLD ; BACKCOLOR COLOR_BUTTONE_LIGHT_RED ; CENTERALIGN @ 155,10 LABEL Label_2 ; WIDTH 450 HEIGHT 46 ; VALUE "создаю БД" ; BOLD ; BACKCOLOR COLOR_BUTTONE_LIGHT_RED ; CENTERALIGN END WINDOW Win_Zaiv.Hide Win_Zaiv.Center Win_Zaiv.Activate RETURN cDbfZip //////////////////////////////////////////////////////////// // Инициализация формы FUNCTION InitChangeZaivki(cDbfZaivIzm,cPathDbf,dZaivka,cTypeWin) LOCAL nJ, nI, aFieldArray, lRet, cFileDbf, bErrHandler, aDbf, nAllRecno LOCAL aRecno := {}, cDateZ, cTimeZ, cNumZ, cID, cMsg MsgDebug(cTypeWin) У Григория есть пример \MiniGUI\SAMPLES\BASIC\SPLASHDEMO\demo.prg Там нормально отрабатывает NOSHOW: Function Main DEFINE WINDOW Form_Main ; AT 0,0 ; WIDTH 640 HEIGHT 480 ; TITLE 'Main Window' ; MAIN ; NOSHOW END WINDOW DEFINE WINDOW Form_Splash ; PICTURE 'DEMO' ; SPLASH ; DELAY 4 ; ON RELEASE Form_Main.Show END WINDOW CENTER WINDOW Form_Main ACTIVATE WINDOW ALL Return Nil По доке окно MODAL тоже может быть NOSHOW... Или глюк какой то ?

Haz: видимо косячек в минигуи с модальным окном. как вариант в ON INIT засунуть ThisWindow.hide , прячет но мелькает всеравно

SergKis: Haz пишет:видимо косячек в минигуи с модальным окном. и не только в модальном (было в версии 2.07) всегда show

Haz: Андрей , держи таблетку и играй в прятки с модальными окнами в h_windows.prg в строке 1295 вместо If _HMG_aFormType == "M" _ShowWindow ( _HMG_aFormNames , .F. ) нужно прописать условие IF ... и пересобратьбиблиотеки минигуи If _HMG_aFormType == "M" if _HMG_aFormNoShow == .F. _ShowWindow ( _HMG_aFormNames , .F. ) ELSE _hIDEWindow ( _HMG_aFormNames , .F. ) end

Панченко: Андрей, убери Win_Zaiv.Activate (ну и Hide перед ним тоже не нужен)

Andrey: Панченко пишет: Андрей, убери Win_Zaiv.Activate (ну и Hide перед ним тоже не нужен) Конечно. Ставил я это из-за того: Haz пишет: видимо косячек в минигуи с модальным окном.

Панченко: Andrey пишет: Haz пишет:  цитата: видимо косячек в минигуи с модальным окном. Андрей, описываешь модальное окно с NOSHOW. ACTIVATE не надо !!! (это активация окна, которая выводит его на экран). Окно нормально создается, но на экран не выводится.

Andrey: Панченко пишет: Окно нормально создается, но на экран не выводится. Да, создается. Только при повторном обращении к этой функции, теперь программа слетает ! С ошибкой: Error: Window: Win_Zaiv is already defined.</p><BR> Called from _DEFINEMODALWINDOW(440) Called from CHANGE_ZAIVKI(311) А с Win_Zaiv.Activate нормально работает. Т.е. если я делаю модальное окно: DEFINE WINDOW Win_Zaiv ; MODAL ; NOSHOW ; ON INIT { || cDbfZip := InitChange(cDbfZaivIzm,cPathDbf,dZaivka,cTypeWin) } ..... END WINDOW Win_Zaiv.Center RETURN NIL //////////////////////////////////////////////////////////// // Инициализация формы FUNCTION InitChange(cDbfZaivIzm,cPathDbf,dZaivka,cTypeWin) ..... IF LEN(cTypeWin) == 0 Win_Zaiv.Show ELSE Win_Zaiv.Hide // "NOWIN" ENDIF ............ То программа с параметром "NOWIN" - работает один раз. При повторном обращении падает с ошибкой указанной выше... Где и что править ? Или придется делать ДВЕ отдельные функции: с окном и без окна ? Но это же неправильно !

SergKis: Andrey для проверки наличия есть: _IsWindowDefined('Form_1') - для окон _IsControlDefined('Label_1', 'Form_1') - для контролов

Andrey: SergKis пишет: для проверки наличия есть: _IsWindowDefined('Form_1') - для окон _IsControlDefined('Label_1', 'Form_1') - для контролов СПАСИБО БОЛЬШОЕ ! Буду пользоваться. Я не пойму только одного у себя, если модальное окно с NOSHOW и БЕЗ Win_Zaiv.Activate у меня окно показывается. А у Григория в примере \MiniGUI\SAMPLES\BASIC\SPLASHDEMO\demo.prg стоит ACTIVATE WINDOW ALL то у него все работает. Панченко пишет: Андрей, убери Win_Zaiv.Activate (ну и Hide перед ним тоже не нужен) Тогда неправ Панченко ?

SergKis: Andrey пишет:А у Григория в примере \MiniGUI\SAMPLES\BASIC\SPLASHDEMO\demo.prg стоит ACTIVATE WINDOW ALL то у него все работает У него другая схема - сначала MAIN, потом другое окно. Начинать приложение сразу с MODAL у меня тоже были проблемы с управлением в окне. Сделал как у Григория, сначала MAIN в небольших координатах, сверху в OnInit MODAL и hide MAIN, но фокус эта конструкция будет забирать на себя при запуске из Tray - возможно запускать надо раньше, при старте своей проги и пусть сидит в фоне, или управлять заголовками (переключением фокуса между окнами по HWND)

SergKis: Andrey при вызове (click-ом) из Tray фокус на Tray меню, hide в новом запуске вернет фокус на последний фокус где был, т.е. на окно задачи не вернет.

Andrey: SergKis пишет: Начинать приложение сразу с MODAL у меня тоже были проблемы с управлением в окне. Так у меня тоже приложение начинается не с MODAL, а с MAIN. У меня в трее сидит приложение. Через 5 минут идет (открытие/проверка), выводит окно MODAL -бегунка подготовки БД. Вот это окно, я хочу убрать это окно, не показывать вообще (NOSHOW). А это окно все равно показывается на экране. У меня 2-3 места в программе, где я не хочу показывать такие MODAL-окна. Вот и получается, что есть тогда 3 варианта: 1) Исправить этот баг в библиотеке МиниГуи 2) написать аналогичные процедуры у себя в программе - без использования окон 3) переключением фокуса между окнами по HWND Пока хочу попробовать 3-вариант. SergKis пишет: или управлять заголовками (переключением фокуса между окнами по HWND) А как вы это делаете ? Подскажите пожалуйста.

SergKis: Andrey Я это делаю AutiIt3, мы это уже обсуждали, в hb через FindWindow в ваших темах где-то было

SergKis: Andrey пишет:А это окно все равно показывается на экране. NOSHOW я не использую, когда надо делаю DoMethod(cWnd, 'Hide', .T.) или .F., работает как надо, претензий нет

Haz: Андрей, пора определиться ) мне кажется необходимости в этом окне в качестве NOSHOW нет никакой, т.к. никакой фоновой нагрузки оно не несет и используется исключительно для отображения бегунка. Это можно оформить процедурой и рисовать обычное окно в ней при вызове . NOSHOW нужно, к примеру , в окне типа "WAIT ..." в минигуи есть 2 примера использования ( и то не модальные ). Вот тут при старте задачи заявил окно и спрятал, а когда нужно пользователю сказать жди(те) - кинул в окно нужную строку и показал до нужного момента. Можно конечно это окно и бегунком украсить если надо ))) PS. если есть все же желание активировать модальное окно с noshow - я показал где это подправить в минигуи. что касается меня - так давно правлю каждый релиз минигуи под себя т.к. некоторые вещи мне удобнее сделать один раз в библиотеке чем выеживаться в каждом проекте, к примеру это возможность получить имя поля базы из колонки tsbrowse и устанавливать ширину этих колонок через это имя, а не по номеру колонки.



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