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

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

Andrey: Как мне до создания окна MAIN показать окно CHILD (или другое) с сообщением типа - "Подождите, создаю базы..." ?

SergKis: Andrey пишет:с сообщением типа - "Подождите, создаю базы..." ? может подойдет схема из BASIC\WAIT_WINDOW\*.* с MAIN NOSHOW и окном сообщения в ON INIT, а после всех дел MAIN перевести в show.

Dima: Andrey У тебя склероз ? Ты этот вопрос уже задавал. Поиск на форуме по слову SPLASH или пример MiniGUI\SAMPLES\BASIC\SPLASHDEMO_3


Vlad04: Примеры WAIT_WINDOW_FOX TimedMsgBox посмотри

Andrey: Dima пишет: У тебя склероз ? Vlad04 пишет: посмотри А прочитать внимательно можно ? Andrey пишет: Как мне до создания окна MAIN показать окно Если нельзя это делать - так напишите что НЕЛЬЗЯ !

Andrey: SergKis пишет: с MAIN NOSHOW и окном сообщения в ON INIT, а после всех дел MAIN перевести в show. Да я знаю про этот вариант, просто принципиально понять хочу. Если нет MAIN окна, то выводить другие окна нельзя получается ? Т.е. такой код никогда не будет работать: Show_MyInfo(.T.) // показ сообщения Open_MyDbf Show_MyInfo(.F.) // скрыть сообщение DEFINE WINDOW Form_Main AT 0,0 WIDTH 720 HEIGHT 560 ; MAIN ; ..... END WINDOW ACTIVATE WINDOW Form_Main ----------------------------------- Почему тогда окна из MsgDebug(), MsgInfo() - всегда показывать можно ?

SergKis: Andrey пишет: Show_MyInfo(.T.) // показ сообщения Open_MyDbf Show_MyInfo(.F.) // скрыть сообщение ты пропустил, сначала CreateWindow_MyInfo()+Title+Menu+кнопки(min,max,exit)+контроы окна+... потом Show_MyInfo(.T.) Open_MyDbf() // здесь возможны сообщения для окна, причем разные ... ... и не забудь про Release, Destroy окна а теперь сравни с DEFINE ... END WINDOW, которые ты писал а CHILD сразу говорит дочернее, т.е. есть главное уже должно быть - это возвращаясь к твоему вопросу

Andrey: Andrey пишет: Как мне до создания окна MAIN показать окно CHILD (или другое) с сообщением типа - "Подождите, создаю базы..." ? В моёй вопросе есть ещё фраза - (или другое) ! Т.е. можно значит создать окно до MAIN ?

Softlog86: Всё как вы и хотели : Запускается SPLASCH окошко ("Ждите подключение к БД и тд") - и по завершении включает главное окно : #include "minigui.ch" #define WM_PAINT 15 #command DEFINE WINDOW <w> ; [ AT <row>,<col> ] ; [ WIDTH <wi> ] ; [ HEIGHT <h> ] ; PICTURE <bitmap> ; SPLASH ; [ DELAY <delay> ] ; [ ON RELEASE <ReleaseProcedure> ] ; => ; _DefineSplashWindow( <"w">, <row>, <col>, <wi>, <h>, <bitmap>, <delay>, <{ReleaseProcedure}> ) /* */ 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 /* */ Procedure _DefineSplashWindow( name, row, col, width, height, cbitmap, nTime, Release ) Local aBmpSize := BmpSize( cbitmap ) DEFAULT row := 0, col := 0, width := aBmpSize[1], height := aBmpSize[2], nTime := 2 DEFINE WINDOW &name ; AT row, col ; WIDTH width HEIGHT height ; CHILD TOPMOST ; NOSIZE NOMAXIMIZE NOMINIMIZE NOSYSMENU NOCAPTION ; ON INIT _SplashDelay( name, nTime ) ; ON RELEASE Eval( Release ) @ 0,0 IMAGE Image_1 ; PICTURE cbitmap ; WIDTH width ; HEIGHT height END WINDOW IF EMPTY(row) .AND. EMPTY(col) CENTER WINDOW &name ENDIF SHOW WINDOW &name Return /* */ Procedure _SplashDelay( name, nTime ) Local iTime := Seconds() SendMessage( GetFormHandle(name), WM_PAINT, 0, 0 ) Do While Seconds() - iTime < nTime Do Events EndDo DoMethod( name, 'Release' ) Return

Andrey: Andrey пишет: Всё как вы и хотели Я хотел поменьше кода и не такой геморой с передачей/возвратом.... //Показать окно // Создать базы //скрыть окно // А потом уж DEFINE WINDOW Form_Main ; MAIN ;

Andrey: Вопрос к Григорию, насчет кнопок ! Есть в рабочем примере такая конструкция: DEFINE BUTTONEX &cObject PARENT &cForm .......... HANDCURSOR .T. ONMOUSEHOVER ( SetProperty(ThisWindow.Name, cObject, "ICON", cResIco2), SetProperty(ThisWindow.Name, cObject, "fontcolor", aFontColorInvert ) ) ONMOUSELEAVE ( SetProperty(ThisWindow.Name, cObject, "ICON", cResIco) , SetProperty(ThisWindow.Name, cObject, "fontcolor", aFontColor) ) END BUTTONEX Пытаюсь сделать то же самое, только без DEFINE: @ nButtY,nWinWidth-20-nLenButt BUTTONEX BUTTON_4 WIDTH nLenButt HEIGHT nHButt ; CAPTION "Выход" ; ICON "iExit48x1" ; FONTCOLOR aFontColor ; BACKCOLOR MAROON ; SIZE nFBSize BOLD ; NOHOTLIGHT NOXPSTYLE HANDCURSOR ; ONMOUSEHOVER ( SetProperty( ThisWindow.Name, "BUTTON_4", "ICON", "iExit48x2" ) ) ; ONMOUSELEAVE ( SetProperty( ThisWindow.Name, "BUTTON_4", "ICON", "iExit48x1" ) ) ; ACTION ( aRetColor := {} , aUslColor:= {}, ThisWindow.Release ) Не собирается, выдает ошибку: Form_color.prg(120) Error E0030 Syntax error "syntax error at '@'" Где неправильно делаю ? И как правильно заменить в SetProperty( ThisWindow.Name, "BUTTON_4", ...) - BUTTON_4 на аналогичное, короткое название ? ThisWindow.Name - _HMG_THISFORMNAME ?????? - _HMG_THISCONTROLNAME Где то встречал, но сейчас не нашёл.

gfilatov2002: Andrey пишет: ONMOUSEHOVER ( SetProperty( ThisWindow.Name, "BUTTON_4", "ICON", "iExit48x2" ) ) ; ONMOUSELEAVE ( SetProperty( ThisWindow.Name, "BUTTON_4", "ICON", "iExit48x1" ) ) ; Для такой команды синтаксис д.б. с пробелом ON MOUSEHOVER ( SetProperty( ThisWindow.Name, "BUTTON_4", "ICON", "iExit48x2" ) ) ; ON MOUSELEAVE ( SetProperty( ThisWindow.Name, "BUTTON_4", "ICON", "iExit48x1" ) ) ; Andrey пишет: короткое название ? This.Name пробовал

Andrey: gfilatov2002 пишет: This.Name пробовал Ну точно помню что видел такую конструкцию, лазил даже в i_this.ch - там не нашёл. Спасибо БОЛЬШОЕ за помощь !!!

Andrey: Что то не работает переключение иконок. Вторая иконка появляется только при нажатии кнопки. Почему ? Как исправить ? @ nButtY,nWinWidth-20-nLenButt BUTTONEX BUTTON_4 WIDTH nLenButt HEIGHT nHButt ; CAPTION "Выход" ; ICON "iExit48x1" ; BACKCOLOR MAROON ; FONTCOLOR aFontColor ; SIZE nFBSize BOLD ; NOHOTLIGHT NOXPSTYLE HANDCURSOR ; ON MOUSEHOVER ( SetProperty( ThisWindow.Name, This.Name, "ICON", "iExit48x2" ) ,; SetProperty(ThisWindow.Name, This.Name, "fontcolor", aFontColor2 ) ) ; ON MOUSELEAVE ( SetProperty( ThisWindow.Name, This.Name, "ICON", "iExit48x1" ) ,; SetProperty(ThisWindow.Name, This.Name, "fontcolor", aFontColor ) ) ; ACTION ( aRetColor := {} , aUslColor:= {}, ThisWindow.Release )

Andrey: А можно как то сделать перевод с одного языка на другой на лету программы ? Т.е. я не хочу делать отдельный языковой файл для программы, хочу просто переводить на другой язык в момент показа формы. Можно ли как то все сообщения программы записать в файл (включая имена переменных) ? А потом можно сделать отдельный модуль с переводом на другой язык. Т.е. форма всегда выводиться на русском, а если установлен другой язык, то переменные на форме перечитываются на нужный язык.

Dima: посмотри для примера сырец dbedit.prg от Паши http://clipper.borda.ru/?1-4-0-00000666-000-0-0-1417410238

petr707: Кто переводить-то будет ? Перевод сильно зависит от контекста. Отдельное слово часто невозможно перевести без контекста. "Мир" как переведешь ? "World" или "peace" ?

SergKis: Andrey пишет:А можно как то сделать перевод с одного языка на другой на лету программы ? petr707 пишет:Кто переводить-то будет ? можно пойти по такому пути: Переводчик Google

Andrey: Dima пишет: посмотри для примера сырец dbedit.prg от Паши Посмотрел. Я примерно так же раньше делал. Потом у Григория взял в качестве примера MiniGUI\SAMPLES\Applications\DBFview\source\DBFview.lng но это не совсем то. Я проще хочу поступить. Можно ли как то все сообщения программы записать в файл (включая имена переменных) ? Т.е. по кнопке обход всех форм, считывание Label, FRAME, BUTTONEX и сброс их в файл. А уж из этого файла можно будет отдельную функцию в программе сделать.

Haz: Григорий, добрый день. Есть маленький, но неприятный глючок в CONTEXT MENU, причем проявляется не всегда ( Andrey тоже писал тут про него ) Суть его в том , что после выбора пункта меню, само меню не закрывается ( только со второго раза ). У меня это проявляется при использовании контекста в TSBrowse DEFINE CONTEXT MENU CONTROL oBrw OF Win MENUITEM 'Добавить новую статью ' ACTION {|| ... } NAME CM_1 MENUITEM 'Удалить текущую статью' ACTION {|| ... } NAME CM_2 END MENU иногда глюк решался забором фокуса от меню через вывод сообщения по окончании ACTION - MsgBox('что то там выполнено'), но не всегда это вписывается в логику. Перечитав исходники MiniGui нашел в h_Events.prg такие строки: =================[ От сюда ]================= 1400: // Process Menus ....................................... IF HiWord( wParam ) == 0 .AND. _HMG_aControlType == "MENU" _DoControlEventProcedure ( _HMG_aControlProcedures , i ) RETURN 0 ENDIF =================[ До сюда ]================= Судя по всему это и есть вызов того самого ACTION, и подумав что меню лучше закрывать ПЕРЕД этим вызовом - добавил строку =================[ От сюда ]================= 1400: // Process Menus ....................................... IF HiWord( wParam ) == 0 .AND. _HMG_aControlType == "MENU" _CloseMenu() _DoControlEventProcedure ( _HMG_aControlProcedures , i ) RETURN 0 ENDIF =================[ До сюда ]================= Глючок то исчез Грирогий, если эта корректировка правильна, может ее внести в след версию ?

gfilatov2002: Haz пишет: Грирогий, если эта корректировка правильна, может ее внести в след версию ? Огромное спасибо за эту корректировку! Уже внес эти изменения в код следующей сборки, которая планируется к выходу на следующей неделе

gfilatov2002: Andrey пишет: обход всех форм, считывание Label, FRAME, BUTTONEX и сброс их в файл. Уточнение: обход всех ОТКРЫТЫХ форм Посмотри пример из папки samples\Basic\Form_Controls с обходом для текущей формы

Andrey: gfilatov2002 пишет: обход всех ОТКРЫТЫХ форм Нет. Хочу обход ВСЕХ форм программы !

Haz: Andrey пишет: Нет. Хочу обход ВСЕХ форм программы Это как ? т.е. считать контролы формы даже не загруженной в память ? Что то мне подсказывает, что в тут без парсера исходного текста не обойтись, ну или на крайняк декомпилятора P-Code. Иного способа узнать о формах и контролах модуля, который еще может даже и не выволняться - не вижу. PS. хотя может я и ошибаюсь ...

SergKis: Haz пишет:PS. хотя может я и ошибаюсь ... [pre2] FOR i := 1 TO Len( _HMG_aFormNames ) IF _HMG_aFormType[ i ]=='Y' AAdd(aNames, _HMG_aFormNames[ i ] ) ENDIF hForm := _HMG-aFormHandle[ i ] а дальше как в примере по handle все контролы NEXT [/pre2]

Andrey: SergKis пишет: FOR i := 1 TO Len( _HMG_aFormNames ) IF _HMG_aFormType[ i ]=='Y' AAdd(aNames, _HMG_aFormNames[ i ] ) ENDIF hForm := _HMG-aFormHandle[ i ] а дальше как в примере по handle все контролы NEXT Ура ! Значит можно !

SergKis: Andrey пишет:Ура ! Значит можно ! првильно hForm := _HMG-aFormHandles[ i ]

Andrey: Во многих примерах МиниГуи встречаю PlayExclamation() - а музыки нет ! Это для чего ?

Andrey: И еще вопрос: Очень много разрешений экрана сейчас пользователи используют. Как бы определиться - какой размер шрифта нужно устанавливать на разные разрешения экранов ? Т.е. для: 800х600 12-размер шрифта, для 1024х720 14-размер шрифта и т.д. Но может я и не прав... Кто какую зависимость использует ?

Andrey: Проехали, сделал методом подстановки от разрешения. На глаз вроде нормально. ////////////////////////////////////////////////////////////////////// Function ModeSizeFont() LOCAL nSize IF GetDesktopHeight() == 600 nSize := IIF(LargeFonts(),10,12) ELSEIF GetDesktopHeight() == 768 nSize := IIF(LargeFonts(),12,14) ELSEIF GetDesktopHeight() == 800 nSize := IIF(LargeFonts(),14,16) ELSEIF (GetDesktopHeight() >= 1050 .AND. GetDesktopHeight() <= 1080) nSize := IIF(LargeFonts(),15,18) ELSEIF GetDesktopHeight() == 1152 nSize := IIF(LargeFonts(),18,20) ELSEIF GetDesktopHeight() >= 1200 nSize := IIF(LargeFonts(),22,24) ELSE nSize := 14 ENDIF RETURN nSize

Andrey: Столкнулся с непоняткой. Маленький пример из 2-3 файлов работает без ошибок. Использую функцию FileSize(cFileTransfer) Размер возвращает нормально. Как собираю этот пример со своей системой, то начинаются чудеса... FileSize() возвращает 0 Почему ? МиниГуи последний... Чем заменить можно ? Прогу собираю с ключом -mt (multi/single-thread Harbour VM)

Dima: Andrey пишет: Прогу собираю с ключом -mt (multi/single-thread Harbour VM) А на фик ? Потоки используешь ? Andrey пишет: Как собираю этот пример со своей системой, то начинаются чудеса... Может в ней чудеса ?

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

Andrey: Вопрос который я задавал ранее, но так и не получилось у меня. Делаю так: DEFINE TAB Tab_1 AT .... PAGE ' Тест 1 ' //MsgDEBUG( Form_9.Tab_1.Row, Form_9.Tab_1.Col, Form_9.Tab_1.Width, Form_9.Tab_1.Height) - не работает DEFINE TBROWSE oBrw9 AT ХХ+5 , ХХ+5 WIDTH ХХ-10 HEIGHT ХХ-10 ; ...... END TBROWSE END PAGE PAGE ' Тест 2 ' END PAGE END TAB MsgDEBUG( Form_9.Tab_1.Row, Form_9.Tab_1.Col, Form_9.Tab_1.Width, Form_9.Tab_1.Height) - работает !!! Мне нужно вместо ХХ задать координаты Tab_1 ! Т.е. нужно вписать TBROWSE во вкладку PAGE ' Тест 1 '. Как это можно сделать ?

Andrey: Можно ли объект RADIOGROUP сделать в ДВА столбца ? Может у кого есть готовый пример ?

Andrey: Всем привет ! Есть пример \MiniGUI\SAMPLES\BASIC\Grid_4\demo2.prg Я его модифицировал и не знаю как назначить кодовый блок цвета, чтобы как в ACHOICE логический массив позволял/запрещал выбирать элемент меню (в данном случае элемент GRIDa). 1) Как мне изменить блок кода для показа элементов с aLogic == .F./.T. ? LOCAL bColorFore := { | Val, CellRowIndex | iif ( CellRowIndex / 2 == Int( CellRowIndex / 2 ) , ; RGB( aColor2[1],aColor2[2],aColor2[3] ) , RGB( aColor3[1],aColor3[2],aColor3[3] ) ) } LOCAL bColorBack := { | Val, CellRowIndex | iif ( CellRowIndex / 2 == Int( CellRowIndex / 2 ) , ; RGB( aColor[1],aColor[2],aColor[3] ) , RGB( aColor[1],aColor[2],aColor[3] ) ) } 2) И почему то нет возврата выбора из этого меню: ON RELEASE {|| MsgDebug( "Выбрано меню:", cRet) } // возврат из окна Может что не так делаю ? Вот сам пример Grid_5 - #include "minigui.ch" STATIC lNolines := .T. // Show / hide the dividing lines in the grid STATIC lCellNavigation := .T. // Set the cell navigation style in the grid STATIC lNoheaders := .T. // Show / hide table headers in the grid /////////////////////////////////////////////////////////////////////////// Procedure Main LOCAL aColor := { 105, 182, 34 } // bright green LOCAL aColor2 := YELLOW LOCAL aColor3 := BLUE LOCAL aBtnColor := WHITE, aBackColor := aColor, cRet := "" LOCAL aHead := {'Menu'}, aImg := MyLoadArray(1), aItems := MyLoadArray(2), aLogic := MyLoadArray(3) LOCAL bColorFore := { | Val, CellRowIndex | iif ( CellRowIndex / 2 == Int( CellRowIndex / 2 ) , ; RGB( aColor2[1],aColor2[2],aColor2[3] ) , RGB( aColor3[1],aColor3[2],aColor3[3] ) ) } LOCAL bColorBack := { | Val, CellRowIndex | iif ( CellRowIndex / 2 == Int( CellRowIndex / 2 ) , ; RGB( aColor[1],aColor[2],aColor[3] ) , RGB( aColor[1],aColor[2],aColor[3] ) ) } SET MULTIPLE OFF SET AUTOADJUST ON DEFINE WINDOW Form_2 ; AT 0,0 ; WIDTH 600 ; HEIGHT 460 ; TITLE 'Grid Colors Demo' ; MAIN ; BACKCOLOR { 0,155,173} /*aBackColor*/ ; FONT 'Tahoma' SIZE 14 ; ON INIT OnInitGrid() ; ON RELEASE {|| MsgDebug( "Выбрано меню:", cRet) } // возврат из окна // Title grid {HEADERS} consists of only one line. // The second line is not visible! Limitation of grid. DEFINE GRID Grid_2 ROW 10 COL 10 WIDTH 570 HEIGHT 300 WIDTHS { 540 } HEADERS aHead ITEMS aItems VALUE 1 ON DBLCLICK { || cRet := Test_Choice(1,aLogic), msgdebug(cRet) } NOLINES lNolines CELLNAVIGATION lCellNavigation SHOWHEADERS lNoheaders FONTBOLD .T. FONTCOLOR BLUE BACKCOLOR aBackColor DYNAMICFORECOLOR { bColorFore , bColorFore, bColorFore } DYNAMICBACKCOLOR { bColorBack, bColorBack, bColorBack } END GRID @ 320,30 LABEL label_1 VALUE "<F4>, <Enter> - choice" ; WIDTH 220 HEIGHT 28 SIZE 12 BOLD TRANSPARENT ON KEY F4 ACTION cRet := Test_Choice(2,aLogic) @ 360, 200 BUTTONEX Button_1 ; WIDTH 170 HEIGHT 35 ; SIZE 11 BOLD ; CAPTION '&Report selection' ; NOHOTLIGHT NOXPSTYLE ; FONTCOLOR WHITE ; BACKCOLOR BLUE ; ACTION cRet := Test_Choice(3,aLogic) @ 360, 400 BUTTONEX Button_2 ; WIDTH 150 HEIGHT 35 ; SIZE 11 BOLD ; CAPTION 'E&xit' ; NOHOTLIGHT NOXPSTYLE ; FONTCOLOR WHITE ; BACKCOLOR RED ; ACTION ThisWindow.Release() END WINDOW CENTER WINDOW Form_2 ACTIVATE WINDOW Form_2 Return cRet /////////////////////////////////////////////////////////////////////////// Procedure OnInitGrid() _HMG_GridSelectedRowForeColor := RED _HMG_GridSelectedRowBackColor := BLACK _HMG_GridSelectedCellForeColor := RED _HMG_GridSelectedCellBackColor := BLACK Form_2.Grid_2.SetFocus Return /////////////////////////////////////////////////////////////////////////// Function MyLoadArray(nVal) Local nI, nJ := 1, nG := 1, aIco := {}, aRows := {}, aLog := {}, aRet AAdd( aIco , "Folder.bmp" ) ; AAdd( aLog , .F. ) AAdd( aRows, { PADC(" Group numba: "+LTRIM(STR(nG))+" ",50,"-") } ) FOR nI := 1 TO 25 AAdd( aIco , "File.bmp" ) AAdd( aRows, { SPACE(5)+"Example filename - "+LTRIM(STR(nJ++))+".txt" } ) AAdd( aLog , .T. ) IF nI % 5 == 0 aIco[nI] := "Folder.bmp" ; aLog[nI] := .F. aRows[nI] := { PADC(" Group numba: "+LTRIM(STR(nG))+" ",50,"-") } nJ := 1 ENDIF NEXT IF nVal == 1 aRet := ACLONE(aIco) ELSEIF nVal == 2 aRet := ACLONE(aRows) ELSEIF nVal == 3 aRet := ACLONE(aLog) ENDIF Return aRet /////////////////////////////////////////////////////////////////////////// FUNCTION Test_Choice( nVal, aLogic ) Local xMenuNum := Form_2.Grid_2.Value Local cMenuName, cRet := "", cText cText := IIF(nVal==2,"You press key [F4]" + CRLF + CRLF,"") cText += IIF(nVal==3,"You press button [Report selection]" + CRLF + CRLF,"") cText += "Menu selection = {" + STR(xMenuNum[1],2)+","+STR(xMenuNum[2],2)+" }" + CRLF + CRLF cMenuName := Alltrim( GetProperty( "Form_2", "Grid_2", "Cell", xMenuNum[1], 1 ) ) cText += "Menu selection = [" + cMenuName + "]" + CRLF + CRLF IF aLogic[xMenuNum[1]] == .F. // игнорирование выбора ELSE MsgInfo( cText ) cRet := cMenuName ThisWindow.Release() ENDIF Return cRet

SergKis: Andrey пишет:И почему то нет возврата выбора из этого меню: Убери ThisWindow.Release в Test_Choice(...) и добавь во все ACTION в конце

SergKis: Andrey пишет:Как мне изменить блок кода для показа элементов с aLogic также как функция Test_Choice( nVal, aLogic ), обрабатывай и возвращай массив цветов. Вызов в: DYNAMICFORECOLOR myFColor(...) DYNAMICBACKCOLOR myBColor(...)

Andrey: SergKis пишет: Убери ThisWindow.Release в Test_Choice(...) и добавь во все ACTION в конце Понял. Спасибо ! SergKis пишет: обрабатывай и возвращай массив цветов. Вызов в: Здесь не понял....

SergKis: Andrey пишет:Здесь не понял.. DYNAMICFORECOLOR myFColor(aLogic) DYNAMICBACKCOLOR myBColor(aLogic) [pre2] FUNC MyFColor(aLogic) LOCAL aColor := { 105, 182, 34 } // bright green LOCAL aColor2 := YELLOW LOCAL aColor3 := BLUE LOCAL bColorFore LOCAL bColorFore1 := { | Val, CellRowIndex | iif ( CellRowIndex / 2 == Int( CellRowIndex / 2 ) , ; // RGB( aColor2[1],aColor2[2],aColor2[3] ) , RGB( aColor3[1],aColor3[2],aColor3[3] ) ) } // для .F. LOCAL bColorFore2 := { | Val, CellRowIndex | iif ( CellRowIndex / 2 == Int( CellRowIndex / 2 ) , ; // RGB( aColor2[1],aColor2[2],aColor2[3] ) , RGB( aColor3[1],aColor3[2],aColor3[3] ) ) } // для .T. Local xMenuNum := Form_2.Grid_2.Value IF aLogic[xMenuNum[1]] == .F. bColorFore := bColorFore1 ELSE bColorFore := bColorFore2 ENDIF RETURN { bColorFore , bColorFore, bColorFore } FUNC MyBColor(aLogic) LOCAL aColor := { 105, 182, 34 } // bright green LOCAL aColor2 := YELLOW LOCAL aColor3 := BLUE LOCAL bColorBack LOCAL bColorBack1 := { | Val, CellRowIndex | iif ( CellRowIndex / 2 == Int( CellRowIndex / 2 ) , ; // RGB( aColor[1],aColor[2],aColor[3] ) , RGB( aColor[1],aColor[2],aColor[3] ) ) } // для .F. LOCAL bColorBack2 := { | Val, CellRowIndex | iif ( CellRowIndex / 2 == Int( CellRowIndex / 2 ) , ; // RGB( aColor[1],aColor[2],aColor[3] ) , RGB( aColor[1],aColor[2],aColor[3] ) ) } // для .T. Local xMenuNum := Form_2.Grid_2.Value IF aLogic[xMenuNum[1]] == .F. bColorBack := bColorBack1 ELSE bColorBack := bColorBack2 ENDIF RETURN { bColorBack, bColorBack, bColorBack } [/pre2] цвета в блоках кода ...1, ...2 подбирай сам.

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

Andrey: А что за ошибка такая ? Подробней информация как можно получить ? Error MGERROR/0 Grid: ITEMS length mismatch. Program terminated. Called from MSGMINIGUIERROR(91) Called from _DEFINEGRID(140) Called from ACHOICE_HMG(230) Called from ACHOICEMENU(142) Called from LISTSPRAVKI(286) Called from (b)MYINITFORMSPR(173) Called from (b)METRO3BUTTON(40) Called from _DOCONTROLEVENTPROCEDURE(1658) Called from EVENTS(1472) Called from _DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(1380) Called from HANDBOOKS(83) Called from (b)MAIN(105) Called from _PROCESSINITPROCEDURE(1498) Called from _ACTIVATEWINDOW(1364)

SergKis: Andrey _DEFINEGRID(140) открываешь h_grid.prg FUNCTION _DefineGrid ( ControlName, ParentFormName, x, y, w, h, aHeaders, aWidths, aRows, value, ; fontname, fontsize, tooltip, change, dblclick, aHeadClick, gotfocus, lostfocus, nogrid, ; aImage, aJust, break, HelpId , bold, italic, underline, strikeout, ownerdata, ondispinfo, ; itemcount, editable, dynamicforecolor, dynamicbackcolor, multiselect, editcontrols, ; backcolor, fontcolor, nId, columnvalid, columnwhen, validmessages, showheaders, aImageHeader, ; NoTabStop, celled, lCheckboxes, lockcolumns ) ... goto line 140 : [pre2] ... IF ValType ( aRows ) != 'U' IF Len ( aRows ) > 0 IF Len ( aRows[1] ) != Len ( aHeaders ) // а тут бяка MsgMiniGuiError ( "Grid: ITEMS length mismatch." ) // line 140 ENDIF ENDIF ENDIF ... [/pre2] если не понятно, открываешь i_grid.ch и смотришь DEFINE GRID ... как ложаться параметры ... и делаешь выводы

Andrey: SergKis пишет: открываешь h_grid.prg Взял это файл, поставил к себе в проект. Перед IF ValType ( aRows ) != 'U' поставил: MsgDebug(aRows,"====",aHeaders,"---",Len ( aRows[1] ), Len ( aHeaders )) После компиляции и запуска на этой строке получаю: MsgDebug(Значение_массива,"====",{'Select menu'},"---", 41, 1) и далее вылет по этой же ошибке.... GRID состоит из ОДНОГО столбца, заголовок есть - тоже один ! Почему должна срабатывать ошибка ? Не пойму я что-то ничего в этом.... А если я делаю SHOWHEADERS .F. тогда этот aHeaders вообще не надо учитывать ! Пример был рабочим - растащил на части - не работает...

Andrey: Andrey пишет: Пример был рабочим - растащил на части - не работает... Блин, уже не первый раз залетаю, что GRID должен на входе иметь не одинарный массив, а вложенный.... Вставил в рабочий пример - h_grid.prg, в нем натыкал отладки, собираешь пример и видишь - где сам накосячил.... Вопрос решен ! Спасибо SergKis за подсказку решения проблеммы !!!

Andrey: Открываю новую форму, задаю шрифт и размер на эту форму, далее вызываю функцию, которая строит объекты на форме. Как получить в этой функции, размер и наименование шрифта ? Можно конечно и передавать параметры в новую функцию, но это не есть хорошо. Я видал что можно и так делать: cFontName := _HMG_DefaultFontName // из MiniGUI.Init() nFontSize := _HMG_DefaultFontSize // из MiniGUI.Init() Или это относиться ТОЛЬКО при открытии задачи ? Поясните пожалуйста....

SergKis: Andrey открываешь h_windows.prg и : [pre2] FUNCTION _DefineWindow ( FormName, Caption, x, y, w, h, nominimize, nomaximize, nosize, nosysmenu, nocaption, aMin, aMax, ; InitProcedure, ReleaseProcedure, MouseDragProcedure, SizeProcedure, ClickProcedure, MouseMoveProcedure, aRGB, PaintProcedure, ; noshow, topmost, main, icon, child, fontname, fontsize, NotifyIconName, NotifyIconTooltip, NotifyIconLeftClick, ; GotFocus, LostFocus, VirtualHeight, VirtualWidth, scrollleft, scrollright, scrollup, scrolldown, hscrollbox, vscrollbox, helpbutton, ; MaximizeProcedure, MinimizeProcedure, cursor, NoAutoRelease, InteractiveCloseProcedure, ; RestoreProcedure, MoveProcedure, DropProcedure, mdi, palette, NotifyIconDblClick, cPanelParent, panel ) ... _HMG_ActiveFontName := IFCHARACTER( FontName, FontName, "" ) _HMG_ActiveFontSize := IFNUMBER( FontSize, FontSize, 0 ) ... [/pre2] если empty(_HMG_ActiveFontName), то берешь _HMG_DefaultFontName аналогично _HMG_ActiveFontSize и _HMG_DefaultFontSize

Andrey: SergKis пишет: открываешь h_windows.prg и : Спасибо !!!

Andrey: Как отловить ошибку в МиниГуи ? В терминалке было так: bErrHandler := ERRORBLOCK( {|var| BREAK(var)} ) //Простая обработка ошибок BEGIN SEQUENCE nJ := LEN( aRelation ) IF nJ > 0 SET RELATION TO FOR nI := 1 TO nJ cTemp1:=aRelation[ nI, 1 ] ; cTemp2:=aRelation[ nI, 2 ] dbSetRelation( cTemp2, {|| &cTemp1}, cTemp1 ) NEXT ENDIF MSG( " Не могу установить SET RELATION "+cTemp1+" INTO "+cTemp2+; " [цикл="+ALLTRIM(STR(nI))+"]", 5 ) RETURN .F. END SEQUENCE ERRORBLOCK(bErrHandler) При ошибках всё прекрасно работало. В МиниГуи теперь получаю: Как сделать, чтобы такого не было ?

SergKis: Andrey пишет:Как отловить ошибку в МиниГуи ? см. SAMPLES\BASIC\MyErrorFunc

Andrey: SergKis пишет: см. SAMPLES\BASIC\MyErrorFunc Спасибо за это ! Только при неправильном dbSetRelation( cTemp2, {|| &cTemp1}, cTemp1 ) программа вылетает БЕЗ ОШИБКИ с таким видом: Как это побороть ? Чтобы ошибка была ?

Andrey: Andrey пишет: Только при неправильном dbSetRelation( cTemp2, {|| &cTemp1}, cTemp1 ) программа вылетает БЕЗ ОШИБКИ с таким видом: Народ, а у вас как вылетает при неправильно заданном dbSetRelation() ?

Dima: Andrey пишет: Народ, а у вас как вылетает при неправильно заданном dbSetRelation() ? У меня ни как. Таких ошибок просто не делаю.

Andrey: gfilatov2002 пишет: С помощью WinAPI надо переопределить statusbar item как самописный (ownerdraw), послав ему собщение SendMessage( hwndSb, SB_SETTEXT, hb_BitOr( IDS_STATUSBAR, SBT_OWNERDRAW ), IDS_STATUSBAR ). В первом приближении это может выглядеть как в примере ниже Скрытый текст А можете эту программ чуток подробне прокоментировать ? Не совсем понял что делает и когда: SET EVENTS FUNCTION TO MYEVENTS Как в основной программе задать цвет и фон StatusBar'a.

gfilatov2002: Andrey пишет: Как в основной программе задать цвет и фон StatusBar'a По шагам: 1) получаем хэндл статусбара hwndSb := GetControlHandle ( _HMG_ActiveMessageBarname, _HMG_ActiveFormName ) 2) переназначаем требуемый участок этого статусбара как ownerdraw SendMessage( hwndSb, SB_SETTEXT, hb_BitOr( IDS_STATUSBAR, SBT_OWNERDRAW ), IDS_STATUSBAR ) 3) обрабатываем в пользовательской функции MyEvents() событие WM_DRAWITEM, в котором сами рисуем надпись на заданном участке. См. доработанный пример ниже [pre2] #include "i_winuser.ch" #include "minigui.ch" #define APP_TITLE "Hello World!" #define SB_SETTEXT (WM_USER+1) #define SBT_OWNERDRAW 0x1000 #define IDS_STATUSBAR 0 /* */ Function Main Local hwndSb SET EVENTS FUNCTION TO MYEVENTS DEFINE WINDOW Win_1 ; AT 0,0 ; WIDTH 400 ; HEIGHT 400 ; TITLE APP_TITLE ; MAIN DEFINE STATUSBAR FONT "Arial" SIZE 12 hwndSb := GetControlHandle ( _HMG_ActiveMessageBarname, _HMG_ActiveFormName ) STATUSITEM "Dummy" STATUSITEM "Dummy" WIDTH 92 END STATUSBAR END WINDOW SendMessage( hwndSb, SB_SETTEXT, hb_BitOr( IDS_STATUSBAR, SBT_OWNERDRAW ), IDS_STATUSBAR ) SendMessage( hwndSb, SB_SETTEXT, hb_BitOr( 1, SBT_OWNERDRAW ), 1 ) CENTER WINDOW Win_1 ACTIVATE WINDOW Win_1 Return Nil *----------------------------------------------------------* Function MyEvents ( hWnd, nMsg, wParam, lParam ) *----------------------------------------------------------* local i, a, hBrush do case **************************************************** case nMsg == WM_DRAWITEM **************************************************** i := AScan ( _HMG_aFormHandles , hWnd ) IF i > 0 .AND. _IsControlDefined ( "StatusBar" , _HMG_aFormNames [ i ] ) a := GETOWNBTNRECT(lParam) hBrush := CreateSolidBrush( 255, 255, 225 ) FillRect( GETOWNBTNDC(lParam), a[ 1 ], a[ 2 ], a[ 3 ], a[ 4 ], hBrush ) DeleteObject( hBrush ) IF GETOWNBTNITEMID(lParam) == IDS_STATUSBAR TextOut( a[ 1 ] + 1, a[ 2 ] + 1, "New Value", GETOWNBTNDC(lParam), RGB( 0, 0, 255 ) ) ELSE TextOut( a[ 1 ] + 1, a[ 2 ] + 1, "New Value", GETOWNBTNDC(lParam), RGB( 255, 0, 0 ) ) ENDIF ENDIF otherwise Events( hWnd, nMsg, wParam, lParam ) endcase Return (0) #pragma BEGINDUMP #include "hbapi.h" #include "windows.h" HB_FUNC ( TEXTOUT ) { HDC hdc = (HDC) hb_parnl( 4 ); SetTextColor( hdc, hb_parnl( 5 ) ); SetBkMode( hdc, TRANSPARENT ); TextOut( hdc, hb_parni(1), hb_parni(2), hb_parc(3), strlen(hb_parc(3)) ) ; SetBkMode( hdc, OPAQUE ); DeleteDC( hdc ) ; } #pragma ENDDUMP[/pre2]

Andrey: Вылетает по ошибке. IF i > 0 .AND. _IsControlDefined ( "StatusBar" , _HMG_aFormNames ) Error BASE/1081 Argument error: + Called from _ISCONTROLDEFINED(1039) Called from MYEVENTS(55) Called from UPDATEWINDOW(0) Called from EVENTS(634) Called from MYEVENTS(72) Called from SHOWWINDOW(0) Called from _ACTIVATEWINDOW(1360) Called from MAIN(37)

gfilatov2002: Andrey пишет: Вылетает по ошибке Это из-за форматирования форума - уже поправил код в сообщении выше

Andrey: Работает ! Осталось как то параметры цвета передавать ....

Dima: Andrey пишет: Осталось как то параметры цвета передавать ... Они задаются в этом примере в MyEvents() и похоже красятся все ITEMы а как покрасит конкретный ?

gfilatov2002: Dima пишет: как покрасит конкретный ? Для этого надо сделать само-нарисованным (Ownerdraw) только этот конкретный участок статусной строки. См. рабочий пример ниже [pre2]#include "i_winuser.ch" #include "minigui.ch" #define APP_TITLE "Hello World!" #define SB_SETTEXT (WM_USER+1) #define SBT_OWNERDRAW 0x1000 #define IDS_STATUSBAR 0 /* */ Function Main Local hwndSb SET EVENTS FUNCTION TO MYEVENTS DEFINE WINDOW Win_1 ; AT 0,0 ; WIDTH 400 ; HEIGHT 400 ; TITLE APP_TITLE ; MAIN DEFINE STATUSBAR FONT "Arial" SIZE 12 hwndSb := GetControlHandle ( _HMG_ActiveMessageBarname, _HMG_ActiveFormName ) STATUSITEM "Item 0" STATUSITEM "Item 1" WIDTH 92 STATUSITEM "Item 2" WIDTH 92 END STATUSBAR END WINDOW // SendMessage( hwndSb, SB_SETTEXT, hb_BitOr( IDS_STATUSBAR, SBT_OWNERDRAW ), IDS_STATUSBAR ) SendMessage( hwndSb, SB_SETTEXT, hb_BitOr( 1, SBT_OWNERDRAW ), 1 ) // SendMessage( hwndSb, SB_SETTEXT, hb_BitOr( 2, SBT_OWNERDRAW ), 2 ) CENTER WINDOW Win_1 ACTIVATE WINDOW Win_1 Return Nil *----------------------------------------------------------* Function MyEvents ( hWnd, nMsg, wParam, lParam ) *----------------------------------------------------------* local i, a, hBrush, hDC do case **************************************************** case nMsg == WM_DRAWITEM **************************************************** i := AScan ( _HMG_aFormHandles, hWnd ) IF i > 0 .AND. _IsControlDefined ( "StatusBar", _HMG_aFormNames [ i ] ) a := GETOWNBTNRECT( lParam ) hDC := GETOWNBTNDC( lParam ) IF GETOWNBTNITEMID( lParam ) == IDS_STATUSBAR hBrush := CreateSolidBrush( 225, 225, 225 ) FillRect( hDC, a[ 1 ], a[ 2 ], a[ 3 ], a[ 4 ], hBrush ) DeleteObject( hBrush ) TextOut( a[ 1 ] + 1, a[ 2 ], "New Value", hDC, RGB( 0, 0, 255 ) ) ELSE hBrush := CreateSolidBrush( 225, 225, 0 ) FillRect( hDC, a[ 1 ], a[ 2 ], a[ 3 ], a[ 4 ], hBrush ) DeleteObject( hBrush ) TextOut( a[ 1 ] + 1, a[ 2 ], "New Value", hDC, RGB( 255, 0, 0 ) ) ENDIF ENDIF otherwise Events( hWnd, nMsg, wParam, lParam ) endcase Return (0) #pragma BEGINDUMP #include "hbapi.h" #include "windows.h" HB_FUNC ( TEXTOUT ) { HDC hdc = ( HDC ) hb_parnl( 4 ); SetTextColor( hdc, hb_parnl( 5 ) ); SetBkMode( hdc, TRANSPARENT ); TextOut( hdc, hb_parni( 1 ), hb_parni( 2 ), hb_parc( 3 ), strlen( hb_parc( 3 ) ) ); SetBkMode( hdc, OPAQUE ); } #pragma ENDDUMP [/pre2]

Dima: gfilatov2002 Понял. Спасибо

Andrey: gfilatov2002 пишет: Для этого надо сделать само-нарисованным (Ownerdraw) только этот конкретный участок статусной строки. Блин, а я StatusBar делал самописный из LABEL.... Столько кода написать пришлось для пересчета при изменение размеров окна....

Andrey: А если сделать так: LOCAL aBackColor := {0,64,80} .... DEFINE WINDOW Win_1 ; BACKCOLOR aBackColor ; ..... Как тогда фон всего STATUSBAR сделать цветом aBackColor ?

gfilatov2002: Andrey пишет: Как тогда фон всего STATUSBAR сделать цветом aBackColor ? Планирую добавить новые свойства BACKCOLOR и FONTCOLOR для STATUSITEM в следующей сборке. Тогда можно будет записать так: [pre]#include "minigui.ch" #define APP_TITLE "Hello World!" Function Main LOCAL aBackColor := {0,64,80} DEFINE WINDOW Win_1 ; AT 0,0 ; WIDTH 400 ; HEIGHT 400 ; TITLE APP_TITLE ; MAIN ; BACKCOLOR aBackColor DEFINE STATUSBAR FONT "Arial" SIZE 10 STATUSITEM "Item 0" BACKCOLOR aBackColor STATUSITEM "Item 1" WIDTH 92 BACKCOLOR aBackColor FONTCOLOR YELLOW STATUSITEM "Item 2" WIDTH 92 BACKCOLOR aBackColor END STATUSBAR END WINDOW CENTER WINDOW Win_1 ACTIVATE WINDOW Win_1 Return Nil [/pre]

Dima: gfilatov2002 пишет: Планирую добавить новые свойства BACKCOLOR и FONTCOLOR для STATUSITEM

gfilatov2002: Dima Хочу уточнить, что я имел в виду следующую сборку 2.4.5, поскольку эти новые свойства требуют дополнительного тестирования. Уже сейчас вижу, что они НЕ совместимы с классом ICON для STATUSITEM

Andrey: gfilatov2002 пишет: Хочу уточнить, что я имел в виду следующую сборку 2.4.5 Подождем ! Спасибо !

Andrey: В терминалке на хХарборе использую базы в 866 кодировке. Символы CHR(250)-CHR(253) пишутся в текстовые поля базы нормально ! Пытаюсь то же самое сделать под МиниГуи не выходит, коды другие: Как записать в поле базы символы CHR(250)-CHR(253) ?

nick_mi: Repl pole with chr(250)+ chr(253) не пробовал? На всякий случай попробуй

Andrey: Всем привет. Делал окошко для проверки базы с двумя бегунками. Причем второй бегунок использовал два раза ( с разными цветами) на копирование файла (синий) и переброску записей с одной базы в другую (зеленый). И столкнулся с непоняткой, при переброске записей (зеленый цвет) вылазит синий цвет ? Наверно нужно как то объект чистить (хотя пользуюсь только DRAW RECTANGLE ) ... А может и не надо... Подскажите как убрать паразитирующий цвет (синий) ? Исходник CheckDbf.7z здесь - https://cloud.mail.ru/public/5d315f972a72/MiniGui-Error

Dima: Andrey пишет: И столкнулся с непоняткой, при переброске записей (зеленый цвет) вылазит синий цвет ? Собрал пример и такого эффекта не увидел. Нижний бегунок меняется нормально с синего на зеленый , потом снова синий потом зеленый. Единственно что когда рисуется зеленый бегунок то он дергается как не нормальный ))))) Синий идет красиво. PS Чем принципиально отличается InkeyGUI() от Inkey() ?

Andrey: Dima пишет: Единственно что когда рисуется зеленый бегунок то он дергается как не нормальный ))))) Вот это и есть фигня ! Как убрать и в чём дело не знаю !!! Dima пишет: Чем принципиально отличается InkeyGUI() от Inkey() ? Inkey() только для задержки форма висит и всё ! А InkeyGUI() нужно использовать чтобы на форме объекты перерисовались.

Dima: Andrey Закоменти в функции MyCopyBase строки cSay := "БД: " + cFile + " " + HB_NtoS(nJ) + "/" + HB_NtoS(nRecnoAll) + " - прошло ХХ:ХХ / осталось ХХ:ХХ" SetProperty(cStForm,"Label_File2","Value", cSay ) и дергаться перестанет.

Haz: Andrey пишет: Вот это и есть фигня ! Как убрать и в чём дело не знаю Эта фигня возникает из-за "непрофильного" использования DRAW да еще в цикле. По сути происходит следующее : Каждый вызов DRAW помимо того что рисует кусок псевдопрогрессбара на форме, так еще и запоминает в системной переменной MiniGui блок вызова этого самого DRAW с указанными параметрами ( что рисуем, по каким координатам, каким цветом, в каком окне ... ) Это нужно для того чтобы при изменении видимости окна - восстанавливать на нем все эти художества автоматически по сабытиям ( перемещение , прорисовка окна и пр ). Теперь что происходит в программе ( на пальцах): Каждый вызов DRAW - запоминает свой кодовый блок , при выводе Label идет перерисовка области окна и .....автоматом идет выполнение ВСЕХ предыдущих прорисовок DRAW отсюlа и моргание. Достаточно посмотреть исходники h_draw.prg и h_events.prg это в h_draw FUNCTION drawrect( window, row, col, row1, col1, penrgb, penwidth, fillrgb ) ... rectdraw( FormHandle, row, col, row1, col1, penrgb, penwidth, fillrgb, fill ) AAdd ( _HMG_aFormGraphTasks , { || rectdraw( FormHandle,row,col,row1,col1,penrgb,penwidth,fillrgb,fill ) } ) ... RETURN nil это в h_events CASE WM_PAINT FOR EACH r In _HMG_aFormHandles IF _HMG_aFormDeleted [z] == .F. a := _HMG_aFormGraphTasks [z] IF ISARRAY ( a ) .AND. Len ( a ) > 0 AEval ( a, { |x| Eval ( x ) } ) ENDIF ENDIF NEXT убрать просто - использовать штатный прогрессбар, или перед вызовом DRAW влепить костыль вида ASize ( _HMG_aFormGraphTasks [GetFormIndex ( cWindowName )], 0 ), который просто обнуляет массив кодовых блоков DRAW и при этом НЕ ГАРАНТИРУЕТСЯ корректная работа в последующих версиях MiniGui, и соответственно ГАРАНТИРУЕТСЯ гемморой с поддержкой такой программы у заказчика

Andrey: Спасибо БОЛЬШОЕ за разъяснения Haz Можно ли тогда в стандартном штатном прогрессбар изменить цвет бегунка ?

Haz: Andrey пишет: Можно ли тогда в стандартном штатном прогрессбар изменить цвет бегунка Условно да, вот из справки по Minigui Note: SMOOTH, BACKCOLOR & FORECOLOR has no effect when XP-Style is used

Haz: Andrey Если уж хочется нестандарта - то рекомендую прогрессбар рисовать фоном стандартного элемента LABEL это сработает и даже быстрее чем DRAW как демонстрация поправь в своей проге LABEL_1 ( TRANSPORENT УБРАТЬ ) @ 15,10 LABEL Label_1 ; WIDTH 0 HEIGHT 20 ; // VALUE cTitle BOLD ; FONTCOLOR BLACK ; BACKCOLOR RED ; CENTERALIGN VCENTERALIGN а Перед DRAW в custom progress вставь строку SetProperty( cWindowName, "Label_1", "Width", nFinishCol ) Дальше уверен сам все увидишь

Andrey: Haz пишет: Если уж хочется нестандарта - то рекомендую прогрессбар рисовать фоном стандартного элемента LABEL это сработает и даже быстрее чем DRAW Спасибо за идею. Буду пробовать. А заодно - насчет нестандарта: а LABEL можно сделать какой нибудь - "заливкой" ? Типа как шапка заголовка в TBROWSE, там 2 цвета используется.

Dima: Andrey пишет: а LABEL можно сделать какой нибудь - "заливкой" ? Не оно ? [pre2] @ <nRow> ,<nCol> LABEL <ControlName> [ ID <nId> ] [ OF | PARENT | DIALOG <ParentWindowName> ] VALUE <cValue> [ ACTION | ONCLICK | ON CLICK <ActionProcedureName> | <bBlock> ] [ ON MOUSEHOVER | ONMOUSEHOVER> <OverProcedureName> | <bBlock> [ ON MOUSELEAVE | ONMOUSELEAVE > <LeaveProcedureName> | <bBlock> ] ; [ WIDTH <nWidth> ] [ HEIGHT <nHeight> ] [ AUTOSIZE ] [ FONT <cFontname> SIZE <nFontsize> ] [ BOLD ] [ ITALIC ] [ UNDERLINE ] [ STRIKEOUT ] [ TOOLTIP <cToolTipText> ] [ BACKCOLOR <anBackColort> ] [ FONTCOLOR <anFontColor>] [ BORDER ] [ CLIENTEDGE ] [ HSCROLL ] [ VSCROLL ] [ TRANSPARENT ] [ BLINK ] [ RIGHTALIGN | CENTERALIGN ] [ HELPID <nHelpId> ] [ INVISIBLE ] [/pre2]

Haz: Andrey пишет: Типа как шапка заголовка в TBROWSE ну так и делай прогресс из TsBrowsa... 10 мин потратил на пример, дальше сам ++++++++++++++++++++++++++++++++ #include "minigui.ch" #include "tsbrowse.ch" Procedure Main() Public oBrw1 Public aDatos_origen DEFINE WINDOW Form1 ; AT 0,0 ; WIDTH 840 ; HEIGHT 480 ; TITLE "TsBrowse Progressbar Test" ; MAIN ; FONT 'Tahoma' SIZE 9 Sample1() END WINDOW DEFINE TIMER Timer_1 OF Form1 INTERVAL 100 ACTION TimerProc() ACTIVATE WINDOW Form1 Return *-------------------------------------------------------------- Function Sample1() aDatos_origen := {} AADD( aDatos_origen, {""} ) IF !_IsControlDefined ("oBrw1", "Form1") DEFINE TBROWSE oBrw1 ; AT 60,10 ; OF Form1 ; WIDTH 800 ; HEIGHT 30 ; FONT "Verdana" ; SIZE 9 ; GRID oBrw1:SetArray( aDatos_origen ) oBrw1:nHeightCell := 29 oBrw1:nHeighthEAD := 0 oBrw1:lNoVScroll := .T. oBrw1:lNoHScroll := .T. oBrw1:SetColor( { 2 }, { { Rgb( 255, 250, 205 ), Rgb( 200, 200, 200 ) } } ) oBrw1:SetColor( { 6 }, { { RGB( 43, 149, 168 ), RGB( 0, 74, 104 )} } ) ADD COLUMN TO TBROWSE oBrw1 DATA ARRAY ELEMENT 1 SIZE 1 END TBROWSE ENDIF Return Nil Func TimerProc() oBrw1:SetColSize( 1, oBrw1:aColSizes[1] +5 ) Return nil

Andrey: Haz пишет: а Перед DRAW в custom progress вставь строку SetProperty( cWindowName, "Label_1", "Width", nFinishCol ) Сделал пример по твоему совету ! То что надо ! Классно работает !!! И даже не "мельтешит" .... Dima пишет: Не оно ? Да нет... Как получить вот такую заливку как в Tbrowse: oBrw:SetColor( { 4 }, { { || { RGB(43,149,168), RGB(0,54,94) } } } ) // 4 , цвет фона шапка таблицы Как сделать такую же заливку на объектах: LABEL или BUTTONEX ?

Haz: Andrey пишет: BUTTONEX Что касается кнопок .... у тебя это есть ? C:\MiniGUI\SAMPLES\Advanced\ExpButton\

Haz: рабочий пример на основе TSBROWS #include "minigui.ch" #include "tsbrowse.ch" Procedure Main() DEFINE WINDOW Form1 AT 0,0 WIDTH 840 HEIGHT 480 TITLE "TsBrowse Progressbar Test" MAIN FONT 'Tahoma' SIZE 9 END WINDOW DEFINE TBROWSE oBrw1 AT 60,10 OF Form1 WIDTH 800 HEIGHT 21 FONT "Verdana" SIZE 9 GRID END TBROWSE oBrw1:SetArray( {{''}} , .T.) oBrw1:nHeightCell := oBrw1:nHeight-1 oBrw1:nHeightHead := 0 oBrw1:lNoVScroll := .T. oBrw1:lNoHScroll := .T. oBrw1:aColumns[1]:nAlign := DT_CENTER oBrw1:SetColor( { 5 }, { RGB(255,255,255) } ) oBrw1:SetColor( { 2 }, { { Rgb( 255, 250, 205 ), Rgb( 200, 200, 200 ) } } ) oBrw1:SetColor( { 6 }, { { RGB( 43, 149, 168 ), RGB( 0, 74, 104 )} } ) DEFINE TIMER Timer_1 OF Form1 INTERVAL 100 ACTION TimerProc() ACTIVATE WINDOW Form1 Return Nil Func TimerProc() IF oBrw1:aColSizes[1] < oBrw1:nWidth oBrw1:aColumns[ 1 ]:nWidth := oBrw1:aColSizes[1] + 5 oBrw1:aColSizes[ 1 ] := oBrw1:aColSizes[1] + 5 oBrw1:aArray[ 1, 1 ] := Ntoc(oBrw1:aColSizes[1]) oBrw1:Refresh(.F.) END Return nil

Andrey: Haz пишет: рабочий пример на основе TSBROWS Пример классный ! Нужно бы в библиотеку примеров поставить... Такой и не придумаешь сам... Haz пишет: Что касается кнопок .... у тебя это есть ? C:\MiniGUI\SAMPLES\Advanced\ExpButton\ Да есть. Смотрел его и ранее... Но как любит писать Дима - очень много букв... Слишком много вариантов, которые не нужны сейчас и не подходят (не то) для: oBrw:SetColor( { 4 }, { { || { RGB(43,149,168), RGB(0,54,94) } } } ) // 4 , цвет фона шапка таблицы Попроще нет примера ?

Haz: Andrey пишет: Попроще нет примера ? Можешь кнопку из TSBrowse сделать из заголовка - он поддерживает визуальный клик и будет именно oBrw:SetColor( { 4 }, { { || { RGB(43,149,168), RGB(0,54,94) } } } )

Andrey: Не, мне кнопку не надо. Надо получить заливку как TSBrowse. Посмотрел исходник, ничего не понял как оттуда вытащить заливку....

Haz: Andrey пишет: Надо получить заливку как TSBrowse. нарисуй ее в любой графике и поставь как паттерн на кнопку

Andrey: Haz пишет: поставь как паттерн на кнопку Это как ?

Haz: Andrey пишет: Это как ? Андрей, ты издеваешься у buttonEx есть пропертя Picture... 1 рисуешь в граф редакторе свою кнопку с какой хош заливкой на весь размер, 2 сохраняешь ее как bmp 3 DEFINE BUTTONEX Button_1 ... PICTURE "Image_1.bmp" ... END BUTTONEX 4 по желанию используешь On MOUSEHOVER и MOUSELEAVE для смены картинки

Andrey: Haz пишет: Андрей, ты издеваешься Нисколько. У меня не получилось растянуть картинку на всю кнопку. Если задаю глупые вопросы, прошу не обижаться ! Не получилось что-то вот и задаю.... Буду пробовать тогда еще раз.

Haz: продолжу про прогрессбар из TsBrows с удивлением обнаружил если в градиентной заливке ВТОРОЙ цвет сделать отрицательным - то градиент из вертикального стоновится горизонтальным ..... сижу гадаю вот пример #include "minigui.ch" #include "tsbrowse.ch" Procedure Main() DEFINE WINDOW Form1 AT 0,0 WIDTH 840 HEIGHT 200 TITLE "TsBrowse Progressbar Test" MAIN FONT 'Tahoma' SIZE 9 END WINDOW DEFINE TBROWSE oBrw1 AT 60,10 OF Form1 WIDTH 800 HEIGHT 20 FONT "Verdana" SIZE 9 GRID END TBROWSE oBrw1:SetArray( {{''}} , .T.) oBrw1:nHeightCell := oBrw1:nHeight-1 oBrw1:nHeightHead := 0 oBrw1:lNoVScroll := .T. oBrw1:lNoHScroll := .T. oBrw1:SetColSize(1, 0) oBrw1:aColumns[1]:nAlign := DT_CENTER oBrw1:SetColor( { 5 }, { RGB(255,255,255) } ) // oBrw1:SetColor( { 2 }, { { Rgb( 255, 250, 205 ), -Rgb( 200, 200, 200 ) } } ) oBrw1:SetColor( { 2 }, { { Rgb( 130, 210, 200 ), -Rgb( 255, 250, 205 ) } } ) oBrw1:SetColor( { 6 }, { { RGB( 43, 189, 198 ), -RGB( 0, 74, 134 )} } ) oBrw1:SetColor( { 12 }, { { RGB( 43, 189, 198 ), -RGB( 0, 74, 134 )} } ) DEFINE TBROWSE oBrw2 AT 100,10 OF Form1 WIDTH 100 HEIGHT 32 FONT "Verdana" SIZE 9 GRID END TBROWSE oBrw2:SetArray( {{''}} , .T.) oBrw2:nHeightCell := 1 oBrw2:nHeightHead := oBrw2:nHeight-2 oBrw2:lNoVScroll := .T. oBrw2:lNoHScroll := .T. oBrw2:lNoChangeOrd := .T. oBrw2:nColOrder := 0 oBrw2:aColumns[1]:bHLClicked := { || Test()} oBrw2:aColumns[1]:cHeading := "Click me" oBrw2:SetColSize(1, oBrw2:nWidth) oBrw2:aColumns[1]:nAlign := DT_CENTER oBrw2:SetColor( { 3 }, { RGB(255,255,255) } ) oBrw2:SetColor( { 4 }, { { RGB( 43, 189, 198 ), RGB( 0, -74, -255 )} } ) ACTIVATE WINDOW Form1 Return Nil Func Test() oBrw1:aColumns[ 1 ]:nWidth := 0 oBrw1:aColSizes[ 1 ] := 0 oBrw1:aArray[ 1, 1 ] := Ntoc(oBrw1:aColSizes[1]) oBrw1:Refresh(.F.) oBrw1:SetFocus() While oBrw1:aColSizes[1] < oBrw1:nWidth oBrw1:aColumns[ 1 ]:nWidth := oBrw1:aColSizes[1] + 5 oBrw1:aColSizes[ 1 ] := oBrw1:aColSizes[1] + 5 oBrw1:aArray[ 1, 1 ] := Ntoc(oBrw1:aColSizes[1]) oBrw1:Refresh(.F.) do Events inkey(0.01) END Return nil

Dima: Haz пишет: то градиент из вертикального стоновится горизонтальным ..... сижу гадаю И к чему пришел в итоге ?

Haz: Dima пишет: И к чему пришел в итоге ? к недокументированной фиче или багу но как применить еще не придумал

Andrey: Как сделать чтобы в GET'е слева была картинка, а справа был ввод ? Картинку вывожу просто в GET слева, но мышкой наведешь на GET и картинка исчезает. @ 200, 20 GETBOX Text_Pswd ; HEIGHT 34 WIDTH nWidth-45 ; VALUE cPswd ; PICTURE 'xxx-xxx-xxx-xxx'; SIZE 18 BOLD ; RIGHTALIGN @ 202, 24 IMAGE Img_3 PICTURE 'BMPPASS' WIDTH 72 HEIGHT 30

Haz: Andrey пишет: мышкой наведешь на GET и картинка исчезает. выводи перед GET , зачем ты их в пересечение выводишь то? @ 200, 96 GETBOX Text_Pswd ; HEIGHT 34 WIDTH nWidth-45 ; VALUE cPswd ; PICTURE 'xxx-xxx-xxx-xxx'; SIZE 18 BOLD ; RIGHTALIGN @ 202, 24 IMAGE Img_3 PICTURE 'BMPPASS' WIDTH 72 HEIGHT 30

Andrey: Haz пишет: выводи перед GET , зачем ты их в пересечение выводишь то? Хочется покрасивей сделать....

Haz: Andrey пишет: Хочется покрасивей сделать.... и в чем противоречие ? картинка переходит в белый фон и сливается с фоном GET GET начинается сразу после картинки не понял зачем ты их пересекаешь по координатам ?

Andrey: Фон у картинки белый. Если его делать голубеньким то он останется за границей GET'a. Я уже не раз с таким сталкивался... Нужно разместить картинку в GET. Если нельзя, то жалко... Можно ли как то сделать чтобы картинка перечитывалась (обновлялась) после наведения мышки ?

Haz: Andrey пишет: Нужно разместить картинку в GET Можно но справа ...

Andrey: Как сделать на одном окне работу(отображение) других функций ? Т.е. на окно с кнопочками (верхний ряд) нужно: 1) заблокировать кнопки первого ряда (это сделал в отдельной функции) 2) добавить кнопочки (средний ряд) и ожидать от юзера нажатий кнопок. У меня кнопки добавляются в отдельной функции на форму ложатся и сразу происходит возврат из этой функции, т.е. не дает ожидания для выбора из вновь появившихся кнопок среднего ряда.

Andrey: Вопрос снят. Сделал тестовый пример - работает. Кому интересно - /* * MINIGUI - Harbour Win32 GUI library Demo * (c) 2015 Verchenko Andrey <verchenkoag@gmail.com> * */ #include "minigui.ch" #define APP_TITLE 'Checking functions in one form' STATIC aStaticDelObj := {} // which objects you want to remove FUNCTION Main() DEFINE WINDOW Form_Main ; AT 0,0 ; WIDTH 640 HEIGHT 480 ; TITLE APP_TITLE ; MAIN ; BACKCOLOR {159, 191, 236} ; FONT "Tahona" SIZE 14 ; ON INIT MyInit() DEFINE LABEL Label_Title ROW 180 COL 30 WIDTH 600 HEIGHT 50 VALUE '' FONTBOLD .t. FONTCOLOR BLACK TRANSPARENT .t. CENTERALIGN .t. END LABEL DEFINE BUTTONEX BUTTON_EXIT ROW 385 COL 20 WIDTH 580 HEIGHT 35 CAPTION 'Exit' ACTION ThisWindow.Release BACKCOLOR MAROON FONTCOLOR WHITE NOHOTLIGHT .F. NOXPSTYLE .T. HANDCURSOR .T. END BUTTONEX END WINDOW CENTER WINDOW Form_Main ACTIVATE WINDOW Form_Main RETURN NIL ////////////////////////////////////////////////////////////////////////// FUNCTION MyInit(cMenu) Local nI, cButt, cCapt, cMess, bAction Local cForm := "Form_Main", aButton := {} AADD( aButton, { 20, 20,170,35, "Button_1", "Menu 1", {|| MenuTask(1)} } ) AADD( aButton, { 70, 20,170,35, "Button_2", "Menu 2", {|| MenuTask(2)} } ) AADD( aButton, { 20,230,170,35, "Button_3", "Menu 3", {|| MenuTask(3)} } ) AADD( aButton, { 70,230,170,35, "Button_4", "Menu 4", {|| MenuTask(4)} } ) AADD( aButton, { 20,430,170,35, "Button_5", "Menu 5", {|| MenuTask(5)} } ) AADD( aButton, { 70,430,170,35, "Button_6", "Menu 6", {|| MenuTask(6)} } ) // ----------- display button (basic) on the shape ----------- FOR nI := 1 TO LEN(aButton) MyButtonForm(cForm, aButton[nI] ) NEXT RETURN NIL ////////////////////////////////////////////////////////////////////////// FUNCTION MenuTask(nMenu) Local nI, cObj, bAction, cTask Local cForm := "Form_Main", aButton := {} Local aColor := { ORANGE, LGREEN, PURPLE, BLUE, TEAL, AQUA } FOR nI := 1 TO 6 cObj := "Button_" + HB_NtoS(nI) SetProperty( cForm, cObj, "Enabled" , .F.) NEXT Domethod( cForm, "BUTTON_EXIT" , "Hide" ) Form_Main.Label_Title.FontColor := aColor[nMenu] Form_Main.Label_Title.Value := "Carried out menu - " + HB_NtoS(nMenu) // ------- an array of new buttons (Second Level)------------------- AADD( aButton, {220, 60,230,50, "Button2_1", "Second-level menu 1" , {|| MsgInfo("Button 2x1") } } ) AADD( aButton, {220,330,230,50, "Button2_2", "Second-level menu 2" , {|| MsgInfo("Button 2x2") } } ) AADD( aButton, {300, 60,230,50, "Button2_3", "Second-level menu 3" , {|| MsgInfo("Button 2x3") } } ) AADD( aButton, {300,330,230,50, "Button2_4", "Exiting 2 level menu" , {|| ExitSLM() } } ) // ----------- display buttons on the form of the second level ----------- FOR nI := 1 TO LEN(aButton) cButt := aButton[nI,5] AADD( aStaticDelObj, cButt ) // mark the object to remove later MyButtonForm(cForm, aButton[nI], aColor[nMenu] ) NEXT RETURN NIL ////////////////////////////////////////////////////////////////////////// FUNCTION ExitSLM() Form_Main.Label_Title.Value := "" FOR nI := 1 TO 6 cObj := "Button_" + HB_NtoS(nI) SetProperty( "Form_Main", cObj, "Enabled" , .T.) NEXT Domethod( "Form_Main", "BUTTON_EXIT" , "Show" ) // If there are objects in the array, then remove them IF LEN(aStaticDelObj) > 0 FOR nI := 1 TO LEN(aStaticDelObj) cObj := aStaticDelObj[nI] Domethod ( "Form_Main", cObj , "Release" ) NEXT ENDIF aStaticDelObj := {} RETURN NIL ////////////////////////////////////////////////////////////////////////// FUNCTION MyButtonForm(cForm, aDim, aColor) LOCAL cButt := aDim[5], cCapt := aDim[6], bAction := aDim[7] DEFAULT aColor := GRAY DEFINE BUTTONEX &cButt PARENT &cForm ROW aDim[1] COL aDim[2] WIDTH aDim[3] HEIGHT aDim[4] CAPTION cCapt ACTION Eval( bAction ) FONTBOLD .t. LEFTTEXT .t. FONTCOLOR WHITE BACKCOLOR aColor FONTNAME "Tahona" FONTSIZE 14 NOHOTLIGHT .F. NOXPSTYLE .T. HANDCURSOR .T. END BUTTONEX RETURN NIL Единственно что не могу понять - как сделать обращение к кнопкам второго уровня, если их вывести скрытыми при инициализации формы ? Но пока этот пример заработал...

SergKis: Andrey пишет:как сделать обращение к кнопкам второго уровня ты это имел ввиду ? /* * MINIGUI - Harbour Win32 GUI library Demo * (c) 2015 Verchenko Andrey <verchenkoag@gmail.com> * */ #include "minigui.ch" #define APP_TITLE 'Checking functions in one form' STATIC aStaticDelObj := {} // which objects you want to remove FUNCTION Main() DEFINE WINDOW Form_Main ; AT 0,0 ; WIDTH 640 HEIGHT 480 ; TITLE APP_TITLE ; MAIN ; BACKCOLOR {159, 191, 236} ; FONT "Tahona" SIZE 14 ; ON INIT MyInit() DEFINE LABEL Label_Title ROW 180 COL 30 WIDTH 600 HEIGHT 50 VALUE '' FONTBOLD .t. FONTCOLOR BLACK TRANSPARENT .t. CENTERALIGN .t. END LABEL DEFINE BUTTONEX BUTTON_EXIT ROW 385 COL 20 WIDTH 580 HEIGHT 35 CAPTION 'Exit' ACTION ThisWindow.Release BACKCOLOR MAROON FONTCOLOR WHITE NOHOTLIGHT .F. NOXPSTYLE .T. HANDCURSOR .T. END BUTTONEX END WINDOW CENTER WINDOW Form_Main ACTIVATE WINDOW Form_Main RETURN NIL ////////////////////////////////////////////////////////////////////////// FUNCTION MyInit(cMenu) Local nI, cButt, cCapt, cMess, bAction Local cForm := "Form_Main", aButton := {} AADD( aButton, { 20, 20,170,35, "Button_1", "Menu 1", {|| MenuTask(1)} } ) AADD( aButton, { 70, 20,170,35, "Button_2", "Menu 2", {|| MenuTask(2)} } ) AADD( aButton, { 20,230,170,35, "Button_3", "Menu 3", {|| MenuTask(3)} } ) AADD( aButton, { 70,230,170,35, "Button_4", "Menu 4", {|| MenuTask(4)} } ) AADD( aButton, { 20,430,170,35, "Button_5", "Menu 5", {|| MenuTask(5)} } ) AADD( aButton, { 70,430,170,35, "Button_6", "Menu 6", {|| MenuTask(6)} } ) // ----------- display button (basic) on the shape ----------- FOR nI := 1 TO LEN(aButton) MyButtonForm(cForm, aButton[nI] ) NEXT RETURN NIL ////////////////////////////////////////////////////////////////////////// FUNCTION MenuTask(nMenu) Local nI, cObj, bAction, cTask Local cForm := "Form_Main", aButton := {} Local aColor := { ORANGE, LGREEN, PURPLE, BLUE, TEAL, AQUA } FOR nI := 1 TO 6 cObj := "Button_" + HB_NtoS(nI) SetProperty( cForm, cObj, "Enabled" , .F.) NEXT Domethod( cForm, "BUTTON_EXIT" , "Hide" ) Form_Main.Label_Title.FontColor := aColor[nMenu] Form_Main.Label_Title.Value := "Carried out menu - " + HB_NtoS(nMenu) Form_Main.Label_Title.Cargo := HB_NtoS(nMenu) // ------- an array of new buttons (Second Level)------------------- AADD( aButton, {220, 60,230,50, "Button2_1", "Second-level menu 1" , {|| MyMsgInfo(1) } } ) AADD( aButton, {220,330,230,50, "Button2_2", "Second-level menu 2" , {|| MyMsgInfo(2) } } ) AADD( aButton, {300, 60,230,50, "Button2_3", "Second-level menu 3" , {|| MyMsgInfo(3) } } ) AADD( aButton, {300,330,230,50, "Button2_4", "Exiting 2 level menu" , {|| ExitSLM() } } ) // ----------- display buttons on the form of the second level ----------- FOR nI := 1 TO LEN(aButton) cButt := aButton[nI,5] AADD( aStaticDelObj, cButt ) // mark the object to remove later MyButtonForm(cForm, aButton[nI], aColor[nMenu] ) NEXT RETURN NIL ////////////////////////////////////////////////////////////////////////// FUNC MyMsgInfo( nN ) LOCAL cLevel := Form_Main.Label_Title.Cargo MsgInfo("Button "+cLevel+'x'+hb_ntos(nN)) RETURN NIL ////////////////////////////////////////////////////////////////////////// FUNCTION ExitSLM() Form_Main.Label_Title.Value := "" FOR nI := 1 TO 6 cObj := "Button_" + HB_NtoS(nI) SetProperty( "Form_Main", cObj, "Enabled" , .T.) NEXT Domethod( "Form_Main", "BUTTON_EXIT" , "Show" ) // If there are objects in the array, then remove them IF LEN(aStaticDelObj) > 0 FOR nI := 1 TO LEN(aStaticDelObj) cObj := aStaticDelObj[nI] Domethod ( "Form_Main", cObj , "Release" ) NEXT ENDIF aStaticDelObj := {} RETURN NIL ////////////////////////////////////////////////////////////////////////// FUNCTION MyButtonForm(cForm, aDim, aColor) LOCAL cButt := aDim[5], cCapt := aDim[6], bAction := aDim[7] DEFAULT aColor := GRAY DEFINE BUTTONEX &cButt PARENT &cForm ROW aDim[1] COL aDim[2] WIDTH aDim[3] HEIGHT aDim[4] CAPTION cCapt ACTION Eval( bAction ) FONTBOLD .t. LEFTTEXT .t. FONTCOLOR WHITE BACKCOLOR aColor FONTNAME "Tahona" FONTSIZE 14 NOHOTLIGHT .F. NOXPSTYLE .T. HANDCURSOR .T. END BUTTONEX RETURN NIL

Eduard: Подскажите пожалуйста, как можно сделать вывод элементов в форме COMBOBOX если вывод зависит от переключателя CHECKBOX, допустим если переключатель стоит в положении "Да", то вывести в список COMBOBOX енное кол-во записей для показа, а не все. Вывод в COMBOBOX идет из базы. Как то так...

Andrey: Eduard делай отдельный самодостаточный пример. Иначе трудно понять что нужно тебе. Я сам пишу одно а нужно другое... Как говорят - все телепаты в отпуске ...

Andrey: SergKis пишет: ты это имел ввиду ? Не совсем. Я хотел все кнопки затолкать в MyInit(), вывести кнопки второго уровня INVISIBLE, а потом уже кнопки второго уровня показывать в нужной функции по их названию. Пример переделаю и выложу. Хотя этот вариант будет сложнее в понимание и дальнейшем сопровождении (я так думаю). Однако, пример сам заработал после переделки... Всё оказывается просто... /* * MINIGUI - Harbour Win32 GUI library Demo * (c) 2015 Verchenko Andrey <verchenkoag@gmail.com> * */ #include "minigui.ch" #define APP_TITLE 'Checking functions in one form' STATIC aStaticDelObj := {} // which objects you want to remove FUNCTION Main() DEFINE WINDOW Form_Main ; AT 0,0 ; WIDTH 640 HEIGHT 480 ; TITLE APP_TITLE ; MAIN ; BACKCOLOR {159, 191, 236} ; FONT "Tahona" SIZE 14 ; ON INIT MyInit() DEFINE LABEL Label_Title ROW 180 COL 30 WIDTH 600 HEIGHT 50 VALUE '' FONTBOLD .t. FONTCOLOR BLACK TRANSPARENT .t. CENTERALIGN .t. END LABEL DEFINE BUTTONEX BUTTON_EXIT ROW 385 COL 20 WIDTH 580 HEIGHT 35 CAPTION 'Exit' ACTION ThisWindow.Release BACKCOLOR MAROON FONTCOLOR WHITE NOHOTLIGHT .F. NOXPSTYLE .T. HANDCURSOR .T. END BUTTONEX END WINDOW CENTER WINDOW Form_Main ACTIVATE WINDOW Form_Main RETURN NIL ////////////////////////////////////////////////////////////////////////// FUNCTION MyInit() Local nI, lRet, cForm := "Form_Main", aButton := {} AADD( aButton, { 20, 20,170,35, "Button_1", "Menu 1", {|| MenuTask(1)} } ) AADD( aButton, { 70, 20,170,35, "Button_2", "Menu 2", {|| MenuTask(2)} } ) AADD( aButton, { 20,230,170,35, "Button_3", "Menu 3", {|| MenuTask(3)} } ) AADD( aButton, { 70,230,170,35, "Button_4", "Menu 4", {|| MenuTask(4)} } ) AADD( aButton, { 20,430,170,35, "Button_5", "Menu 5", {|| MenuTask(5)} } ) AADD( aButton, { 70,430,170,35, "Button_6", "Menu 6", {|| MenuTask(6)} } ) // ------- an array of new buttons (Second Level)----- Hide mode -------------- AADD( aButton, {220, 60,230,50, "Button2_1", "Second-level menu 1" , {|| NIL } , .T. } ) AADD( aButton, {220,330,230,50, "Button2_2", "Second-level menu 2" , {|| NIL } , .T. } ) AADD( aButton, {300, 60,230,50, "Button2_3", "Second-level menu 3" , {|| NIL } , .T. } ) AADD( aButton, {300,330,230,50, "Button2_4", "Exiting 2 level menu" , {|| NIL } , .T. } ) // ----------- Change processing unit menu (Example) ----------- aButton[1,7] := {|| lRet := MsgYesNo( "Do you want to start another menu: 10 ?" ), ; IIF( lRet, MsgInfo("Starting the menu 10"), MsgInfo("Starting the menu 1") ),; IIF( lRet, MenuTask(10), MenuTask(1) ) } // ----------- display button (basic) on the shape ----------- FOR nI := 1 TO LEN(aButton) MyButtonForm(cForm, aButton[nI] ) NEXT // ------- hide the second level -------------- Domethod ( "Form_Main", "Button2_1" , "Hide" ) Domethod ( "Form_Main", "Button2_2" , "Hide" ) Domethod ( "Form_Main", "Button2_3" , "Hide" ) Domethod ( "Form_Main", "Button2_4" , "Hide" ) RETURN NIL ////////////////////////////////////////////////////////////////////////// FUNCTION MenuTask(nMenu) Local nI, cObj, bAction, cTask Local cForm := "Form_Main", aButton := {} Local aColor := { ORANGE, LGREEN, PURPLE, BLUE, TEAL, AQUA, , , , RED } FOR nI := 1 TO 6 cObj := "Button_" + HB_NtoS(nI) SetProperty( cForm, cObj, "Enabled" , .F.) NEXT Domethod( cForm, "BUTTON_EXIT" , "Hide" ) Form_Main.Label_Title.FontColor := aColor[nMenu] Form_Main.Label_Title.Value := "Carried out menu - " + HB_NtoS(nMenu) // ------- appoint a new button color -------------- SetProperty( "Form_Main", "Button2_1" , "BackColor", aColor[nMenu] ) SetProperty( "Form_Main", "Button2_2" , "BackColor", aColor[nMenu] ) SetProperty( "Form_Main", "Button2_3" , "BackColor", aColor[nMenu] ) SetProperty( "Form_Main", "Button2_4" , "BackColor", aColor[nMenu] ) // ------- assign a new code to handle the buttons -------------- SetProperty( "Form_Main", "Button2_1" , "Action", {|| MsgInfo("Button 2x1") } ) SetProperty( "Form_Main", "Button2_2" , "Action", {|| MsgInfo("Button 2x2") } ) SetProperty( "Form_Main", "Button2_3" , "Action", {|| MsgInfo("Button 2x3") } ) SetProperty( "Form_Main", "Button2_4" , "Action", {|| NewExitSLM() } ) // ------- button to show the second level -------------- Domethod ( "Form_Main", "Button2_1" , "Show" ) Domethod ( "Form_Main", "Button2_2" , "Show" ) Domethod ( "Form_Main", "Button2_3" , "Show" ) Domethod ( "Form_Main", "Button2_4" , "Show" ) RETURN NIL ////////////////////////////////////////////////////////////////////////// FUNCTION NewExitSLM() Form_Main.Label_Title.Value := "" FOR nI := 1 TO 6 cObj := "Button_" + HB_NtoS(nI) SetProperty( "Form_Main", cObj, "Enabled" , .T.) NEXT Domethod( "Form_Main", "BUTTON_EXIT" , "Show" ) // ------- hide the second level -------------- Domethod ( "Form_Main", "Button2_1" , "Hide" ) Domethod ( "Form_Main", "Button2_2" , "Hide" ) Domethod ( "Form_Main", "Button2_3" , "Hide" ) Domethod ( "Form_Main", "Button2_4" , "Hide" ) RETURN NIL ////////////////////////////////////////////////////////////////////////// FUNCTION MyButtonForm(cForm, aDim, aColor, lHide) LOCAL cButt := aDim[5], cCapt := aDim[6], bAction := aDim[7] DEFAULT aColor := GRAY, lHide := .F. DEFINE BUTTONEX &cButt PARENT &cForm ROW aDim[1] COL aDim[2] WIDTH aDim[3] HEIGHT aDim[4] CAPTION cCapt ACTION Eval( bAction ) FONTBOLD .t. LEFTTEXT .t. FONTCOLOR WHITE BACKCOLOR aColor FONTNAME "Tahona" FONTSIZE 14 NOHOTLIGHT .F. NOXPSTYLE .T. HANDCURSOR .T. INVISIBLE lHide END BUTTONEX RETURN NIL

SergKis: Eduard пишет:как можно сделать ... Создайте два combobox, с нужнымы item и в зависимости от состояния checkbox один делайте hide, другой show (Visible .F.\.T.)

SergKis: Andrey пишет: Я хотел все кнопки затолкать в MyInit(), вывести кнопки второго уровня INVISIBLE... т.е. ты хотел создать все 24 кнопки (6x4) в hide и потом делать кнопки нужного level в show ? если да, то создавай их между define window и endwindow (массив кнопок 24 элемента, добавив элемент принадлежность к level), по aeval делай hide и show button нужного level

SergKis: Eduard другой способ делать в combobox (он один) DeleteAllItems и добавлять нужные по AddItem. что проще решайте сами

Haz: Eduard пишет: Подскажите пожалуйста, как можно сделать вывод элементов в форме COMBOBOX если вывод зависит от переключателя CHECKBO если комбо по базе ( ItemSource - ValueSource ) то по checkBox просто ставится фильтр на базу и комбику делаем .Refresh() если комбо по массиву - то как SergKis написал - DeleteAll + AddItem

Eduard: Добрый день. Со вчерашним вопросом разобрался. Интересует, можно ли если установлена связка ItemSource - ValueSource сделать сортировку в КомбоБоксе, либо возможность поиска там-же по названию. Видел есть параметр SORT в combobox, но он не работает если стоит ItemSource. Смотрел пример в c:\MiniGUI\SAMPLES\BASIC\ComboSearch\, но там поиск идет типа по отдельному полю, но мне надо что-б непосредственно искало в самом Комбобоксе. И еще как можно сделать что-б комбобокс раскрылся при переходе на него ентером?

Haz: Eduard пишет: можно ли если установлена связка ItemSource - ValueSource сделать сортировку в КомбоБоксе Если задан Itemsource то при инициализации комбо элементы добавляются в порядке записей. т.е нужно сначала базу проиндексировать с нужным ключем, а потом создать комбо. Комбо по базе при выборе значения вернет valueSource ( если не определено - то Recno() ) Устанавливается такой комбо ВСЕГДА по Recno() вне зависимости от того что в ValueSource - Form_1.Combo_1.Value := nRecno но мне надо что-б непосредственно искало в самом Комбобоксе примерно так For n := 1 TO Form_1.Combo_1.ItemCount() IF Form_1.Combo_1.Item ( n ) == 'ищем эту строку' нашли ну или непосредственно по базе ( по которой строили комб )

SergKis: Eduard пишет:И еще как можно сделать что-б комбобокс раскрылся при переходе на него ентером? ComboBox раскрывается по F4, можно послать сообщение по кнопке или на GotFocus: hComboBox := GetControlHandle(cCombo, cForm) PostMessage( hComboBox, WM_KEYDOWN, VK_F4, 0)

SergKis: PS. Если combobox использовать без DISPLAYEDIT .T., то поиск по 1-ой букве, с DISPLAYEDIT .T. и набором букв в открывшемся поле поиск с подводом по набору

Eduard: Добрый день. Есть форма с размещенными на ней элементами CheckBox, подскажите, как сделать последовательную обработку каждого элемента начиная с первого и заканчивая последним? Каждый элемент ЧекБокс возвращает свое значение если он выбран, и есть функция которая возвращает значение если выбран тот либо иной элемент. Могут быть выбраны все элементы а может только 2-3. Пустые события не должны обрабатываться (только выбранные элементы) Также необходимо что-бы после подтверждения формы с элементами данные события сохранились. Функция для возврата события... Function T_Ch1(ch1) do case case ch1 == .T. bz := "1" bztext := "пар.1" otherwise bz := "" bztext := "" endcase ch1 := bz+" "+bztext MsgInfo(ch1) return

Andrey: Eduard а свою тему отдельную сложно создать ?

Andrey: SergKis пишет: т.е. ты хотел создать все 24 кнопки (6x4) в hide и потом делать кнопки нужного level в show ? если да, то создавай их между define window и endwindow (массив кнопок 24 элемента, добавив элемент принадлежность к level), по aeval делай hide и show button нужного level Однако, пример сам заработал после переделки... Всё оказывается просто... Пример выше....

Dima: Andrey пишет: Eduard а свою тему отдельную сложно создать ? А что не так ? Тема называется Примеры из Минигуи -ошибки, вопросы..... Может её подписать типа Примеры из Минигуи -ошибки, вопросы..... VS Andrey Ты когда что то спрашиваешь не в своей теме , кто то был против ? PS Андрей не надо устраивать ЦИРК !

Andrey: Dima пишет: Андрей не надо устраивать ЦИРК Ну извините, не хотел... Просто в одной теме вести разные вопросы я считаю сложно. Мы же здесь не останавливаясь спрашивали про 2 разных вопроса, я и Eduard. Ответы и осмысления не укладываются ...

Dima: Andrey пишет: Просто в одной теме вести разные вопросы я считаю сложно. У тебя тоже разные вопросы и кто знает тот отвечает и помогает. Можно еще замутить тему LetoDB сервер vs Андрей ну если надо очень Не парься по этому поводу , кто захочет и знает всегда поможет. С 8 марта наших девочек которых на форуме раз два и всё

SergKis: Andrey пишет:Однако, пример сам заработал после переделки... Всё оказывается просто... Пример выше.... Разницу не увидел, что первый, что второй примеры (тексты разные) работают одинаково, кнопки, цвета уровней меняются, сообщения второго уровня одни и теже Button 2x1, ... 2x2, ...2x3, а уровни 1...6, т.е сообщения должны быть Button 2x1, ... 2x2, ...2x3, Button 3x1, ... 3x2, ...3x3, ..., Button 6x1, ... 6x2, ...6x3. Если же я правильно понял смысл примеров ?!

Andrey: SergKis пишет: Разницу не увидел, что первый, что второй примеры (тексты разные) работают одинаково Я пробовал сделать примеры показывающие как можно делать меню на ОДНОЙ форме: 1) пример с динамически построением кнопок на форме с последующим удалением объектов (метод "Release") 2) пример с построением кнопок на форме сразу, с использованием Show/Hide для второго уровня кнопок. Все примеры работают нормально. Только при переносе в свой проект 1-вариант не работает. SergKis пишет: На мой взгляд основная ошибка - динамическое создание\удаление кнопок второго уровня в oninit. Создавай столько контролов (между define window и end window) сколько надо для работы окна сразу (координаты не важны их можно устанавливать перед Visible .T.). А динамическое создание\удаление контролов даже gfilatov говорил делать осторожно. Я этим не пользуюсь совсем. Вот это я хотел услышать ! Уже года три работаю с МиниГуи, а с этим и не разобрался (не услышал)... Спасибо БОЛЬШОЕ !

Andrey: Предыдущие примеры 1FormDemo.prg и 2FormDemo.prg были простые. Сделал еще один пример 3FormDemo.prg На кнопки вешаю кодо-блок нескольких функций, типа: aButton[1,7] := {|| Domethod( cForm, "BUTTON_EXIT" , "Hide" ), ; lRet := MsgYesNo( "Do you want to start another menu: 10 ?" ), ; IIF( lRet, MsgInfo("Starting the menu 10"), MsgInfo("Starting the menu 1") ),; IIF( lRet, MenuTask(10, aColor, aButton2), MenuTask(1, aColor, aButton2) ),; MsgInfo("Skill menu!") , ; Domethod( cForm, "BUTTON_EXIT" , "Show" ) } Не отрабатывает функция MenuTask(). Не получает управления эта функция. Что не так делаю ? Примеры тут - https://cloud.mail.ru/public/6e47c4e671d1/Menu_buttons_Second_Level.7z

Andrey: Всем привет. Использую объект LISTBOX, прогу давно написал. Файлов у юзера много стало и программа начала подвисать. Для показа списка файлов у юзера на форме использую такую функцию: FUNCTION GetReportFiles(cPath, cMaska) LOCAL aList := {}, nI, cFile // Получаем список файлов в папке отчётов с маской aList := Directory( cPath + cMaska ) FOR nI := Len( aList ) TO 1 STEP - 1 cFile := aList[ nI, 1 ] // Добавляем элемент из массива Form_Report.List_1.AddItem( cFile ) // Присваиваем номер по порядку Form_Report.List_1.Value := nI NEXT // Возвращаемся к началу списка Form_Report.List_1.Value := 1 RETURN Nil Теперь когда много файлов при показе тормоза начинаются... и подвисание программы. Как убрать этот эффект ?

Dima: Andrey пишет: Теперь когда много файлов при показе тормоза начинаются... На сколько много файлов ? Если тормоз только из за FOR то попробуй FOR EACH

Dima: Andrey пишет: aList := Directory( cPath + cMaska ) Вместо этого можно в цикле пробнуть FileSeek() + Form_Report.List_1.AddItem + Form_Report.List_1.Value

Haz: Файлов у юзера много стало Дима правильно спросил - много это сколько ? от тормозов при сканировании папки с числом файлов более 1000 скорее всего не избавиться программно. Лучше спросить клиента зачем ему столько отчетов или предложить организовать вложенные папки по видам отчетов Возможно поможет ... ================================ Долго открывается директория, в которой большое количество файлов из-за того, что NTFS обновляет метку последнего доступа к файлам. Когда в директории много файлов то метку надо обновить на каждом, а это может занять много времени. Чтобы функцию отключить надо в реестре по адресу HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem создать ключ NtfsDisableLastAccessUpdate типа DWORD и установить значение в «1». После перезагрузки данная проблема исчезнет.

Andrey: Haz пишет: много это сколько ? 1186 файлов... Я сам офигел. Haz пишет: предложить организовать вложенные папки по видам отчетов Да это лучшее решение. Буду делать его. Когда программу делал, то лет 7 назад об этом не думал. Спасибо за идею ! Как сделать перемещение/показ списка по файлам и папкам в одной функции GetReportFiles(cPath, cMaska) ? Если нужно показывать папки Отчет-2010, Отчет-2011,.... и файлы по маске *.txt

Dima: Andrey пишет: Как сделать перемещение/показ списка по файлам и папкам в одной функции GetReportFiles(cPath, cMaska) ? cPath есть , вот и отталкивайся от него.

SergKis: Andrey пишет: Как сделать перемещение/показ списка по файлам и папкам в одной функции GetReportFiles(cPath, cMaska) ? в одной функции не знаю, но в двух grid\browse можно: - читай в 1-й список папок - во второй (по on change в 1-м) читай список файлов по маске из выбранной папки, можно не по on change, а по кнопке или Enter\dublclick.

Andrey: SergKis пишет: в одной функции не знаю, но в двух grid\browse можно: Понял, буду делать... Хотел быстренько одну функцию изменить, а нет - не получилось. Другой вопрос по CHECKBOX. Есть у него режим ReadOnly как TEXTBOX или EDITBOX ? Что то по хелперу фраза непонятная... Available at control definition only R: Read-Only

SergKis: Andrey пишет:Есть у него режим ReadOnly в help см. Enabled - оно есть Andrey пишет: Хотел быстренько одну функцию изменить проще можно в grid читать папки (с обратной сортировкой), grid, на котором ты achoice делал, после выбора, показывай другой grid с отчетами. компоненты все у тебя под рукой ...

SergKis: Andrey пишет:Хотел быстренько одну функцию изменить можно совсем простенько: GetFolder(...) см. \Samples\Basic\GetFolder GetFile(...) см. \Samples\Basic\GetFile

Andrey: SergKis пишет: можно совсем простенько: GetFolder(...) см. \Samples\Basic\GetFolder GetFile(...) см. \Samples\Basic\GetFile Забыл про них...

Andrey: Подскажите как удалить и заново перечитать массив в COMBOBOXEX ? @ 110,10 COMBOBOXEX ComboEx_3 ; WIDTH 150 ; ITEMS {"one ","two ","tree "} ; .......

Haz: Andrey пишет: массив в COMBOBOXEX C:\MiniGUI\SAMPLES\BASIC\COMBO_5

Andrey: Haz пишет: C:\MiniGUI\SAMPLES\BASIC\COMBO_5 Что то не совсем понятно. Нужно удалить каждый элемент массива, а потом добавить по каждому элементу. Правильно ли это ? А то в ГРИДе делалось немного по другому: // перечитаем Grid_1251 aList := LoadDbf1251() // новый массив Form_6.Grid_1251.DeleteAllItems IF Len(aList) > 0 Form_6.Grid_1251.DisableUpdate FOR nI := 1 to LEN(aList) Form_6.Grid_1251.AddItem( aList[nI] ) NEXT Form_6.Grid_1251.EnableUpdate ENDIF

Haz: Andrey пишет: А то в ГРИДе делалось немного по другому: а если справку из поставки miniGui почитать по Combo ... METHODS: · Show Shows a ComboBox control · Hide Hides a ComboBox control · AddItem( cItemText ) Add a new item to a ComboBox control · DeleteItem( nItemIndex ) Deletes an item from a ComboBox control · DeleteAllItems Deletes all items from a ComboBox control · SetFocus Gives the focus to a ComboBox control · Release Releases a ComboBox control from memory · EnableUpdate Update enables for ComboBox control · DisableUpdate Update disables for ComboBox control · SaveAs Save a ComboBox control as BitMap file.

Andrey: Haz пишет: а если справку из поставки miniGui почитать по Combo ... Спасибо ! Просто не нашёл пример и потерялся...

Andrey: Всем привет ! Вывожу картинку во всю форму по длине. На неё назначена обработка при нажатии: @ 5,5 IMAGE Image_1 ...... PICTURE ....... ACTION AboutInfo() OnMouseHover RC_CURSOR( "MINIGUI_FINGER" ) А как мне сделать обработку нажатия на картинки допустим на 3 части ? Вот чтобы так было: Разрезать картинку на 3 части нельзя.

Haz: координаты своей картинки знаешь @ 5,5 IMAGE Image_1 ...... как поделил на 3 части знаешь Вот и обрабатывай в зависимости от положения курсора, координаты курсора из OnMouseMove возьмешь пример с координатами есть в минигуи

Andrey: Haz пишет: пример с координатами есть в минигуи Где ? Если не сложно то дай путь к нему.

Haz: MiniGUI\SAMPLES\BASIC\Mouse_Coords

Andrey: SergKis пишет: 1. вынеси connect до окна (если его нет, то сообщение и конец) или в oninit (тогда сначала контрлы hide или disable, если connect есть переводи в рабочее соостояние, иначе сообщение ...). 2. в цикл загрузки ставь do events 4. не мучай grid перезагрузкой Item-ов, используй browse (skipbuffer устанавливай в кол-во строк в browse (default 10)) 5. получить длину записи области RecSize()+1, или посчитать длины из dbStruct() и +1. 1) А зачем ? Проверил сервер, а потом сразу опять, без повторного запуска программы проверяем. Это в качестве же примера, а на рабочую систему, согласен - нужно делать по другому. 2) Забыл про это ! Работает ! Спасибо ! 4) Согласен ! А простой browse -какой можно поставить ? Просто чтобы показать, что база есть. 5) Не совсем понял, а на примере моём можно пояснить ?

Andrey: Есть шаблон для ввода вида 127.0.0.1:2812 ? Или достаточно обычного поставить типа: @R 999.999.999.999:999999

SergKis: Andrey пишет:1) А зачем ? ... работа с letodb у тебя не закончится на этом примере ? если да, то вопрос снят я connect делаю на MDI MAIN, тебе на MAIN и если его нет, то все child окна, связанные с letodb не имеют смысла

Andrey: Как можно вывести список файлов на форму и сделать возможный выбор любого файла ? Т.е. типа как в explorer. Есть ли готовые примеры или что можно посмотреть ?

Haz: Andrey пишет: Есть ли готовые примеры или что можно посмотреть ? GetFile из минигуи или самому формировать массив и бровс по нему

SergKis: Andrey пишет:или что можно посмотреть BASIC\DirSelect\demo.prg

Andrey: SergKis пишет: BASIC\DirSelect\demo.prg Не совсем то... Это обычный GRID. Понятно что так сделать можно. А как сделать показ несколько столбцов ? и расстояние между ними как высчитывать ? По идее можно сканировать папку рассчитать кол-во элементов, добавить иконки и потом строить ГРИД. А как тогда высчитывать имя файла по ячейкам ? и выбор по колонкам между файлами как запретить ? Всё больше вопросов возникает... А готовых других примеров под такие задачи больше нет ?

SergKis: Andrey пишет:По идее можно сканировать папку рассчитать кол-во элементов, добавить иконки и потом строить ГРИД ты же сам все знаешь. Сам не сделаешь, кто сделает ? (c) Andrey пишет:Всё больше вопросов возникает... по мне, так ты все заданные вопросы уже решал в разных своих примерах. не нравится grid, browse, buttonex попробуй tsbrowse ...

Andrey: SergKis пишет: по мне, так ты все заданные вопросы уже решал в разных своих примерах. не нравится grid, browse, buttonex попробуй tsbrowse ... Согласен, решал. Но вот свойство человеческой психологии - сначала спросить... А вдруг кто-то лучше подскажет. Дима иногда пишет: пока курил, придумал... А я вот не курю и сразу спрашиваю.

SergKis: Andrey пишет:А я вот не курю и сразу спрашиваю. Что ж "батенька" будем лечить ..., в смысле посылать ... ну это ... покурить конфетку скушать ...

gfilatov2002: Andrey пишет: как сделать показ несколько столбцов ? Для этого можно использовать ListBox с классом MULTICOLUMN (см. пример в папке samples\Basic\Listbox_4)

Andrey: Можно ли вызвать Notepad в режиме просмотра ? Т.е. запретить юзеру править текст ? Хотя этот вопрос сложно отнести к МиниГуи...

PSP: Andrey пишет: Можно ли вызвать Notepad в режиме просмотра ? Т.е. запретить юзеру править текст ? Notepad, думаю, нельзя. А вот открыть текстовый файл в браузере можно. И юзер ничего не сможет исправить

petr707: Открыть не оригинальный файл, а его временную копию, которую удалить после просмотра. Править можно, на исходнике не отразится.

Andrey: PSP пишет: А вот открыть текстовый файл в браузере можно. И юзер ничего не сможет исправить А как ?

SergKis: Andrey [pre2] <html> <body> <pre> Теги отобразят текст с точным количеством, проставленных в исходном коде, пробелов и переносов строк. К тому же, текст будет моноширинным. Моноширинный - все буквы одинаковой ширины (машинописный шрифт). </pre> </body> </html>[/pre2]

Andrey: SergKis пишет: текст будет моноширинным То что нужно !

Andrey: Только для 866 кодировки нужно ставить так: <html> <head><meta charset="cp866"></head> <body> <pre>

SergKis: Andrey пишет:Только для 866 кодировки нужно ставить так где нибудь с этим могут быть проблемы. лучше: <html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Create dokuments</title> ... и кодировать вывод в utf8. Ты же не любишь модули на Run, почему не сделал для вывода текста окно MiniGui с EditBox или RichEditBox с disable := .T. ?

Andrey: SergKis пишет: Ты же не любишь модули на Run, почему не сделал для вывода текста окно MiniGui с EditBox или RichEditBox с disable := .T. ? Да хотел обойтись Notepad'ом, а потом посыпались предложения... Вот пока выбираю.

SergKis: Andrey пишет: Вот пока выбираю. Если планируешь, получать таблички и т.д. в html, а не только тэг pre, то глянь пример SAMPLES\Advanced\ActiveX

Andrey: Всем привет ! Возвращаюсь опять к ранее заданному вопросу: В терминалке на хХарборе использую базы в 866 кодировке. Символы CHR(250)-CHR(253) пишутся в текстовые поля базы нормально ! Пытаюсь то же самое сделать под МиниГуи не выходит, коды другие: Как записать в поле базы символы CHR(250) или CHR(251) или CHR(253) ? Так и не смог сделать.

SergKis: Andrey пишет:Так и не смог сделать. а кодовая страница установлена 866 ? работаю с LV866 - chr(251), chr(254) точно нормальные, другие не пользую может у тебя 1251 - смотри в фонте, что на этих местах а в базу и utf8 прекрасно пишутся.

Andrey: SergKis пишет: а кодовая страница установлена 866 ? Экран - 1251, а база открыта 866 !

SergKis: т.е. у тебя раскладка 1251, dbf 866. ansitooem() может надо применить при записи

Andrey: Делаю так: USE ( cPath+cDatabase ) ALIAS ( cAlias ) CODEPAGE "RU866" SHARED NEW // сетевой захват записи IF RecLock( LOCK_RETRY ) cVal := CHR(250)+CHR(251)+CHR(252)+CHR(253) cVal := HB_ANSITOOEM(cVal) FIELDPUT(2,cVal) DBUnlock() DBCOMMIT() ENDIF В поле записывается: "клмн" Если убрать HB_ANSITOOEM(cVal), то записывается: "ъыьэ"

SergKis: Andrey пишет:Если убрать а если поставить страницу 866 FieldPut(..., chr(251)) поставить страницу 1251

SergKis: PS. в твоем варианте на месте 250, 251,... стоят буквы, получемые по ansitooem, найди в 1251 нужные (если они есть) и попробуй сделать от них

Softlog86: Вопросик : в контроле PROGRESSBAR ограничение максимального значения в 65535 .... Нафига вообще было ограничивать ??? Я часто сканирую базы с большим числом записей и крайне неудобно использовать алгоритмы пересчета чтоб войти в эти самые 65 тыщ ...... Кто как решает таое неудобство ?

petr707: FIELDPUT(2,cVal) DBUnlock() DBCOMMIT() Вроде лучше так.. FIELDPUT(2,cVal) DBCOMMIT() DBUnlock()

Andrey: SergKis пишет: в твоем варианте на месте 250, 251,... стоят буквы, получемые по ansitooem, найди в 1251 нужные (если они есть) и попробуй сделать от них Вот есть шестнадцатеричные коды Unicode (1251): ° - 00B0, ∙ - 2219, · - 00B7, √ - 221A, № - 2116, ¤ - 00A4 Как их вывести ? Может вопрос и тупой, но что-то я никак не соображу...

SergKis: Andrey будет работать: [pre2] на входе ставь страницу 866 gC866() // инициализация ставь страницу 1251 и работай, где надо вызывай gC866(251)+gc866(254) ... Func gC866( nChar866 ) Local cChar866 := '' STATIC aChar866 IF aChar866 == NIL aChar866 := array(255) aEval(aChar866, {|x,n| aChar866[ n ] := chr(n) }) ENDIF IF hb_IsNumeric(nChar866) .and. nChar866 > 0 .and. nChar866 < 256 cChar866 := aChar866[ nChar866 ] ENDIF Return cChar866 [/pre2]

Andrey: Andrey пишет: будет работать: Не а, не работает - "ъыьэ" ....

Andrey: Для чего это ОЧЕНЬ нужно: 1) чтобы при сортировке записи были в конце списка 2) визуальное отображение по SET RELATION Это терминалка хХарбор: Это на МиниГуи:

SergKis: Andrey пишет:Не а, не работает сделай hb_memowrit('_0.txt', gc866(251)+gc866(254)) - будут в файле символы 866 вмешивается перекодировка при записи в dbf убери указание страницы у dbf - тоже должно быть ok с этими символами

Andrey: SergKis пишет: вмешивается перекодировка при записи в dbf убери указание страницы у dbf - тоже должно быть ok с этими символами Блин, так просто....

Andrey: Ура, заработало !!! SergKis СПАСИБО БОЛЬШОЕ !!!

Andrey: Сделал небольшую программу, ввод пароля. Работает нормально. Беру переношу в свой большой проект, компиляция НЕ ИДЕТ вообще. Выдает такую ошибку: Harbour 3.2.0dev (r1503131756) Copyright (c) 1999-2015, http://harbour-project.org/ Source\form_LoginPassw.prg(82) Error E0030 Syntax error "syntax error at '@'" Source\form_LoginPassw.prg(90) Error E0030 Syntax error "syntax error at '@'" 2 errors No code generated. Что за фигня такая ? Стоки 82 и 90: @ 245,155 BUTTONEX BUTTON_Ok WIDTH 90 HEIGHT 32 ; CAPTION "Ввод" ; FONTCOLOR aButtColor ; BACKCOLOR LGREEN ; SIZE nFBSize BOLD ; NOHOTLIGHT NOXPSTYLE HANDCURSOR ; ACTION {|| nRet := 0, cUserName := cLogin, cPassword := cPswd, ; ThisWindow.Release } @ 245,255 BUTTONEX BUTTON_Cancel WIDTH 90 HEIGHT 32 ; CAPTION "Отмена" ; FONTCOLOR aButtColor ; BACKCOLOR MAROON ; SIZE nFBSize BOLD ; NOHOTLIGHT NOXPSTYLE HANDCURSOR ; ACTION {|| nRet := -1, ThisWindow.Release } И в обычные скобки ставил () и в одну строчку делал: ACTION { || nRet := 0, cUserName := cLogin, cPassword := cPswd, domethod("Form_LoginPass", "Release") } и модуль в проекте сдвигал, ни чего не помогает. А в маленьком проекте (6 файлов) всё нормально собирается и работает ! Помогите понять в чем дело ....

Andrey: После кучи перестановок и шаманства выяснил, блин как фокусник - легким движением на клавиатуре убираем HANDCURSOR и всё начинается компилироваться... Вспомнил, такая же беда второй раз происходит, и в другом модуле тоже пришлось убирать HANDCURSOR.... Вывод .ppo который компилируется: _DefineOwnerButton ( "BUTTON_Ok",, 155, 245, "Ввод", { || nRet := 0, cUserName := cLogin, cPassword := cPswd, domethod("Form_LoginPass", "Release") }, 90, 32,,,,, .F., .F.,, .F., .F., .F.,,, nFBSize, .T., .F., .F., .F., .F., .F., .F., { 0 , 128 , 0 }, aButtColor, .T., .T., .F. ) _DefineOwnerButton ( "BUTTON_Cancel",, 255, 245, "Отмена", { || nRet := -1, domethod("Form_LoginPass", "Release") }, 90, 32,,,,, .F., .F.,, .F., .F., .F.,,, nFBSize, .T., .F., .F., .F., .F., .F., .F., { 128 , 0 , 0 }, aButtColor, .T., .T., .F. ) Вывод .ppo который НЕ компилируется: @ 245,155 BUTTONEX BUTTON_Ok WIDTH 90 HEIGHT 32 CAPTION "Ввод" FONTCOLOR aButtColor BACKCOLOR { 0 , 128 , 0 } SIZE nFBSize BOLD NOHOTLIGHT NOXPSTYLE HANDCURSOR ACTION { || nRet := 0, cUserName := cLogin, cPassword := cPswd, DoMethod ( _HMG_SYSDATA[254] , "Release" ) } @ 245,255 BUTTONEX BUTTON_Cancel WIDTH 90 HEIGHT 32 CAPTION "Отмена" FONTCOLOR aButtColor BACKCOLOR { 128 , 0 , 0 } SIZE nFBSize BOLD NOHOTLIGHT NOXPSTYLE HANDCURSOR ACTION { || nRet := -1, DoMethod ( _HMG_SYSDATA[254] , "Release" ) } Ну что за приколы ?

SergKis: Andrey пишет:убираем HANDCURSOR и всё начинается компилироваться... _HMG_aControlInputMask [k] := handcursor // см. h_button.prg line 634 попробуй такой вариант: @ 245,155 BUTTONEX BUTTON_Ok ... без HANDCURSOR добавь nInd := GetControlIndex('BUTTON_Ok', ThisWindow.Name) _HMG_aControlInputMask [ nIndex ] := .T.

Andrey: Работает !!! Спасибо !!! Только вот так: _HMG_aControlInputMask [ nInd ] := .T.

SergKis: Andrey пишет:Вывод .ppo который НЕ компилируется: @ 245,155 BUTTONEX BUTTON_Ok WIDTH 90 HEIGHT 32 CAPTION "Ввод" FONTCOLOR aButtColor BACKCOLOR { 0 , 128 , 0 } SIZE nFBSize BOLD NOHOTLIGHT NOXPSTYLE HANDCURSOR ACTION { || nRet := 0, cUserName := cLogin, cPassword := cPswd, DoMethod ( _HMG_SYSDATA[254] , "Release" ) } MiniGui.chm [pre2] @ <nRow>,<nCol> BUTTONEX <ButtonName> [ OF | PARENT <ParentWindowName> ] [ CAPTION <cCaption>] [ WIDTH <nWidth> HEIGHT <nHeight> ] [ PICTURE <cBitmapName>] | [ ICON <cIconName>] [ ACTION | ONCLICK | ON CLICK <ActionProcedureName> | <bBlock> [ FONT <cFontName> ] [ SIZE <nFontSize> ] [ BOLD ] [ ITALIC ] [ UNDERLINE ] [ STRIKEOUT ] [ FONTCOLOR <aFontcolorRGBArray> ] [ BACKCOLOR <aBackcolorRGBArray> ] [ VERTICAL ] [ LEFTTEXT ] [ UPPERTEXT ] [ ADJUST ] [ TOOLTIP <cTooltip>] [ NOHOTLIGHT ] [ FLAT ] [ NOTRANSPARENT ] [ NOXPSTYLE ] [ ON GOTFOCUS | ON MOUSEHOVER <OnGotfocusProcedure | bBlock> ] [ ON LOSTFOCUS | ON MOUSELEAVE <OnLostProcedure | bBlock> ] [ HANDCURSOR ] [ NOTABSTOP ] [ HELPID <nHelpId>] [ INVISIBLE ] [ DEFAULT [/pre2] может тут собака порылась ?

Andrey: SergKis пишет: может тут собака порылась ? Попробую. Но больше всего убило, что маленький пример (6 файлов) нормально собирается, а большой проект (58 файлов) - НЕТ !

Andrey: Сделал НОВОЕ меню ввода пароля. И опять проблема... После закрытия окна ввода пароля главная форма прячется на задний план всех программ, переключаешься на неё, а задача не откликается (кнопочки не реагируют, крестик закрытия не работает) т.е. висит задача, приходиться снимать через Диспетчер задач. В чем проблема и как её решить ?

Andrey: Если первый раз неправильно введу пароль, то опять возвращаюсь в это окно ввода и тогда программа не вешается... Что-то связано с инициализацией окна ? Как можно вернуть фокус ввода на главное окно задачи ? SetForegroundWindow( M->hIdWindows ) - так делал, но это не помогает....

Haz: Andrey пишет: Как можно вернуть фокус ввода на главное окно задачи так ShowWindow(hWnd, 3) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 BringWindowToTop(hWnd) Но думаю проблема не в фокусе. Скорее всего чего то намудрил при проверке пароля, и обработчик ошибки это не ловит

Andrey: Haz пишет: Скорее всего чего то намудрил при проверке пароля, До этого использовал окно пароля из \MiniGUI\SAMPLES\Advanced\GetPassword прекрасно всё работало. Заменил GetPassword() на свою форму: DEFINE WINDOW Form_LoginPass AT 0,0 WIDTH 370 HEIGHT 320 + IIF( IsXPThemeActive(), 10, 0 ) ; TITLE cTitle ; ICON cIco ; MODAL ; BACKCOLOR aBackColor ; NOSIZE ; ON INIT { || Form_LoginPass.Text_Login.SetFocus } ну и там 2 GETBOX и 2 кнопки. И перестало работать с первого раза - висит главное окно задачи ! Если первый раз неправильно ввести пароль, но происходит повторное обращение к окну - функция заново отрабатывает. и ТОЛЬКО после этого главное окно задачи работает нормально ! Шайтан - однако... После проверки пароля я даже пробовал переключать на картинку на форме, там висит функция обработки на ней... CheckPassword() // проверка пароля BringWindowToTop( M->hIdWindows ) Form_Main.Image_1.Setfocus Безрезультатно... Висит главная форма и всё тут.... Полная

Andrey: Блин, ну что за невезуха... Полдня убил на это... Поменял окно на CHILD и всё заработало.... Безо всяких переключений...

Haz: Andrey пишет: Поменял окно на CHILD и всё заработало У меня подобная вещь работает вне зависимости CHILD | MODAL ... похоже ты нашел "заплатку" на проблему, может аукнуться позже

Andrey: Haz пишет: У меня подобная вещь работает вне зависимости CHILD | MODAL ... Это как ?

Haz: Andrey пишет: Это как Да все просто , при старте программы главная форма прячется и управление получает окно запроса пароля ( не важно CHILD или MODAL работает с любым вариантом ). При вводе правильного пароля окно запроса закрывается и показывается главная форма. При неправильном пароле предлагается угадать еще разик, при отказе от ввода пароля программа завершается. Ничего не виснет .

Andrey: Haz пишет: при старте программы главная форма прячется и управление получает окно запроса пароля Понял. Спасибо.

Andrey: Вот опять непонятка: FOR nI := 1 TO 8 nRow := aRow[nI] + nHButt + 5 nCol := aCol[nI] + 10 //nWButt @ nRow, nCol CHECKBOX &cObjLog ; CAPTION 'Включить ХХХХ' ; VALUE aLogic[nI] ; WIDTH nWButt-20 HEIGHT 20 ; FONTCOLOR RED ; SIZE 11 TRANSPARENT ; ON CHANGE { || MsgDebug(nI), aLogic[nI] := GetProperty("Form_PC", cObjLog, "Value" ) } // строка 230 NEXT При редактировании выдаёт ошибку: Error BASE/1133 Переполнение массива: доступ к массиву Called from (b)MYPAGE_MAINMENU(230) Значение nI == 9 Как исправить ? Т.е. я понимаю что в цикле присваивать VALUE aLogic[nI] не получается ?

Haz: Andrey пишет: ON CHANGE { || MsgDebug(nI), aLogic[nI] := GetProperty("Form_PC", cObjLog, "Value" ) } было в твоих вопросах , с другим контролом правда ...но было. Andrey пишет: Как исправить ON CHANGE &("{ || MsgDebug(" + ntoc(nI) +"), aLogic[" + ntoc(nI) + "] := GetProperty('Form_PC', cObjLog, 'Value' ) }" )

Andrey: Haz пишет: было в твоих вопросах , с другим контролом правда ...но было. Да, точно, было. Памяти точно уже нет. Спасибо за подсказку !

Andrey: Haz пишет: ON CHANGE &("{ || MsgDebug(" + ntoc(nI) +"), aLogic[" + ntoc(nI) + "] := GetProperty('Form_PC', cObjLog, 'Value' ) }" ) Не отрабатывает вообще ON CHANGE ! Сделал так: cObjLog := "Check_" + HB_NtoS(nI) bBlock := "{ || MsgDebug(" + ntoc(nI) +"), aStatLogic[" + ntoc(nI) + "] := GetProperty('Form_PC', '" + cObjLog + "', 'Value' ) }" @ nRow, nCol CHECKBOX &cObjLog ; CAPTION 'Запуск внешней программы' ; VALUE aStatLogic[nI] ; WIDTH nWButt-20 HEIGHT 20 ; FONTCOLOR RED ; SIZE 11 TRANSPARENT ; ON CHANGE &( bBlock ) Как еще можно сделать чтобы заработало ?

SergKis: Andrey попробуй : FOR nI := 1 TO 8 nRow := aRow[nI] + nHButt + 5 nCol := aCol[nI] + 10 //nWButt @ nRow, nCol CHECKBOX &cObjLog ; CAPTION 'Включить ХХХХ' ; VALUE aLogic[nI] ; WIDTH nWButt-20 HEIGHT 20 ; FONTCOLOR RED ; SIZE 11 TRANSPARENT ; ON CHANGE ( MsgDebug(_SetGetUserData(_HMG_THISCONTROLNAME, _HMG_THISFORMNAME), This.Value) ) // строка 230 _SetGetUserData(cObjLog, _HMG_THISFORMNAME, nI) // запомнило в Cargo NEXT

SergKis: Andrey а для запомининия в aLogic:[pre2] ON CHANGE {|nNr| nNr := _SetGetUserData(_HMG_THISCONTROLNAME, _HMG_THISFORMNAME), ; aLogic[ nNr ] := This.Value, ; MsgDebug(nNr, aLogic[ nNr]) } [/pre2]

Andrey: SergKis пишет: а для запомининия в aLogic: ON CHANGE {|nNr| nNr := _SetGetUserData(_HMG_THISCONTROLNAME, _HMG_THISFORMNAME), ; aLogic[ nNr ] := This.Value, ; MsgDebug(nNr, aLogic[ nNr]) } Не работает, выдаёт: Error BASE/1069 Неверный аргумент: доступ к массиву Called from (b)MYPAGE_MAINMENU(230) Called from _DOCONTROLEVENTPROCEDURE(1654) Called from EVENTS(1523)

Dima: Andrey пишет: При редактировании выдаёт ошибку: Error BASE/1133 Переполнение массива: доступ к массиву Called from (b)MYPAGE_MAINMENU(230) Значение nI == 9 Кхм а откуда там 9 получилось если заполнялось до 8 ?

Andrey: Dima пишет: Кхм а откуда там 9 получилось если заполнялось до 8 ? А я откуда знаю... Что получил, то и спросил...

Dima: Andrey пишет: А я откуда знаю... Что получил, то и спросил... FOR nI := 1 TO 8 NEXT ? nI // 9 однако

Andrey: Andrey пишет: Не работает, выдаёт: Error BASE/1069 Неверный аргумент: доступ к массиву Понял, получилось. Вот так работает: FOR nI := 1 TO 8 nRow := aRow[nI] + nHButt + 5 nCol := aCol[nI] + 10 //nWButt @ nRow, nCol CHECKBOX &cObjLog ; CAPTION 'Включить ХХХХ' ; VALUE aLogic[nI] ; WIDTH nWButt-20 HEIGHT 20 ; FONTCOLOR RED ; SIZE 11 TRANSPARENT ; ON CHANGE {|nNr| nNr := _SetGetUserData(_HMG_THISCONTROLNAME, _HMG_THISFORMNAME), ; aLogic[ nNr ] := This.Value, ; MsgDebug(nNr, aLogic[ nNr]) } _SetGetUserData(cObjLog, _HMG_THISFORMNAME, nI) // запомнило в Cargo NEXT Спасибо БОЛЬШОЕ SergKis ! Пример бы такой нужен в библиотеке Григорию !!! А то в цикле не всегда получается вывести/построить объекты. Целая наука. _SetGetUserData(cObjLog, _HMG_THISFORMNAME, nI) // запомнило в Cargo - нигде не встречал, а если и видел, то и не понял для чего... Посмотрел специально, есть только в одном исходнике: h_controlmisc.prg SergKis - колдун он однако....

Dima: Andrey пишет: FOR nI := 1 TO 8 nRow := aRow[nI] + nHButt + 5 nCol := aCol[nI] + 10 //nWButt Да оно бы и так вот работало бы FOR nI := 1 TO 8 XnI:=nI nRow := aRow[XnI] + nHButt + 5 nCol := aCol[XnI] + 10 и так далее

Andrey: Dima пишет: Да оно бы и так вот работало бы Неа, не заработало бы... Я долго мучился... Проверь сам, если не веришь...

SergKis: Andrey Трать немного времени на мат. часть. Примеры с cargo есть: BASIC\Cargo\*.prg Есть UTILS\FuncList\*.*

SergKis: Andrey пишет: нигде не встречал, а если и видел, то и не понял для чего... для работы с cargo контрола достаточно: SetProperty(cFormName, cControlName, 'Cargo', xValue) GetProperty(cFormName, cControlName, 'Cargo') а _SetGetUserData(...) это обертка, в minigui их много. Примеры использования см. в i_pseudofunc.ch

Haz: Andrey пишет: А то в цикле не всегда получается вывести/построить объекты. Целая наука Нет там никакой науки, это еще с 90х годов аксиомы из Clipper 1) цикл FOR работает так - сначала увеличивает переменную потом проверяет на достижение граничного значения. Отсюда и 9 . И так было всегда 2) кодовый блок в который передается переменная при исполнении использует значение переменной на момент этого исполнения ( в твоем примере 9 ) и так тоже было всегда. Объекты тут не при чем - в цикле формируется кодовый блок использующий переменную цикла , в любом подобном коде будет использоваться значение переменной на момент исполнения. Выход - передавать не переменную а ее значение в блок ( это как вариант с макроподстановкой ) или как пишет SergKis запоминать это значение , а потом его использовать. Cargo есть почти у всех объектов ( кстати у того-же Clipper тоже есть в его объектах тоже с 90х выучить времени полно было ) и значение переменной цикла можно сохранить там и использовать в блоке

Andrey: Haz пишет: у того-же Clipper тоже есть в его объектах тоже с 90х выучить времени полно было Согласен, во время не выучил... Haz пишет: и значение переменной цикла можно сохранить там и использовать в блоке Покажи пожалуйста как ?

Dima: Andrey Ну так на странице 10 все ж есть Andrey пишет: Haz пишет: цитата: было в твоих вопросах , с другим контролом правда ...но было. Да, точно, было. Памяти точно уже нет. Спасибо за подсказку ! ЗЫ Тут подход нужен как к выражениям фильтра для ADS. Например вот такое выражение ADS поймет 'KOD_KL==3' А если вот так , то нет NKOD:=3 'KOD_KL==NKOD' Посему нужно передавать значение 'KOD_KL=='+Ntoc(NKOD) или так 'KOD_KL=='+HB_NtoS(NKOD)

SergKis: Haz SergKis пишет: цитата: А то в цикле не всегда получается вывести/построить объекты. Целая наука Это Andrey пишет Отправлено: Вчера 15:00. ...

Andrey: Haz пишет: цитата: было в твоих вопросах , с другим контролом правда ...но было. Контрол был другой. Я его нашёл. Вот он: bBlock := "{ || MEMOLINE("+ALIAS()+"->"+cField+","+HB_NTOS(LEN(cStr))+",1) }" oBrw:aColumns[nJ]:bData := &( bBlock ) oBrw:aColumns[nJ]:Cargo := cField oBrw:aColumns[nJ]:lEdit := .T. oBrw:aColumns[nJ]:bPrevEdit := { || FORMA_MEMO( oBrw:aColumns[oBrw:nCell]:cHeading, oBrw:aColumns[oBrw:nCell]:Cargo ), FALSE } Но он в данном случае к вопросу не подходит ! Из - за этого и пишу как сделать для: "и значение переменной цикла можно сохранить там и использовать в блоке" ?

Haz: SergKis пишет: Это Andrey пишет Отправлено: Вчера 15:00. ... Извиняюсь .... не обратил внимания кого автором цитаты показало. Не специально чес слово

SergKis: Andrey пишет:Но он в данном случае к вопросу не подходит ! Все подходит и делается примерно также. У тебя bBlock := "{ || MEMOLINE("+ALIAS()+"->"+cField+","+HB_NTOS(LEN(cStr))+",1) }" теперь то, о чем вопрос ( как сделать для:...): FOR i := 1 TO k bBlock := &( "{|nNr| nNr := "+hb_ntos(i)+", aLogic[nNr] := This.Value, MsgDebug(nNr, aLogic[nNr] }" ) ... // или через Cargo из примера NEXT блока кода отличается, только тем, что завели переменную для него (могли исполтзовать и local из prg), но это давние дела ...

SergKis: PS к MsgDebug скобку пропустил в конце

SergKis: SergKis пишет:могли исполтзовать и local из prg уточню в таком блоке (не по макро): Local nNr {|| nNr := This.Value } в макро можно private, public

Haz: Andrey пишет: Как еще можно сделать чтобы заработало ? вроде можно и так ON CHANGE {|| aLogic[cton(Substr(This.Name,7))] := This.Value }

Dima: Haz пишет: Не специально чес слово Это результат не правильной отметки текста и затем цитирования. Проверь Сам не раз на это попадал ))

Andrey: Спасибо БОЛЬШОЕ всем за разъяснения ! Буду использовать ! Но не обижайтесь, если еще раз спрошу об этом в другом месте...

Andrey: Всем привет ! Можно ли создать объект TAB с 3-мя вкладками, а потом одну вкладку скрыть ? Есть ли такой метод HIDE для Tab ?

Haz: Andrey пишет: вкладку скрыть http://clipper.borda.ru/?1-1-0-00000365-000-0-0-1357386336

Andrey: Haz Спасибо ! Пропустил я этот пример...

Andrey: Всем привет ! Подскажите пожалуйста, как узнать размеры чужого окна зная его ХЕНДЛ ?

Haz: Andrey пишет: как узнать размеры чужого окна зная его ХЕНДЛ Посмотри в своем же примере ( только раз хендл звестен то GetFormHandle соответственно не надо ) IniSavePosWinCfg.prg GetWindowRect( GetFormHandle( FormName ), actpos )

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

Andrey: Читаем: XtoC() Converts values of data type C, D, L, M, N to a string. А прога на МиниГуи вываливается... Error BASE/1081 Argument error: + Called from TAKECUSTOMERDATA(76) Called from (b)MAIN(37) Called from _DOCONTROLEVENTPROCEDURE(1654) Called from EVENTS(1325) Called from INKEYGUI(0) Called from MY_MESSAGE(187) Called from TAKECUSTOMERDATA(78) Строка 76: cStaticMsg += cStr + VALTYPE(r) + ":" + XtoC( r ) + CRLF Как лечить ?

Dima: Почему решил что падает именно на Xtoc ? Что за переменная r и cStr ?

Andrey: r := GETDATA() if r != NIL cStr := "Received " + DTOC(DATE()) + " " + TIME() + " - " cStaticMsg += cStr + VALTYPE(r) + ":" + XtoC( r ) + CRLF Form_Main.Edit_Result.Value := cStaticMsg My_Message( VALTYPE(r) + ":" + XtoC( r ) ) endif Заменил XtoC() на hb_ValToExp() падать перестало ! Спасибо Дима, выручил !

Andrey: Смотрел пример Z:\MiniGUI\SAMPLES\BASIC\COMM не понял для чего. Пока Григорий пример не дал другой, так и не понял. Сейчас опять глянул, 2 таблички и всё. Смотрю тексты программ - вижу Set CommPath To 'C:\' Так как у меня Win8 и она блокирует запись на 'C:\' даже под админской учеткой (переспросит несколько раз зараза), то понял что за пример и почему не работал. Под WinXP пример работает. Чем заменить 'C:\' чтобы везде работало ? Не забываем про русские буквы в пути... И про то что хХарбор по другому может читать (допустим 866 кодировка, а в пути русские буквы)...

Andrey: Всем привет. Можно ли у окна MODAL ограничить изменение размеров до заданных ? Делаю так: DEFINE WINDOW Form_Card ; ............................. MODAL ; ON SIZE { || ResizeForm() } ; ON INIT MyInitForm() ; Работает отлично, но окно можно сделать крохотным. Мне надо ограничить допустим до: MINWIDTH 770 MINHEIGHT 490 ; Если вставляю эту строчку, то при 1-ом же изменение размера окна - ОКНО становиться в размер 770х490 и не меняется вообще. Что не так делаю ?

Haz: Andrey пишет: Что не так делаю вроде все так, скорее всего глюк минигуи. PS. раз уж есть ON SIZE то можно в нем отслеживать размер окна и если он меньше заданного минимально - принудительно выставлять минимум ( т.е. не пользоваь MINWIDTH и MINHEIGHT ) Примерно такие строки нужно добавить в ResizeForm() IF GetProperty("Form_Card", "WIDTH") < 770 SetProperty("Form_Card", "WIDTH", 770) END IF GetProperty("Form_Card", "HEIGHT") < 490 SetProperty("Form_Card", "HEIGHT", 490) END

Andrey: Haz Спасибо БОЛЬШОЕ ! Не раз выручаешь !

Andrey: Использую объект: LOCAL aBackcolor := {192, 185, 154} @ 20,30 CHECKLISTBOX ListBox_2 ; WIDTH 390 HEIGHT 290 ; ITEMS aItems ; VALUE {2} ; CHECKBOXITEM {} ; BACKCOLOR aBackcolor ; ON DBLCLICK cmlb_Check() ; MULTISELECT ; ITEMHEIGHT 19 А как изменить цвета для него ? А то получается этот объект весь белый ?

Dima: MDICHILD окно , как ему прицепить свой фон , наследуемый фон из MDI окна не устраивает. Нашли решение ON INIT { || SetWindowBackground( GetFormHandle(This.Name) , PaintBkGnd( GetFormHandle(This.Name), aRGB} ) )}

Dima: Andrey я еще не много "на....у" в твоем заповеднике На основной MDI форме живет картинка , после того как на нем полежало MDICHILD окно картинка пропадает. Как решить проблему ?

Andrey: Dima пишет: Как решить проблему ? Скорее всего эту картинку нужно перерисовать заново. Сделай после MDICHILD перерисовку картинки, типа: Окно_1.картинка_1.Enabled := .F. а потом сразу Окно_1.картинка_1.Enabled := .T. или если не поможет, то Окно_1.картинка_1.Hide INKEYGUI(50) Окно_1.картинка_1.Show

Dima: Andrey Нет не помогает...

alexandr11: пример webcam из MiniGUI2.4 видео пишется в файл c:\capture.avi по умолчанию нужно сменить имя файла нашел в vfw.h такую строку #define capFileSetCaptureFile(hwnd, szName) ((BOOL)AVICapSM(hwnd, WM_CAP_FILE_SET_CAPTURE_FILE, 0, (LPARAM)(LPVOID)(LPTSTR)(szName))) по аналогии с другими функциями из webcam.prg написал функцию HB_FUNC( SetCapFile ) { hb_retl( capFileSetCaptureFile( (HWND) hb_parnl(1), hb_parc(2) ) ); } С-файл собирается, но получаю Unresolved external '_HB_FUN_SETCAPFILE' referenced from WEBCAM.OBJ помогите пожалуйста

Andrey: Dima пишет: Нет не помогает... Давай отдельный пример. Может при создании этого примера можно будет понять что не так делаешь. У меня тоже так частенько получается, вроде должно работать, а не работает. Делаешь отдельный пример и понимаешь как нужно сделать.

Andrey: Andrey пишет: Выдает такую ошибку: Harbour 3.2.0dev (r1503131756) Copyright (c) 1999-2015, http://harbour-project.org/ Source\form_LoginPassw.prg(82) Error E0030 Syntax error "syntax error at '@'" Source\form_LoginPassw.prg(90) Error E0030 Syntax error "syntax error at '@'" 2 errors No code generated. Опять такие же грабли ..... Увеличил свой проект на 450Кб текстов программ и опять не хочет собираться. В отдельном модуле собирается нормально, как начинаешь добавлять в основную программу - отказ компиляции, на простом месте. Почему ? Вот так выглядит ошибка: Harbour 3.2.0dev (r1505191317) Copyright (c) 1999-2015, http://harbour-project.org/ Source\form_transf_cnf1.prg(101) Error E0030 Syntax error "syntax error at '@'" Source\form_transf_cnf1.prg(118) Error E0030 Syntax error "syntax error at '@'" 2 errors No code generated. Вот так выглядит код который в небольшом проекте собирается, а к большому присоединяешь - НЕ собирается: @ nRowButt, 140 BUTTONEX Button_Save ; WIDTH nWButt HEIGHT nHButt ; CAPTION 'Сохранить' ; ICON "iFloppy48x1" ; FONTCOLOR aButtColor ; BACKCOLOR COLOR_GREEN_METRO ; SIZE nFBSize2 ; NOXPSTYLE ; ON MOUSEHOVER ( SetProperty(ThisWindow.Name, This.Name, "ICON", "iFloppy48x2") ,; SetProperty(ThisWindow.Name, This.Name, "fontcolor", aButtColor2 ) ) ; ON MOUSELEAVE ( SetProperty(ThisWindow.Name, This.Name, "ICON", "iFloppy48x1") ,; SetProperty(ThisWindow.Name, This.Name, "fontcolor", aButtColor ) ) ; ACTION { || SaveConfig(), Form_DbM2Cnf1.Release() } // строка 101 // при наведении мышкой на кнопку стрелка меняется на палец nIndex := GetControlIndex('Button_Save', ThisWindow.Name) _HMG_aControlInputMask [ nIndex ] := .T. @ nRowButt, 420 BUTTONEX Button_Exit ; WIDTH nWButt HEIGHT nHButt ; ICON "iExit48x1" ; CAPTION 'Выход' ; FONTCOLOR aButtColor ; BACKCOLOR COLOR_BRIGHT_RED ; SIZE nFBSize2 ; NOXPSTYLE ; ON MOUSEHOVER ( SetProperty(ThisWindow.Name, This.Name, "ICON", "iExit48x2") ,; SetProperty(ThisWindow.Name, This.Name, "fontcolor", aButtColor2 ) ) ; ON MOUSELEAVE ( SetProperty(ThisWindow.Name, This.Name, "ICON", "iExit48x1") ,; SetProperty(ThisWindow.Name, This.Name, "fontcolor", aButtColor ) ) ; ACTION { || Form_DbM2Cnf1.Release() } // строка 118 // при наведении мышкой на кнопку стрелка меняется на палец nIndex := GetControlIndex('Button_Exit', ThisWindow.Name) _HMG_aControlInputMask [ nIndex ] := .T. Помогите пожалуйста.

Dima: Andrey пишет: Form_DbM2Cnf1.Release() DoMethod("Form_DbM2Cnf1","Release")

Andrey: Dima пишет: DoMethod("Form_DbM2Cnf1","Release") Даже ставил ThisWindow.Release - бестолку, не компилирует. Даже убрал вообще ACTION { || .... } всё равно не компилирует. У меня новых 4 модуля с такой конструкцией. В проекте есть старые такие же конструкции - он их компилирует. Как убираешь эти кнопки - компилируется нормально. Объём текстов то небольшой - чуть меньше 2 Мб ... Всё чудесней и чудесней со временем становиться...

Dima: Andrey пишет: Всё чудесней и чудесней со временем становиться... И у меня та же фигня

Dima: По ходу в описании BUTTONEX не указан PARENT и если описание делается вне описания окна тогда и не собрать

Andrey: Dima пишет: По ходу в описании BUTTONEX не указан PARENT и если описание делается вне описания окна тогда и не собрать Он не обязателен. В малом проекте ВСЁ собирается, а в большом нет. Закоментировал что не собирается и ОПЯТЬ облом.... Пишет: Harbour 3.2.0dev (r1505191317) Copyright (c) 1999-2015, http://harbour-project.org/ OBJ\form_transf_cnf1.c: Turbo Incremental Link 5.66 Copyright (c) 1997-2002 Borland Error: Unresolved external '_HB_FUN_GETWINDOWWIDTH' referenced from W:\HB_PROJECT\ Error: Unresolved external '_HB_FUN_GETWINDOWHEIGHT' referenced from W:\HB_PROJECT\ Смотрю текст: nTabWidth := GetWindowWidth(GetControlHandle('Tab_1', _HMG_ThisFormName)) - 2*2 nTabHeight := GetWindowHeight(GetControlHandle('Tab_1', _HMG_ThisFormName)) - 1 В отдельном проекте компилируется и собирается нормально. Как в большой проект засовываешь - всё СТОП работа. Функции FUN_GETWINDOWWIDTH такой действительно нет. Там должно срабатывать из i_controlmisc.ch #xtranslate GetWindowWidth ( <hWnd> ) ; => ; GetWindowRect( <hWnd>, 3 ) Чем больше текста, тем хуже компилятор Харбора справляется с работой ?

Haz: Andrey пишет: Даже ставил ThisWindow.Release - бестолку, может проблема в том что требуется блок кода, а не список процедур в скобках ON MOUSEHOVER ( SetProperty(ThisWindow.Name, This.Name, "ICON", "iExit48x2") ,; SetProperty(ThisWindow.Name, This.Name, "fontcolor", aButtColor2 ) ) ; не проверял , но так как выше я писать точно не стал бы а с этим тоже не ботает ? ON MOUSEHOVER { || SetProperty(ThisWindow.Name, This.Name, "ICON", "iExit48x2") ,; SetProperty(ThisWindow.Name, This.Name, "fontcolor", aButtColor2 ) } ;

Dima: Haz Глаз алмаз

Andrey: Haz пишет: может проблема в том что требуется блок кода, а не список процедур в скобках ON MOUSEHOVER ( SetProperty(ThisWindow.Name, This.Name, "ICON", "iExit48x2") ,; SetProperty(ThisWindow.Name, This.Name, "fontcolor", aButtColor2 ) ) ; Как Григорий дал, так и использую.... Отсебятины не делал.

Andrey: Чем больше текста, тем хуже компилятор Харбора справляется с работой ? Вручную в начале программы где использую GetWindowWidth и GetWindowHeight поставил: #xtranslate GetWindowWidth ( <hWnd> ) => GetWindowRect( <hWnd>, 3 ) #xtranslate GetWindowHeight ( <hWnd> ) => GetWindowRect( <hWnd>, 4 ) Тогда собралась программа. Но это же неправильно ! Может какие то ограничения у Харбора при компиляции ?

Andrey: Haz пишет: а с этим тоже не ботает ? ON MOUSEHOVER { || SetProperty(ThisWindow.Name, This.Name, "ICON", "iExit48x2") ,; SetProperty(ThisWindow.Name, This.Name, "fontcolor", aButtColor2 ) } ; Нет не заработало... Придется наверно отдельную функцию писать... Чем больше текст, тем меньше вероятности его компиляции...

Haz: Andrey пишет: Отсебятины не делал. в этом и все дело, это как списать пример в школе не понимая решения. Андрей, компилятор всегда ведет себя одинаково, что маленький проект , что большой. Разница может быть только в том , что компилятору скармливают. на входе ( инклюды , объявления и пр ) У меня ни разу не было ситуации что тестовый код при включении в проект вел себя по другому ( при идентичности условий компиляции ). Компилятор проверяет лексику и синтаксис ( скобки , ключевые конструкции, объявления ) , но не логику. Раз ругань идет от компилятора - проверяй синтаксис , парные операнды, парные конструкции , скобки, и пр. чудес не бывает.

Haz: Andrey пишет: Нет не заработало так там не один HOVER со скобками круглыми в куске кода, еще и MOUSELEAVE есть такой же Andrey пишет: Чем больше текст, тем меньше вероятности его компиляции.. тем больше вероятности в нем накосячить , а свалить на компилятор

Andrey: Haz пишет: так там не один HOVER со скобками круглыми в куске кода, еще и MOUSELEAVE есть такой же Оба сделал, несколько раз перепроверил. Не работает. Haz пишет: тем больше вероятности в нем накосячить , а свалить на компилятор Ну не понимаю я. Сделал отдельный проект - 450 Кб текстов программ. Оттестировал, собирается - короче работает. Добавляю в большой проект - перестаёт компилироваться. Ошибки выше. Поборол компиляцию (закомментировал пока), вылазит ошибка - нету функций. Препроцессор сдох... Ручками добавил - заработало. Ну это разве работа ? Вот и спрашиваю, может слишком много текстов программ, увеличить надо какие то параметры для препроцессора и самого компилятора ? Проект то ещё пока не шибко большой: 2 Мб текстов, ехе-ник сам всего 8 Мб.

Haz: Andrey пишет: Проект то ещё пока не шибко большой: 2 Мб не аргумент ... Исходники MiniGui 6МБ и компилятор их жует отлично. Проверяй так 1 ) в MOUSEHOVER и MOUSELEAVE поставь {|| NIL } Если собирается косяк в этих кусках кода, не собирается - не в этиж 2) Упрости максимально @ BUTTONEX ,,,, в одну строку в ACTION {|| NIL } собирается - расскрывай все что дописал. Ну и надеюсь 2МБ это модули а не одним куском ( и модули независимые а не один живет в другом в виде include module2.prg )

Andrey: Haz пишет: Ну и надеюсь 2МБ это модули а не одним куском ( и модули независимые а не один живет в другом в виде include module2.prg ) Конечно модули, отдельные-независимые программы.

Haz: Andrey пишет: Конечно модули, отдельные-независимые программы. т.е. тогда какойто отдельный модуль не компилится ? Ищи в нем косяк , на чем спотыкается компилятор - закоменти код ставь заглушки. Тебе важно понять причину а не обойти ее ( т.к. не первый раз спотыкаешься )

Dima: Из хелпа [ ON GOTFOCUS | ON MOUSEHOVER <OnGotfocusProcedure | bBlock> ] Поэтому или процедура или блок. Перечисление функций в скобках видимо не прокатит.

SergKis: Andrey глянь препроцессор и попробуй obj из тестового (работающего) проекта включить в большой. может проще не куски кода таскать, а формировать lib и ее включать в проекты

Andrey: Dima пишет: Перечисление функций в скобках видимо не прокатит. Прокатывает ! Если объём файлов в проекте 450Кб то собирается... Если большой проект: 2Мб - не собирается. Простое копирование файлов из одной паки в другую. 4 файла не компилируются после вставки в большой проект. Вот хоть тресни. Это 1-я беда, вторая беда - не может препроцессор найти в 3-х модулях функции GetWindowWidth и GetWindowHeight. Вручную поставил сам в начале модулей: #xtranslate GetWindowWidth ( <hWnd> ) => GetWindowRect( <hWnd>, 3 ) #xtranslate GetWindowHeight ( <hWnd> ) => GetWindowRect( <hWnd>, 4 ) Тогда заработало. Вот и спрашиваю, что за фигня, может у Харбора надо что-то подкрутить ? В Клипере раньше приходилось шаманить, не помню уже что. SergKis пишет: Andrey глянь препроцессор и попробуй obj из тестового (работающего) проекта включить в большой. может проще не куски кода таскать, а формировать lib и ее включать в проекты Попробую. Нет не особо удобно формировать и таскать lib. Не привык я к такому.

Dima: Andrey пишет: вторая беда - не может препроцессор найти в 3-х модулях функции GetWindowWidth и GetWindowHeight. Вручную поставил сам в начале модулей: #include "minigui.ch" прописан в PRG ?

Andrey: Dima пишет: #include "minigui.ch" прописан в PRG ? Конечно ! Иначе бы вообще не собирал !

Dima: Тогда фик знает. Может и есть какое ограничение. Максимум что у меня было для сборки (GTWVT) файл размером 320 кило и строк в нем 13000 , собирается нормально.

Haz: Andrey пишет: Это 1-я беда, вторая беда - Андрей, думаю в твоей ситуации без "самодостаточного" примера - это пальцем в небо ... ЗЫ. у меня в проекте 133 файла и 1,5 МБ кода - все норм

Andrey: Haz пишет: Андрей, думаю в твоей ситуации без "самодостаточного" примера - это пальцем в небо ... ЗЫ. у меня в проекте 133 файла и 1,5 МБ кода - все норм Давай я тебе пришлю модуль который не компилируется ? У меня в проекте 89 файлов и 1,9 Мб кода.

Haz: Andrey пишет: Давай я тебе пришлю модуль который не компилируется шли

Andrey: Haz пишет: шли Выслал...

Andrey: Трехдневная эпопея со сборкой там работает, а здесь нет подола наконец то к завершению. Спасибо большое всем кто откликнулся. Убрал в своём большом проекте МойПроект.hbp строчку -incpath=z:\minigui\include и всё стало нормально компилироваться ... Блин, ну почему такие явные вещи мешают компиляции - загадка ! Как в той загадке - без окон и дверей полна горница:

Dima: Andrey пишет: -incpath=z:\minigui\include путь то есть такой ?

Andrey: Dima пишет: путь то есть такой ? Да есть, у меня там МиниГуй установлен. Даже это теперь компилируется: ON MOUSEHOVER ( SetProperty(ThisWindow.Name, This.Name, "ICON", "iFloppy48x2") ,; SetProperty(ThisWindow.Name, This.Name, "fontcolor", aButtColor2 ) ) ; ON MOUSELEAVE ( SetProperty(ThisWindow.Name, This.Name, "ICON", "iFloppy48x1") ,; SetProperty(ThisWindow.Name, This.Name, "fontcolor", aButtColor ) ) ;

Andrey: Можно ли сделать/создать окно - чтобы оно было отдельно на панели задач от MAIN окна ?

Andrey: Как сделать ввод числа по маске "999 999 999" ? Делаю так: @ 45,130 TEXTBOX TextBox_1 VALUE M->nPubMaxRecno WIDTH 120 HEIGHT 32 ; BACKCOLOR {255,255,255} SIZE 14 NUMERIC INPUTMASK '999 999 999' ; ON CHANGE {|| M->nPubMaxRecno := Form_6.TextBox_1.Value } а на экране всё равно слитно цифры отображаются...

Haz: Andrey пишет: Как сделать ввод числа по маске "999 999 999" переделать через @ 45 ,130 GETBOX ... PICTURE "@R 999 999 999"

Andrey: Спасибо БОЛЬШОЕ ! Отправил письмо на почту, посмотри пожалуйста. И еще в догонку к этому письму, не получается переместить фокус в ГРИД после расчёта. Делаю: @ 450,15 BUTTONEX Button_Start CAPTION 'Starting calculation'; WIDTH 380 HEIGHT 40 BACKCOLOR LGREEN FONTCOLOR WHITE BOLD ; NOXPSTYLE HANDCURSOR ACTION {|| Test_Calc_Dbf(), Form_1.Grid_1.Setfocus } а курсор в ГРИД не переходит...

Andrey: Смотрел пример \MiniGUI\SAMPLES\Advanced\GridColor Там строка 132: Form_1.Grid_1.SetFocus или я не то смотрю.... А, понял... Нужно сначала ставить: Form_1.Grid_1.Value := 1, а потом уже Form_1.Grid_1.SetFocus ! Тогда работает !

Dima: Andrey пишет: Form_1.Grid_1.SetFocus А если через Domethod

Andrey: Dima пишет: А если через Domethod А не важно как, всеравно препроцессор поставит сам Domethod !

Haz: Andrey пишет: Делаю: @ 450,15 BUTTONEX Button_Start CAPTION 'Starting calculation'; WIDTH 380 HEIGHT 40 BACKCOLOR LGREEN FONTCOLOR WHITE BOLD ; NOXPSTYLE HANDCURSOR ACTION {|| Test_Calc_Dbf(), Form_1.Grid_1.Setfocus } Form_1.Grid_1.Setfocus , Form_1.Grid_1.Value := 1 }

Andrey: Haz пишет: Form_1.Grid_1.Setfocus , Form_1.Grid_1.Value := 1 } Спасибо, понял !

Andrey: Григорий ! Просвети в вопросе по окнам. Юзера достали... Вот нужно им чтобы при сбросе окна кнопкой [_] - вниз, появлялось рядом иконка этого окна. Можно ли сделать/создать окно - чтобы оно было отдельно на панели задач от MAIN окна ?

SergKis: Andrey пишет:Можно ли сделать/создать окно - чтобы оно было отдельно на панели задач от MAIN окна ? CHILD у окна не пиши

gfilatov2002: Andrey пишет: Можно ли сделать/создать окно - чтобы оно было отдельно на панели задач Для этой цели надо использовать дочерние окна типа STANDARD (см. пример ниже) [pre2]#include "minigui.ch" Function Main Local i, cForm DEFINE WINDOW Win_1 ; TITLE 'Hello World!' ; WINDOWTYPE MAIN END WINDOW DEFINE WINDOW Win_2 ; TITLE 'Child Window' ; WINDOWTYPE STANDARD END WINDOW DEFINE WINDOW Win_3 ; TITLE 'Modal Window' ; WINDOWTYPE MODAL END WINDOW FOR i:=1 TO 3 cForm := "Win_" + str(i, 1) _DefineHotKey(cForm, 0, 27, hb_MacroBlock("_ReleaseWindow('"+cForm+"')")) NEXT Win_3.Center ACTIVATE WINDOW Win_3, Win_2, Win_1 Return Nil [/pre2]

Andrey: SergKis пишет: CHILD у окна не пиши Попробовал - работает ! Спасибо Большое ! #include "minigui.ch" FUNCTION Main DEFINE WINDOW Form1 ; AT 0 , 0 ; WIDTH 600 HEIGHT 400 ; TITLE "Window 1" ; MAIN ; BACKCOLOR YELLOW DEFINE BUTTON Button_1 ROW 60 COL 60 WIDTH 180 HEIGHT 48 CAPTION "Win2" ACTION Win2() FONTNAME "Arial" FONTSIZE 18 END BUTTON END WINDOW CENTER WINDOW Form1 Activate Window Form1 RETURN nil /////////////////////////////////////////////////////////////////// FUNCTION Win2() if IsWindowDefined(Form2) Show Window Form2 else DEFINE WINDOW Form2 ; AT 100 , 100 ; WIDTH 400 HEIGHT 370 ; TITLE "Window 2" ; BACKCOLOR BLUE END WINDOW Activate Window Form2 endif RETURN NIL

Andrey: Есть меню - DEFINE CONTEXT MENU CONTROL ... Какие примеры можно посмотреть ?

Сергей Р: gfilatov2002 привет. после 5-ти летнего прозябания, начал снова использовать твою GUI, но теперь даже простое меню стало выдавать кучу нелицеприятных ругательств. Было (Harbour MiniGUI 1.7 Extended Edition (Build 77) - 2009.11.26), что теперь все заново изучать?, или можешь помочь с объяснением ошибок: Error Unresolved external ' hb extIsNil' referenced from C:\MINIGUI\LIB\MINIGUI.LIB|c winapimisc Error Unresolved external 'TransparentBlt' referenced from C:\MINIGUI\LIB\MINIGUI.LIB|c image Error Unresolved external ' HB FUN HB EOL' referenced from C:\MINIGUI\LIB\MINIGUI.LIB|h error Error Unresolved external ' HB FUN HB DEFAULT' referenced from C:\MINIGUI\LIB\MINIGUI.LIB|h windows Error Unresolved external ' HB FUN DEFAULTNIL' referenced from C:\MINIGUI\LIB\MINIGUI.LIB|h windows Error Unresolved external ' HB FUN HB DEFAULTVALUE' referenced from C:\MINIGUI\LIB\MINIGUI.LIB|h winprop Error Unresolved external ' HB FUN HB VAL' referenced from C:\MINIGUI\LIB\MINIGUI.LIB|h getbox Error Unresolved external ' HB FUN PVALUE' referenced from C:\MINIGUI\LIB\MINIGUI.LIB|h windows Error Unresolved external ' HB FUN HB DATE' referenced from C:\MINIGUI\LIB\MINIGUI.LIB|h controlmisc Error Unresolved external ' HB FUN HB ISFUNCTION' referenced from C:\MINIGUI\LIB\MINIGUI.LIB|h hyperlink

Dima: Сергей Р пишет: Было (Harbour MiniGUI 1.7 Extended Edition (Build 77) - 2009.11.26) А сейчас ? Старый пересобранный код не работает что ли ?

SergKis: Сергей Р используете hb 2.0 или hb 3.2 ?

Сергей Р: Dima Да, пересобранный код не фурычит. Сейчас взял текущий Harbour MiniGUI Extended Edition 2.4.7, ты не поверишь, я за всю жизнь столько ошибок не сделал.

Сергей Р: SergKis Брал комлект, который идет в поставке с 3.2

SergKis: Сергей Р env include правильно назначен ? i_pseudofun.ch ... #if ( __HARBOUR__ - 0 < 0x030200 ) #xtranslate hb_IsFunction( <c> ) => ( Type( <c> + "()" ) == "UI" ) # xtranslate hb_default( @<v>, <x> ) => iif( StrTran( ValType( <v> ), "M", "C" ) == StrTran( ValType( <x> ), "M", "C" ), Nil, <v> := <x> ) # xtranslate hb_defaultValue( <v>, <x> ) => iif( StrTran( ValType( <v> ), "M", "C" ) == StrTran( ValType( <x> ), "M", "C" ), <v>, <x> ) # xtranslate __defaultNIL( @<v>, <x> ) => ( <v> := iif( <v> == NIL, <x>, <v> ) ) #endif в 3.2 - hb_IsFunction - ok! А у Вас вылезла как не найденная. а пример любой из samples\basic Compile.bat собирает ? сам работаю с hb 2.0 + MiniGui 2.0.7

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

Dima: NOTIFYICON и NOTIFYBALLOONCLICK не устраивает ? Andrey пишет: Можно ли из основной программы создать отдельное окно которое бы висело в трее ? Создал окно NOSHOW , прицепил к нему NOTIFYICON и NOTIFYBALLOONCLICK , по клику в трее на иконке окну делаем SHOW.

Andrey: Dima пишет: Создал окно NOSHOW , Наверно MAIN создал. А мне нужно CHILD или STANDART !

Dima: Andrey пишет: Наверно MAIN создал я про MAIN и не писал ни чего да и про тип окна , это уже на твой вкус. просто дал идею ;)

Haz: Andrey пишет: А мне нужно CHILD или STANDART ! NotifyIcon - это проперти ТОЛЬКО главного окна . А раз это проперти, то менять его можно откуда угодно через SetProperty() и разумеется эта икона сначала должна быть определена в описании главного окна хоть как пустое значение.

Dima: Haz пишет: NotifyIcon - это проперти ТОЛЬКО главного окна . Записал себе. Не знал.

Haz: NotifyIcon - это проперти ТОЛЬКО главного окна Хочу добавить - только главного окна в реализации MiniGui ( в коде стоит запрет на все окна кроме MAIN ). NotifyIcon можно создать и привязать к любому виду окна, В исходниках c_windows.c есть все для этого ShowNotifyIcon и ChangeNotifyIcon.

Dima: Записал и это , сенкс , пробну

Andrey: Взял свою старую программу которая в трее сидит, заменил MAIN на STANDART. DEFINE WINDOW Form_Site ; AT 0,0 ; WIDTH 400 HEIGHT 100 ; TITLE cTitle ; WINDOWTYPE STANDARD ; NOMAXIMIZE NOSIZE NOSYSMENU ; BACKCOLOR LGREEN ; NOTIFYICON '1MAIN_ICON' ; NOTIFYTOOLTIP cTitle ; ON NOTIFYCLICK MsgDebug("NOTIFYCLICK !") // строка 36 ! Ошибка при выполнении: Error MGERROR/0 Notification icon allowed only in Main Window. Program terminated. Called from MSGMINIGUIERROR(94) Called from _DEFINEWINDOW(125) Called from FORM_SITEDWNLD(36) Called from (b)MAIN(101) Что не так делаю ?



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