Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2013, 13:32   #1
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию 3х мерный массив координат

в общем рисую на канве изображения сетку из квадратиков 9*9, каждый квадратик 16*16, есть 2 массива Rectangles_x[1..9, 1..9, 1..16] и Rectangles_y[1..9, 1..9, 1..16], первые 2 части массивов - номера строки и столбца, третья - координаты по x и y относительно Image соответственно, в общем я слегка запутался во всем этом деле... если я завожу 3 цикла в которых рисую и попутно пытаюсь записать координаты в 3 часть массивов, то я никак не врублюсь как же получиться что вложенный цикл выходит больше того что выше...
Код:
var
  Form1: TForm1;
  Rectangles_x: array [1..9, 1..9, 1..16] of integer;
  Rectangles_y: array [1..9, 1..9, 1..16] of integer;

implementation

{$R *.dfm}

{$R imgs.RES}

Procedure PaintField;
const s = 0;   // начало рисования таблицы
      n = 16;  // размер квадратов
Var x1, x2, y1, y2, i, j, u: integer;
begin
with Form1.Image1.Canvas do
begin
Brush.Color:= clBtnFace;
LineTo(145,0);
LineTo(145,161);
LineTo(0,161);
LineTo(0,0);
end;

x1:= s; y1:= s; x2:= n; y2:= n;
for i:= 1 to 9 do
  begin
    for j:= 1 to 9 do
      begin
      for u:= 1 to 16 do               //вот тут  
      begin                            //основные
      Rectangles_x[i, j, u]:= x1;      //сомнения
      Rectangles_y[i, j, u]:= y1;      //возникают
      end;                             //(добавлено позже)
      Form1.Image1.Canvas.Rectangle(x1, y1, x2, y2);
      x1:= x2;
      x2:= x2 + n;
      end;
    x1:= s;
    x2:= n;
    y1:= y2;
    y2:= y2 + n;
  end;

end;

Последний раз редактировалось NewLamer&Programer; 06.01.2013 в 13:59.
NewLamer&Programer вне форума Ответить с цитированием
Старый 06.01.2013, 16:38   #2
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

HELP !!!!!
NewLamer&Programer вне форума Ответить с цитированием
Старый 06.01.2013, 16:48   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

зачем Вы поднимаете тему? Надеетесь, так быстрее получите результат?..

попробовал Ваш код.
рисует прямоугольник заполненный клетками 9X9
что не так?

p.s.вместо двух массивов я бы рекомендовал использовать один,
типа TPoint

Код:
var
  Rectangles: array [1..9, 1..9, 1..16] of TPoint;
...
      Rectangles[i, j, u].x:= x1;
      Rectangles[i, j, u].y:= y1;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.01.2013, 18:40   #4
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

Serge_Bliznykov, да надеюсь

Код:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Var i,j,u: integer;
begin
for i:= 1 to 9 do
for j:= 1 to 9 do
for u:= 1 to 16 do
if (x in Rectangles[i, j, u].x) and (y in Rectangles[i, j, u].y)
then MessageBox(handle,PChar('Ваше сообщение'+#13#10), PChar('Заголовок сообщения'), 48);
end;
вот как то так (MB для примера...), мне нужно ловить в какую точку тыкнул мышкой на сетке (а точнее в какой квадратик) и исходя из этого что нибудь делать, но насколько я сам же понимаю мой код делает что то не то...
з.ы. да пожалуй можно и TPoint, не знал о таком спасибо

Последний раз редактировалось NewLamer&Programer; 06.01.2013 в 19:40.
NewLamer&Programer вне форума Ответить с цитированием
Старый 07.01.2013, 02:01   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
x in Rectangles[i, j, u].x

y in Rectangles[i, j, u].y
я, так же, как и компилятор Delphi, не могу понять, что Вы хотите сказать данной записью...

так, что ли??

Код:

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Caption := 'X = '+IntToStr(x)+' y= '+IntToStr(y)+
    ' Вы нажали на квадратик в '+ IntToStr(trunc(y div 16)+1)+'-й строке  '+
     IntToStr(trunc(x div 16)+1)+'-м столбце';
end;

Последний раз редактировалось Serge_Bliznykov; 07.01.2013 в 02:07.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.01.2013, 11:42   #6
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

смотрите:
Rectangles[i, j, u].x
в u будет записана координата x - это понятно? (или y, если это массив Rectangles[i, j, u].y) таких координат 16, т.к. сторона квадрата 16, соответственно по каждому квадрату 16 u, потом в Image1MouseDown я пишу - если X совпадает с одной из u то мне нужно будет взять координаты этого квадрата (исходя только из номера столбца и строки, x и y мне больше не нужны) и где то использовать потом (по нажатию на Image в конкретной клетке что то должно происходить)
да, и конечно y тоже должно совпадать...
п.с. может конечно для всей этой фигни существует готовый компонент, но я о таком не слышал

Последний раз редактировалось NewLamer&Programer; 07.01.2013 в 11:45.
NewLamer&Programer вне форума Ответить с цитированием
Старый 07.01.2013, 13:53   #7
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

также возникло еще несколько вопросов другого характера, напишу их уж в этой же теме:

1. Моя попытка устроить рекурсию... знаю о ней только по наслышке короче выдает ошибку: "Left side cannot be assigned to" в месте присвоения AEnabled:= True;

Код:
Function AEnabled: Boolean;
begin
if AEnabled 
then Result:= True
else Result:= False;
end;

...

AEnabled:= True;
2. здесь что то типа секундомера надо сделать, в реале же при
Timer1.Enabled:= True; он заполняет все лабелы какими то левыми числами о_О
з.ы. да кстати при включении\выключении таймера ATime будет обнуляться? просто я даже не знаю как его тут обнулить... ведь оно должно считать...

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
Var ATime: integer;
begin
ATime:= ATime + 1;

if ATime<10 then
Form1.Label6.Caption:= IntToStr(ATime); //секунды

if (ATime>9) and (ATime<60) then
begin
Form1.Label4.Caption:= IntToStr(ATime div 10); //секунды
Form1.Label6.Caption:= IntToStr(ATime mod 10); //десятки секунд
end;

if ATime>59 then
begin
Form1.Label3.Caption:= IntToStr(ATime div 60); //минуты
Form1.Label4.Caption:= IntToStr((ATime - (ATime div 60)) div 10); //десятки секунд
Form1.Label6.Caption:= IntToStr((ATime - (ATime div 60)) mod 10); //секунды
end;

end;

Последний раз редактировалось NewLamer&Programer; 07.01.2013 в 20:31.
NewLamer&Programer вне форума Ответить с цитированием
Старый 08.01.2013, 11:46   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
по нажатию на Image в конкретной клетке что то должно происходить
пример моего код из пост #5 попробовали? Не то?

извините, я просто не могу представить, что за трёхмерный массив Вы пытаетесь создать и обработать.. нам бы схему аль чертёж, мы б затеяли вертёж... Нарисуйте иллюстрацию, которая отображает, что Вы хотите получить...


теперь по поводу рекурсии. Чтобы понимать рекурсию, нужно сначала понимать рекурсию.
Вы же пытаетесь использовать рекурсию НЕ понимая, что это такое!

ошибки у Вас две.
первая. Мелкая. О которой Вас уведомляет компилятор. Она к рекурсии отношения НЕ ИМЕЕТ.
представьте, у Вас есть ФУНКЦИЯ, которая вычисляет (например!) квадратный корень.
назовём её SQRT.
она где-то описана так function SQRT( real ) : real;
Вы пытаетесь написать так:

SQRT(2) := 0;

что должен сделать компилятор?! Он НЕ МОЖЕТ присвоить значению функции (результату) Ваше число. О чём он и скажет "Left side cannot be assigned to" - "нельзя присвоить левой части выражения"

ну, формально эту ошибку можно обойти так:

Код:
Function AEnabled: Boolean;
begin
if AEnabled
  then Result:= True
  else Result:= False;
end;

begin
  if AEnabled then WriteLn('True') 
                 else  WriteLn('False');
НО!!! Я не рекомендую запускать этот код. Потому как вход в функцию AEnabled есть, а выхода - нет. Она будет рекурсивно вызывать себя, пока не исчерпает все ресурсы (и приложение либо повиснет, либо выдаст ошибку об исчерпании стека)...

Что Вы вообще пытаетесь добиться такой функцией?!!!! Вообще не могу понять! ;(

по поводу таймера. На форуме эта тема уже была расмотрена и не раз.
Если вкратце - нужно использовать или системный таймер, или делать переменную ATime ГЛОБАЛЬНОЙ переменной (или, лучше, свойством класса, например в Form1 )
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.01.2013, 15:37   #9
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

1. пробовал, не то
если честно (иллюстрация) я пытаюсь сделать сапера (системная виндовская игрушка)

2. просто скажите мне как мне сделать функцию типа Enabled, которая будет что то включать и выключать(по присвоении Enabled:= True/False), можно без рекурсии

3. что такое системный таймер не знаю(не sleep() часом?), что такое свойство класса тоже плохо себе представляю (примерчик бы)
проблему решил сделав переменную ATime глобальной спасибо

Последний раз редактировалось NewLamer&Programer; 08.01.2013 в 16:12.
NewLamer&Programer вне форума Ответить с цитированием
Старый 08.01.2013, 16:17   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,318
По умолчанию

Вот заготовочка сапера (может натолкнет на какие-нибудь мысли). Захотелось тоже написать
Вложения
Тип файла: zip сапер - заготовка.zip (5.1 Кб, 7 просмотров)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
2х мерный массив delphi sofiya Помощь студентам 1 22.02.2011 10:26
2-мерный массив Golovastik PHP 1 30.06.2010 23:13
N-мерный массив в c++ builder vasuc Qt и кроссплатформенное программирование С/С++ 0 27.02.2010 16:54
N мерный массив Лубышев Общие вопросы Delphi 3 08.05.2009 12:12
2х мерный массив - помощь пукарь Паскаль, Turbo Pascal, PascalABC.NET 15 28.10.2008 16:13