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

Вниз

TFont в record   Найти похожие ветки 

 
self.name ©   (2008-07-30 20:47) [0]

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

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

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


 
Правильный$Вася   (2008-07-30 20:49) [1]


> мне нужно как-то создать mFont?

именно
в record у тебя только неинициализированный указатель, а объект нужно явно создать конструктором


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

сделал

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

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


 
{RASkov} ©   (2008-07-30 21:28) [3]

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

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

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


 
{RASkov} ©   (2008-07-30 21:35) [4]

> [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;

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


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


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

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

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


 
self.name ©   (2008-07-30 22:51) [6]

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


 
{RASkov} ©   (2008-07-30 22:55) [7]

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

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


 
Amoeba ©   (2008-07-30 23:06) [8]


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

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


 
self.name ©   (2008-07-30 23:19) [9]

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

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


 
{RASkov} ©   (2008-07-30 23:36) [10]

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

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


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

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

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


 
Amoeba ©   (2008-07-30 23:49) [12]


> 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:54) [13]

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


 
{RASkov} ©   (2008-07-30 23:59) [14]

> [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;

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


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

Вот держи сохранение шрифта в ини файле:
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);

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


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

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


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

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

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


 
Leonid Troyanovsky ©   (2008-07-31 08:22) [18]


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

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

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

--
Regards, LVT.


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

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


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

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


 
{RASkov} ©   (2008-07-31 10:39) [21]

> [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;

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



Страницы: 1 вся ветка

Текущий архив: 2008.09.14;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.048 c
3-1206004854
Alexey
2008-03-20 12:20
2008.09.14
Работа с таблицами Fox Pro в Delphi 7


2-1217517420
self.name
2008-07-31 19:17
2008.09.14
insert в TFileStream


2-1217946143
Krolm
2008-08-05 18:22
2008.09.14
Модуль для создания списка ссылок из html страницы


3-1205828294
Гость-1734
2008-03-18 11:18
2008.09.14
постоянная ошибка с msdart.dll


3-1204532945
Ega23
2008-03-03 11:29
2008.09.14
Добавить разом много записей.