Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TFont в record [D2005, 2003]


Страницы:   1 2

self.name ©   (2008-07-30 20:47:00) 

здравствуйте.
помогите разобраться..
есть такой код

type
 ToF = record
   mFont: TFont;
 end;
...
var
 f: ToF;
...
f.mFont.Size:=21;

и тут же получаю ошибку AccessViolation.
мне нужно как-то создать mFont? или..от чего ошибка?


{RASkov}   (2008-07-31 10:39:00) [1]

> [18] Leonid Troyanovsky ©   (31.07.08 08:22)
> На каждый фонт свой ини?

В [15] получается что так)

Но при наличии извилин можно подправить пример до универсальности... :) Например, передавать параметром секцию...
...а можно и вообще его [15] проигнорировать так как к сабжу он не относится :(
Только вот так будет "круче":
procedure GetFontFromIni(const FlIni: String; FontSection: String; Fnt: TFont);
begin
with TIniFile.Create(FlIni) do try
 Fnt.Name:=ReadString(FontSection, 'FName', 'Courier New Cyr');
 Fnt.Color:=TColor(ReadInteger(FontSection, 'FColor', clBlack));
 Fnt.Pitch:=TFontPitch(ReadInteger(FontSection, 'FPitch', 0));
 Fnt.Size:=ReadInteger(FontSection, 'FSize', 8);
 Fnt.Style:=TFontStyles(Byte(ReadInteger(FontSection, 'FStyle', 0)));
finally
 Free;
end;
end;

ну и сет соот-но так же переделать....


Медвежонок Пятачок   (2008-07-31 09:56:00) [2]

А вообще хранить сам экземпляр фонта когда всего лишь требуется информация о его характеристиках это жесть.
это примерно как вместо каталога автомобилей разных цветов заводить сам парк автомобилей.


Медвежонок Пятачок   (2008-07-31 09:53:00) [3]

на все фонты один xml


Leonid Troyanovsky   (2008-07-31 08:22:00) [4]


> {RASkov} ©   (31.07.08 00:16) [15]

> procedure GetFontFromIni(const FlIni: String; Fnt: TFont);

На каждый фонт свой ини?

--
Regards, LVT.


{RASkov}   (2008-07-31 00:32:00) [5]

> [16] self.name ©   (31.07.08 00:27)
> ..работает:)

Хотелось бы верить :)
Ну да ладно, удачи)


self.name   (2008-07-31 00:27:00) [6]

а я уже сделал)
только этот шрифт прицепил к своему рекорду..работает:)
большое спасибо за ответы.
пойду химичить дальше))


{RASkov}   (2008-07-31 00:16:00) [7]

Вот держи сохранение шрифта в ини файле:
uses ..., inifiles;

procedure GetFontFromIni(const FlIni: String; Fnt: TFont);
var FIni: TIniFile;
begin
 FIni:= TIniFile.Create(FlIni);
 Fnt.Name:=FIni.ReadString('FONTDATA', 'FName', 'Courier New Cyr');
 Fnt.Color:=TColor(FIni.ReadInteger('FONTDATA', 'FColor', clBlack));
 Fnt.Pitch:=TFontPitch(FIni.ReadInteger('FONTDATA', 'FPitch', 0));
 Fnt.Size:=FIni.ReadInteger('FONTDATA', 'FSize', 8);
 Fnt.Style:=TFontStyles(Byte(FIni.ReadInteger('FONTDATA', 'FStyle', 0)));
 FIni.Free;
end;

procedure SetFontToIni(const FlIni: String; Fnt: TFont);
var FIni: TIniFile;
begin
 FIni:= TIniFile.Create(FlIni);
 FIni.WriteString('FONTDATA', 'FName', Fnt.Name);
 FIni.WriteInteger('FONTDATA', 'FColor', Fnt.Color);
 FIni.WriteInteger('FONTDATA', 'FPitch', ORD(Fnt.Pitch));
 FIni.WriteInteger('FONTDATA', 'FSize', Fnt.Size);
 FIni.WriteInteger('FONTDATA', 'FStyle', Byte(Fnt.Style));
 FIni.Free;
end;

//Пример вызова
сохраняем:
SetFontToIni('fontparam.ini', Label1.Font);
читаем:
GetFontFromIni('fontparam.ini', Label1.Font);

может пригодится)


{RASkov}   (2008-07-30 23:59:00) [8]

> [11] self.name ©   (30.07.08 23:42)
> а если я напишу свой тип


> то всё будет работать?

Смотря как напишешь. Именно мой кусок, что привел в [11] "неверен" из-за String. Обрати внимание на слово неверен в кавычках. Потому как и длинный стринг тоже можно сохранять, но там нужно перед этим сохранить длину строки, а потом саму строку. Т.е. одной строкой, как ты хочешь, не получится и всеж придется тебе по "клаве" постучать :)
С простыми типами можно так:
type
 TParamFont = record
   Name: String[100];
   Size: Integer;
   Style: TFontStyle;
 end;

 TFileFontParam = file of TParamFont;

..........
var F: TFileFontParam; PF: TParamFont;
begin
 with PF do begin
  Name:=''; //Менее или равно 100 символов;
  Size:=21;
........
 end;
 AssignFile(F, 'option.opt');
 Reset(F);
 Write(F, PF);
 CloseFile(F);
end;

Только не нужно копировать этот кусок, в нем куча логических ошибок, как например нет ни одной проверки и нет обработки исключений и т.п. и т.д.


self.name   (2008-07-30 23:54:00) [9]

:)щас попробую...


Amoeba   (2008-07-30 23:49:00) [10]


> self.name ©   (30.07.08 23:42) [11]
>
> строки я ограничил - string[100];
> :)всё понял)) исправлюсь
> а если я напишу свой тип - что-то вроде
> TParamFont = record
>   Name: String;
>   Size: Integer;
>   Style: TFontStyle;
> end;
> то всё будет работать?

Может быть и заработает, а может и нет. Зависит от кривизны рук.


self.name   (2008-07-30 23:42:00) [11]

строки я ограничил - string[100];
:)всё понял)) исправлюсь
а если я напишу свой тип - что-то вроде
TParamFont = record
  Name: String;
  Size: Integer;
  Style: TFontStyle;
end;

то всё будет работать?


{RASkov}   (2008-07-30 23:36:00) [12]

> [9] self.name ©   (30.07.08 23:19)
> хм)))не подумал..

Еще как не подумал) Теперь думай и переделывай все... Иначе у тебя сохраняется совсем не то что ты хочешь... Кстати, есть ли в твоем рекорде длинные строки? Ага, с ними тоже трабла в таком случае :)
А как подумаешь хорошо, то окажется, что твоя затея "писать меньше" оказалась лажовой)
Тыж программер или компонетокидатель and мышкошевелитель ?)


self.name   (2008-07-30 23:19:00) [13]

хм)))не подумал..
сохраняю так
...
 with TFileStream.create(ProgDir+'options.orn', fmCreate or fmOpenWrite) do
 try
   Write(main_frm.oOptions,SizeOf(main_frm.oOptions));
 finally
   free;
 end;
...

где в oOptions разные настройки..


Amoeba   (2008-07-30 23:06:00) [14]


> Есть подозрения на не верное сохранение... т.е. сохранение
> 4 байт :)

Как пить дать!


{RASkov}   (2008-07-30 22:55:00) [15]

> [6] self.name ©   (30.07.08 22:51)
> а TFont нужен чтобы меньше писать...т.е. я его сохраняю в файл с другими параметрами

А можно посмотреть на код сохранения? Есть подозрения на не верное сохранение... т.е. сохранение 4 байт :)


self.name   (2008-07-30 22:51:00) [16]

это я понял, правильно было сказано в [4] - создавать думал в FormCreate, а очищать в FormClose.
а TFont нужен чтобы меньше писать...т.е. я его сохраняю в файл с другими параметрами и, после загрузки, сразу присваиваю tfont edit'a тому что загрузил...такая задумка:)


Правильный$Вася   (2008-07-30 21:39:00) [17]


>  f.mFont:=TFont.Create;  f.mFont.Size:=321;  f.mFont.Free;

проведу аналогию с твоим кодом
есть стена (record), на которой хочется иметь надпись (font)
берем карандаш (create)
пишем (size)
стираем (free)

а так хотелось иметь надпись...


{RASkov}   (2008-07-30 21:35:00) [18]

> [2] self.name ©   (30.07.08 20:58)

Может тебе нужна примерно такая запись:

Type
 TParamFont = record
   Name: String;
   Size: Integer;
   Style: TFontStyle;
 end;

?

А экземпляры классов, пусть они в записях, пусть отдельно, или, например, присутствуют в других классах - их нужно всегда создавать и не забывать удалять.
Но то как ты продемонстировал в [2] - это что-то непонятное, хотя может быть у тебя вот так:
f.mFont:=TFont.Create;
f.mFont.Size:=321;
.....
//Тут используем f.mFont
f.mFont.Free;

Тогда нормально в принципе... Но тоже - вилами по воде...


{RASkov}   (2008-07-30 21:28:00) [19]

> [2] self.name ©   (30.07.08 20:58)
> последняя строчка тоже ж нужна?

Ага.
Только другими словами, именно эти три строки - не нужны вообще.

Лучше скажи, для чего тебе нужен TFont в записи?


self.name   (2008-07-30 20:58:00) [20]

сделал

 f.mFont:=TFont.Create;
 f.mFont.Size:=321;
 f.mFont.Free;

заработало) спасибо
последняя строчка тоже ж нужна?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо