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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по алгоритмике, в 2х словах не обьяснить надо смотреть 
:(
    Опции темы
DonPager
Дата 4.10.2007, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Колдырь
**


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

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



Сначала хотел запостить в алгоритмах но думаю что здесь уместнее
Вопрос такой есть код:
Код

  TCustomStation = class(TGroupBox)
  private
...
     FStatePSH :boolean;
...
     FbtnPSH :TCheckBox;
...
     procedure SetPSH(const Value :boolean);
....
  protected
     procedure OnPSHClick(Sender:TObject);
...
  public
     property StatePSH :boolean  read FStatePSH    write SetPSH;
...
  end;
...
implementation
...
procedure TCustomStation.SetPSH(const Value: boolean);
begin
 FStatePSH := Value;
 if FbtnPSH <> nil then begin
   FbtnPSH.Checked := FStatePSH;
   if FbtnPSH.Checked then FbtnPSH.Font.Color := clRed else FbtnPSH.ParentFont := true;
 end;
end;
...
procedure TCustomStation.OnPSHClick(Sender: TObject);
begin
  StatePSH := not FStatePSH;
  if FStatePSH then SendCommand(CODE_PSH,#$00) else SendCommand(CODE_PSH,#$FF);
end;
...

В ответ на эту команду приходит STATUS исполнения его я и обрабатываю
Код
if STATUS=OTKA3 then StatePSH = false
 эта команда вызывает рекурсивное зацикливание - так вот как бы мне изменить условия
чтобы всё работало и при этом если чекбокс чекнутый то он становилсябы красным?


--------------------
кодер + лодырь = колдырь
PM MAIL ICQ Skype GTalk   Вверх
Rennigth
Дата 4.10.2007, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

  TCustomStation = class(TGroupBox)
  private
     FLockChecked: Boolean;
     FStatePSH :boolean;
     FbtnPSH :TCheckBox;
     procedure SetPSH(const Value :boolean);
  protected
     procedure OnPSHClick(Sender:TObject);
  public
     property StatePSH :boolean  read FStatePSH    write SetPSH;
  end;

implementation

procedure TCustomStation.SetPSH(const Value: boolean);
begin
  FLockChecked  := True;
  try  
     FStatePSH := Value;
     if FbtnPSH <> nil then 
     begin
       FbtnPSH.Checked := FStatePSH;
       if FbtnPSH.Checked then 
         FbtnPSH.Font.Color := clRed else FbtnPSH.ParentFont := true;
      end;
  finally
    FLockChecked  := False;
  end;
end;

procedure TCustomStation.OnPSHClick(Sender: TObject);
begin
  if not FLockChecked then
  begin
    StatePSH := not FStatePSH;
    if FStatePSH then SendCommand(CODE_PSH,#$00) else SendCommand
(CODE_PSH,#$FF);
  end;
end;



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

Добавлено @ 15:06
А еще лутше так:
Код


procedure TCustomStation.SetPSH(const Value: boolean);
begin
  if FLockChecked then
    Exit;

  FLockChecked  := True;
  try
     FStatePSH := Value;
     if FbtnPSH <> nil then
     begin
       if FStatePSH then
       begin
         FbtnPSH.Checked := FStatePSH;
         SendCommand(CODE_PSH,#$00)
       end
       else
       begin
         FbtnPSH.Checked := False;
         SendCommand(CODE_PSH,#$FF);
       end;

       if FbtnPSH.Checked then
         FbtnPSH.Font.Color := clRed
       else
         FbtnPSH.ParentFont := True;
      end;
  finally
    FLockChecked  := False;
  end;
end;

procedure TCustomStation.OnPSHClick(Sender: TObject);
begin
  StatePSH := not FStatePSH;
end;


Это сообщение отредактировал(а) Rennigth - 4.10.2007, 15:07


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


Колдырь
**


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

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



т.е. добавить флажок на время выполнения процедуры присвоения, чтобы запретить рекурсию? smile 
всёрно спасибо  smile 
 smile ... а может как нить покрасивше? чтобы вообще рекурсии не возникало


--------------------
кодер + лодырь = колдырь
PM MAIL ICQ Skype GTalk   Вверх
Rennigth
Дата 4.10.2007, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



DonPager, так уж в VCL-ом CheckBox-е сделано. 
Вот код который вызывается при клике:
Код

  if FState <> Value then
  begin
    FState := Value;
    if HandleAllocated then
      SendMessage(Handle, BM_SETCHECK, Integer(FState), 0);
    if not ClicksDisabled then Click;
  end;

т.е. Click будет вызываться если не установлен флаг ClicksDisabled, а он находиться в области видимости protected. Как вариант, можно этой проперте увеличить область видимости, примерно так, (прописать вначале модуля):
Код

  TCheckBox = class(StdCtrls.TCheckBox)
  public
    property ClicksDisabled;
  end;

И при необходимости устанавливать ее.



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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