| 
| 
 | Вопрос # 2 402/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты!Вопрос такой: Можно ли сделать динамический массив картинок, а потом его сохранить в файл? Если можно и то и то, то меня больше интересует второе...
 И ещё, If всё вышесказанное возможно, then как из масива удалить картинку?
 Я пробовал сделать Record с переменной : TPicture, засунуть туда картинку получается, а убрать от тудова - нет... Ковырялся в Интернете, нашёл кучу способов, но они работают только с компонентом Image, компилятор не ругается, просто когда загружаешь картинку съедается память, потом нажимаю кнопку (со всеми способами очистки, которые я накопал), чтоб очистить переменную, но память не освобождается, а если ещё раз загрузить картинку, то память опять убавится... :(
 
|  |   Вопрос задал: Юрий Олегович (статус: Посетитель)Вопрос отправлен: 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 (статус: Студент), 7 февраля 2009, 08:32 [#1]:Подробности в мини-форуме. "Digital Networked Knight" |  
|   | DNK (статус: Студент), 7 февраля 2009, 09:51 [#3]:Под грузом опыта в программировании крупных проектов пришлось почти полностью отказаться от использования массивов, чего и другим советую. Изредко использую для хранения промежуточных значений каких-нибудь вычислений или констант для них. Уж больно из-за них код потом тяжело ворочать. TObjectList класс специализированный на хранения большого количества ссылок на объекты. Для добавления используются методы Add, Insert, для удаления Delete, Clear. Для доступа к объектам свойство Items, правда оно имеет свойство TObject, но это поправимо. Кроме того позволяет производить поиск, перемещение, автоматическую сортировку объектов. Да о чем я говорю, все это в хелпе описано.
 Чтобы сохранять и загружать картинки нужно сначала обдумать формат файлов.
 "Digital Networked Knight" |  
|   | Юрий Олегович (статус: Посетитель), 7 февраля 2009, 10:52 [#4]:Как Вы уже поняли - я новичёк в програмировании... "обдумать формат файлов. " - я много раз это слышал, но не могу представить как этот процесс происходит...
 Я пробовал сохранять несколько таблиц и ещё кучу текста с помощью FileStream, я себе представляю структуру получившегося файла, но это никто ни разу не называл "обдумывание формата файла"...
 Я "практик" и не очень себе это представляю...
 С чего начать и что использовать?
 Как происходит этот процесс?
   |  
|   | DNK (статус: Студент), 7 февраля 2009, 11:11 [#5]:В простейшем случае можно поступить следующим образом: 1. Сохранять сначала картинку в поток.
 2. Затем записовывать потоки в головной поток в следующем порядке. Размер потока - четырех байт думаю хватит. Далее сам поток.
 3. Повторить 1,2 если нужно. В итоге получаем бинарник.
 Читать в обратном порядке. Сначала читаем байты размера. Затем копируем нужного размера поток и загружаем в картинку, добавляем в список объектов.
 "Digital Networked Knight" |  
|   | Юрий Олегович (статус: Посетитель), 7 февраля 2009, 11:41 [#6]:Прошу прощения, я не озвучил свою цель... Вообщем я создаю программу тестирования и получается, что мне необходимо всё держать в памяти, пока создаётся файл теста, а только потом его скидывать в файл... Как это реализовать с помощью потоков (или есть ещё способ?)? Желательно с примерчиком, потому что с примером это намного больше встанет на свои места...   |  
|   | 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 (статус: Студент), 8 февраля 2009, 10:28 [#12]:Тогда после или перед длинной записи можно вставить заголовок специального формата с описанием, что внутри пакета информации(текст, картинка). Заголовки-описатели - это универсальная система с помощью которых строятся протоколы, файловые системы, БД. "Digital Networked Knight" |  
|   | 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 (статус: 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 (статус: 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 (статус: Студент), 16 февраля 2009, 17:42 [#19]:Только советую почитать документы по правилам проектирования БД. "Digital Networked Knight" |  
|   | Вадим К (статус: Академик), 16 февраля 2009, 18:16 [#20]:м, читаю и не понимаю, вы все что действительно предлагаете хранить картинки в базе и считаете, что это луче? Картинки имеют плохое свойство - быть большими и забивают очень быстро базу. И висят мертным грузом. Картинки правильно хранить в отдельной папке. А если их предполагаеться, что будет больше 1000, то лучше делать на подпапки. Надеюсь все замечали, что когда качаешь с разных файлообменных сайтов, то ссылки выглядят как
 site.net/files/xyz/xyzqweljfdwhkj.ext
 Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |