Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кнопка START и кнопка STOP, Активность кнопок во время выполнения 
:(
    Опции темы
Alexzz
Дата 9.7.2008, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Предположим, есть форма и на ней две кнопки, одна старт, другая стоп. Вторая изначально не видна (.Visible выставлен в false). По нажатию первой кнопки начинается процесс чтения данных через ком-порт. На время выполнения кнопка старт становится неактивной, а вторая появляется.
Код

begin
  Button1.Enabled:=false;
  Button2.Visible:=true;
  
  // ******* открытие порта, чтение данных, закрытие порта

  Button1.Enabled:=true;
  Button2.Visible:=false;
end;

Процесс заканчивается когда все данные считаны.  Но может возникнуть ошибка при считывании, или устройство может оказаться не включенным к ком-порту, и при этом в алгоритме считывания данных предусмотрены повторные попытки считать данные увеличив интервалы. Но есть желание чтобы процесс можно было бы прервать в любой момент, кликнув на кнопку STOP, коей является Button2. Ну предположим, задав некую глобальную переменную типа boolean, могу выставить её в true в начале процесса и постоянно проверять в условии цикла, а по клику на буттон2 просто присвоить ей значение false.
Проблема в том, что пока выполняется алгоритм чтения, кнопка2 хоть и выглядит активной, но кликай на неё сколько хочешь, это ни к чему не приводит пока процесс не выполнится до конца.
Внутри цикла процесса чтения стоит application.processmessages, но толку никакого.

Вопрос: Как сделать чтобы кнопка 2 была кликаемой во время выполнения процесса прописанного в онклике кнопки 1?
PM WWW ICQ MSN   Вверх
Данкинг
Дата 9.7.2008, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



Если данные читаются в цикле, то как-то так: завести глобальную переменную... По клику на кнопке "стоп" изменить её значение... В цикле же проверять значение этой переменной после каждой итерации... Если изменилось, то из цикла выходить... И не забываем про application.Processmessages.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Alexzz
Дата 9.7.2008, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Данкинг, это всё уже есть, вопрос не об этом. Вопрос о том, как кнопку "стоп" сделать активной.
PM WWW ICQ MSN   Вверх
Данкинг
Дата 9.7.2008, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



Цитата(Alexzz @  9.7.2008,  23:58 Найти цитируемый пост)
это всё уже есть

Код

application.Processmessages

тоже есть?..


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
THandle
Дата 10.7.2008, 05:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

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



Ну вот работающий пример:
Код


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  b : boolean = false;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.Enabled := false;
  Button2.Enabled := true;
  Button2.Visible := true;
  while not b do
    begin
      Application.ProcessMessages;
      //Some Code
    end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  b := not b;
  Button1.Enabled := true;
end;

end.




А вообще мне кажется, что тут лучше отдельный поток сделать...
PM   Вверх
morpheyushka
Дата 10.7.2008, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зеленый человек
**


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

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



Цитата(THandle @  10.7.2008,  05:34 Найти цитируемый пост)
А вообще мне кажется, что тут лучше отдельный поток сделать... 

 и попробывать прикрутить Антифриз к нему. Должно все получиться!


--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
Rennigth
Дата 10.7.2008, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(THandle @  10.7.2008,  05:34 Найти цитируемый пост)
А вообще мне кажется, что тут лучше отдельный поток сделать... 

Единственное правильное решение.  smile 
ProcessMessages все-равно коряво работает, плюс не будет возмодности во время выполнения закрыть программу.

Добавлено через 45 секунд
Цитата(morpheyushka @  10.7.2008,  11:07 Найти цитируемый пост)
 и попробывать прикрутить Антифриз к нему. 

Причем он сдесь? В индейцев вроде автор не грает...  smile 


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Alexzz
Дата 13.7.2008, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Данкинг @ 9.7.2008,  23:25)
Цитата(Alexzz @  9.7.2008,  23:58 Найти цитируемый пост)
это всё уже есть

Код

application.Processmessages

тоже есть?..

Наверное нынче в моде давать ответ не читая вопрос. Я ещё в первом сообщении написал, что процессмессаджес есть, выполняется внутри цикла. Кнопка стоп выглядит активной, но она мёртвая до окончания чтения.

По поводу отдельного потока, можно поподробней, пожалуйста?
PM WWW ICQ MSN   Вверх
THandle
Дата 14.7.2008, 06:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

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



Alexzz, по нажатию кнопки START создаешь отдельный поток, он читает данные. По нажатию кнопки STOP останавливаем этот поток.

Подробнее о потоках тут:
http://forum.vingrad.ru/forum/topic-60076.html
PM   Вверх
MetalFan
Дата 14.7.2008, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Цитата(morpheyushka @  10.7.2008,  11:07 Найти цитируемый пост)
и попробывать прикрутить Антифриз к нему. Должно все получиться! 

какой такой антифриз?! из индей? и при чем он тут?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Alexzz
Дата 20.7.2008, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вынужден просить прощения. Оказывается это я сам лоханулся и не обратил внимания, что в случае отсутствия поступающих данных программа выполняет совсем другой цикл, в котором то и не было никакого application.processmessages. Всунул его и в тот цикл ожидания данных, точнее прямо в процедуру чтения, туда где начисляется таймаут, и кнопка "стоп" ожила!
PM WWW ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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