![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как присвоить TImage другой TImage?
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]понял отстал.