Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.09.14;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.042 c
2-1217841362
Lex
2008-08-04 13:16
2008.09.14
Помогите разобраться пожалуйста


2-1217967486
krem
2008-08-06 00:18
2008.09.14
Memo


4-1196408923
serg128
2007-11-30 10:48
2008.09.14
Как определить загрузку процессора?


15-1216726494
Zhekson
2008-07-22 15:34
2008.09.14
qtintf70.dll - кто-нибудь знает, что это за бибилиотека ?


2-1217590545
serg2195
2008-08-01 15:35
2008.09.14
Помогите научиться азам программирования под WinCE?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский