Форум: "Основная";
Текущий архив: 2002.12.12;
Скачать: [xml.tar.bz2];
ВнизСохранение небазовых типов в .ini файле Найти похожие ветки
← →
Vcoder (2002-12-01 14:49) [0]TPen.Style, TPen.Mode, TFont.Style... Как их сохранить в .ini файл, а потом восстановить? Ведь в .ini файл можно сохранять только базовые типы (String, Boolean, Logint, Double, DateTime,... вот вроде и все). Или, может, можно преобразовать эти типы в базовый (напр. Longint, ведь много чего на нем основано, например тот же TColor...)?
← →
Calm (2002-12-01 14:58) [1]Я преобразовывал все в string. Если тип совсем уж не базовый (т.е. нет функций вида XxxToStr(), то писал свои. Соответственно нужны функции вида StrToXxx
← →
Vcoder (2002-12-01 16:11) [2]Может еще какие мысли есть?
← →
Сергей Бушин (2002-12-01 16:20) [3]MyIni.WriteBool("Pen","Mode",Self.Canvas.Pen.Mode in [pmCopy]);
← →
Юрий Зотов (2002-12-01 17:11) [4]1. Приведение типа, например Integer(clWindow) или TColor(3).
2. ObjectBinaryToText позволяет записать весь объект разом.
← →
Vcoder (2002-12-01 19:22) [5]
> Сергей Бушин © (01.12.02 16:20)
> MyIni.WriteBool("Pen","Mode",Self.Canvas.Pen.Mode in [pmCopy]);
Вы наверное хотели написать
MyIni.WriteBool("Pen","Mode",[pmCopy] in Self.Canvas.Pen.Mode);
Да и слишком уж громоздкая конструкция получается...
> Юрий Зотов © (01.12.02 17:11)
> 1. Приведение типа, например Integer(clWindow) или TColor(3).
> 2. ObjectBinaryToText позволяет записать весь объект разом.
1. К какому типу можно привести, например, TPen.style, коий является, если я не ошибаюсь, перечисляемым типом?
2. ObjectBinaryToText требует аргументы типа TStream, в который можно сохранить только наследников TComponent. TPen и TFont таковыми не являются...
← →
TTCustomDelphiMaster (2002-12-01 21:08) [6]Делал примерно то же и примерно так:
type
TIniFileEx = class(TIniFile)
private
function BufToString(Size: integer; const Buf): string;
function StringToBuf(Value: String; Size: integer; var Buf): Boolean;
public
procedure WriteStyle(const Section, Ident: String;
Value: TPenStyle); overload;
procedure WriteStyle(const Section, Ident: String;
Value: TFontStyles); overload;
function ReadStyle(const Section, Ident: String;
Default: TPenStyle): TPenStyle; overload;
function ReadStyle(const Section, Ident: String;
Default: TFontStyles): TFontStyles; overload;
end;
{ TIniFileEx }
function TIniFileEx.StringToBuf(Value: String; Size: integer; var Buf): Boolean;
var
i: integer;
k: PByte;
begin
if Length(Value) div 2 <> Size then
begin
Result := False;
Exit;
end
else
Result := True;
k := @Buf;
for i := 0 to Size - 1 do
begin
k^ := StrToInt("$"+Copy(Value, i*2, 2));
inc(k);
end;
end;
function TIniFileEx.BufToString(Size: integer; const Buf): string;
var
i: integer;
k: PByte;
begin
Result := "";
k := @Buf;
for i := 0 to Size - 1 do
begin
Result := Result + IntToHex(k^, 2);
inc(k);
end;
end;
procedure TIniFileEx.WriteStyle(const Section, Ident: String;
Value: TPenStyle);
begin
WriteString(Section, Ident, BufToString(SizeOf(TPenStyle), Value));
end;
procedure TIniFileEx.WriteStyle(const Section, Ident: String;
Value: TFontStyles);
begin
WriteString(Section, Ident, BufToString(SizeOf(TFontStyles), Value));
end;
function TIniFileEx.ReadStyle(const Section, Ident: String;
Default: TPenStyle): TPenStyle;
begin
if not StringToBuf(ReadString(Section, Ident, ""), SizeOf(TPenStyle), Result) then
Result := Default;
end;
function TIniFileEx.ReadStyle(const Section, Ident: String;
Default: TFontStyles): TFontStyles;
begin
if not StringToBuf(ReadString(Section, Ident, ""), SizeOf(TFontStyles), Result) then
Result := Default;
end;
← →
Юрий Зотов (2002-12-01 23:25) [7]> Vcoder © (01.12.02 19:22)
> 1. К какому типу можно привести, например, TPen.style, коий
> является, если я не ошибаюсь, перечисляемым типом?
Ответ.
Любой перечислимый тип есть целое число. К нему и приводится.
> 2. ObjectBinaryToText требует аргументы типа TStream, в
> который можно сохранить только наследников TComponent.
> TPen и TFont таковыми не являются...
Ответ.
ObjectBinaryToText требует не САМОГО TStream (это вообще абстрактный класс), а ЛЮБОГО ЕГО ПОТОМКА, включая TMemoryStream. И, поскольку ЛЮБОЙ объект хранится в памяти, он может быть записан в TMemoryStream.
3. При записи форм сама Delphi использует именно те механизмы, о которых я говорил. В том числе, она прекрасно записывает TFont, TCollecton, TStrings, да и вообще любые другие некомпонентские классы - потомки TPersistent. Собственно, этот класс именно для того и существует.
← →
Vcoder (2002-12-02 19:56) [8]
> Юрий Зотов © (01.12.02 23:25)
Please, приведите по кусочку кода на ответы 1 и 2, как это сделать. Просто у меня нет книги, где это можно посмотреть, а "дойти по приборам" здесь не так просто :(
← →
Ученик (2002-12-02 21:20) [9]>Vcoder © (01.12.02 14:49)
uses
Classes;
type
TWriterAccess = class(TWriter);
procedure WritePersistent(Stream: TStream; Instance: TPersistent);
begin
with TWriterAccess.Create(Stream, 1024) do try
WriteListBegin;
WriteProperties(Instance);
WriteListEnd;
finally
Free
end
end;
type
TReaderAccess = class(TReader);
procedure ReadPersistent(Stream: TStream; Instance: TPersistent);
begin
with TReaderAccess.Create(Stream, 1024) do try
if ReadValue = vaList then begin
while not EndOfList do ReadProperty(Instance);
SkipValue
end
finally
Free
end
end;
TMemoryStream, TIniFile.WriteBinaryStream, TIniFile.ReadBinaryStream, если они есть в Delphi 5, также в INI-файле есть ограничения на длину строки
← →
PVOzerski (2002-12-02 22:54) [10]В поставленной задаче оговорено, что используется стандартный ini-файл, что накладывает определенные ограничения. Так, ЛЮБУЮ строку писать туда нельзя - что будет, если в ней будет, скажем, #13 или #0? Или она просто начнется с пробела?
Я бы решал задачу, исходя из размеров переменных в байтах.
Если <=4, преобразовывал бы в longint (для перечислимых типов - через обычный typecast, а, скажем, для single или array - каким-нибудь трюком вроде move или absolute). Если фиксированная и не очень большая длина - представлял бы как массив байтов, word"ов или longint"ов и каждый элемент сохранял бы как отдельный item.
Если длина переменная - делал бы файл в формате, скажем, UUE :^), и сохранял бы его строки.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.12;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c