![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хранение информации разных типов в одном файле [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, например. Все просто и быстро.
С уважением, ЕВА.