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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2014, 09:52   #1
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию Проблемы при перемещении картинок которые созданы динамически.

Создаю динамически Image на ScrollBox1. Картинки создаются и перемещаются, но при повторном обращении к компоненту выскакивает ощибка.Скорей всего обращаюся к компоненту которого нет. Вот мой код
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    ScrollBox1: TScrollBox;
    Image2: TImage;
    procedure Image1Click(Sender: TObject);
    procedure Image2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure MyMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
    procedure MyMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
    procedure MyMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);

  end;

var
  Form1: TForm1;
   x0,y0:integer;
 move:boolean;
  legend:  array[0..100] of TImage;
   t: integer;

implementation

{$R *.dfm}

procedure TForm1.MyMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if button<>mbLeft then move:=false //если нажали не левой кнопкой, то перемещать не будем!
 else begin
 move:=true;
 x0:=x; //запоминаем начальные координаты
 y0:=y; //запоминаем начальные координаты
 end;
end;
procedure TForm1.MyMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if move then begin
 legend[t].Left:=legend[t].Left+x-x0; // Изменяем позицию левого края
 legend[t].Top:=legend[t].Top+y-y0; // Изменяем позицию верхнего края
 end;
end;

procedure TForm1.MyMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
move:=false;
t:= t+1;
end;

procedure TForm1.Image1Click(Sender: TObject);
begin
legend[t]:=TImage.Create(ScrollBox1);
legend[t].Parent:=Form1.ScrollBox1;
legend[t].Name:='legend'+IntToStr(t);
legend[t].Height:=33;
legend[t].Width:=33;
legend[t].Top:=0;
legend[t].Left:=0;
legend[t].Visible:=true;
Clipboard.Assign(Image1.Picture);
legend[t].Picture.Assign(Clipboard);
Clipboard.Clear;
legend[t].OnMouseDown:=MyMouseDown;
legend[t].OnMouseMove:=MyMouseMove;
legend[t].OnMouseUp:=MyMouseUp;
legend[t].ShowHint:=true;
legend[t].Hint:='legend'+IntToStr(t);


end;

procedure TForm1.Image2Click(Sender: TObject);
begin
legend[t]:=TImage.Create(ScrollBox1);
legend[t].Parent:=Form1.ScrollBox1;
legend[t].Name:='legend'+IntToStr(t);
legend[t].Height:=33;
legend[t].Width:=33;
legend[t].Top:=0;
legend[t].Left:=0;
legend[t].Visible:=true;
Clipboard.Assign(Image2.Picture);
legend[t].Picture.Assign(Clipboard);
Clipboard.Clear;
legend[t].OnMouseDown:=MyMouseDown;
legend[t].OnMouseMove:=MyMouseMove;
legend[t].OnMouseUp:=MyMouseUp;
end;

end.
Aleksandr вне форума Ответить с цитированием
Старый 29.10.2014, 10:07   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Руку гения видно сразу.
Код:
Clipboard.Assign(Image1.Picture);
legend[t].Picture.Assign(Clipboard);
Clipboard.Clear;
Расскажи, чего ты хочешь от программы? Задача-то какая?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 29.10.2014, 10:15   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Потому что логика порушена
В MyMouseUp счетчик увеличили, но Image еще не создана. Мышкой орять кликаете по картинке - в MyMouseDown запускаете перемещение и бац в MyMouseMove ошибка обращения к несуществующему объекту
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.10.2014, 10:19   #4
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию

Аватар, а как мне тогда счетчик увеличивать? Делал увеличение счетчика по двойному клику, но это ничего не дало. Вводить еще какую нибудь глобальную переменную?
Aleksandr вне форума Ответить с цитированием
Старый 29.10.2014, 10:24   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Есть Sender и обращаться к нему: TImage(Sender).Left:=чего-то
Счетчик увеличивать при создании объекта. И массив по хорошему динамический должен быть, либо контроль на не больше 100. Вернее не вижу пока здесь вообще необходимости в этом массиве. И картинка через буфер обмена лихо
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.10.2014, 10:32   #6
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию

Аватар спасибо переделал через Sender.
Aleksandr вне форума Ответить с цитированием
Старый 29.10.2014, 10:35   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Викинь массив СОВСЕМ. Он тебя путает.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 29.10.2014, 11:43   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Создаю динамически Image на ScrollBox1.
Какова цель? сделать плитку как в просмотрщиках картинок?
Для этого лучше всего подходит DrawGrid как отображатель.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мерцание панельки, при перемещении. stalker1995s Общие вопросы Delphi 12 04.08.2013 15:04
как работать с компанентами, которые были созданы программно? morgonXak Компоненты Delphi 6 20.12.2010 18:38
шум при перемещении мыши Lotles Компьютерное железо 6 14.12.2010 21:16
Перезапись при копировании/перемещении Shouldercannon Общие вопросы Delphi 4 12.09.2010 02:32
Процедура при перемещении формы Alex Cones Общие вопросы Delphi 7 28.07.2009 09:11