проблемы с массивом TImage

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
eagle_ua
Сообщения: 10
Зарегистрирован: 22 ноя 2005, 16:07

создаю объект типа TImage при каждом нажатии левой кнопки мыши на форме(предварительно щёлкнув на кнопке PAINT),
нажав кнопку DRAG перемещаю каждый выбранный рисунок по форме, но тут то и возникает загвоздочка,
какой бы рисунок я не выбирал перемещение происходит в обратном порядке их появления на форме.
Как можно сделать так чтобы перемещался тот рисунок на которы я клацаю мышкой.
Заранее спасибо.
:?:

Код: Выделить всё


(занести на форму 2 кнопки и поменять caption на PAINT и DRAG соответственно, так же разместить 1 EDIT,
и обязательно 1 пустой Image)

unit Unit1;
interface

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

type
  TForm1 = class(TForm)
    a0: TImage;
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure a0MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure a0MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure a0MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
       procedure FormCreate(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  X0,Y0:integer;
  flag:boolean;
  ramka:Trect;
  a:array of TImage;
  z,n:integer;
  i:byte;

implementation

uses StrUtils;

{$R *.dfm}


//процедуры для пустого Imega
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   i:=i-1;//если этого не поставить то возникает ошибка, т.к значение і больше, чем должно быть
  if      button = mbLeft      then
             begin
	X0 := X;
	Y0 :=Y;
   	ramka := a[i].BoundsRect;
                     flag := true;

    end
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
   if flag then
begin
Canvas.DrawFocusRect(ramka);
with   ramka  do
              begin
	left := left+X-X0;
	right := right+X-X0;
 	top := top+Y-Y0;
	bottom := bottom+Y-Y0;
	X0 :=X;
	Y0:=Y;
              end;
Canvas.DrawFocusRect(ramka);
end;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     Canvas.DrawFocusRect(ramka);
  with   a[i] do
                begin
         ramka.left:=ramka.left+X-X0;
	 ramka.top:=ramka.top+Y-Y0;
	SetBounds(ramka.left,ramka.top,Width,Height);
 BringToFront;
                end;
    flag := false;
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
z:=0;
end;


procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
If z=1 then
begin
   setlength(a,100);
   i:=n;
inc(i);
a[i]:=TImage.Create(Form1);
a[i].Parent:=Form1;
a[i].Left:=X;
a[i].Top:=Y;
a[i].Transparent:=true;
a[i].Picture.LoadFromFile('but1.bmp');
a[i].AutoSize:=true;
a[i].Tag:=i;
a[i].Name:='server'+IntToStr(i);
edit1.Text:=a[i].Name;
n:=i;
end;

end;
//для кнопки PAINT
procedure TForm1.Button1Click(Sender: TObject);
begin
z:=1;
end;

//для кнопки DRAG
procedure TForm1.Button2Click(Sender: TObject);
begin
z:=2;

  for i:=1 to n do
  begin
a[i].OnMouseDown:=Image1MouseDown;
a[i].OnMouseMove:=Image1MouseMove;
a[i].OnMouseUp:=Image1MouseUp;
  end;
 end;
end.
Ы!
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

1. Нет начальной инициализации N
2. При клике на форме ты устанавливаешь I := N и соответственно работаешь с последним добавленным элементом. В событии Image1MouseUp используй вместо a

Код: Выделить всё

(Sender) as TImage
это позволит обратиться к тому по кому кликнули
3.

Код: Выделить всё

a[i].OnMouseDown:=Image1MouseDown; 
a[i].OnMouseMove:=Image1MouseMove; 
a[i].OnMouseUp:=Image1MouseUp; 
лучше делать при создании объекта
Изображение
eagle_ua
Сообщения: 10
Зарегистрирован: 22 ноя 2005, 16:07

:D :D :D :D :D спасибо :D :D :D :D :D
Ы!
eagle_ua
Сообщения: 10
Зарегистрирован: 22 ноя 2005, 16:07

всё зашибись,заработало.

Инициализация N: по умолчанию присваивается 0;

i:=N делаю для того, чтобы при повторном нажатии на кнопку PAINT отсчёт вёлся не с последнего элемента --i--,а со следующего(если этого не сделать -заматюкается);

Так же (Sender as TImage) необходимо дописать в Image1MouseDown

:D
Ы!
eagle_ua
Сообщения: 10
Зарегистрирован: 22 ноя 2005, 16:07

а ты не знаешь случайно как сделать следующее(или хотя бы в каком направлении рыть надо):
На этой же форме допустим есть 2 Image, и мне нужно соединить их линией используя мышку
Ы!
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

eagle_ua, я вапче не обчень понял смысл кнопок PAINT и DRAG... Да и если разбираться - то и массив этот нифик не нужен, ибо всё есть в коллекции Components формы...
Мышкой просто выбирать шейпы будешь? или линию рисовать?
Изображение
eagle_ua
Сообщения: 10
Зарегистрирован: 22 ноя 2005, 16:07

Просто мне нужно замутить прогу с помощью которой можно будет нарисовать комьютерную сетку. А кнопки DRAG и PAINT - что бы выбрать нужный компонент. А линию хотелось бы так, чтобы на одном Image мышкой клацнул, потом на другом - и опа - линия нарисовалась
:?
Ы!
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

такие вещи можно рисовать с помощью MS Visio - она как раз заточена для всяких схем ;)
по поводу соединительной линии подумалось... любо делаем объект-наследник от того же TShape чтобы хранить в нём доп. св-во (лучше), либо просто каждый раз вычисляем (хуже) некий центр фигуры. Линией соединяем центры двух указанных Шейпов, располагая сами Шейпы над линией - тем самым выполнив отрезку лишнего...
Изображение
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Вводим 2 состояния: Обычное и Редактирование (для храниения состояния нужна глобальная на уровне экземпляра формы переменная, например, в свойство формы)

* На OnClick Image-а
- в обычном состоянии: запоминаем X1(i),Y1(i) и переходим в состояние редактирования
- в состоянии редактирования запоминаем X2(i),Y2(i) и увеличиваем i на 1, где i - это номер соединительной линии. (Линий-то мы много можем понарисовать). И вызываем перерисовку того, на ком лежат Image-ы
* На OnMouseMove того, на ком лежат Image-ы, в состоянии редактирования перерисовываем линию X1(i),Y1(i)-X,Y
* На нажатие ESC выходим из состояния редактирования.
* На OnPain того, на ком лежат Image-ы в цикле от 0 до i-1 рисуем все линии.


PS
Коллеги! Давайте впредь отдельный вопрос в отдельной теме обсуждать. Если темы некоторым образом связаны, то в первое сообщение темы можно вставить цитату и ссылку на сообщение из которой данная темы выросла.
Ответить