Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];

Вниз

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

 
Glex ©   (2006-02-05 19:24) [0]

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

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

a:= b;

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

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


 
John_Doe   (2006-02-05 19:28) [1]

a.Assign(b);


 
Glex ©   (2006-02-05 19:35) [2]

EConvertError: "Cannot assign a TImage to a TImage"


 
vrem   (2006-02-05 19:39) [3]

form1.Image2.Picture.Assign(form1.Image1.Picture);


 
Glex ©   (2006-02-05 19:42) [4]

vrem

Зачем? Picture"s можно просто a.picture:= b.picture;
Мне не Picture, а TImage надо!


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

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


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

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


 
Джо ©   (2006-02-05 20:01) [7]

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

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


 
Glex ©   (2006-02-05 20:04) [8]

Джо

Как в MiX: a←b


 
Джо ©   (2006-02-05 20:12) [9]

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

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


 
Glex ©   (2006-02-06 08:19) [10]

Джо

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

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


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

TImage+F1


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

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


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

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

Странный вы.

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


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

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


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


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

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

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

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


 
msguns ©   (2006-02-06 11:18) [15]

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

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

 или

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


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


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

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


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


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

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


 
msguns ©   (2006-02-06 11:26) [18]

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

Переведи


 
sniknik ©   (2006-02-06 11:43) [19]

> А указатель на 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);

где рисует?


 
Джо ©   (2006-02-06 14:52) [20]

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

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


 
Glex ©   (2006-02-06 19:36) [21]

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("&#208;&#224;&#226;&#237;&#238;");

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

3)
a:= b;
if a = b then ShowMessage("&#208;&#224;&#226;&#237;&#238;");

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

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

4)
a:= b;
if a = b then ShowMessage("&#208;&#224;&#226;&#237;&#238;");

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("&#208;&#224;&#226;&#237;&#238;");
a.Canvas.Rectangle(0, 0, 100, 100);
//Как в 1, рисует на b)))))

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

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

:)


 
sniknik ©   (2006-02-06 20:48) [22]

> По вашей рекомендации провёл несколько тестов. Результаты удивительны!
вообщето я не давал рекомендаций, так, показал 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 одинаковых с одинаковыми свойствами имеджа? один другого же закрывать будет, не видно его будет. смысл?

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


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


> где рисует?

Сдаюсь. :)


 
Glex ©   (2006-02-07 20:07) [24]

sniknik

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

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

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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.077 c
2-1139216929
Антон1209
2006-02-06 12:08
2006.02.26
TDataSetProvider


15-1139184926
Yegorchic
2006-02-06 03:15
2006.02.26
Оцените/покритикуйте программу...


15-1137190386
Anatoly Podgoretsky
2006-01-14 01:13
2006.02.26
Скандал вокруг антивирусов Касперского и Нортора.


1-1138173919
sally
2006-01-25 10:25
2006.02.26
Доступ к свойствам интерфейса через RTTI


2-1139773723
Непонятка
2006-02-12 22:48
2006.02.26
Как вызвать процедуру?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский