Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Хранение информации разных типов в одном файле [D7, WinXP]


ArchValentin ©   (2005-11-01 00:26:00) 

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


Amoeba   (2005-11-01 10:40:00) [1]

Библиотека Single File System. Для некоммерческого использования бесплатна.
http://www.aidaim.com/single_file_system.htm

Сам успешно ее использую.


Джо   (2005-11-01 03:37:00) [2]

Или воспользоваться streaming capabilities of TComponent.

unit Unit1;

interface
uses Classes, SysUtils, Graphics;

type

 TStorage = class (TComponent)
 private
   FMyString: string;
   FBitmap: TBitmap;
   procedure SetBitmap(const Value: TBitmap);
 published
   property MyString: string read FMyString write FMyString;
   property MyBitmap: TBitmap read FBitmap write SetBitmap;
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
 end;

implementation

{ TStorage }

constructor TStorage.Create(AOwner: TComponent);
begin
 inherited;
 FBitmap := TBitmap.Create;
end;

destructor TStorage.Destroy;
begin
 FBitmap.Free;  
 inherited;
end;

procedure TStorage.SetBitmap(const Value: TBitmap);
begin
 FBitmap.Assign(Value);
end;

end.


Пример:


// запись
procedure TForm12.Button1Click(Sender: TObject);
var
 FS: TFileStream;
 Storage: TStorage;
begin
 FS := TFileStream.Create('d:\storage.dat',fmCreate);
 try
   Storage := TStorage.Create(nil);
   try
     Storage.MyString := Edit1.Text;
     Storage.MyBitmap := Image1.Picture.Bitmap;
     FS.WriteComponent(Storage);
   finally
     Storage.Free;
   end;
 finally
   FS.Free;
 end;
end;

//чтение
procedure TForm12.Button2Click(Sender: TObject);
var
 FS: TFileStream;
 Storage: TStorage;
begin
 FS := TFileStream.Create('d:\storage.dat',fmOpenRead);
 try
   Storage := TStorage.Create(nil);
   try
     FS.ReadComponent(Storage);

     Image1.Picture.Bitmap := Storage.MyBitmap;
     Edit1.Text := Storage.MyString;
   finally
     Storage.Free;
   end;
 finally
   FS.Free;
 end;
end;


В общем, вариантов масса. И это еще не касались СУБД.


Джо   (2005-11-01 03:18:00) [3]


procedure ReadString (AStream: TStream; var AString: string);
var
 Sz: Integer;
begin
 // читаем размер данных
 AStream.Read(Sz,SizeOf(Sz));
 // устанавливаем длину строки
 SetLength(AString,Sz);
 // читаем строку
 AStream.Read(AString[1],Sz);
end;

procedure WriteString (AStream: TStream; AString: string);
var
 Sz: Integer;
begin
 // пишем длину данных
 Sz := Length(AString);
 AStream.Write(Sz,SizeOf(Sz));
 // пишем сами данные
 AStream.Write(AString[1],Sz);
end;

// запись
procedure TForm12.Button1Click(Sender: TObject);
var
 FS: TFileStream;
begin
 FS := TFileStream.Create('d:\storage.dat',fmCreate);
 try
   Image1.Picture.Bitmap.SaveToStream(FS);
   WriteString (FS,Edit1.Text);
 finally
   FS.Free;
 end;
end;

//чтение
procedure TForm12.Button2Click(Sender: TObject);
var
 FS: TFileStream;
 S: string;
begin
 FS := TFileStream.Create('d:\storage.dat',fmOpenRead);
 try
   Image1.Picture.Bitmap.LoadFromStream(FS);
   ReadString (FS,S);
   Edit1.Text := S;
 finally
   FS.Free;
 end;
end;


злобная танька   (2005-11-01 03:10:00) [4]

разложы ее на пикселы и пихай.. ширину, высоту, потом ширину*высоту пикселов (по три байта кажный например) потом строчки свои.. проще пареной репы. через файлстрим удобно.


ArchValentin   (2005-11-01 02:53:00) [5]


> Джо ©   (01.11.05 02:46) [8]

Конкретно, как запихать в один файл куртинку и пару строк...


Джо   (2005-11-01 02:46:00) [6]

[7] ArchValentin ©   (01.11.05 02:45)
> Для это го то и создали такие конференции

Рискну предположить, что, все-таки, не для этого, ну да ладно :)

Так пример по какой подсказке требуется?


ArchValentin   (2005-11-01 02:45:00) [7]


> Джо ©   (01.11.05 02:41) [5]

тоже конечно верно, но всё-таки. Для это го то и создали такие конференции


Джо   (2005-11-01 02:42:00) [8]


> [4] ArchValentin ©   (01.11.05 02:39)
> ...еже ли не сложно, кинте сорец с конкретным примером.
>

А, кстати, с примером - чего? Их тут несколько подсказали.


Джо   (2005-11-01 02:41:00) [9]

[4] ArchValentin ©   (01.11.05 02:39)
> А то так довольно сложно разбираться.

Программировать вообще не просто.


ArchValentin   (2005-11-01 02:39:00) [10]

...еже ли не сложно, кинте сорец с конкретным примером. А то так довольно сложно разбираться. Заранее спасибо


Defunct   (2005-11-01 01:52:00) [11]

ArchValentin ©   (01.11.05 00:26)  

см. про тип поля - BLOB


Юрий Зотов   (2005-11-01 00:52:00) [12]

1. Пишем длину элемента данных N (4 байта)
2. Пишем сам элемент данных (N байт)

И так, пока не кончатся все данные. Читаем в том же порядке.


saNat   (2005-11-01 00:52:00) [13]

Используйте Access, например. Все просто и быстро.

С уважением, ЕВА.


Наверх

Титульная страница Поиск, карта сайта Написать письмо