Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизКартинки в массив и обратно Найти похожие ветки
← →
andrewtitoff © (2012-04-18 17:00) [0]Здравствуйте!, подскажите как правильно сохранять картинки в массив из TImage, а потом обратно показывать их?
У меня на форме 5шт TImage, сначала мне нужно загрузить картинки в массив, для этого я использую TImage (в него все нормально грузится), а потом из него пытаюсь сохранить картинку в массив ну и потом обратно из массива показать в нужном TImage но почему-то то-ли не сохраняется в массив, то-ли не отображается... =(((
...
type
OBYA = packed record
DAT : string;
IMG : string;
PRI : string;
HTT : string;
PRS : string;
MET : string;
PIS : TPicture;
PB1 : TPicture;
PB2 : TPicture;
PB3 : TPicture;
PB4 : TPicture;
PB5 : TPicture;
TEP : TPicture;
TEL : string;
end;
....
var
Z: Array of OBYA;
ms: TMemoryStream;
jpeg: TJpegImage;
.....
ms := TMemoryStream.Create;
jpeg := TJpegImage.Create;
try
http1.Get(Z[coun-1].IMG, ms);
ms.Position := 0;
jpeg.LoadFromStream(ms);
Image1.Picture.Graphic := jpeg;
finally
jpeg.Free; ms.Free;
http1.Disconnect;
end;
Z[coun-1].PIS:=Image1.Picture;
.....
Image1.Picture:=Z[i].PB1;
Image2.Picture:=Z[i].PB2;
Image3.Picture:=Z[i].PB3;
Image4.Picture:=Z[i].PB4;
Image5.Picture:=Z[i].PIS;
....
← →
stas © (2012-04-18 17:15) [1]Потому что
Z[coun-1].PIS:=Image1.Picture;
это ты присваиваешь ссылку. Тебе надо создавать каждый раз новый Image и удалять при очистке массива.
1. Вместо динамического массива лучше использовать TStringList или подобные
2. Я бы хранил TJpegImage вместо Picture
← →
andrewtitoff © (2012-04-18 17:28) [2]
> Потому что Z[coun-1].PIS:=Image1.Picture; это ты присваиваешь
> ссылку. Тебе надо создавать каждый раз новый Image и удалять
> при очистке массива.
>
Ясн, т.е. тогда PIS,PB1..PB5 должны быть TImage а не TPicture или я что то не так понял?
> 1. Вместо динамического массива лучше использовать TStringList
> или подобные
>
Почему?, чем динамический массив плох?
> 2. Я бы хранил TJpegImage вместо Picture
>
>
Опять же в чем разница?, мне это не принципиально, просто хотелось бы знать почему а не просто делать так потому что кто-то так сказал... =)))
← →
Palladin © (2012-04-18 17:35) [3]http://codingrus.ru/readarticle.php?article_id=2867
← →
andrewtitoff © (2012-04-18 17:37) [4]
> http://codingrus.ru/readarticle.php?article_id=2867
И к чему это?
← →
sniknik © (2012-04-18 17:39) [5]> И к чему это?
причина
← →
sniknik © (2012-04-18 17:44) [6]> Image1.Picture:=Z[i].PB1;
если ты так присваиваешь, то в Z[i].PB1 должен быть "цельный" объект, а не ссылка на возможно уже "битый".
т.е. в коде выше первым должно стоять
Z[coun-1].PIS:= TPicture.Create;
дальше все операции с ним, и не в коем случае не делать Z[coun-1].PIS.Free; до тех пор пока объект станет реально не нужен.
← →
andrewtitoff © (2012-04-18 17:45) [7]
> причина
Причина чего?, не понимания или не желания понимать сути вопроса?..
← →
sniknik © (2012-04-18 17:47) [8]в чем суть?
← →
AV © (2012-04-18 17:50) [9]если просто, то переделать просто
не
jpeg := TJpegImage.Create;
и потом телодвижения
а сразу
Z[coun-1].PIS := TJpegImage.Create;
соотв.
PIS : TJpegImage;
← →
andrewtitoff © (2012-04-18 17:50) [10]
> > Image1.Picture:=Z[i].PB1;
> если ты так присваиваешь, то в Z[i].PB1 должен быть "цельный"
> объект, а не ссылка на возможно уже "битый".
> т.е. в коде выше первым должно стоять
> Z[coun-1].PIS:= TPicture.Create;
> дальше все операции с ним, и не в коем случае не делать
> Z[coun-1].PIS.Free; до тех пор пока объект станет реально
> не нужен.
>
>
Так это я уже давно понял благодаря stas-у, просто я написал немножко не правильно (со скобочками) и получил
[DCC Error] Unit1.pas(165): E2010 Incompatible types: "TPicture" and "TImage"
вот по этому и спросил.., спасибо что поправили =)))
← →
andrewtitoff © (2012-04-18 17:55) [11]написал так:
Z[coun-1].PIS:= TPicture.Create;
Z[coun-1].PIS:=Image1.Picture;
только почему-то все равно не работает.. =(((
← →
andrewtitoff © (2012-04-18 17:57) [12]
> соотв.
> PIS : TJpegImage;
>
>
Ааа, понял, ну в принципе да, только потом же опять как я понял нужны телодвижения что-бы запихнуть его в TImage..?
← →
andrewtitoff © (2012-04-18 17:58) [13]
> в чем суть?
>
>
В беспредметности разговора.. =)))
← →
sniknik © (2012-04-18 17:59) [14]ой, и не говори, что ты "уже понял". почитай лучше ссылку, суть там.
← →
icWasya © (2012-04-18 18:13) [15]Вот это
Z[coun-1].PIS:= TPicture.Create;
надо сделать один раз
А вместо этогоZ[coun-1].PIS:= Image1.Picture;
можно несколько раз делатьZ[coun-1].PIS.Assign(Image1.Picture);
а за вот этим присваиванием
Image1.Picture:=Z[i].PIS
Дельфи сама ставит такой код
Image1.Picture.Assign(Z[i].PIS);
Учите матчасть
← →
Ega23 © (2012-04-18 18:55) [16]
> stas © (18.04.12 17:15) [1]
>
> 1. Вместо динамического массива лучше использовать TStringList или подобные
Иногда. Иногда - нет. Иногда - ваще противопоказано.
> 2. Я бы хранил TJpegImage вместо Picture
Почему не битмап? Почему не MemoryStream?
← →
stas © (2012-04-19 09:08) [17]
> Почему?, чем динамический массив плох?
Не нужно голову морочить с выделением памяти и т.д. в TSTringList есть минимальный набор методов для работы c динамическими массивами
Ega23 © (18.04.12 18:55) [16]
1. Не встречал случаев когда это противопоказано.
2.Потому что битмап занимает больше места в ОЗУ, а со Stream чтобы выгрузить надо будет еще движения какие-то делать.
← →
Ega23 © (2012-04-19 09:14) [18]
> 1. Не встречал случаев когда это противопоказано.
Возможно вы мало программировали.
> а со Stream чтобы выгрузить надо будет еще движения какие-то делать.
А с TJPEGImage - не надо???? Сначала битмап привести к джпегу, потом заассайнить его с элементом массива (через тот же стрим). Да, ещё создать надо...
← →
andrewtitoff © (2012-04-19 10:24) [19]
> а за вот этим присваиванием
> Image1.Picture:=Z[i].PIS
> Дельфи сама ставит такой код
> Image1.Picture.Assign(Z[i].PIS);
Пробовал и так и так, чет не работает, вернее у меня сейчас показывает в цикле с - так вот показывет картинку один раз и потом она пустая, может нужно какой-то рефреш делать или обнулять перед тем как новую картинку загружать?
for i := 0 to coun-1 do
begin
RichEdit1.Lines.Add(Z[i].DAT);
...
Image5.Picture.Assign(Z[i].PIS);
Application.ProcessMessages;
Sleep(1000);
Application.ProcessMessages;
end;
← →
stas © (2012-04-19 11:21) [20]
> Ega23 © (19.04.12 09:14) [18]
> Возможно вы мало программировали.
Возможно, приведите пример, буду знать на будущее
>Сначала битмап привести к джпегу
Зачем? он загружает jpeg.
← →
stas © (2012-04-19 11:24) [21]andrewtitoff © (19.04.12 10:24) [19]
Ну, это вы показали вывод из массива, а как загружаете в массив?
← →
andrewtitoff © (2012-04-19 11:48) [22]
> Ну, это вы показали вывод из массива, а как загружаете в
> массив?
Так вроде как писал уже, или вы про что?...
> Z[coun-1].PIS:= TPicture.Create;
> Z[coun-1].PIS:=Image1.Picture;
>
У меня пока что только один раз нужно загрузить т.е. для каждого Z[i].PIS в цикле я делаю это один раз
← →
stas © (2012-04-19 11:54) [23]
Z[coun-1].PIS.Assign(Image1.Picture)
← →
stas © (2012-04-19 12:00) [24]andrewtitoff © (19.04.12 11:48) [22]
Пойми когда пишешь равно ты приравниваешь ссылку, а не содержимое.
Допустим
1. в гостиничный номер №36 поселен andrewtitoff
2. Z[1].PIS=№36
3. На следующей итерации в №36 поселился Ega
4. Z[2].PIS=№36
У тебя получилось что все элементы массива ссылаются на №36 и во всех живет Ega. А Assign забирает именно кто же живет в этом номере...
Понятно ))?
← →
andrewtitoff © (2012-04-19 12:49) [25]
> Пойми когда пишешь равно ты приравниваешь ссылку, а не содержимое.
Ааа, понял, спс, сейчас попробую.
только я не понял тогда почему у меня тогда получилось в цикле вывода при первом прохождении цикла выдал картинки (с нужным индексом или нет не разбирался), при чем переделано в цикле вывода было только для одного TImage, а остальные были по старомуImage1.Picture:=Z[i].PB1;
, но тем не менее показал 5 картинок, но уже на втором прохождении цикла и до конца все 5 TImage были пусты...
← →
andrewtitoff © (2012-04-19 12:56) [26]
> Z[coun-1].PIS.Assign(Image1.Picture)
Да, спасибо, попробовал, так вроде работает, действительно чет я не допер что это не просто элемент массива а объект =)))
P.S.
Эх, как чудесно все было 15 лет назад в паскале, все можно было реализовать без объектов, да винда еще не была в ходу(3.11 не в счет), все просто и понятно, на прямую к железу =)))
← →
sniknik © (2012-04-19 12:57) [27]> почему у меня тогда получилось
предполагаю, что там, тогда, был TImage на обоих сторонах, а у него Picture метод, где в обработчике "усе путем"...
почитал бы ссылку, вник, вместо "упрямства".
← →
sniknik © (2012-04-19 12:59) [28]> чет я не допер что это не просто элемент массива а объект =)))
ну как же допер, "додолбили"... с самого начала только это и пишут.
← →
andrewtitoff © (2012-04-19 13:05) [29]
> почитал бы ссылку, вник, вместо "упрямства".
Да прочитал я ее давно уже, ничего нового там нет, просто опыт нужен, которого у меня нет.
> ну как же допер, "додолбили"... с самого начала только это
> и пишут.
Ну так я и говорю что тупанул, подумал сначала только про TImage которые на форме, а то-что в массиве все тоже самое у меня - не подумал... =))))
← →
andrewtitoff © (2012-04-19 15:04) [30]А может быть еще кто-нибудь подскажет как загрузить картинку PNG ? =)))
← →
stas © (2012-04-19 15:22) [31]Так же как JPEG, только в uses PNG надо включить, не знаю стандартный модуль есть или нет
← →
andrewtitoff © (2012-04-19 16:26) [32]
> Так же как JPEG, только в uses PNG надо включить, не знаю
> стандартный модуль есть или нет
Спс, правда я еще ссылку на картинку не разобрался как получить, как разберусь - попробую
← →
Palladin © (2012-04-20 00:09) [33]феерические люди были есть и будут быть...
← →
andrewtitoff © (2012-04-20 09:23) [34]
> феерические люди были есть и будут быть...
Что-то не так?.. =)))
Хотите поговорить об этом? ;)))
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.069 c