Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.07.2012, 10:16
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию Как отследить событие OnClick?

Вообщем по этому событию у меня начинается цикл. Есть (отдельно) функция (написанная мною). В ней две строковых переменные. В них заносятся результаты вычислений из цикла события OnClick.
Если нажать на кнопку повторно, то в строках уже будут значения из двух циклов подряд. Если их обнулять в функции, то занесутся только последние значения вычислений в цикле. Спасает обнуление во время наступления события OnClick'а, но тогда строки приходится описывать как глобальные переменные.

Вопрос: можно-ли в моей функции отслеживать события нажатия на кнопку?
Ответить с цитированием
  #2  
Старый 09.07.2012, 10:23
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

А теперь поподробнее.
Как сейчас в эти
>>В ней две строковых переменные
попадают значения из цикла, написаного в OnClick ?
Ответить с цитированием
  #3  
Старый 09.07.2012, 11:59
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

Цитата:
Сообщение от icWasya
Как сейчас в эти...попадают значения из цикла

Это простая функция с параметром. В параметр заносится результат вычислений из цикла. Строки заполняются из значения параметра.
Ответить с цитированием
  #4  
Старый 09.07.2012, 12:01
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

вы код покажите, а то так долго можно гадать.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 09.07.2012, 12:17
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

Вот код:
Код:
var
  Form1: TForm1;
  a,b,c,i,rez:byte;
  mas:array [1..8,1..8] of byte;
  s1,s2:string;

implementation

{$R *.dfm}


function OutRez(rez:byte):byte;
var
    x,y:byte;
begin
if i>2
  then s1:=s1+IntToStr(rez)
  else s2:=s2+IntToStr(rez);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
s1:=(''); s2:=('');
Label1.Caption:=('');
for i:=5 downto 0 do
  begin
  rez:=0;
  randomize;
  a:=random(2);
  b:=random(2);
  c:=random(2);
  inc(rez,a);inc(rez,b);inc(rez,c);
  if rez<2 then rez:=0
    else rez:=1;
  Label1.Caption:=Label1.Caption+(' ')+IntToStr(rez);

  OutRez(rez);
  end;

ShowMessage('s1 = '+s1+' s2 = '+s2 );
end;

end.
Ответить с цитированием
  #6  
Старый 09.07.2012, 12:55
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.enabled:=false;
{тело процедуры}
Button1.enabled:=true;
end;
__________________
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard
Ответить с цитированием
  #7  
Старый 09.07.2012, 13:40
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

cotseec, не помогло.
Делал так:
Код:
if Form1.Button1.Enabled then
  s1:=(''); s2:=('');
Ответить с цитированием
  #8  
Старый 09.07.2012, 14:01
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Ну судя по коду, строки и так у Вас глобальные.
Так что Вы хотите в конце концов получить.
Например
Делаю так - получается вот это
А хочу получить вот такое
Ответить с цитированием
  #9  
Старый 09.07.2012, 14:25
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

не совсем понятно, что в итоге хочется.....
то, что написал я просто не дает нажать на кнопку до тех пор пока предыдущее нажатие не отработает, т.е. нажали на кнопку, запретили нажатие на кнопку, что-то вычислили, отобразили, разрешили нажатие на кнопку
__________________
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard
Ответить с цитированием
  #10  
Старый 09.07.2012, 16:06
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

Цитата:
Сообщение от icWasya
Ну судя по коду, строки и так у Вас глобальные.
Ну да. А мне бы хотелось их сделать локальными, т.к. в других местах они не нужны.
В строки заносится не одно, а три значения. Тут то и проблема с обнулением. Оно необходимо лишь при повторном запуске цикла.

Последний раз редактировалось R-18Rus, 09.07.2012 в 16:09.
Ответить с цитированием
  #11  
Старый 09.07.2012, 16:30
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Кстати, переменная цикла i у Вас то же глобальная, чего все книжки по паскалю настоятельно не рекомендуют делать.
Если S1 и S2 сделать локальными внутри функции OutRes, то к ним нельзя будет достучаться ни до, ни после вызова этой функции.
А если хотите сделать всё по-правилам, то нужно писать класс, примерно такой.

Код:
type 
  TClassRez = class
private
  FS1,FS2:String;
public
  procedure Clear;
  procedure OutRez(I:Integer;Rez:Byte);
public
  property S1:String read FS1;
  property S2:String read FS2;
end;

Код:
procedure TClassRez.Clear;
begin
  FS1:='';
  FS2:='';
end;

procedure TClassRez.OutRez(I:Integer;Rez:Byte);
begin
  if i>2  then 
    s1:=s1+IntToStr(rez)   
  else 
    s2:=s2+IntToStr(rez); 
end;

и соответственно

Код:
procedure TForm1.Button1Click(Sender: TObject); 
var
  ClassRTez: TClassRes;
begin
  randomize;   // <<==-- нельзя делать внутри цикла
  ClassRTez:= TClassRes.Create; (* создаём, строки автоматически становятся пустыми*)
  Label1.Caption:=''; 
  for i:=5 downto 0 do  
  begin  
    rez:=0;   
    a:=random(2);   b:=random(2);   c:=random(2);   
    inc(rez,a);inc(rez,b);inc(rez,c);
    if rez<2 then 
      rez:=0    
    else 
      rez:=1;   
   ClassRez.OutRez(i,Rez);
  Label1.Caption:=Label1.Caption+' '+IntToStr(rez);     
  end;   
  ShowMessage('s1 = '+ClassRez.s1+' s2 = '+ClassRez.s2 ); 
  ClassRez.Free; //<<==-- уничтожаем
end; 

Для дальнеёшего развития код цикла тоже можно сделать методом класса
Ответить с цитированием
  #12  
Старый 10.07.2012, 09:17
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

icWasya, спасибо за ответ. Но я им пользоваться не буду. Классы я не знаю, ещё не изучали. Поэтому примерно я понял что как, а сделать сам не смогу.

Я тут подумал, что обнулить можно при условии "if i=5". Попробую пока так.
Ответить с цитированием
  #13  
Старый 10.07.2012, 17:42
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

Цитата:
Сообщение от icWasya
Кстати, переменная цикла i у Вас то же глобальная, чего все книжки по паскалю настоятельно не рекомендуют делать.
Если S1 и S2 сделать локальными внутри функции OutRes, то к ним нельзя будет достучаться ни до, ни после вызова этой функции.
А если хотите сделать всё по-правилам, то нужно писать класс, примерно такой.

Разве переменная, описанная в процедуре локально, не считается глобальной для процедуры, вызванной внутри нее?
В Паскале по крайней мере так (вроде) отрабатывало.

В таком случае, объявить s1 и s2 локальными для OnClick, и в OutRez они будут доступны.
Ответить с цитированием
  #14  
Старый 10.07.2012, 19:35
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

Цитата:
Разве переменная, описанная в процедуре локально, не считается глобальной для процедуры, вызванной внутри нее?
это если так объявлены
Код:
procedure TForm1.Button1Click(Sender: TObject);

  procedure OutRez
  begin
  end;

begin
  OutRez
end;
Ответить с цитированием
Этот пользователь сказал Спасибо Pyro за это полезное сообщение:
nixel (12.07.2012)
  #15  
Старый 12.07.2012, 09:22
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

оу, спасибо. подзабыл этот момент.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:12.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter