Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Замена функции в онклик кнопки, "Начать поиск" -> "Остановить поиск" 
:(
    Опции темы
Eugene82
Дата 2.8.2005, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



Как сделать, чтобы после нажатия на кнопку, например, Search, на время выполнения вызванной функции, эта же кнопка становилась кнопкой Stop и останавливала работающую функцию?

Как вообще можно одной кнопкой последовательно вызывать разные функции?
PM WWW ICQ   Вверх
BreakPointMAN
Дата 2.8.2005, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 6
Всего: 24



Цитата(Eugene82 @ 2.8.2005, 21:09)
Как сделать, чтобы после нажатия на кнопку, например, Search, на время выполнения вызванной функции, эта же кнопка становилась кнопкой Stop и останавливала работающую функцию?

Как вообще можно одной кнопкой последовательно вызывать разные функции?

Ну, а если подумать?..

Как вариант: использовать некую переменную, характеризующую то, что в данный момент при нажатии на кнопку должно вызываться, и в зависимости от ее значения в обработчике OnClick кнопки switch-евать или if-ить вызов нужной функции... там же можно менять значение этой переменной и надписи на кнопке... и по завершению нужной функции соответствующие изменения делать... %)

Переменная может быть и глобальной, и принадлежащей форме... можно св-во Tag кнопки использовать - имхо так даже лучше, глобальная переменная и переменная, принадлежащая форме - это не оччч. красиво...


...можно и по-другому - в нужное время менять обработчик кнопки на нужный... %)

...
есть еще варианты... smile

Это сообщение отредактировал(а) BreakPointMAN - 2.8.2005, 22:43


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Eugene82
  Дата 2.8.2005, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



как выбрать какую функцию выполнять по онклик я разобрался. вставил условие. Только меня смущает что пришлось использовать глобальную переменную или это нормально?

остался вопрос: Как остановить работающую функцию? должен же быть какой-нить break! smile

или только засовывать функцию в отдельный процесс и вторым нажатием его убивать smile
PM WWW ICQ   Вверх
BreakPointMAN
Дата 2.8.2005, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 6
Всего: 24



Цитата(Eugene82 @ 2.8.2005, 22:31)
остался вопрос: Как остановить работающую функцию? должен же быть какой-нить break!  smile


можно, конечно, и
Цитата(Eugene82 @ 2.8.2005, 22:31)
засовывать функцию в отдельный процесс и вторым нажатием его убивать


варварски, вообщем-то... %))
если в функции происходит что-то итеративно, то можно в тело цикла включить дополнительную проверку некой переменной-флага "процесс прервали, ну-ка, завершай работу!" и делать return. Только тогда перед этим нужно внимательно посмотреть, а не нужно ли сообщить вызывающей функции, что функция до конца не отработала, и если нужно, то сделать это каким-то образом...

впрочем, есть и еще варианты... %)))



--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Eugene82
  Дата 2.8.2005, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



Цитата(BreakPointMAN @ 2.8.2005, 22:28)
Ну, а если подумать?..
Верное замечание. Но я заметил, что мне легче получается думать, когда я могу чётко сформулировать вопрос! Как для форума smile

Спасибо большое за помощь!!! smile Вставил проверку той же глобальной переменной, что используется для определения количества нажатий на кнопку, в функции - пришлось сделать последовательный выход из вызываемых функций - и получил желаемый результат! Ещё раз спасибо! smile

Это сообщение отредактировал(а) Eugene82 - 2.8.2005, 23:52
PM WWW ICQ   Вверх
BreakPointMAN
Дата 2.8.2005, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 6
Всего: 24



Цитата(Eugene82 @ 2.8.2005, 23:28)
Спасибо большое за помощь!!! smile

Всегда пожалуйста... smile

Только лучше, наверное, использовать не глобальную переменную, все-таки, а св-во Tag кнопки - если оно не используется по-другому. Это св-во специально предназначено для хранения каких-то связанных с данным экземпляром кнопки данных, туда можно что угодно записать... (в смысле, что угодно - если оно, конечно, туда поместиться... целое значение, указатель)

И если не лень - можно попробовать другой способ, возможно он удобнее окажется. Сделать два обработчика нажатия кнопки - и когда надо заменять один другим. %)


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Eugene82
Дата 2.8.2005, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



BreakPointMAN Оперативно отвечаешь! smile

да, использовать кучу глобальных переменых только для подсчёта количества нажатий для разных кнопок как-то стрёмно - ведь разные только кнопки, а суть та же. Глобальная видимость сразу же подразумевает различные имена для этих переменных.

Я хелп по свойству Tag прочитал, но что-то не понял как туда записываются более одного значения?

А как сделать два обработчика?
PM WWW ICQ   Вверх
BreakPointMAN
Дата 3.8.2005, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 6
Всего: 24



Цитата(Eugene82 @ 2.8.2005, 23:55)
Я хелп по свойству Tag прочитал, но что-то не понял как туда записываются более одного значения?

А зачем тебе писать более одного значения?

Цитата(Eugene82 @ 2.8.2005, 23:55)
А как сделать два обработчика?



Насчет нескольких обработчиков... например, так:
предположим, у тебя есть кнопка Button1 и ее обработчик выглядит как-то так:
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   ShowMessage("This is 1st!");
}

...а в соответствующем .h-файлике в объявлении класса формы в секции _published записано :
Код

void __fastcall Button1Click(TObject *Sender);


Тогда можно ввести некий обработчик по имени Second, например, так, в .h-файлике:
Код

void __fastcall Second(TObject *Sender);

А в .cpp-файлике:
Код

void __fastcall TForm1::Second(TObject *Sender)
{
   ShowMessage("This is 2nd!");
}


И в нужный момент переключаться между ними:

Код

Button1->OnClick=Second;

и назад
Код

Button1->OnClick=TForm1::Button1Click;

По сути, OnClick - это свойство, если очень грубо, то это указатель на функцию-обработчик... ну и менять ее можно, когда надо. Написал несколько разных обработчиков и указывай их имена в операторе присваивания...


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
NiJazz
Дата 3.8.2005, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: нет
Всего: 23



Почему бы не использовать потоки?
PM MAIL   Вверх
Vyacheslav
Дата 3.8.2005, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Во - первых прошу обратить внимание на Action. Серьезно упрощает код и цетрализует управление событиями. Все действия которые Вы можете совершить храняться в одном месте - АсtionList. К тому же в Action можно задать и иконку и Caption, которые автоматом присвоятся кнопке при присвоении Action
Выглядело бы это примерно так
Код

void __fastcall TForm1::StopActionExecute(TObject *Sender)
{
    FindButton->Tag = 1;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FindActionExecute(TObject *Sender)
{
    FindButton->Tag = 0;
    FindButton->Action = StopAction; 
    for(;;)
    {
        //....
        Application->ProcessMessages();
        if (FindButton->Tag) {
            break;
        }
    }
    FindButton->Action = FindAction;
}



Вот весь код, который кстати и меняет Caption. Остальное все сделано в дизайне.
Кроме того можно еще обратить внимания на стандартные предопределенные Action: TSearchFind, TSearchFindNext, TSearchReplace, TSearchFindFirst



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
mr.Anderson
Дата 3.8.2005, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Цитата
как выбрать какую функцию выполнять по онклик я разобрался.

Цитата
остался вопрос: Как остановить работающую функцию? должен же быть какой-нить break!

Eugene82, а можете привести код, как у вас получилось? Мне бы он был очень полезен.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Eugene82
  Дата 4.8.2005, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



sim7, выше писали теорию как это сделать, от себя добавлю пример, хотя есть варианты проще - красивее, эффективнее, но с ними я ещё не разобрался. Это использование св-ва Action.
Итак, вариант 1:
Цитата(BreakPointMAN @ 2.8.2005, 22:28)
использовать некую переменную, характеризующую то, что в данный момент при нажатии на кнопку должно вызываться, и в зависимости от ее значения в обработчике OnClick кнопки switch-евать или if-ить вызов нужной функции... там же можно менять значение этой переменной и надписи на кнопке... и по завершению нужной функции соответствующие изменения делать... %)

Код

bool globalVar; //Описали глобальную переменную 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(!globalVar)
{
MyFunction1()
{
Application->ProcessMessages();
globalVar=True
//Наш код
}
}
else
{
MyFunction2()
{
//Наш альтернативный код
globalVar=False
}
}
}
Таким образом, можно заставить одну кнопку выполнять две различные функции: MyFunction1(), если переменная globalVar имеет значение False (по умолчанию, т.о. значит при первом нажатии запускается MyFunction1()) или MyFunction2(), если globalVar имеет значение True - в моём примере функция MyFunction2() будет запущена по второму нажатию Button1, после чего значение globalVar возвращается к значению False (а можно и не возвращать). И всё повторяется снова. Я использовал такой метод для остановки MyFunction1(). Т.е. MyFunction2() имела вид:
Код

MyFunction2()
{
globalVar=False
}

А внутри MyFunction1() была встроена проверка значения globalVar:
Код

Application->ProcessMessages();
globalVar=True
//...Наш код (содержит внутри проверку значения globalVar:
if(!globalVar)return;/*Выполняет возврат из функции, если Button1 была нажата
второй раз*/
//Продолжение нашего кода

Важное замечание! В моём случае функции работает итеративно (является циклическлой), т.е. значение глобальной переменной проверяется ВНУТРИ цикла! Таким образом и достигается её останов независимо от условия цикла! Если функция работает не в цикле - такой вариант не пройдёт!

Аналогично можно использовать 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
PM WWW ICQ   Вверх
Eugene82
  Дата 4.8.2005, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



Vyacheslav. Разобрался с Action. По сути это те же самые обработчики событий только их можно в большом количестве назначать одному и тому же объекту, причём действительно уменьшается количество кода для написания вручную и нет необходимости использовать глобальные переменные! А тип int свойства Tag позволяет иметь больше двух различных значений для него, а значит и вариантов функций для выбора может быть больше! Это ж замечательно! И почти всё в дизайне! smile Спасибо за подсказку!
PM WWW ICQ   Вверх
Vyacheslav
Дата 4.8.2005, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Ну в общем то можно на первых порах для таких ограничиться ActionList.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
codelord
Дата 4.8.2005, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



А если использовать вместо глобальных переменных
Код

static //?????

smile


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Eugene82
Дата 4.8.2005, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



codelord, возможно для использования одного события различнымыми кнопками и придётся. Но использование экшенов мне понравилось smile
PM WWW ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0623 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.