Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 402

Раздел: Delphi » Прочее
/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Вопрос такой: Можно ли сделать динамический массив картинок, а потом его сохранить в файл? Если можно и то и то, то меня больше интересует второе...
И ещё, If всё вышесказанное возможно, then как из масива удалить картинку?
Я пробовал сделать Record с переменной : TPicture, засунуть туда картинку получается, а убрать от тудова - нет... Ковырялся в Интернете, нашёл кучу способов, но они работают только с компонентом Image, компилятор не ругается, просто когда загружаешь картинку съедается память, потом нажимаю кнопку (со всеми способами очистки, которые я накопал), чтоб очистить переменную, но память не освобождается, а если ещё раз загрузить картинку, то память опять убавится... :(

Приложение:
  1.  


Юрий Олегович Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Юрий Олегович (статус: Посетитель)
Вопрос отправлен: 7 февраля 2009, 08:01
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: DNK

Здравствуйте, Юрий Олегович!
Здается мне что вы не уничтожаете объект, который записываете в Record, отсюда и утечки памяти. Да будет вам известно, там хранится только ссылка на объект, и сохранение такого массива в файл никчему доброму не приведёт.
А вообще для хранения картинок я бы использовал следующие способы:
1. Объект ObjectList или его потомок. Если установить его свойство OwnsObjects, то он автоматически будет удалять катринки.
2. Компонент ImageList. Стандартный компонент может хранить только bmp и ico и только одного разрешения, но и это поправимо.
3. Внутри какого-нибудь своего компонента в свойстве с типом коллекция.

Ответ отправил: DNK (статус: Студент)
Время отправки: 7 февраля 2009, 08:30

Ответ #2. Отвечает эксперт: Градов Ю.М.

Здравствуйте, Юрий Олегович!
Я бы поступил проще - с помощью базы данных. Есть полное управление удалением/добавлением.
Как раз DBImage для картинок, DBText для текста и т.д. Все прелести базы данных - сортировка, поиск, управлление записями и т.д. и т.п.

Ответ отправил: Градов Ю.М. (статус: 8-ой класс)
Время отправки: 7 февраля 2009, 14:55


Мини-форум вопроса

Всего сообщений: 20; последнее сообщение — 16 февраля 2009, 18:16; участников в обсуждении: 5.
DNK

DNK (статус: Студент), 7 февраля 2009, 08:32 [#1]:

Подробности в мини-форуме.
"Digital Networked Knight"
Юрий Олегович

Юрий Олегович (статус: Посетитель), 7 февраля 2009, 09:15 [#2]:

Хм... Спасибо большое за ответ, этот вопрос меня долго мучал... :)
А можно распросить по-подробнее, мне необходимо записать в файл разные типы данных (картинку, текст, числа), но это необходимо реализовать в виде динамического массива...
Я решил использовать массив Record`ов... Помимо этого появилась необходимость в этом массиве сделать ещё один массив других Record`ов и они тоже содержать картинки...
Подскажите, верный ли выбран путь?
Если можно поподробнее узнать про ObjectList и как с ним общаться?
Как правильно такую конструкцию сохранять в файл?
Было бы неплохо с примерами... :)
Заранее благодарю...
DNK

DNK (статус: Студент), 7 февраля 2009, 09:51 [#3]:

Под грузом опыта в программировании крупных проектов пришлось почти полностью отказаться от использования массивов, чего и другим советую. Изредко использую для хранения промежуточных значений каких-нибудь вычислений или констант для них. Уж больно из-за них код потом тяжело ворочать.
TObjectList класс специализированный на хранения большого количества ссылок на объекты. Для добавления используются методы Add, Insert, для удаления Delete, Clear. Для доступа к объектам свойство Items, правда оно имеет свойство TObject, но это поправимо. Кроме того позволяет производить поиск, перемещение, автоматическую сортировку объектов. Да о чем я говорю, все это в хелпе описано.
Чтобы сохранять и загружать картинки нужно сначала обдумать формат файлов.
"Digital Networked Knight"
Юрий Олегович

Юрий Олегович (статус: Посетитель), 7 февраля 2009, 10:52 [#4]:

Как Вы уже поняли - я новичёк в програмировании...
"обдумать формат файлов. " - я много раз это слышал, но не могу представить как этот процесс происходит...
Я пробовал сохранять несколько таблиц и ещё кучу текста с помощью FileStream, я себе представляю структуру получившегося файла, но это никто ни разу не называл "обдумывание формата файла"...
Я "практик" и не очень себе это представляю...
С чего начать и что использовать?
Как происходит этот процесс? :)
DNK

DNK (статус: Студент), 7 февраля 2009, 11:11 [#5]:

В простейшем случае можно поступить следующим образом:
1. Сохранять сначала картинку в поток.
2. Затем записовывать потоки в головной поток в следующем порядке. Размер потока - четырех байт думаю хватит. Далее сам поток.
3. Повторить 1,2 если нужно. В итоге получаем бинарник.
Читать в обратном порядке. Сначала читаем байты размера. Затем копируем нужного размера поток и загружаем в картинку, добавляем в список объектов.
"Digital Networked Knight"
Юрий Олегович

Юрий Олегович (статус: Посетитель), 7 февраля 2009, 11:41 [#6]:

Прошу прощения, я не озвучил свою цель... Вообщем я создаю программу тестирования и получается, что мне необходимо всё держать в памяти, пока создаётся файл теста, а только потом его скидывать в файл... Как это реализовать с помощью потоков (или есть ещё способ?)? Желательно с примерчиком, потому что с примером это намного больше встанет на свои места... :)
DNK

DNK (статус: Студент), 7 февраля 2009, 12:03 [#7]:

%)

После озвучивания я даже меньше понимать стал.
Какие такие тесты? Какое такое всё? Какой такой файл теста?
На каком языке вы говорите? Мы инженеры кроме ТЗ других не знаем, и реализовать "то чего не может быть" не сможем, даже с помощью потоков.
"Digital Networked Knight"
Юрий Олегович

Юрий Олегович (статус: Посетитель), 7 февраля 2009, 13:20 [#8]:

хгх... так, я в краске... Необходимо создать структуру, содержащую разные типы данных, (воде массива) с которой юзер будет работать, а по завершению программы (или нажатию кнопки типа "сохранить") всё, что он (юзер) наработал сохраняестя в файл. Просто я думал понятнее будет если я скажу, что это программа создания тестов, где n-ое количество вопросов с динамическим количесвом ответов в каждом вопросе (+картинки как в вопросах, так и ответах)...
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 7 февраля 2009, 21:40 [#9]:

зачем сохранять картинки тестов в файлах для юзеров??? Или подразумеваются тесты, в которых испытуемый рисует то, что ему вздумается?
Юрий Олегович

Юрий Олегович (статус: Посетитель), 8 февраля 2009, 01:21 [#10]:

Или подразумеваются тесты, в которых испытуемый рисует то, что ему вздумается?

Нет, испытуемый видит картинку в вопросе, и в вариантах ответов могут быть картинки...
PS: я знаю что такое ТЗ (техначеское задание), просо ни разу его не видел и не писал... я пока что студент, ещё немного дотянуть...
PPS: Я не на прграммиста учился... вернее учусь на специальности "прикладная информатика (в экономике)", у нас был минимум программирования... от того и несколько несуразные вопросы... в данный момент двое суток не спал (читал кучу статей...)... стремлюсь к программированию, но не всегда получается... (заговорите про книжки - нету их... интернет - не всегда понятно)... единственный мой серьёзный проэкт - это прога, которая по расписанию даёт звонки и через паузу воспроизводит музыку...(вообщем работал с динамическим расписанием...)

Некое резюме получилось...
просто в моём кругу либо не понимают смысл задачи (не из-за формулировки), либо дают дуратские советы...
Юрий Олегович

Юрий Олегович (статус: Посетитель), 8 февраля 2009, 01:42 [#11]:

For Градов Ю.М.
Да, это было бы не плохо, но это не совсем годный вариант при локальном тестировании, да и я защитой проблема будет... просто там не все студенты дубовые (БД открывают в блокное, напрмер)... ели можно продумать защиту на файлы, но на БД защита одна, а продумывать защиту на БД не очень хочется... Базы министерского тестирования как семечки лускают, а тут им так повезёт... да и отдельный файл просто мобильнее...
DNK

DNK (статус: Студент), 8 февраля 2009, 10:28 [#12]:

Тогда после или перед длинной записи можно вставить заголовок специального формата с описанием, что внутри пакета информации(текст, картинка). Заголовки-описатели - это универсальная система с помощью которых строятся протоколы, файловые системы, БД.
"Digital Networked Knight"
Anderson N.N

Anderson N.N (статус: 2-ой класс), 9 февраля 2009, 02:58 [#13]:

Вопрос а зачем сохранять сами картинки это же громадный расход, памяти...
да и зачем копировать по нескольку раз одну и ту же информацию, по нескольку раз (каждый пользователь со своими ответами)
сделайте просто все картинки в одну папку ( с именами например 1.jpg, 2.jpg ... хотя дело вкуса) и сохраняйте в файл, только названия
картинок(и просмотре загружать из папки по имени ... В итоге каждая картинка в одном экземпляре
Насчет безопасности просто шифруете этот свой файл А если не устраивают открытые изображения в папке
(просто можно поменять формат у картинок вместо 1.jpg -> 1.qji люди не будут париться и перед просмотром прога будет переименовывать) .
Юрий Олегович

Юрий Олегович (статус: Посетитель), 9 февраля 2009, 12:01 [#14]:

В принципе логично, но не со всем я согласен...
Задача такова: сохранить в файле разнотипную информацию, не используя архивирование и БД...

2 Ершов Денис Принцип я понял, но я теряюсь в вопросах... Хотябы с чего начать? Я пробовал сделать массив, а потом с помощью FileStream сохранить массив в файл, но столкнулся с проблемой картинок...
Если можно, покажите на примере как сохранить текст вместе с картинками?

Почему я начал с массивов? очень просто: массив лежит в памяти и идеальная структура для решения моей задачи, т.к. какждую ячейку массива я представил набором переменных в Record... Выглядит примерно так:
......................
Type
Tes = record;
a : Strung;
b : Tstrings;
c : Boolean;
d : 0..4;
e : Tpicture;
End;
.....................
.....................
var CrTes : array of Tes;
.....................

Затем я хотел сделать что-то вроде:

var fa:TFileStream;
.......................
Fa:TfileStream.Create(c:\111.rtq, FmCreate);
For i:=0 to Length(CrTes) do
Fa.write (Length(CrTest[i]))
Fs.Free;

Да... сакжите Вы... Думал легко отделаться... Правда? :)
Anderson N.N

Anderson N.N (статус: 2-ой класс), 9 февраля 2009, 20:49 [#15]:

если это не лабороторная по информатике, то вообще не врубаюсь если есть 500-600 ответов
в каждой пара картинок общим весом хотя бы 1 метр. У тебя же файл за гигабайт уйдет ... а потом с этой громадиной
работать
а я так понял ответов ... будет больше ... хотя забей
----------------------------------------------------------------------
вопрос по коду

Fa.write (Length(CrTest[i]))

почему ты записываешь в файл, размер элементов а не их содержимое
Юрий Олегович

Юрий Олегович (статус: Посетитель), 10 февраля 2009, 01:18 [#16]:

эм... Про код - там наверное SizeOf вместо Length должно быть написано, правильно мыслю? Вторая часть кода (после слов"Затем я хотел сделать что-то вроде") придуман "на ходу"...

На один "Тест" создаётся один "Файл", где порядка 10-20-ть вопростов и раза в 3-4 больше ответов... Не каждый ответ бедт содержать картинки, там может быть и текст... Да, это будет большая, просто громадная куча файлов, но она будет храниться, в положеном ей месте, на сервере... И по-мере необходимости будут от тудова браться (Бочему и отказался от БД)... У меня вопрос по-моему коду: Как удалять картинку из массива? Я даже Free и Destroy пробовал - не помогает освободить память... If not(И правильно ли это я сохраняю?)then не подскажите как правильно?
Anderson N.N

Anderson N.N (статус: 2-ой класс), 10 февраля 2009, 14:15 [#17]:

Нет в функции write 2 параметра:
1) что записываешь
2) размер
В итоге код поменяется вот так:
...
Fa.write (CrTest[i],Length(CrTest[i]))
...
я не видел твоего кода, поэтому так абстрактно говорить трудно
Приведи код, не весь именно проблемные участки последовательно:
где создаешь (массив
где сохраняешь
где удаляешь
----------------------------------------------------------------
и копируй желательно прям из редактора Делфи
----------------------------------------------------------------
насчет массива я бы посоветовал вместо переменно TPicture использовать
указатели на TPicture (с ними не намного труднее может добавиться строчки 2)
но зато выигрыш будет огромный ...
Юрий Олегович

Юрий Олегович (статус: Посетитель), 16 февраля 2009, 00:39 [#18]:

Я тут пораскинул мыслями (по всему полу) и решил не использовать такой подход в решении проблемы (т.к. сроки поджимают). Согласившись с Вами, уважаемые эксперты, я решил использовать базы данных, но хранить не все тесты в одной базе, а на каждый тест создавать БД. Этим решатся сразу множество вопросов.
Всем большое спасибо за участие в обсуждении!

PS/Хоть данный вопрос и остаётся мне интересен, его я отложу в сторонку, поскольку это теперь не столь актуально:)
DNK

DNK (статус: Студент), 16 февраля 2009, 17:42 [#19]:

Только советую почитать документы по правилам проектирования БД.
"Digital Networked Knight"
Вадим К

Вадим К (статус: Академик), 16 февраля 2009, 18:16 [#20]:

м, читаю и не понимаю, вы все что действительно предлагаете хранить картинки в базе и считаете, что это луче?
Картинки имеют плохое свойство - быть большими и забивают очень быстро базу. И висят мертным грузом. Картинки правильно хранить в отдельной папке. А если их предполагаеться, что будет больше 1000, то лучше делать на подпапки. Надеюсь все замечали, что когда качаешь с разных файлообменных сайтов, то ссылки выглядят как
site.net/files/xyz/xyzqweljfdwhkj.ext
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 7 апреля 2020, 00:49
Выполнено за 0.02 сек.
Рейтинг@Mail.ru