|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Как отследить событие OnClick?
Вообщем по этому событию у меня начинается цикл. Есть (отдельно) функция (написанная мною). В ней две строковых переменные. В них заносятся результаты вычислений из цикла события OnClick.
Если нажать на кнопку повторно, то в строках уже будут значения из двух циклов подряд. Если их обнулять в функции, то занесутся только последние значения вычислений в цикле. Спасает обнуление во время наступления события OnClick'а, но тогда строки приходится описывать как глобальные переменные. Вопрос: можно-ли в моей функции отслеживать события нажатия на кнопку? |
#2
|
|||
|
|||
А теперь поподробнее.
Как сейчас в эти >>В ней две строковых переменные попадают значения из цикла, написаного в OnClick ? |
#3
|
||||
|
||||
Цитата:
Это простая функция с параметром. В параметр заносится результат вычислений из цикла. Строки заполняются из значения параметра. |
#4
|
||||
|
||||
вы код покажите, а то так долго можно гадать.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#5
|
||||
|
||||
Вот код:
Код:
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
|
||||
|
||||
Код:
procedure TForm1.Button1Click(Sender: TObject); begin Button1.enabled:=false; {тело процедуры} Button1.enabled:=true; end; Понять, что хочет заказчик - бесценно, ведь он платит MasterCard |
#7
|
||||
|
||||
cotseec, не помогло.
Делал так: Код:
if Form1.Button1.Enabled then s1:=(''); s2:=(''); |
#8
|
|||
|
|||
Ну судя по коду, строки и так у Вас глобальные.
Так что Вы хотите в конце концов получить. Например Делаю так - получается вот это А хочу получить вот такое |
#9
|
||||
|
||||
не совсем понятно, что в итоге хочется.....
то, что написал я просто не дает нажать на кнопку до тех пор пока предыдущее нажатие не отработает, т.е. нажали на кнопку, запретили нажатие на кнопку, что-то вычислили, отобразили, разрешили нажатие на кнопку Понять, что хочет заказчик - бесценно, ведь он платит MasterCard |
#10
|
||||
|
||||
Цитата:
В строки заносится не одно, а три значения. Тут то и проблема с обнулением. Оно необходимо лишь при повторном запуске цикла. Последний раз редактировалось R-18Rus, 09.07.2012 в 16:09. |
#11
|
|||
|
|||
Кстати, переменная цикла 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
|
||||
|
||||
icWasya, спасибо за ответ. Но я им пользоваться не буду. Классы я не знаю, ещё не изучали. Поэтому примерно я понял что как, а сделать сам не смогу.
Я тут подумал, что обнулить можно при условии "if i=5". Попробую пока так. |
#13
|
|||
|
|||
Цитата:
Разве переменная, описанная в процедуре локально, не считается глобальной для процедуры, вызванной внутри нее? В Паскале по крайней мере так (вроде) отрабатывало. В таком случае, объявить s1 и s2 локальными для OnClick, и в OutRez они будут доступны. |
#14
|
|||
|
|||
Цитата:
Код:
procedure TForm1.Button1Click(Sender: TObject); procedure OutRez begin end; begin OutRez end; |
Этот пользователь сказал Спасибо Pyro за это полезное сообщение: | ||
nixel (12.07.2012)
|
#15
|
|||
|
|||
оу, спасибо. подзабыл этот момент.
|