![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сохранить TFont в INI - файл как Data
koha! © (2008-09-19 06:03:00)как сохранять в ини-файлы структуры это понятно, а как можно из свойства Tfont скопировать структуру TFontData с минимальными усилиями не распарсивая.
Var
INI : TIniFile;
Strm : TStringStream;
Buff : String;
SizeBuff: Integer;
FD: TFontData;
begin
Result := False;
try
try
INI:=TIniFile.Create(CurPath+ConfigFile);
With INI do begin
SizeBuff:=SizeOf(FD);
SetLength(buff,SizeBuff);
FillChar(Buff[1],SizeBuff,0);
Strm := TStringStream.Create(Buff);
//примерно так можно сохранить одним разом все свойста,
WriteBinaryStream(FontSection,'FontConfig',Strm);
end;
Result := true;
finally
INI.Free;
end;
except
on E: Exception do
MessageBox(0,PChar(E.ClassName+' ????????? ??????, ? ?????????? : '+E.Message),
PChar('MSGLoger'),MB_ICONERROR);
end;
Но вот как TFontData скопировать ее из Тfont?
Koha! (2008-09-20 06:29:00) [1]
> Германн © (20.09.08 01:58) [18]
Не, просто я не не смотрел как объявлен тип в "Graphics"..... да и кому это нужно было выяснять, кто от чего страдает, я же ни кого не упрекаю, что кто - то страдает, от чрезмерной мании величия... Это все можно было решить просто, без взаимных упреков, такой подход, как будто я не выучил урок и пришел экзамены сдавать, вот она ваша преподавательская заносчивость, даже в повседневной жизни, дома и среди друзей , наверное тоже, "Ставите кафедру"... А то, действительно как, детский сад ..... (На этот пост можно не отвечать)
Германн (2008-09-20 02:19:00) [2]
> KilkennyCat © (20.09.08 02:12) [20]
>
> Главное, чтоб не пронесло... это неприятно, независимо от
> месяца.
>
- Что пил?
- Зубровку.
- Точно.
(с) Семь стариков и одна девушка.
За сим прекратим сие общение.
KilkennyCat (2008-09-20 02:12:00) [3]Главное, чтоб не пронесло... это неприятно, независимо от месяца.
Германн (2008-09-20 02:01:00) [4]
> KilkennyCat © (20.09.08 01:56) [15]
>
> ff и 255 - это разные вещи.
>
Кота понесло. Ну если на крышу, то это ещё пустяки. Хотя вроде сентябрь, а не март?
Германн (2008-09-20 01:58:00) [5]
> koha! (20.09.08 01:41) [12]
>
>
> > Чтобы было легко надо твердо выучить азбуку. А с этим
> видно
> > проблема. Начал без изучения азбуки, теперь мучается.
>
>
> И вовсе не мучаюсь,, Дело вовсе не в азбуке
Именно мучаешься. И дело именно в азбуке. Именно в азбуке Паскаля описан тип setи то, как он хранится в памяти. А ты азбуку не учил и не знаешь основ. Вот потому и мучаешься.
{RASkov} (2008-09-20 01:58:00) [6]> [15] KilkennyCat © (20.09.08 01:56)
Точно... Первые - это буквы, а вторые - цифры :)
{RASkov} (2008-09-20 01:57:00) [7]> [14] Германн © (20.09.08 01:54)
> Не верю!
:(
Как доказать? :)
KilkennyCat (2008-09-20 01:56:00) [8]ff и 255 - это разные вещи.
Германн (2008-09-20 01:54:00) [9]
> {RASkov} © (20.09.08 01:35) [11]
Не прибедняйся. Не верю! (с)
KilkennyCat (2008-09-20 01:53:00) [10]Бросаю!
(я никогда не признаю своих ошибок) :Р
koha! (2008-09-20 01:41:00) [11]
> Чтобы было легко надо твердо выучить азбуку. А с этим видно
> проблема. Начал без изучения азбуки, теперь мучается.
И вовсе не мучаюсь,, Дело вовсе не в азбуке, просто нужно так было сделать, ну, вот, просто хочу сделать таким методом, нужно же осваивать все способы записи - чтения, рано или поздно придется и с ними столкнуться.
Ну, кто без ошибок - брось первый камень....
{RASkov} (2008-09-20 01:35:00) [12]> [10] Германн © (20.09.08 01:28)
> всё равно не наш метод!
А мне что FF что 255 - одна фикня непонятная :( Это я про калькулятор :)
Германн (2008-09-20 01:28:00) [13]
> {RASkov} © (20.09.08 01:01) [8]
Но
> WriteInteger(FontSection, 'Style', Byte(Fnt.Style));
всё равно не наш метод!
Я бы предпочел:
WriteString(FontSection, 'Style', IntToHex(Byte(Fnt.Style),2))
и
Fnt.Style:=TFontStyles(Byte(StrToInt('$'+ReadString(FontSection, 'Style', '0')));
То же самое, но не люблю слишком часто включать "встроенный" в мой мозг калькулятор для конверта из десятичного в двоичный. :)
Германн (2008-09-20 01:08:00) [14]
> {RASkov} © (20.09.08 01:01) [8]
>
> Как все сложно :)
>
> > // Попробуй те сохранить множестыенный параметр, если
> он
> > будет таким FontSettings.Style:=[fsBold,fsItalic]
>
> Да легко
Чтобы было легко надо твердо выучить азбуку. А с этим видно проблема. Начал без изучения азбуки, теперь мучается.
{RASkov} (2008-09-20 01:01:00) [15]Как все сложно :)
> // Попробуй те сохранить множестыенный параметр, если он
> будет таким FontSettings.Style:=[fsBold,fsItalic]
Да легко
WriteInteger(FontSection, 'Style', Byte(Fnt.Style));
Его чтение:
Fnt.Style:=TFontStyles(Byte(ReadInteger(FontSection, 'Style', 0)));
где Fnt - TFont;
:)
koha! (2008-09-20 00:19:00) [16]Раз такое дело то вот еще и сразу покажу пример и для чтения параметров
Эти примеры нашел на ресурсе _www.delphiworld.narod.ru только вних имелось ввиду сохранение параметров Tfont в реестр.
//................................................................................ ..
Type
TFontConfigRec = packed record
Color : TColor;
LogFont : TLogFont;
end;
Var
LogFile : String;
CurPath : String;
FontSettings : TFont;
Const
FontSection = 'FONTSETTINGS';
ConfigFile = 'Config.ini';
//................................................................................ ...
{------------------------------- ReadINISettings ------------------------------}
Function ReadINISettings: boolean;
Var
INI : TIniFile;
strm : TStringStream;
buff : String;
FontRec: TFontConfigRec;
begin
Result := False;
try
try
INI:=TIniFile.Create(CurPath+ConfigFile);
With INI do begin
strm:=TStringStream.Create(Buff);
ReadBinaryStream(FontSection,'FontConfig',strm);
if Length(strm.DataString) = SizeOf(FontRec) then begin
Move(strm.DataString[1],FontRec,SizeOf(FontRec));
FontSettings.Handle := CreateFontIndirect(FontRec.LogFont);
FontSettings.Color := FontRec.Color;
end else Exit;
end;
Result:=true;
finally
strm.Free;
INI.Free;
end;
except
on E: Exception do
MessageBox(0,PChar(E.ClassName+' ????????? ??????, ? ?????????? : '+E.Message),
PChar('MSGLoger'),MB_ICONERROR);
end;
end;
KilkennyCat (2008-09-20 00:17:00) [17]
type
IIFont = class(TFont);
pSaveFont = ^ISaveFont;
ISaveFont = packed record
CharSet : TFontCharSet;
Color : TColor;
Pitch : TFontPitch;
Size : Word;
Style : TFontStyles;
end;
procedure TDataFile.ReadFont(Section, Ident: string; Font: TFont);
var
Buf : TMemoryStream;
pPos : PChar;
pBuf : Pointer;
Count : Integer;
FontChange: TNotifyEvent;
begin
try
Buf := TMemoryStream.Create;
Count := ReadStream(Section, Ident, Buf);
if( Count > SizeOf(ISaveFont))then
begin
try
GetMem(pBuf, Count);
Buf.Seek(0, soFromBeginning);
Buf.Read(pBuf^, Count);
FontChange := Font.OnChange;
Font.OnChange := nil;
Font.Charset := pSaveFont(pBuf)^.CharSet;
Font.Color := pSaveFont(pBuf)^.Color;
Font.Pitch := pSaveFont(pBuf)^.Pitch;
Font.Size := pSaveFont(pBuf)^.Size;
Font.Style := pSaveFont(pBuf)^.Style;
pPos := pBuf;
inc(pPos, SizeOf(ISaveFont));
Font.Name := StrPas(pPos);
finally
Font.OnChange := FontChange;
IIFont(Font).Changed;
FreeMem(pBuf, Count);
end;
end;
finally
Buf.Free;
end;
end;
procedure TDataFile.WriteFont(Section, Ident: string; Font: TFont);
var
pBuf: Pointer;
pPos: PChar;
Len : Integer;
begin
try
Len := SizeOf(ISaveFont) + Length(Font.Name) + 1;
GetMem(pBuf, Len);
pSaveFont(pBuf)^.CharSet := Font.Charset;
pSaveFont(pBuf)^.Color := Font.Color;
pSaveFont(pBuf)^.Pitch := Font.Pitch;
pSaveFont(pBuf)^.Size := Font.Size;
pSaveFont(pBuf)^.Style := Font.Style;
pPos := pBuf;
inc(pPos, SizeOf(ISaveFont));
StrPCopy(pPos, Font.Name);
WriteData(Section, Ident, pBuf, Len);
finally
FreeMem(pBuf, Len);
end;
end;
(с)Product: TDataFile
Version: 1.16
Author: Momot Alexander
Web: http://www.dbwork.kuban.ru
koha! (2008-09-20 00:02:00) [18]вот еще тип структуры забыл упомянуть для примера нужна:
Type
TFontConfigRec = packed record
Color : TColor;
LogFont : TLogFont;
end;
koha! (2008-09-19 23:57:00) [19]Для себя я уже нашел решение, жаль что с разу не отпостился на форуме, просто интеренет не всегда доступен бывает.
{------------------------------ WriteINISettings ------------------------------}
Function WriteINISettings: boolean;
Var
INI : TIniFile;
SizeBuff: Integer;
FontConf: TFontConfigRec;
mstrm : TMemoryStream;
begin
Result := False;
try
try
INI:=TIniFile.Create(CurPath+ConfigFile);
With INI do begin
// 1. первый традиционныц способ
WriteString(FontSection,'Name',FontSettings.Name);
WriteInteger(FontSection,'Height',FontSettings.Height);
WriteInteger(FontSection,'Orientation',FontSettings.Orientation);
WriteInteger(FontSection,'Pitch',Integer(TFontPitch(FontSettings.Pitch)));
WriteInteger(FontSection,'Size',FontSettings.Size);
// Вот это уже не прет >>>> WriteInteger(FontSection,'Style',Integer(TFontStylesBase(FontSettings.Style)));
// Попробуй те сохранить множестыенный параметр, если он будет таким FontSettings.Style:=[fsBold,fsItalic]
WriteInteger(FontSection,'Charset',Integer(TFontCharset(FontSettings.Charset)));
//2. способ...
//Из кода явно видно что вариант два на много упрощает сохранение параметра шрифта
if GetObject(FontSettings.Handle,SizeOf(FontConf.LogFont),@FontConf.LogFont) > 0 then begin
FontConf.Color := FontSettings.Color;
mstrm:=TMemoryStream.Create;
mstrm.Write(FontConf,SizeOf(FontConf));
mstrm.Seek(soFromEnd,soFromBeginning);
WriteBinaryStream(FontSection,'FontConfig',mstrm);
end;
end;
Result := true;
finally
mstrm.Free;
INI.Free;
end;
except
on E: Exception do
MessageBox(0,PChar(E.ClassName+' произошла ошибка, с сообщением : '+E.Message),
PChar('MSGLoger'),MB_ICONERROR);
end;
end;
Сергей М. (2008-09-19 10:22:00) [20]Ты в Инспекторе Объектов свойства фонта видишь в какомвиде ?
В текстовомвиде ты их видишь)
И хранятся эти свойтва в dfm тоже в текстовомвиде.
Так за каким же лешим нужно представлять все это добро в бинарном виде, если оно расчудесно записывается, хранится и считывается в виде текста ?
Ведь ini-контейнер в этом плане ничем не отличается от dfm-контейнера ..