Type
TMyRec = record
Str: string[255]; //Обычная строка
LStr: AnsiString; // Или WideString
end;
....
var
RecFile: TRMyRec;
....
Длинный текст в структуру record
Например вот код:
Код:
Фишка в том, что структура для типизированного файла должна быть с конечным значением (пр. string[255]), а AnsiString не имеют конечного значения. Поэтому в таком коде выдаётся ошибка.
А в моей проге необходимо создавать список, в котором будет в узлах (record) "Название" (string[255]) и соответствующее длинное определение (WideString или AnsiString) формата RTF, а затем сохранить это всё в типизированный файл.
Помогите мне, пожалуйста!!!
Цитата:
Originally posted by Fobos
А в моей проге необходимо создавать список, в котором будет в узлах (record) "Название" (string[255]) и соответствующее длинное определение (WideString или AnsiString) формата RTF, а затем сохранить это всё в типизированный файл.
А в моей проге необходимо создавать список, в котором будет в узлах (record) "Название" (string[255]) и соответствующее длинное определение (WideString или AnsiString) формата RTF, а затем сохранить это всё в типизированный файл.
Понятия типизированный файл и длинная строке не совместимы. Для того чтоб сохранить длинную строку сначала пиши длину строки а потом саму строку. Кроме того тебе НЕ УДАСТЬСЯ сохранить RTF форматирование с использованием файловых переменных - для этого нужно создавать потоки (streams).
Цитата:
Кроме того тебе НЕ УДАСТЬСЯ сохранить RTF форматирование с использованием файловых переменных - для этого нужно создавать потоки (streams).
А как поток сохранить в record?
Мне ведь списки надо делать?
Цитата:
Originally posted by Fobos
А как поток сохранить в record?
Мне ведь списки надо делать?
А как поток сохранить в record?
Мне ведь списки надо делать?
Код:
type
TRec = record
Field1: integer;
Field2: double;
Field3: string;
end;
procedure WriteRec(Stream: TStream; const Rec: TRec);
var strlen: integer;
begin
//запись 1 поля
Stream.WriteBuffer(Rec.Field1,sizeof(Rec.Field1));
//запись 2 поля
Stream.WriteBuffer(Rec.Field2,sizeof(Rec.Field2));
//запись 3 пооля-строки
strlen:=Length(Rec.Field3);
Stream.WriteBuffer(strlen,sizeof(strlen));
Stream.WriteBuffer(pointer(Rec.Field3)^,strlen*sizeof(Char));
end;
procedure ReadRec(Stream: TStream; var Rec: TRec);
var strlen: integer;
begin
//чтение 1 поля
Stream.ReadBuffer(Rec.Field1,sizeof(Rec.Field1));
//чтение 2 поля
Stream.ReadBuffer(Rec.Field2,sizeof(Rec.Field2));
//чтение 3 поля-строки
Stream.ReadBuffer(strlen,sizeof(strlen));
SetString(Rec.Field3,nil,strlen);
Stream.ReadBuffer(pointer(Rec.Field3)^,strlen*sizeof(Char));
end;
<...>
var Stream: TFileStream;
begin
Stream:=TFileStream.Create('c:\file.tmp',fmCreate or fmOpenWrite);
WriteRec(Stream, ...);
Stream.Free;
end;
begin
Stream:=TFileStream.Create('c:\file.tmp', fmOpenRead);
ReadRec(Stream, ...);
Stream.Free;
end;
TRec = record
Field1: integer;
Field2: double;
Field3: string;
end;
procedure WriteRec(Stream: TStream; const Rec: TRec);
var strlen: integer;
begin
//запись 1 поля
Stream.WriteBuffer(Rec.Field1,sizeof(Rec.Field1));
//запись 2 поля
Stream.WriteBuffer(Rec.Field2,sizeof(Rec.Field2));
//запись 3 пооля-строки
strlen:=Length(Rec.Field3);
Stream.WriteBuffer(strlen,sizeof(strlen));
Stream.WriteBuffer(pointer(Rec.Field3)^,strlen*sizeof(Char));
end;
procedure ReadRec(Stream: TStream; var Rec: TRec);
var strlen: integer;
begin
//чтение 1 поля
Stream.ReadBuffer(Rec.Field1,sizeof(Rec.Field1));
//чтение 2 поля
Stream.ReadBuffer(Rec.Field2,sizeof(Rec.Field2));
//чтение 3 поля-строки
Stream.ReadBuffer(strlen,sizeof(strlen));
SetString(Rec.Field3,nil,strlen);
Stream.ReadBuffer(pointer(Rec.Field3)^,strlen*sizeof(Char));
end;
<...>
var Stream: TFileStream;
begin
Stream:=TFileStream.Create('c:\file.tmp',fmCreate or fmOpenWrite);
WriteRec(Stream, ...);
Stream.Free;
end;
begin
Stream:=TFileStream.Create('c:\file.tmp', fmOpenRead);
ReadRec(Stream, ...);
Stream.Free;
end;