Автор | Сообщение |
|
| |
Пост N: 1
Зарегистрирован: 28.01.11
|
|
Отправлено: 14.02.11 15:50. Заголовок: Создание кнопок через _DefineButton
Добрый день! Создаю кнопки в цикле через функцию _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
[только новые]
|
|
|
| moderator
|
Пост N: 165
Зарегистрирован: 11.02.10
|
|
Отправлено: 14.02.11 16:00. Заголовок: kadijoller пишет: К..
kadijoller пишет: Свойство Action принимает в качестве параметра кодовый блок. Поэтому используйте bBlock:= {||FuncName()} SetProperty("Form", "btn1", "Action", bBlock)
|
|
|
|
| |
Пост N: 2
Зарегистрирован: 28.01.11
|
|
Отправлено: 15.02.11 13:30. Заголовок: Спасибо за помощь, т..
Спасибо за помощь, только никак не могу понять что собой представляет этот кодовый блок. В документации это как что-то само собой разумеющееся, типа переменной. Мне бы все-таки хотелось присваивать Action на лету и для разных кнопок разные действия. Попытался упаковать все это в массив, но не вышло. Может я на ложном пути?
|
|
|
|
| moderator
|
Пост N: 167
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.02.11 14:05. Заголовок: kadijoller пишет: В..
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. |
|
|
|
|
|
| |
Пост N: 4
Зарегистрирован: 28.01.11
|
|
Отправлено: 15.02.11 16:51. Заголовок: Все равно не понимаю..
Все равно не понимаю как это использовать в моем случае. Action принимает значение в виде кодового блока, в блоке функция, в функцию надо передать параметр, параметр должен браться в зависимости от нажатой кнопки. Я себе представляю это как _DefineButton ( ctrl, "Form", x, y, ctrl, {||FuncName(ctrl)}, width, height), но харбор представляет себе это совсем иначе. Нельзя как-нибудь строку преобразовать в кодовый блок?
|
|
|
|
| moderator
|
Пост N: 168
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.02.11 17:03. Заголовок: kadijoller пишет: Н..
kadijoller пишет: цитата: | Нельзя как-нибудь строку преобразовать в кодовый блок? |
| Можно. Вот пример из сырцов библиотеки минигуи: цитата: | action := &('{|| ' + Left(cAction, At("(",cAction)) + ' "'+NewItem + '" ) }') |
| Кстати, в вышеприведенной доке это тоже есть: цитата: | ¦ В следующем примере демонстрируется, как может компилироваться блок кода во время выполнения с помощью использования оператора (&): bBlock := &("{ |nArg| nArg + 1 }") // Транслировать строку блока |
|
|
|
|
|
| постоянный участник
|
Пост N: 459
Зарегистрирован: 25.12.07
|
|
Отправлено: 16.02.11 15:16. Заголовок: kadijoller пишет: В..
kadijoller пишет: цитата: | Все равно не понимаю как это использовать в моем случае. Action принимает значение в виде кодового блока, в блоке функция, в функцию надо передать параметр, параметр должен браться в зависимости от нажатой кнопки. Я себе представляю это как _DefineButton ( ctrl, "Form", x, y, ctrl, {||FuncName(ctrl)}, width, height), но харбор представляет себе это совсем иначе. |
| Представляете почти правильно, за исключением одного "но". "Две палочки ||" - они не для красоты, а как раз это место для определения параметра, передаваемого в блок, то есть должно быть: {|curctrl|FuncName(curctrl)} curctrl вместо ctrl для того, чтобы имя формального параметра не пересекалось с именем переменной. P.S. MiniGui не знаю, могут быть конечно здесь нюансы...
|
|
|
|
| |
Пост N: 143
Зарегистрирован: 11.06.10
|
|
Отправлено: 16.02.11 17:14. Заголовок: Sergey Spirin пишет:..
Sergey Spirin пишет: цитата: | P.S. MiniGui не знаю, могут быть конечно здесь нюансы... |
| Скорее нет никаких нюансов, чистый xHarbour.
|
|
|
|
| постоянный участник
|
Пост N: 460
Зарегистрирован: 25.12.07
|
|
Отправлено: 17.02.11 00:07. Заголовок: AlexMyr пишет: . Mi..
AlexMyr пишет: цитата: | . MiniGui не знаю, могут быть конечно здесь нюансы... Скорее нет никаких нюансов, чистый xHarbour. |
| Не, я, конечно, не синтаксис блока кода имел в виду. Я к тому, что не знаю, а что собственно кнопка MiniGui-кнопка передает в обработчик события Action, какие параметры? И передается ли экземпляр объекта-кнопка в этот обработчик? Что-то мне смутно помнится, что инфа об "объектах" там хранится в каких-то глобальных переменных и т.п. Поэтому, вполне в духе MiniGui может быть такой вариант: {||FuncName(_HMG_BlaBla)} Но это, Григорий наверное, прояснит.
|
|
|
|
| moderator
|
Пост N: 171
Зарегистрирован: 11.02.10
|
|
Отправлено: 17.02.11 11:15. Заголовок: Sergey Spirin пишет:..
Sergey Spirin пишет: цитата: | Но это, Григорий наверное, прояснит. |
| Рекомендую получить имя нажатой кнопки внутри вызываемой функции так: цитата: | Function FuncName() local btnName:=this.name ... |
|
|
|
|
|
| |
Пост N: 5
Зарегистрирован: 28.01.11
|
|
Отправлено: 17.02.11 22:46. Заголовок: Всем спасибо за помо..
Всем спасибо за помощь! И отдельно большое спасибо Григорию
|
|
|
|