Форум » GUI » Создание кнопок через _DefineButton » Ответить

Создание кнопок через _DefineButton

kadijoller: Добрый день! Создаю кнопки в цикле через функцию _DefineButton примерно так: for i:=1 to 3 ctrl:="btn" + ALLTRIM(STR(i)) _DefineButton ( ctrl, "Form", x, y, ctrl, "FuncName()", width, height) next Как я понимаю, вместо FuncName нужно указать действие по аналогии со свойством Action, например указать имя функции, в данном случае FuncName. Но почему-то не работает. Если указать в кавычках - ничего не происходит, если без - то функция выполняется внутри цикла, но свойство кнопкам не присваивается. Пробовал изменять свойство кнопки через SetProperty("Form", "btn1", "Action", "FuncName") - та же беда. Как сделать правильно?

Ответов - 10

gfilatov2002: kadijoller пишет: Как сделать правильно? Свойство Action принимает в качестве параметра кодовый блок. Поэтому используйте bBlock:= {||FuncName()} SetProperty("Form", "btn1", "Action", bBlock)

kadijoller: Спасибо за помощь, только никак не могу понять что собой представляет этот кодовый блок. В документации это как что-то само собой разумеющееся, типа переменной. Мне бы все-таки хотелось присваивать Action на лету и для разных кнопок разные действия. Попытался упаковать все это в массив, но не вышло. Может я на ложном пути?

gfilatov2002: kadijoller пишет: В документации это как что-то само собой разумеющееся, типа переменной. Так и есть - все верно См. доку Клиппера: EVAL() Выполняет блок кода. ------------------------------------------------------------------------------ Синтаксис EVAL(<блок кода>,[<список аргументов>]) --> значение последнего выражения Аргументы <блок кода> является выполняемым блоком кода. <список аргументов> является списком аргументов, которые посылаются в блок кода перед его выполнением. Возвращаемое значение EVAL() возвращает значение последнего выражения в блоке. Блок кода может возвращать значение любого типа. Описание EVAL() является функцией обработки блока кода. Это наиболее мощное средство в системе Clipper для выполнения блоков кода. Блок кода является особым значением данных, которое относится к части компилированного кода программы. Для получения дополнительной информации по блокам кода читайте главу "Основные концепции". Для выполнения блока кода нужно вызвать функцию EVAL(), передав ей блок кода и набор параметров. Параметры передаются блоку перед его выполнением. Блоки кода могут представлять собой последовательность выражений, разделенных запятыми. Когда блок кода выполняется, возвращаемым значением является значение последнего выражения в блоке. Блок кода обычно компилируется при компиляции Clipper-программы. Однако бывают случаи, когда во время выполнения программы возникает необходимость компилировать блок кода из символьной строки. (Например, при использовании оператора (&)). EVAL() часто используется для создания функций - итераторов. Это такие функции, которые применяют блок к каждому элементу структуры данных. AEVAL(), ASORT(), ASCAN() и DBEVAL() являются функциями - итераторами. AEVAL(), например, выполняет блок для каждого элемента в массиве. Примеры ¦ В примере показано создание блока кода: bBlock := { |nArg| nArg + 1 } ? EVAL(bBlock, 1) // Результат: 2 ¦ В следующем примере демонстрируется, как может компилироваться блок кода во время выполнения с помощью использования оператора (&): bBlock := &("{ |nArg| nArg + 1 }") // Транслировать строку блока ? EVAL(bBlock, 1) // Выполнить блок Файлы: Библиотека CLIPPER.LIB.


kadijoller: Все равно не понимаю как это использовать в моем случае. Action принимает значение в виде кодового блока, в блоке функция, в функцию надо передать параметр, параметр должен браться в зависимости от нажатой кнопки. Я себе представляю это как _DefineButton ( ctrl, "Form", x, y, ctrl, {||FuncName(ctrl)}, width, height), но харбор представляет себе это совсем иначе. Нельзя как-нибудь строку преобразовать в кодовый блок?

gfilatov2002: kadijoller пишет: Нельзя как-нибудь строку преобразовать в кодовый блок? Можно. Вот пример из сырцов библиотеки минигуи: action := &('{|| ' + Left(cAction, At("(",cAction)) + ' "'+NewItem + '" ) }') Кстати, в вышеприведенной доке это тоже есть: ¦ В следующем примере демонстрируется, как может компилироваться блок кода во время выполнения с помощью использования оператора (&): bBlock := &("{ |nArg| nArg + 1 }") // Транслировать строку блока

Sergey Spirin: kadijoller пишет: Все равно не понимаю как это использовать в моем случае. Action принимает значение в виде кодового блока, в блоке функция, в функцию надо передать параметр, параметр должен браться в зависимости от нажатой кнопки. Я себе представляю это как _DefineButton ( ctrl, "Form", x, y, ctrl, {||FuncName(ctrl)}, width, height), но харбор представляет себе это совсем иначе. Представляете почти правильно, за исключением одного "но". "Две палочки ||" - они не для красоты, а как раз это место для определения параметра, передаваемого в блок, то есть должно быть: {|curctrl|FuncName(curctrl)} curctrl вместо ctrl для того, чтобы имя формального параметра не пересекалось с именем переменной. P.S. MiniGui не знаю, могут быть конечно здесь нюансы...

AlexMyr: Sergey Spirin пишет: P.S. MiniGui не знаю, могут быть конечно здесь нюансы... Скорее нет никаких нюансов, чистый xHarbour.

Sergey Spirin: AlexMyr пишет: . MiniGui не знаю, могут быть конечно здесь нюансы... Скорее нет никаких нюансов, чистый xHarbour. Не, я, конечно, не синтаксис блока кода имел в виду. Я к тому, что не знаю, а что собственно кнопка MiniGui-кнопка передает в обработчик события Action, какие параметры? И передается ли экземпляр объекта-кнопка в этот обработчик? Что-то мне смутно помнится, что инфа об "объектах" там хранится в каких-то глобальных переменных и т.п. Поэтому, вполне в духе MiniGui может быть такой вариант: {||FuncName(_HMG_BlaBla)} Но это, Григорий наверное, прояснит.

gfilatov2002: Sergey Spirin пишет: Но это, Григорий наверное, прояснит. Рекомендую получить имя нажатой кнопки внутри вызываемой функции так: Function FuncName() local btnName:=this.name ...

kadijoller: Всем спасибо за помощь! И отдельно большое спасибо Григорию



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