![]() |
|
|
![]()
|
|
| Eugene82 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 30.5.2005 Где: г. Ростов-на-Дону Репутация: нет Всего: нет |
Как сделать, чтобы после нажатия на кнопку, например, Search, на время выполнения вызванной функции, эта же кнопка становилась кнопкой Stop и останавливала работающую функцию?
Как вообще можно одной кнопкой последовательно вызывать разные функции? |
|||
|
||||
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 6 Всего: 24 |
Ну, а если подумать?.. Как вариант: использовать некую переменную, характеризующую то, что в данный момент при нажатии на кнопку должно вызываться, и в зависимости от ее значения в обработчике OnClick кнопки switch-евать или if-ить вызов нужной функции... там же можно менять значение этой переменной и надписи на кнопке... и по завершению нужной функции соответствующие изменения делать... %) Переменная может быть и глобальной, и принадлежащей форме... можно св-во Tag кнопки использовать - имхо так даже лучше, глобальная переменная и переменная, принадлежащая форме - это не оччч. красиво... ...можно и по-другому - в нужное время менять обработчик кнопки на нужный... %) ... есть еще варианты... Это сообщение отредактировал(а) BreakPointMAN - 2.8.2005, 22:43 -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
| Eugene82 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 30.5.2005 Где: г. Ростов-на-Дону Репутация: нет Всего: нет |
как выбрать какую функцию выполнять по онклик я разобрался. вставил условие. Только меня смущает что пришлось использовать глобальную переменную или это нормально?
остался вопрос: Как остановить работающую функцию? должен же быть какой-нить break! или только засовывать функцию в отдельный процесс и вторым нажатием его убивать |
|||
|
||||
| BreakPointMAN |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 6 Всего: 24 |
можно, конечно, и
варварски, вообщем-то... %)) если в функции происходит что-то итеративно, то можно в тело цикла включить дополнительную проверку некой переменной-флага "процесс прервали, ну-ка, завершай работу!" и делать return. Только тогда перед этим нужно внимательно посмотреть, а не нужно ли сообщить вызывающей функции, что функция до конца не отработала, и если нужно, то сделать это каким-то образом... впрочем, есть и еще варианты... %))) -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
||||
|
|||||
| Eugene82 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 30.5.2005 Где: г. Ростов-на-Дону Репутация: нет Всего: нет |
Спасибо большое за помощь!!! Это сообщение отредактировал(а) Eugene82 - 2.8.2005, 23:52 |
|||
|
||||
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 6 Всего: 24 |
Всегда пожалуйста... Только лучше, наверное, использовать не глобальную переменную, все-таки, а св-во Tag кнопки - если оно не используется по-другому. Это св-во специально предназначено для хранения каких-то связанных с данным экземпляром кнопки данных, туда можно что угодно записать... (в смысле, что угодно - если оно, конечно, туда поместиться... целое значение, указатель) И если не лень - можно попробовать другой способ, возможно он удобнее окажется. Сделать два обработчика нажатия кнопки - и когда надо заменять один другим. %) -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
| Eugene82 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 30.5.2005 Где: г. Ростов-на-Дону Репутация: нет Всего: нет |
BreakPointMAN Оперативно отвечаешь!
да, использовать кучу глобальных переменых только для подсчёта количества нажатий для разных кнопок как-то стрёмно - ведь разные только кнопки, а суть та же. Глобальная видимость сразу же подразумевает различные имена для этих переменных. Я хелп по свойству Tag прочитал, но что-то не понял как туда записываются более одного значения? А как сделать два обработчика? |
|||
|
||||
| BreakPointMAN |
|
||||||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 6 Всего: 24 |
А зачем тебе писать более одного значения?
Насчет нескольких обработчиков... например, так: предположим, у тебя есть кнопка Button1 и ее обработчик выглядит как-то так:
...а в соответствующем .h-файлике в объявлении класса формы в секции _published записано :
Тогда можно ввести некий обработчик по имени Second, например, так, в .h-файлике:
А в .cpp-файлике:
И в нужный момент переключаться между ними:
и назад
По сути, OnClick - это свойство, если очень грубо, то это указатель на функцию-обработчик... ну и менять ее можно, когда надо. Написал несколько разных обработчиков и указывай их имена в операторе присваивания... -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
||||||||||||||||
|
|||||||||||||||||
| NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: нет Всего: 23 |
Почему бы не использовать потоки?
|
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Во - первых прошу обратить внимание на Action. Серьезно упрощает код и цетрализует управление событиями. Все действия которые Вы можете совершить храняться в одном месте - АсtionList. К тому же в Action можно задать и иконку и Caption, которые автоматом присвоятся кнопке при присвоении Action
Выглядело бы это примерно так
Вот весь код, который кстати и меняет Caption. Остальное все сделано в дизайне. Кроме того можно еще обратить внимания на стандартные предопределенные Action: TSearchFind, TSearchFindNext, TSearchReplace, TSearchFindFirst -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| mr.Anderson |
|
||||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 3 Всего: 128 |
Eugene82, а можете привести код, как у вас получилось? Мне бы он был очень полезен. |
||||
|
|||||
| Eugene82 |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 30.5.2005 Где: г. Ростов-на-Дону Репутация: нет Всего: нет |
sim7, выше писали теорию как это сделать, от себя добавлю пример, хотя есть варианты проще - красивее, эффективнее, но с ними я ещё не разобрался. Это использование св-ва Action.
Итак, вариант 1:
А внутри MyFunction1() была встроена проверка значения globalVar:
Важное замечание! В моём случае функции работает итеративно (является циклическлой), т.е. значение глобальной переменной проверяется ВНУТРИ цикла! Таким образом и достигается её останов независимо от условия цикла! Если функция работает не в цикле - такой вариант не пройдёт! Аналогично можно использовать switch или if, но для проверки глобальной переменной уже типа int - чтобы было больше вариантов при выборе функций. Добавлю, что если надо сделать несколько различных функций для НЕСКОЛЬКИХ РАЗЛИЧНЫХ КНОПОК, то и глобальные переменные должны будут иметь РАЗЛИЧНЫЕ имена, а в таком случае их может быть много! Т.е. это не есть хороший способ использовать различные функции в обработке событий. Создание нескольких отдельных обработчиков уже лучше. См. выше пост BreakPointMAN от 3.8.2005, 00:31 Ну а лучше всего наверное использовать Action Manager [выше Vyacheslav, 3.8.2005, 09:56] ------------------------ Поскольку я уже разобрался с Action Manager'ом цепляю к посту архив моего проекта с использованием оного - в дизайне всё станет понятно! Качай архив. Имеет он расширение rar, но по чьей-то причуде такие файлы закачивать нельзя. Так что замени txt на rar. Это сообщение отредактировал(а) Eugene82 - 4.8.2005, 13:41 Присоединённый файл ( Кол-во скачиваний: 8 )
DiskCleaner.txt 39,41 Kb |
||||||||
|
|||||||||
| Eugene82 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 30.5.2005 Где: г. Ростов-на-Дону Репутация: нет Всего: нет |
Vyacheslav. Разобрался с Action. По сути это те же самые обработчики событий только их можно в большом количестве назначать одному и тому же объекту, причём действительно уменьшается количество кода для написания вручную и нет необходимости использовать глобальные переменные! А тип int свойства Tag позволяет иметь больше двух различных значений для него, а значит и вариантов функций для выбора может быть больше! Это ж замечательно! И почти всё в дизайне!
|
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Ну в общем то можно на первых порах для таких ограничиться ActionList.
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| codelord |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 777 Регистрация: 7.5.2005 Где: ты моя темноглаза я где?! Репутация: 16 Всего: 39 |
А если использовать вместо глобальных переменных
|
|||
|
||||
| Eugene82 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 30.5.2005 Где: г. Ростов-на-Дону Репутация: нет Всего: нет |
codelord, возможно для использования одного события различнымыми кнопками и придётся. Но использование экшенов мне понравилось
|
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |