Форум: "Начинающим";
Текущий архив: 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.5 MB
Время: 0.052 c