Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.08.2009, 02:11
spidergrasp spidergrasp вне форума
Прохожий
 
Регистрация: 17.08.2009
Сообщения: 2
Репутация: 10
Стрелка организация хранения данных

Стоит задача организовать хранение данных в одном файле. Данные имеют следующую структуру:
id - уникальный номер объекта
object - jpeg или bmp изображение
description - тестовое описание

Каким образом лучше всего организовать хранение такой структуры данных, чтобы все содержалось в одном файле и работало более менее быстро?
Ответить с цитированием
  #2  
Старый 18.08.2009, 20:40
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,090
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Например, использовать встраиваемую БД. Я для таких задач использую Embedded FireBird.
Ответить с цитированием
  #3  
Старый 20.08.2009, 18:40
dissident dissident вне форума
Прохожий
 
Регистрация: 25.07.2007
Сообщения: 8
Репутация: 10
По умолчанию

Ну, примитивный способ - использовать записи:

type
TData = record
id : integer;
description : string[255];
picture : array [1..1024,1..768] of integer;
end;

На лицо сразу куча недостатков, некоторая ограниченность метода и избыточность размера файлов.
Лучше всего конечно использовать базу данных, но если это по какой-либо причине нельзя делать, выход - использовать механихм blockread и blockwrite с обычными file of byte, записывая в файл информацию побайтово, кусками, сначала Id, затем описание, затем саму картинку, но так как размер описания и картинки может быть разным, лучше еще и их размер указывать. Также придется выделить область в файле для индека - чтоб выборку делать быстро, а не перебирать все варианты.
Ответить с цитированием
  #4  
Старый 21.08.2009, 13:02
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Цитата:
Сообщение от dissident
...
Это было-бы так если-бы автору не требовалось хранить данные непосредственно в файле. Использовать сторонние компоненты не всегда полезно, когда можно обойтись и встроеными средствами, лично я вижу несколько более простой вариант - использование ресурсов. Делаем ресурс с данными, включаем его в прогу, компилим, получаем один здоровый файл. Насколько это будет быстро работать - зависит от количества данных. Если картинка в пределах 30кило, я думаю и на 1000 штук будет шустро работать.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 21.08.2009 в 13:04.
Ответить с цитированием
  #5  
Старый 22.08.2009, 22:15
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Как вариант, есть еще и это :

Doc-файлы («DocFiles», «compound file», «составной файл», «хранилища структурированной информации», «structured storage») – средство для хранения структурированной информации в виде единого файла. Структура файла построена в виде дерева по аналогии с файловой системой. При этом, эквивалентом каталога(папки) является хранилище(storage), а эквивалентом файла – поток(stream). Doc-файлы ориентированы на хранение разнородных данных (текст, видео, графика, звук и т.д.).
Этот формат используется в MS Office (Word, Excel, PowerPoint).

Примерно так (открыть файл и отобразить в TTreeView) :

Код:
procedure TForm1.Button1Click(Sender: TObject);
Var
  Node : TTreeNode;
  stgRoot: IStorage;
begin
  OD1.FileName:=fn_1Cv7_md;
  OD1.InitialDir:=ExtractFilePath(fn_1Cv7_md);
  if OD1.Execute then begin
     fn_1Cv7_md:=OD1.FileName;
     Caption:=fn_1Cv7_md;
     if StgIsStorageFile(PWideChar(fn_1Cv7_md))=S_OK then begin
        //ShowMessage(ExtractFileName(fn_1Cv7_md)+' - это Doc-файл');
        OleCheck(StgOpenStorage(PWideChar(fn_1Cv7_md),
                                nil,
                                stgm_read or stgm_share_exclusive,
                                nil,
                                0,
                                stgRoot));
        TreeView1.Items.BeginUpdate;
        try
          TreeView1.Items.Clear;
          Node:=TreeView1.Items.Add(nil,'<Root>');
          GetNextStorage(Node,stgRoot);
          Node.Expand(true);
        finally
          TreeView1.Items.EndUpdate;
          stgRoot:=nil;
        end;
     end
     else begin
        ShowMessage(ExtractFileName(fn_1Cv7_md)+' - это не Doc-файл');
     end;
  end;
end;

procedure TForm1.GetNextStorage(pn : TTreeNode; stg : IStorage);
Var
  ESS : IEnumStatStg;
  StatStg : TStatStg;
  NodeName : string;
  cn : TTreeNode;
  ctgChild : IStorage;
  Sx : string;
begin
  OleCheck(stg.EnumElements(0,nil,0,ESS));
  while ESS.Next(1,StatStg,nil) = S_OK do
   begin
     NodeName:=StatStg.pwcsName;
     Sx:='???';
     if StatStg.dwType = STGTY_STORAGE then Sx:='STORAGE';
     if StatStg.dwType = STGTY_STREAM then Sx:='STREAM';
     if StatStg.dwType = STGTY_PROPERTY then Sx:='PROPERTY';
     if StatStg.dwType = STGTY_LOCKBYTES then Sx:='LOCKBYTES';
     cn:=TreeView1.Items.AddChild(pn,NodeName+'='+Sx+'');
     if (StatStg.dwType = STGTY_STORAGE) then begin
        OleCheck(Stg.OpenStorage(StatStg.pwcsName,
                 nil,
                 stgm_read or stgm_share_exclusive,
                 nil,
                 0,
                 ctgChild));
        GetNextStorage(cn,ctgChild);
     end;
  end;
end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:01.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025