![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Вообщем по этому событию у меня начинается цикл. Есть (отдельно) функция (написанная мною). В ней две строковых переменные. В них заносятся результаты вычислений из цикла события 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; |
|
#7
|
||||
|
||||
|
cotseec, не помогло.
Делал так: Код:
if Form1.Button1.Enabled then
s1:=(''); s2:=(''); |
|
#8
|
|||
|
|||
|
Ну судя по коду, строки и так у Вас глобальные.
Так что Вы хотите в конце концов получить. Например Делаю так - получается вот это А хочу получить вот такое |
|
#9
|
||||
|
||||
|
не совсем понятно, что в итоге хочется.....
то, что написал я просто не дает нажать на кнопку до тех пор пока предыдущее нажатие не отработает, т.е. нажали на кнопку, запретили нажатие на кнопку, что-то вычислили, отобразили, разрешили нажатие на кнопку |
|
#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
|
|||
|
|||
|
оу, спасибо. подзабыл этот момент.
|