Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Копия объекта [D7, WinXP]


Viktop ©   (2004-11-12 13:07:00) 

На форме имеется некоторое количесиво объетов TImage. При нажатии на какой-либо рисунок должна создаваться его копия. В принципе я делаю это примерно так

Image2.Picture.Bitmap.Assign(Image1.Picture.Bitmap)

Рисунок из Image1 копируется в Image2
Не могу разобраться с этой строчкой Image1.Picture.Bitmap
Как узнать на каком рисунке был щелчок (или вызвано PopUpMenu), чтобы скопировать именно этот рисунок?


Defunct   (2004-11-13 10:52:00) [1]

Palladin ©   (13.11.04 08:32) [18]

согласен, с AutoSize чудес не будет


Palladin   (2004-11-13 08:32:00) [2]


> [14] Defunct ©   (13.11.04 08:04)

Никаких чудес с масштабом не наблюдаю. AutoSize:=True;


Viktop   (2004-11-13 08:11:00) [3]

Теперь буду знать!


Defunct   (2004-11-13 08:09:00) [4]

> А с чего вы взяли, что это JPG? Это PNG!

Смысл, тот же. ;>
Picture.Bitmap.Assign можно безболезнено применять только к BMP.


Viktop   (2004-11-13 08:06:00) [5]


> Вы жульничаете - в Image загружен JPG а не BMP картинка.
> У меня приведенный Вами код работает с BMPшками.

А с чего вы взяли, что это JPG? Это PNG!
В принципе работает (с PNG), но как-то криво. У меня для рисунка по которуму производится щелчок стоит свойство Autosize=True, а у созданного изображения размер по умолчанию (тот, который стоит при добавлении объекта на форму).
Если кому интересно, то вот код (теперь полностью рабочий):
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Image1: TImage;
   procedure Image1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Image1Click(Sender: TObject);
begin
with TImage.Create(Self) do
begin
  Parent := Self;
  Top:=100;
  Left:=100;
  Width := 100;
  Height := 100;
  Picture.Bitmap.Width := Width;
  Picture.Bitmap.Height := Height;
  Autosize:=True;
  Transparent:=True;
  Picture.Bitmap.Canvas.StretchDraw( ClientRect, (Sender as TImage).Picture.Graphic);
end
end;

end.

Спасибо за терпение!


Defunct   (2004-11-13 08:04:00) [6]

Palladin ©   (13.11.04 08:01) [13]

будут чудеса с масштабом.


Palladin   (2004-11-13 08:01:00) [7]

with TImage.Create(Self) do
begin
 Parent := Self;
 top:=100;
 left:=100;
 Picture.Assign((Sender as TImage).Picture)
end
end;


Defunct   (2004-11-13 07:57:00) [8]

Viktop   (13.11.04 07:40) [11]

Вы жульничаете - в Image загружен JPG а не BMP картинка.
У меня приведенный Вами код работает с BMPшками.

Для того чтобы работало с JPG, сделайте так:

procedure TForm1.Image1Click(Sender: TObject);
begin
 with TImage.Create(Self) do
 begin
   Parent := Self;
   Top:=100;
   Left:=100;
   Width := 100;
   Height := 100;
   Picture.Bitmap.Width := Width;
   Picture.Bitmap.Height := Height;


   Picture.Bitmap.Canvas.StretchDraw( ClientRect, (Sender as TImage).Picture.Graphic);
 end
end;


В общем при работе с JPG надо явно задавать размер картинки.


Viktop   (2004-11-13 07:40:00) [9]

А что тут приводить? Всё указано в [7]. Но если настаиваете, то вот пример для конретного изображения:
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, pngimage, ExtCtrls;

type
 TForm1 = class(TForm)
   Image1: TImage;
   procedure Image1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Image1Click(Sender: TObject);
begin
with TImage.Create(Self) do
begin
  Parent := Self;
  top:=100;
  left:=100;
  Picture.Bitmap.Assign((Sender as TImage).Picture.Bitmap)
end
end;
end.

Что тут может быть неправильного.


Defunct   (2004-11-13 06:46:00) [10]

> При нажатии на рисунок он [рисунок] исчезает.

Вы что-то делаете не так.


> Я думал здесь оперативно отвечают

Вам уже все ответили.
Врятли можно что-то добавить к четкому ответу [7], тем более код вашего обработчика вы упорно не хотите приводить.


Viktop   (2004-11-13 06:17:00) [11]

Я думал здесь оперативно отвечают :-(


Viktop   (2004-11-12 16:17:00) [12]

При нажатии на рисунок он [рисунок] исчезает.


Юрий Зотов   (2004-11-12 14:46:00) [13]

> Viktop   (12.11.04 14:35) [6]
> Всё дело в этом TargetImage (он создаётся в run-time).

Так и создавайте на здоровье, в чем проблема-то? Непонятно.

procedure TForm1.AnyImageClick(Sender: TObject);
begin
 with TImage.Create(Self) do
 begin
   Parent := Self;
   SetBounds(...);
   ...
   Picture.Bitmap.Assign((Sender as TImage).Picture.Bitmap)
 end
end;


Viktop   (2004-11-12 14:35:00) [14]

Всё дело в этом TargetImage(он создаётся в run-time). Ситуация такая: при нажатии на рисунок создаётся объект TImage (с заданными координатими, именем, свойствами и т.д.), в который копируется рисунок из Image1 (Sender as TImage)


Юрий Зотов   (2004-11-12 14:04:00) [15]

> Viktop   (12.11.04 13:45) [4]

> Я прописываю процедуру нажатия здесь
> procedure TForm1.FormClick(Sender: TObject);

Зачем же обрабатывать щелчок по картинкев обработчике щелчка по форме? У картинки есть свойOnClick.

procedure TForm1.AnyImageClick(Sender: TObject);
begin
 TargetImage.Picture.Bitmap.Assign((Sender as TImage).Picture.Bitmap)
end;


Viktop   (2004-11-12 13:45:00) [16]

Я прописываю процедуру нажатия здесь:

procedure TForm1.FormClick(Sender: TObject);
begin

end;

Или просто скажите (желательно полный код :)) как создать точную копию объекта Timage при нажатии на него.


Юрий Зотов   (2004-11-12 13:25:00) [17]

> Viktop   (12.11.04 13:07)  

> на каком рисунке был щелчок
Sender as TImage

> или вызвано PopUpMenu
PopupMenu.PopupComponent as TImage


rom   (2004-11-12 13:16:00) [18]

Попробуй так:

Копирование изображения из одного витмапа (Bmp1) в другой (Bmp)

Bmp.Canvas.CopyMode:=cmSrcCopy;
Bmp.Canvas.CopyRect(rect(0,0,Bmp1.Width,Bmp1.Height),Bmp1.Canvas,rect(0,0,Bmp1.Width,Bmp1.Height));


MBo   (2004-11-12 13:10:00) [19]

Sender используй


Наверх

Титульная страница Поиск, карта сайта Написать письмо