Skip to main content

"BitMap как Strring"

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
"BitMap как Strring"

Помогите сохранить структуру в файл.

TYPE
NEW=record
A:string[10];
B:integer;
C:BitMap;
end;

File of NEW - не катит, точно нужно что - то другое ?!

Аватар пользователя забыл_пароль
Не в сети
Гражданин
Зарегистрирован: 29.10.2005
Сообщения: 1414
Баллы: 1427
"BitMap как Strring"

У записи должен быть ограниченый размер для того, чтобы сделать типизированный файл. Делай нетипизированный. Все равно типизированный - это не текстовый а бинарный формат. Текстовый - textfile.

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
"BitMap как Strring"

Можешь привести пример хранения в одном файле информации типа string (записи о человеке: ФИО и т.д.) и bitmap'а (image.picture.bitmap - правильный JPGFLIE). Сейчас у меня они хранятся в разных файлах и мне приходиться поддерживать ссылочную целостность. А хочу чтобы чтение из одного единственного файла полностю заполняло мою структуру (та где есть и string и bitmap).

Аватар пользователя забыл_пароль
Не в сети
Гражданин
Зарегистрирован: 29.10.2005
Сообщения: 1414
Баллы: 1427
"BitMap как Strring"

"Shader" пишет:

Можешь привести пример хранения в одном файле информации типа string (записи о человеке: ФИО и т.д.) и bitmap'а (image.picture.bitmap - правильный JPGFLIE). Сейчас у меня они хранятся в разных файлах и мне приходиться поддерживать ссылочную целостность. А хочу чтобы чтение из одного единственного файла полностю заполняло мою структуру (та где есть и string и bitmap).

Используй BlockRead/BlockWrite - можно записывать например такую структуру:

[размер таблицы адресов][начало]
[размер строки]строка[размер рисунка]рисунок
[размер строки]строка[размер рисунка]рисунок
[размер строки]строка[размер рисунка]рисунок
...
[конец][таблица адресов]

таблица адресов - таблица смещений, на каждую запись (если нужен поиск)... хотя это и туповато немного...

Аватар пользователя Aven
Не в сети
Гражданин
Зарегистрирован: 08.05.2007
Сообщения: 1318
Баллы: 1375
"BitMap как Strring"

кодируй в base64

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
"BitMap как Strring"

"Avenger" пишет:

кодируй в base64

А-ээ... в Base64 говоришь?

Аватар пользователя забыл_пароль
Не в сети
Гражданин
Зарегистрирован: 29.10.2005
Сообщения: 1414
Баллы: 1427
"BitMap как Strring"

"Shader" пишет:

А-ээ... в Base64 говоришь?

Да, кстати, если надо могу дать алгоритм =)

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
"BitMap как Strring"

"забыл_пароль" пишет:

Да, кстати, если надо могу дать алгоритм =)

Давай, буду рад...

Аватар пользователя забыл_пароль
Не в сети
Гражданин
Зарегистрирован: 29.10.2005
Сообщения: 1414
Баллы: 1427
"BitMap как Strring"

"Shader" пишет:

Давай, буду рад...

писал когда-то...

function EncodeBase64(const inStr: string): string;</p>
<p>  function Encode_Byte(b: Byte): char;<br />
  const<br />
    Base64Code: string[64] =<br />
      'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';<br />
  begin<br />
    Result := Base64Code[(b and $3F)+1];<br />
  end;</p>
<p>var<br />
  i: Integer;<br />
begin<br />
  i := 1;<br />
  Result := '';<br />
  while i < =Length(InStr) do<br />
  begin<br />
    Result := Result + Encode_Byte(Byte(inStr[i]) shr 2);<br />
    Result := Result + Encode_Byte((Byte(inStr[i]) shl 4) or (Byte(inStr[i+1]) shr 4));<br />
    if i+1 < =Length(inStr) then<br />
      Result := Result + Encode_Byte((Byte(inStr[i+1]) shl 2) or (Byte(inStr[i+2]) shr 6))<br />
    else<br />
      Result := Result + '=';<br />
    if i+2 < =Length(inStr) then<br />
      Result := Result + Encode_Byte(Byte(inStr[i+2]))<br />
    else<br />
      Result := Result + '=';<br />
    Inc(i, 3);<br />
  end;<br />
end;</p>
<p>// Base64 decoding<br />
function DecodeBase64(const CinLine: string): string;<br />
const<br />
  RESULT_ERROR = -2;<br />
var<br />
  inLineIndex: Integer;<br />
  c: Char;<br />
  x: SmallInt;<br />
  c4: Word;<br />
  StoredC4: array[0..3] of SmallInt;<br />
  InLineLength: Integer;<br />
begin<br />
  Result := '';<br />
  inLineIndex := 1;<br />
  c4 := 0;<br />
  InLineLength := Length(CinLine);</p>
<p>  while inLineIndex < =InLineLength do<br />
  begin<br />
    while (inLineIndex < =InLineLength) and (c4 < 4) do<br />
    begin<br />
      c := CinLine[inLineIndex];<br />
      case c of<br />
        '+'     : x := 62;<br />
        '/'     : x := 63;<br />
        '0'..'9': x := Ord(c) - (Ord('0')-52);<br />
        '='     : x := -1;<br />
        'A'..'Z': x := Ord(c) - Ord('A');<br />
        'a'..'z': x := Ord(c) - (Ord('a')-26);<br />
      else<br />
        x := RESULT_ERROR;<br />
      end;<br />
      if x < > RESULT_ERROR then<br />
      begin<br />
        StoredC4[c4] := x;<br />
        Inc(c4);<br />
      end;<br />
      Inc(inLineIndex);<br />
    end;</p>
<p>    if c4 = 4 then<br />
    begin<br />
      c4 := 0;<br />
      Result := Result + Char((StoredC4[0] shl 2) or (StoredC4[1] shr 4));<br />
      if StoredC4[2] = -1 then Exit;<br />
      Result := Result + Char((StoredC4[1] shl 4) or (StoredC4[2] shr 2));<br />
      if StoredC4[3] = -1 then Exit;<br />
      Result := Result + Char((StoredC4[2] shl 6) or (StoredC4[3]));<br />
    end;<br />
  end;<br />
end;

Не в сети
Новенький
Зарегистрирован: 22.01.2006
Сообщения: 9
Баллы: 10
"BitMap как Strring"

Я бы сделал по другому. Зачем какие-то промежуточные геморои с Base64?
Есть же FileStream!

TYPE
TNEW=record // не понимаю, как тебе Delphi разрешил обозвать тип словом new? Я добавил T для приличия
A:string[10];
B:integer;
C:BitMap; // а че за Bitmap? Может TBitmap?
end;

procedure SaveFile(filename: string);
var
FS : TFileStream;
i: integer;
begin
// Чтобы не заморачиваться удаляем просто файл, если вдруг он уже есть
DeleteFile(PAnsiChar(filename));

FS := TFileStream.Create(filename,fmOpenWrite or fmCreate);

try
// Сначала записываем кол-во записей, которые у тебя где-нибудь в массиве или еще где
FS.Write(RecordsCount,sizeof(RecordsCount));
for i:=0 to RecordsCount-1 do
SaveRecord(Records[i],FS); // Records - это твой массив из структур
finally
FS.Free;
end;
end;

procedure SaveRecord(Rcd: TNew; FS: TFileStream);
begin
FS.Write(Rcd.A,10);
FS.Write(Rcd.B,sizeof(Rcd.B));
Rcd.C.SaveToStream(FS);
end;

Ну а как прочитать - в том же порядке только Read, надеюсь догадаешься.

Аватар пользователя Shader
Не в сети
Студент
Зарегистрирован: 15.10.2005
Сообщения: 706
Баллы: 729
"BitMap как Strring"

"DreDD" пишет:

Я бы сделал по другому. Зачем какие-то промежуточные геморои с Base64?
Есть же FileStream!

TYPE
TNEW=record // не понимаю, как тебе Delphi разрешил обозвать тип словом new? Я добавил T для приличия
A:string[10];
B:integer;
C:BitMap; // а че за Bitmap? Может TBitmap?
end;

procedure SaveFile(filename: string);
var
FS : TFileStream;
i: integer;
begin
// Чтобы не заморачиваться удаляем просто файл, если вдруг он уже есть
DeleteFile(PAnsiChar(filename));

FS := TFileStream.Create(filename,fmOpenWrite or fmCreate);

try
// Сначала записываем кол-во записей, которые у тебя где-нибудь в массиве или еще где
FS.Write(RecordsCount,sizeof(RecordsCount));
for i:=0 to RecordsCount-1 do
SaveRecord(Records[i],FS); // Records - это твой массив из структур
finally
FS.Free;
end;
end;

procedure SaveRecord(Rcd: TNew; FS: TFileStream);
begin
FS.Write(Rcd.A,10);
FS.Write(Rcd.B,sizeof(Rcd.B));
Rcd.C.SaveToStream(FS);
end;
Ну а как прочитать - в том же порядке только Read, надеюсь догадаешься.

Попробую...

Аватар пользователя Aven
Не в сети
Гражданин
Зарегистрирован: 08.05.2007
Сообщения: 1318
Баллы: 1375
"BitMap как Strring"

ему же в стринг нужно было а не в filestream )

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".