Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение шрифта таблицы в ini-файл 
:(
    Опции темы
Mick Winder
  Дата 11.11.2004, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 15.10.2004
Где: Москва Рязанка

Репутация: нет
Всего: -1



Создаю ini-файл, куда записываю все параметры размеров формы, фон и шрифт таблицы...
Есть проблема записи в ini-файл параметров шрифта... Как решить проблему со шрифтами...
Исходный код ниже:

procedure TForm1.FormDestroy(Sender: TObject);
var
Ini: Tinifile;
begin
Ini:= TiniFile.Create(extractfilepath(paramstr(0))+'MyIni.ini');
Ini.WriteInteger('Size', 'Width', form1.Width);
Ini.WriteInteger('Size', 'Height', form1.Height);
Ini.WriteInteger('Position', 'X', form1.Left);
Ini.WriteInteger('Position', 'Y', form1.Top);
Ini.WriteInteger('Grid', 'ColorColums[0]', DBGridEh1.Columns.Items[0].Color);
Ini.WriteInteger('Grid', 'ColorTitle[0]', DBGridEh1.Columns.Items[0].Title.Color);
Ini.WriteInteger('Grig', 'FontTitle', DBGrideh1.Columns.Items[0].Title.Font); // проблема
Ini.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
Ini: Tinifile;
i: Integer;
begin
Ini:= TiniFile.Create(extractfilepath(paramstr(0))+'MyIni.ini');
Form1.Width:= Ini.ReadInteger('Size', 'Width', 100);
Form1.Height:= Ini.ReadInteger('Size', 'Height', 100);
Form1.Left:= Ini.ReadInteger('Size', 'X', 10);
Form1.Top:= Ini.ReadInteger('Size', 'Y', 10);
DBGridEh1.Columns.Items[0].Color:= Ini.ReadInteger('Grid', 'ColorColums[0]', clWhite);
DBGridEh1.Columns.Items[0].Title.Color:= Ini.ReadInteger('Grid', 'ColorTitle[0]', clLtGray);
for i:=1 to DBgridEh1.Columns.Count -1 do
DBGrideh1.Columns.Items[i]Title.Font:= Ini.ReadInteger('Grid', 'FontTitle', 0);
Ini.Free;
end;
PM MAIL   Вверх
Dimich
Дата 11.11.2004, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 25.8.2004
Где: Брянск

Репутация: 1
Всего: 7



Код

Ini.WriteInteger('Grig', 'FontTitle', DBGrideh1.Columns.Items[0].Title.Font);

Да, тут действительно проблема... Именно так, как написано - не получится. Конфликт типов TFont и Integer.
Думаю, надо сохранять для шрифта все его параметры (Name, Color, Height, Size, Style и т.д.), а потом их загружать. Собственно так должно получиться.
--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
Mick Winder
Дата 11.11.2004, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 15.10.2004
Где: Москва Рязанка

Репутация: нет
Всего: -1



Попробовал написать...
Ini.WriteString('Grig', 'FontTitleStyle', DBGridEh1.Columns.Items[0].Title.Font.Style);
или
Ini.WriteInteger('Grig', 'FontTitleStyle', DBGridEh1.Columns.Items[0].Title.Font.Style);

Все равно конфликт типов String или Integer и TFontStyle... Что делать?
PM MAIL   Вверх
Гость_Pakshin A. S.
Дата 11.11.2004, 18:00 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Отдельно прописываем все опции класса TFont. TFontStyle можно прописать через integer...

А вообще, по культуре, заведи отдельный файл (типизированный), тип которого будет состоять из патаметров Font'а... и писать отдельный файл, не ini...
  Вверх
Alex
Дата 11.11.2004, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Код

function FontToStr(font: TFont): string;
 procedure yes(var str: string);
 begin

   str := str + 'y';
 end;
 procedure no(var str: string);
 begin

   str := str + 'n';
 end;
begin

 {кодируем все атрибуты TFont в строку}
 Result := '';
 Result := Result + IntToStr(font.Color) + '|';
 Result := Result + IntToStr(font.Height) + '|';
 Result := Result + font.Name + '|';
 Result := Result + IntToStr(Ord(font.Pitch)) + '|';
 Result := Result + IntToStr(font.PixelsPerInch) + '|';
 Result := Result + IntToStr(font.size) + '|';
 if fsBold in font.style then
   yes(Result)
 else
   no(Result);
 if fsItalic in font.style then
   yes(Result)
 else
   no(Result);
 if fsUnderline in font.style then
   yes(Result)
 else
   no(Result);
 if fsStrikeout in font.style then
   yes(Result)
 else
   no(Result);
end;

procedure StrToFont(str: string; font: TFont);
begin

 if str = '' then
   Exit;
 font.Color := StrToInt(tok('|', str));
 font.Height := StrToInt(tok('|', str));
 font.Name := tok('|', str);
 font.Pitch := TFontPitch(StrToInt(tok('|', str)));
 font.PixelsPerInch := StrToInt(tok('|', str));
 font.Size := StrToInt(tok('|', str));
 font.Style := [];
 if str[0] = 'y' then
   font.Style := font.Style + [fsBold];
 if str[1] = 'y' then
   font.Style := font.Style + [fsItalic];
 if str[2] = 'y' then
   font.Style := font.Style + [fsUnderline];
 if str[3] = 'y' then
   font.Style := font.Style + [fsStrikeout];
end;

function tok(sep: string; var s: string): string;

 function isoneof(c, s: string): Boolean;
 var
   iTmp: integer;
 begin
   Result := False;
   for iTmp := 1 to Length(s) do
   begin
     if c = Copy(s, iTmp, 1) then
     begin
       Result := True;
       Exit;
     end;
   end;
 end;
var

 c, t: string;
begin

 if s = '' then
 begin
   Result := s;
   Exit;
 end;
 c := Copy(s, 1, 1);
 while isoneof(c, sep) do
 begin
   s := Copy(s, 2, Length(s) - 1);
   c := Copy(s, 1, 1);
 end;
 t := '';
 while (not isoneof(c, sep)) and (s <> '') do
 begin
   t := t + c;
   s := Copy(s, 2, length(s) - 1);
   c := Copy(s, 1, 1);
 end;
 Result := t;
end;



--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Medved
Дата 12.11.2004, 03:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



Alex, про Charset забыл.

В помощь:
Код

TFontCharset = 0..255;



--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Alex
Дата 12.11.2004, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Цитата(Pegas @ 12.11.2004, 03:12)
Alex, про Charset забыл.

Значит DRKB подправим smile


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Alex
Дата 12.11.2004, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Я добавил, но это не пример, это кошмар smile

Код

function FontToStr(font: TFont): string;
 procedure yes(var str: string);
 begin
   str := str + 'y';
 end;
 procedure no(var str: string);
 begin
   str := str + 'n';
 end;
begin

{кодируем все атрибуты TFont в строку}
Result := '';
Result := Result + IntToStr(font.Color) + '|';
Result := Result + IntToStr(font.Height) + '|';
Result := Result + font.Name + '|';
Result := Result + IntToStr(Ord(font.Pitch)) + '|';
Result := Result + IntToStr(font.PixelsPerInch) + '|';
Result := Result + IntToStr(font.size) + '|';
Result := Result + IntToStr(font.Charset) + '|';
if fsBold in font.style then
  yes(Result)
else
  no(Result);
if fsItalic in font.style then
  yes(Result)
else
  no(Result);
if fsUnderline in font.style then
  yes(Result)
else
  no(Result);
if fsStrikeout in font.style then
  yes(Result)
else
  no(Result);
end;

function tok(sep: string; var s: string): string;

function isoneof(c, s: string): Boolean;
var
  iTmp: integer;
begin
  Result := False;
  for iTmp := 1 to Length(s) do
  begin
    if c = Copy(s, iTmp, 1) then
    begin
      Result := True;
      Exit;
    end;
  end;
end;
var

c, t: string;
begin

if s = '' then
begin
  Result := s;
  Exit;
end;
c := Copy(s, 1, 1);
while isoneof(c, sep) do
begin
  s := Copy(s, 2, Length(s) - 1);
  c := Copy(s, 1, 1);
end;
t := '';
while (not isoneof(c, sep)) and (s <> '') do
begin
  t := t + c;
  s := Copy(s, 2, length(s) - 1);
  c := Copy(s, 1, 1);
end;
Result := t;
end;

procedure StrToFont(str: string; font: TFont);
begin

if str = '' then
  Exit;
font.Color := StrToInt(tok('|', str));
font.Height := StrToInt(tok('|', str));
font.Name := tok('|', str);
font.Pitch := TFontPitch(StrToInt(tok('|', str)));
font.PixelsPerInch := StrToInt(tok('|', str));
font.Size := StrToInt(tok('|', str));
font.Charset := StrToInt(tok('|', str));
font.Style := [];
if str[2] = 'y' then
  font.Style := font.Style + [fsBold];
if str[3] = 'y' then
  font.Style := font.Style + [fsItalic];
if str[4] = 'y' then
  font.Style := font.Style + [fsUnderline];
if str[5] = 'y' then
  font.Style := font.Style + [fsStrikeout];
end;


Я вечером нормальный сделаю и выложу



--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
p0s0l
Дата 12.11.2004, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Я бы сделал так:
Код
uses TypInfo;

function GetObjectSettings (Obj : TObject) : string;
var
 pl : PPropList;
 i, Count : integer;
 v : Variant;
 s : string;

begin
 Result := '';
 Count := GetPropList (obj.ClassInfo, pl);
 for i := 0 to Count-1 do
 begin
   v := GetPropValue(Obj, pl^[i].Name, False);
   try s := v; except s := FloatToStr(v); end;
   Result := Result + s + '|';
 end;
end;

procedure SetObjectSettings (Obj : TObject; Value : string);
var
 pl : PPropList;
 i, Count : integer;
 v : Variant;

begin
 Count := GetPropList (obj.ClassInfo, pl);
 for i := 0 to Count-1 do
 begin
   v := Copy(Value, 1, Pos('|', Value)-1);
   Delete (Value, 1, Pos('|', Value));
   try SetPropValue(Obj, pl^[i].Name, v);
   except SetPropValue(Obj, pl^[i].Name, StrToInt(v));
   end;
 end;
end;
Только Tools -> Debugger Options -> Language Exceptions -> Stop on Delphi Exceptions должны быть отключены (по умолчанию это в Delphi включено, но я сразу это вырубаю после установки Delphi)...

Пользоваться так:
GetObjectSettings (Button1.Font) - вовзращает инфу о Fontе кнопки в виде строки
SetObjectSettings (Button1.Font, s) - Font кнопки грузится из строки s

Код
//Запись:
Ini.WriteString('GridFont', 'FontTitleStyle', GetObjectSettings(DBGridEh1.Columns.Items[0].Title.Font));
...
//Чтение:
SetObjectSettings (DBGridEh1.Columns.Items[0].Title.Font, Ini.ReadString('GridFont', 'FontTitleStyle', ''));



--------------------
С уважением, г-н Посол.
PM   Вверх
Mick Winder
Дата 12.11.2004, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 15.10.2004
Где: Москва Рязанка

Репутация: нет
Всего: -1



Спасибо всем! То, что вы здесь прописали, для меня очень полезно... И я попробую реализовать все это в своей проге...
А пока я решил немного "поиграть", чтобы понять суть работы...
Написал следующий небольшой кодик:
procedure TForm1.FormDestroy(Sender: TObject);
var
Ini: Tinifile;
begin
Ini.WriteInteger('Grid', 'ColorTitle[0]', DBGridEh1.Columns.Items[0].Title.Color);
Ini.WriteInteger('Grig', 'FontTitleColor[0]', DBGridEh1.Columns.Items[0].Title.Font.Color);
Ini.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
Ini: Tinifile;
i: Integer;
begin
DBGridEh1.Columns.Items[0].Title.Color:= Ini.ReadInteger('Grid', 'ColorTitle[0]', clLtGray);
DBGrideh1.Columns.Items[0].Title.Font.Color:= Ini.ReadInteger('Grid', 'FontTitleColor[0]', 0);
Ini.Free;
end;

Мои действия:
1. Открываю свою программу. На форме таблица. Заголовок первого столбца окрашен в серый цвет (сlLtGreen), наименование заголовка в черный цвет (0 или clBlack).
2. Меняю цвет загловка в желтый цвет, наименование заголовка в синий.
3. Закрываю программу.
Результат при повторном открытии:
Цвет заголовка - желтый,
а цвет наименования заголовка - ...черный, хотя по идее должно быть синим...
Почему? Что за фигня? Сделал пошаговую отладку и параллельно заглядывал в ini-файл... При закрытии проги все последние настройки записываются в файл как положено, а при загрузке значение FontTitleColor стирается и присваивается значение 0 (черный цвет)... Nie razumiem!
PM MAIL   Вверх
Mick Winder
Дата 12.11.2004, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 15.10.2004
Где: Москва Рязанка

Репутация: нет
Всего: -1



Цитата(p0s0l @ 12.11.2004, 11:42)
Я бы сделал так:
....

Огромное спасибо!!!
Всё получилось! smile
PM MAIL   Вверх
Alex
Дата 12.11.2004, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Я сделал так:
Код

uses
 StrUtils;

...

function FontToStr(font: TFont): string;
// Кодируем все атрибуты TFont в строку
begin
 Result := '';
 with TStringList.Create do try
   Add(IntToStr(font.Color        ));
   Add(IntToStr(font.Height       ));
   Add(font.Name                   );
   Add(IntToStr(Ord(font.Pitch)   ));
   Add(IntToStr(font.PixelsPerInch));
   Add(IntToStr(font.size         ));
   Add(IntToStr(font.Charset      ));
   Add(IfThen(fsBold      in font.style, '1', '0'));
   Add(IfThen(fsItalic    in font.style, '1', '0'));
   Add(IfThen(fsUnderline in font.style, '1', '0'));
   Add(IfThen(fsStrikeOut in font.style, '1', '0'));
   Result:= CommaText;
 finally
   Free;
 end;
end;

procedure StrToFont(str: string; font: TFont);
// Выставляем атрибуты TFont из строки
begin
 if str = '' then Exit;
 with TStringList.Create do try
   CommaText:= str;
   if Count <> 11 then Exit;
   font.Color:=                    StrToInt(Strings[0]);
   font.Height:=                   StrToInt(Strings[1]);
   font.Name:=                              Strings[2];
   font.Pitch:=         TFontPitch(StrToInt(Strings[3]));
   font.PixelsPerInch:=            StrToInt(Strings[4]);
   font.Size:=                     StrToInt(Strings[5]);
   font.Charset:=                  StrToInt(Strings[6]);
   font.Style := [];
   if Strings[ 7] = '1' then font.Style := font.Style + [fsBold     ];
   if Strings[ 8] = '1' then font.Style := font.Style + [fsItalic   ];
   if Strings[ 9] = '1' then font.Style := font.Style + [fsUnderline];
   if Strings[10] = '1' then font.Style := font.Style + [fsStrikeOut];
 finally
   Free;
 end;
end;



--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Guest
Дата 15.11.2004, 09:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











smile Спасибо!!!
  Вверх
Mick Winder
Дата 15.11.2004, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 15.10.2004
Где: Москва Рязанка

Репутация: нет
Всего: -1



smile Спасибо!!!
PM MAIL   Вверх
Akella
Дата 16.11.2004, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



smile

smile поставь библиотеку EhLib и не мучайся
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0631 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.