On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение



Пост 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") - та же беда. Как сделать правильно?


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 10 [только новые]


moderator




Пост N: 165
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 14.02.11 16:00. Заголовок: kadijoller пишет: К..


kadijoller пишет:

 цитата:
Как сделать правильно?


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 2
Зарегистрирован: 28.01.11
ссылка на сообщение  Отправлено: 15.02.11 13:30. Заголовок: Спасибо за помощь, т..


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

Спасибо: 0 
ПрофильЦитата Ответить
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.



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 4
Зарегистрирован: 28.01.11
ссылка на сообщение  Отправлено: 15.02.11 16:51. Заголовок: Все равно не понимаю..


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

Нельзя как-нибудь строку преобразовать в кодовый блок?

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 168
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 15.02.11 17:03. Заголовок: kadijoller пишет: Н..


kadijoller пишет:

 цитата:
Нельзя как-нибудь строку преобразовать в кодовый блок?


Можно. Вот пример из сырцов библиотеки минигуи:


 цитата:
action := &('{|| ' + Left(cAction, At("(",cAction)) + ' "'+NewItem + '" ) }')



Кстати, в вышеприведенной доке это тоже есть:


 цитата:
¦ В следующем примере демонстрируется, как может компилироваться блок
кода во время выполнения с помощью использования оператора (&):

bBlock := &("{ |nArg| nArg + 1 }") // Транслировать строку блока




Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост 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 не знаю, могут быть конечно здесь нюансы...





Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 143
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 16.02.11 17:14. Заголовок: Sergey Spirin пишет:..


Sergey Spirin пишет:

 цитата:
P.S. MiniGui не знаю, могут быть конечно здесь нюансы...


Скорее нет никаких нюансов, чистый xHarbour.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 460
Зарегистрирован: 25.12.07
ссылка на сообщение  Отправлено: 17.02.11 00:07. Заголовок: AlexMyr пишет: . Mi..


AlexMyr пишет:

 цитата:
. MiniGui не знаю, могут быть конечно здесь нюансы...


Скорее нет никаких нюансов, чистый xHarbour.



Не, я, конечно, не синтаксис блока кода имел в виду. Я к тому, что не знаю, а что собственно кнопка MiniGui-кнопка передает в обработчик события Action, какие параметры? И передается ли экземпляр объекта-кнопка в этот обработчик? Что-то мне смутно помнится, что инфа об "объектах" там хранится в каких-то глобальных переменных и т.п. Поэтому, вполне в духе MiniGui может быть такой вариант:

{||FuncName(_HMG_BlaBla)}

Но это, Григорий наверное, прояснит.





Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 171
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 17.02.11 11:15. Заголовок: Sergey Spirin пишет:..


Sergey Spirin пишет:

 цитата:
Но это, Григорий наверное, прояснит.


Рекомендую получить имя нажатой кнопки внутри вызываемой функции так:

 цитата:
Function FuncName()
local btnName:=this.name
...



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 5
Зарегистрирован: 28.01.11
ссылка на сообщение  Отправлено: 17.02.11 22:46. Заголовок: Всем спасибо за помо..


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

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 175
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет