Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Проблема с массивом


Автор: darkida 3.2.2010, 06:39
Вот он код. 

Код

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  var
  i: integer;
begin
x0:=Mouse.CursorPos.X-form1.left-4;
y0:=Mouse.CursorPos.Y-form1.top-30;
label3.Caption:='x='+inttostr(x0)+'  '+'y='+inttostr(y0);
for i:=1 to 4 do
if (x0> xx[i]) and (x0<(xx[i]+30)) and (y0>yy[i]) and (y0<(yy[i]+20)) then begin
memo1.Lines[0]:=inttostr(i);
button4.Visible:=true;
button5.Visible:=true;
end else begin
memo1.Lines[0]:=' ';
button4.Visible:=false;
button5.Visible:=false;
end;
end;


Как видно из кода, что при клике на какой-то объект должно проходить событие. Но почему откликается только на последний элемент массива. Тоесть если сделать for 1 to 3, то будет откликаться только 3. если 4 то только 4-ый. В чем проблема? В том что массив указан глобально, а не динамически? Но мне нужно чтоб он был вначале.
Помогите пожалуйста. 

Автор: kami 3.2.2010, 08:46
Цитата(darkida @  3.2.2010,  06:39 Найти цитируемый пост)
Как видно из кода, что при клике на какой-то объект должно проходить событие.

Нет, из кода этого не видно. Для того, чтобы сказать это со 100% уверенностью, нужно видеть dfm и объявление класса формы.
Цитата(darkida @  3.2.2010,  06:39 Найти цитируемый пост)
Но почему откликается только на последний элемент массива. Тоесть если сделать for 1 to 3, то будет откликаться только 3. если 4 то только 4-ый. В чем проблема?

Что значит "откликается на элемент массива"? Это как?
Проявляя недюжинный потенциал телепатии, и совершенно не понимая кода  smile , скажу, что проблема здесь:
Цитата(darkida @  3.2.2010,  06:39 Найти цитируемый пост)
memo1.Lines[0]:

И проблема именно в [0].

Автор: darkida 3.2.2010, 09:29
Цитата

Проявляя недюжинный потенциал телепатии, и совершенно не понимая кода  smile , скажу, что проблема здесь:  memo1.Lines[0]:

Уважаемый kami , на этот раз ваш потенциал телепатии оказался не верным.  smile . Я проверил, это не влияет. 
Цитата

Что значит "откликается на элемент массива"? Это как?

Ой не  массива, а цикла. Извиняюсь.



Автор: darkida 3.2.2010, 10:31
ооо нашел ошибку. 

я else не правильно писал вот здесь
Код

for i:=1 to 4 do   begin
if (x0> xx[i]) and (x0<(xx[i]+30)) and (y0>yy[i]) and (y0<(yy[i]+20)) then begin
memo1.Lines[0]:=inttostr(i);
button2.Visible:=true;
button3.Visible:=true;
end else begin
memo1.Lines[0]:=' ';
stavka:=0;
button2.Visible:=false;
button3.Visible:=false;
end;
end;

если else убрать то все работает. 
Хотя так и не понял почему.

Объясните как правильно прописать здесь else. 

Автор: shmelina 6.2.2010, 23:09
Как же тяжело смотреть на неотформатированный код. Вы бы хоть нас пожалели, если вам себя не жалко.

Автор: xfoby 9.2.2010, 01:20
shmelina,
Код

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  i: integer;
begin
  x0 := Mouse.CursorPos.X - Form1.Left - 4;
  y0 := Mouse.CursorPos.Y - Form1.Top - 30;
  Label3.Caption := 'x=' + IntToStr(x0) + '  ' + 'y=' + IntToStr(y0);
  for i := 1 to 4 do
    if (x0 > xx[i]) and (x0 < (xx[i] + 30)) and (y0 > yy[i]) and (y0 < (yy[i] + 20)) then
    begin
      Memo1.Lines[0] := IntToStr(i);
      Button4.Visible := true;
      Button5.Visible := true;
    end
    else
    begin
      Memo1.Lines[0] := ' ';
      Button4.Visible := false;
      Button5.Visible := false;
    end;
end;


У тебя "откликаются" все итерации цикла, просто этого не видно (что судя по всему и имел ввиду kami), так как в каждой итерации нулевая строка перезаписывается и значения видимости кнопок меняются. Поставь вместо 
Код

Memo1.Lines[0] := IntToStr(i);
...
Memo1.Lines[0] := ' ';

хотя бы
Код

Memo1.Lines.Add(IntToStr(i));
...
Memo1.Lines.Add(' ');

И увидишь, что всё "откликается" smile


Немного ещё:
Код

x0:=Mouse.CursorPos.X-form1.left-4;
y0:=Mouse.CursorPos.Y-form1.top-30;

такие вещи непростительны, ибо в разных визуальных стилях ширина бордеров и высота заголовка разные. К тому же у тебя в параметрах процедуры координаты даны.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)