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

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

Как присвоить TImage другой TImage?


Страницы:   1 2

Glex ©   (2006-02-05 19:24:00) 

Детский, наверное, вопрос, никогда раньше не сталкивался.

var a, b, t: TImage;
...
//a, b проинициализованы, в них есть картинки и они располагаются на форме
...

a:= b;

Не работает, да и не должно, так как TImage - это, как я понял, указатель.
Тогда как присвоить a b?

Наверное, что-то вроде Assign(a,b)


Glex   (2006-02-07 20:07:00) [1]

sniknik

Удивительным мне показалось, что рисует не на обоих Image'aх, а на одном.
И вообще внешне после копирования ничего не меняется.

Всем огромное спасибо!

Задачу решил другим способ(копированием всех свойств поочерёдно).


John_Doe   (2006-02-07 13:54:00) [2]


> где рисует?

Сдаюсь. :)


sniknik   (2006-02-06 20:48:00) [3]

> По вашей рекомендации провёл несколько тестов. Результаты удивительны!
вообщето я не давал рекомендаций, так, показал John_Doe   (06.02.06 11:21) [17] что указатель "не потерялся"

а тебе раз это показалось удивительным следует вернутся к книгам и почитать про указатели. и понять что указатель на обьект <> самому обьекту, его можно менять, заставлять указывать на любой(что и сделано в примере) даже на то что обьектом не является...
var st: string;
begin
 st:= 'типа заменяю image...';
 a:= TImage(st); //теперь любое обращение к свойствам обьекта как к имеджу даст ошибку(!!!), понятно почему, это не он, это вообще бред, мы "обманули" компилятор.
 ....

> 'Cannot assign a TImage to a TImage' - начинаю думать, что это глюк Delphi.
это не глюк. просто у имеджа нет перекрытого метода (в отличие от Picture) ассигн, а метод от предка (TPersistent) ничего не знает о свойствах потомка, вот и ошибка. "нарисуй" свое "перекрытие" тогда и будет работать. но на самом деле это нафиг не нужно, зачем тебе 2 одинаковых с одинаковыми свойствами имеджа? один другого же закрывать будет, не видно его будет. смысл?

ИМХО ты решаеш не задачу, а проблему возникщую изза неправильного понимания/постановки задачи.


Glex   (2006-02-06 19:36:00) [4]

John_Doe
>Все дело в том,что возможно автору надо иметь не только идентичные картинки,но и скажем размеры Image'а,св-во Stretch итд...
Незнаю,пусть автор скажет. :-)

Да, Вы правы. Мне нужно именно это! :-)

msguns
>А самое главное, что так и покрытно туманом: что нужно автору:
>Два одинаковых экземпляра одного и того же объекта (одинаковый Image)...
Два одинаковых экземпляра!

sniknik
По вашей рекомендации провёл несколько тестов. Результаты удивительны!
1)
TForm1 = class(TForm)
  a: TImage;
  b: TImage;
  ....

a:= b;
if a = b then ShowMessage('Равно');
//Равно выводит, но свойства картинок да и сами рисунки различны 8) WTF?!!

2)
a:= b;
if a = b then ShowMessage('Ðàâíî');

a:= TImage(FindComponent('a'));
//Результат как в 1

3)
a:= b;
if a = b then ShowMessage('Ðàâíî');

a:= TImage(FindComponent('a'));

if a b then ShowMessage('Ne ravno');
//Как в 1, только кроме равно ещё и 'ne ravno'

4)
a:= b;
if a = b then ShowMessage('Ðàâíî');

a:= TImage(FindComponent('a'));

if a b then ShowMessage('Ne ravno');
a.Canvas.Rectangle(0, 0, 100, 100);
//Как в 3. Рисует прямоугольник на a

5)
a:= b;
if a = b then ShowMessage('Ðàâíî');
a.Canvas.Rectangle(0, 0, 100, 100);
//Как в 1, рисует на b)))))

Джо
Возможно, у меня есть некоторые проблемы с формулировкой.. Но меня уже перевели на русский))

Всем
'Cannot assign a TImage to a TImage' - начинаю думать, что это глюк Delphi.
Т. е. он опознаёт два TImage(даже их свойства заведомо равны) как экземпляры разныхклассов.
У кого есть BDS2006, попробуйте в ней провернуть a.Assign(b);

:)


Джо   (2006-02-06 14:52:00) [5]

> [10] Glex ©   (06.02.06 08:19)
> Джо
>
> Тогда советую почитать Кнута.
> Уверяю, понятие присвоить переменной a значение переменной
> b я использую в общепринятом понятии.
>
> Т.е. после a:=b должно быть (a=b)=true.

Если бы я задавал вопрос "Что значит у Кнута a<b?", я с удовольствием воспринял бы ваш ответ. А пока я вижу, что проблема с формулировкой у вас.


sniknik   (2006-02-06 11:43:00) [6]

> А указатель на image1 будет утерян.
не совсем, проверь
 TForm1 = class(TForm)
   a: TImage;
   b: TImage;
   ....

 a:= b;
 if a = b then ShowMessage('Равно');

 a:= TImage(FindComponent('a'));
 a.Canvas.Rectangle(0, 0, 100, 100);

где рисует?


msguns   (2006-02-06 11:26:00) [7]

>John_Doe   (06.02.06 11:21) [16]
>И теперь если делать что-то с image1,то меняться будет именно image2.
А указатель на image1 будет утерян.

Переведи


John_Doe   (2006-02-06 11:21:00) [8]


> А вы попробуйте. Вдруг даст?

Image1 и Image2 действительно указатели на обьекты.
И если написать:
image1:=image2;
То получится,что image1 ,будет указывать на image2.
И теперь если делать что-то с image1,то меняться будет именно image2.
А указатель на image1 будет утерян.


John_Doe   (2006-02-06 11:21:00) [9]


> А вы попробуйте. Вдруг даст?

Image1 и Image2 действительно указатели на обьекты.
И если написать:
image1:=image2;
То получится,что image1 ,будет указывать на image2.
И теперь если делать что-то с image1,то меняться будет именно image2.
А указатель на image1 будет утерян.


msguns   (2006-02-06 11:18:00) [10]

А самое главное, что так и покрытно туманом: что нужно автору:

Два одинаковых экземпляраодного и того же объекта (одинаковый Image)

 или

Два указателя на один и тот жеэкземпляр ?


John_Doe   (2006-02-06 11:06:00) [11]

Метод Assign,который любезно предоставлен предком многих обьектов классом TPersistent,он нужен для переноса значений всех полей обьекта a,в соответствующие поля обьекта b.
Думаю это автору топика и нужно.
Но честно сказать не пойму,почему это не работает...
Действительно выдает 'Cannot assign a TImage to a TImage'.
Пробовал как с разными типами картинок,так и с одинаковыми.

> Короче работать надо с Picture и его методом Assign.

Все дело в том,что возможно автору надо иметь не только идентичные картинки,но и скажем размеры Image'а,св-во Stretch итд...
Незнаю,пусть автор скажет. :-)


gamer   (2006-02-06 10:46:00) [12]

> Glex ©   (06.02.06 08:19) [10]

Странный вы.

> Не работает, да и не должно, так как TImage - это, как я понял, указатель.


А потом пургу гоните, о том, что

> > Т.е. после a:=b должно быть (a=b)=true.


А вы попробуйте. Вдруг даст?


nstur   (2006-02-06 10:42:00) [13]

До конца не помню, но на вскидку скажу.
Для того, чтобы присвоить b -> a, бывает необходимо знать, какой тип картинки у вас загружен и типизировать соответственно Picture. TGif..., TJpg..., TPNG... Если BMP, тогда работать с Picture.Bitmap.
Короче работать надо с Picture и его методом Assign.


ASoft   (2006-02-06 08:22:00) [14]

TImage+F1


Glex   (2006-02-06 08:19:00) [15]

Джо

Тогда советую почитать Кнута.
Уверяю, понятие присвоить переменной a значение переменной b я использую в общепринятом понятии.

Т.е. после a:=b должно быть (a=b)=true.


Джо   (2006-02-05 20:12:00) [16]

> [8] Glex ©   (05.02.06 20:04)
> Как в MiX: a<b

Я не знаю, что такое MiX.


Glex   (2006-02-05 20:04:00) [17]

Джо

Как в MiX: a←b


Джо   (2006-02-05 20:01:00) [18]

> [6] Glex ©   (05.02.06 19:55)
> До сих пор решения не нашёл.
> Плиз хелп)

Нужно определиться с тем, что значит для тебя "присвоить TImage другой TImage".


Glex   (2006-02-05 19:55:00) [19]

До сих пор решения не нашёл.
Плиз хелп)


vrem   (2006-02-05 19:45:00) [20]

понял отстал.


Страницы:   1 2

Наверх

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