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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.11.2010, 02:57
Аватар для Daemonghost
Daemonghost Daemonghost вне форума
Прохожий
 
Регистрация: 16.11.2010
Сообщения: 4
Репутация: 10
По умолчанию Динамическое создание массива TImage и обработчик OnMouseDown

Друзья!
Моя программа использует динамическое создание 2-мерного массива TImage.
Пытаюсь оформить универсальный обработчик OnMouseDown для созданных Image так, чтобы событие для Image[1,1] отличалось от события с image[1,2].

можете посоветовать грамотный способ для этой организации?
__________________
а есть ли способ задампить жизнь и дизассемблировать вредную привычку - программирование?... если - да, то стоит изучать ассемблер...
Ответить с цитированием
  #2  
Старый 21.11.2010, 03:06
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Выводить как одну картинку, по координатам щелчка выяснять по какой из картинок щелкнули и делать соотв. действия.

Пусть у нас двумерный массив картинок размером 20x20. сам массив - 10х10 . Тогда:
Код:
procedure TForm1.MouseDown(Sender : TObject; X, Y : Integer);
var
  I, J : Integer;
begin
  I := (X div 20) + 1; // +1 - если массив с 1, если с 0 - то убрать.
  J := (Y div 20);

  // теперь по координатам картинки в массиве можно что-то делать.
end;
Ответить с цитированием
  #3  
Старый 21.11.2010, 09:23
Аватар для Daemonghost
Daemonghost Daemonghost вне форума
Прохожий
 
Регистрация: 16.11.2010
Сообщения: 4
Репутация: 10
По умолчанию

к сожалению, данный вариант не подходит. дабы при щелчке на image X и Y объявляются как координаты места на картинке, на которую мы нажали. следовательно, в данном случае I = J = 0 {X,Y<20}.

Я пытаюсь организовать по массиву Img[a,b].. и где нибудь в обработчике нужен анализатор этих пересенных.
Есть идея в стороннем обработчике задать их зарание, перед выполнением OnMousDown, но при данном случае, могу сталкнуться с такой ситуацией, что задаем одну картинку, а можем нажать на другую.
__________________
а есть ли способ задампить жизнь и дизассемблировать вредную привычку - программирование?... если - да, то стоит изучать ассемблер...

Последний раз редактировалось Daemonghost, 21.11.2010 в 09:46.
Ответить с цитированием
  #4  
Старый 21.11.2010, 09:33
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
unit Unit1;

interface

uses
  ExtCtrls,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    FImage: array [0..4, 0..4] of TImage;
    procedure ImageMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  AImage: TImage;
  i, j: Integer;
begin
  for i:=0 to 3 do
    for j:=0 to 3 do
    begin
      AImage:=TImage.Create(Self);
      AImage.Parent:=Self;
      AImage.Width:=20;
      AImage.Height:=20;
      AImage.Left:=i*AImage.Width;
      AImage.Top:=j*AImage.Height;
      AImage.OnMouseDown:=ImageMouseDown;
      // сохраним индексы массива картинки
      AImage.Tag:=MakeWord(i, j);
      AImage.Canvas.Rectangle(0, 0, AImage.Width, AImage.Height);
      FImage[i, j]:=AImage;
    end;
end;

procedure TForm1.ImageMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  AImage: TImage;
  i, j: Integer;
begin
  AImage:=TImage(Sender);
  // i, j - содержат индексы картинки в массиве
  i:=HIBYTE(AImage.Tag);
  j:=LOBYTE(AImage.Tag);
  Caption:='i, j = '+IntToStr(i)+', '+IntToStr(j);
end;

end.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 21.11.2010, 10:17
Аватар для Daemonghost
Daemonghost Daemonghost вне форума
Прохожий
 
Регистрация: 16.11.2010
Сообщения: 4
Репутация: 10
По умолчанию

очень благодарен! тему можно закрыть!
__________________
а есть ли способ задампить жизнь и дизассемблировать вредную привычку - программирование?... если - да, то стоит изучать ассемблер...
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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