Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.12;
Скачать: CL | DM;

Вниз

Сохранение небазовых типов в .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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.016 c
4-36486
Semion
2002-10-29 06:41
2002.12.12
удаленное соединение


14-36352
andrek
2002-11-20 11:53
2002.12.12
Желаю узнать ваше мнение


14-36369
Starkom
2002-11-20 15:20
2002.12.12
Помогите с InstallShield и BDE


14-36371
MaximatorVeter
2002-11-18 19:42
2002.12.12
Слова любви!


1-36092
Саррус
2002-12-01 01:23
2002.12.12
Многодокументный интерфейс