Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-36248
maSESter
2002-11-30 23:06
2002.12.12
Как создать BAK file?


1-36236
Vasechkin
2002-12-01 17:33
2002.12.12
Как считать из реестра параметр DWORD


1-36109
Pavel_Next
2002-12-03 11:06
2002.12.12
Сообщение


1-36253
MaXie
2002-11-28 12:40
2002.12.12
Темная лошадка Delphi5 - Закладка Servers!


1-36102
Маришка
2002-12-03 09:39
2002.12.12
Приветик!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский