Форум: "Основная";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
Внизini Найти похожие ветки
← →
rosl (2003-12-25 07:28) [0]Уважаемые МАСТЕРА!!!
Как в файл ini записать, а потом прочитать оттуда настройку font.style
← →
Babay (2003-12-25 07:52) [1]Uses typInfo,inifiles;
Пишем:
Var ini:TIniFile;
begin
ini:=TIniFile.Create("c:\Config.ini");
ini.WriteString("Font","FontStyle",GetSetProp(Font,"Style"));
ini.Free;
end;
Читаем:
Var ini:TIniFile;
s:String;
begin
ini:=TIniFile.Create("c:\Config.ini");
s:=ini.ReadString("Font","FontStyle","");
ini.Free;
SetSetProp(Font, "Style",s);
end;
Открываем хелп или книжку читаем про RTTI
← →
del (2003-12-25 08:05) [2]Вот ini - файл
[Global]
ServerName=Main
dataBaseName=transport
userName=masterRoute
[Font]
name=Arial
Height=-12
[Visual]
SheetActive=1
aviFileName=e:\DevDelphi\resource\common.avi
[Environ]
idRouteType=3
а вот работающий код:
чтение:
fontName := inifile.ReadString("Font", "name", "Arial");
if Length(fontName) > 0 then
fontHeight :=
StrToInt(inifile.ReadString("Font", "Height", "10"))
else
fontHeight := Self.Font.Height;
inifile.Free;
Self.Font.Name := fontName;
Self.Font.Height := fontHeight;
/////////////
запись:
inifile := TIniFile.Create(inifileName);
inifile.WriteString("Visual", "SheetActive",
IntToStr(PageControl.ActivePageIndex));
inifile.WriteString("Font", "name", fontName);
inifile.WriteString("Font", "Height", IntToStr(fontHeight));
← →
Babay (2003-12-25 08:28) [3]То del
А где запись свойства Style ? ты вопрос внимательно читал ?
← →
del (2003-12-25 08:44) [4]Babay, прости, погорячился.
← →
Sandman25 (2003-12-25 11:06) [5]Babay
Не подскажете, где можно найти хороший справочник по Rtti?
В Delphi help GetSetProp не описан, Yandex ничего не нашел по запросу GetSetProp, а по запросу RTTI выдает только ссылки на книги либо на форумы. Я покопался в TypInfo.pas, но это не самый удобный способ изучения, особенно учитывая отсутствие комментариев...
← →
PVOzerski (2003-12-25 11:19) [6]tFontStyle - это обычный enum, приводимый к типу integer и обратно. Так что ReadInteger и WriteInteger вполне подойдут.
← →
Babay (2003-12-25 12:48) [7]To Sandman25
-> "Я покопался в TypInfo.pas" и я тоже. Правда есть еще бумажная книжка по Д там неплохо основы этого дела прописаны. + еще исходники компонетов которые его используют в RXLibrary был кажется формплацемент.
А насчет электронки незнаю уменя нету буду то же рад узнать ссылочку.
← →
Sandman25 (2003-12-25 12:55) [8][7] Babay © (25.12.03 12:48)
Понятно. Спасибо. Значит я на правильном пути :) Сижу в typinfo.pas, читаю.
Ссылочек не нашел.
← →
Ega23 (2003-12-25 12:56) [9]
function GetFontStyle(const Value: TFontStyles): Integer;
begin
Result:=0;
if (fsBold in Value) then Result:=Result or 1;
if (fsItalic in Value) then Result:=Result or 2;
if (fsUnderline in Value) then Result:=Result or 4;
if (fsStrikeout in Value) then Result:=Result or 8;
end;
//***************************************************************
function SetFontStyle(const Value: integer): TFontStyles;
begin
Result:=[];
if ((Value shr 0) and 1)=1 then Result:=Result+[fsBold];
if ((Value shr 1) and 1)=1 then Result:=Result+[fsItalic];
if ((Value shr 2) and 1)=1 then Result:=Result+[fsUnderline];
if ((Value shr 3) and 1)=1 then Result:=Result+[fsStrikeout];
end;
Ну а запись в ini - ReadInteger, WriteInteger
← →
Babay (2003-12-25 12:56) [10]To PVOzerski неа не enum a set
попробуйте сделать так
edit1.Text:=Inttostr(Integer(Font.Style));
Ну как увидели номер?
или я чегото не понимаю?
← →
PVOzerski (2003-12-25 13:05) [11]Да, здесь, конечно, речь о set of tFontStyle - я поспешил... Но и на этот случай есть решение - может быть, не самое изящное, но опробованное.
var
x:tFontStyles;
y:array[1..sizeof(tFontStyles)]of byte absolute x;
i:integer;
begin
x:=Font.Style;
for i:=1 to sizeof(tFontStyles) do
IniFile.WriteInteger("Properties","FontStyleByte"+inttostr(i),y[i]);
Чтение - аналогично.
← →
Тимохов (2003-12-25 13:12) [12]Что-то я не понял вот этой конструкции
x:tFontStyles;
y:array[1..sizeof(tFontStyles)]of byte absolute x;
Это ты как из головы придумал или это у тебя работает?
Вообще говоря это работать не будет, т.к. множества представляются не побайтно (как было в паскале) и побитно...
← →
Sandman25 (2003-12-25 13:16) [13][12] Тимохов © (25.12.03 13:12)
Ничего страшного. Значит, запишется/считается не 8 байт, а 1.
← →
PVOzerski (2003-12-25 13:18) [14]Это у меня испытано и на других сложных структурах (не на множествах), с внутренней организацией типа Set я тоже разбирался. Хотелось бы знать, а как же тогда должны представляться множества "внутри". Да, побитно, но биты-то живут в байтах, и ничего, кроме битовой арифметики, процессор с битами как таковыми делать не умеет. В том числе и присваивание тоже. А упихивать множества set of 0..63 я ухитрялся аж в double (и загонять в соответствующие поля в MySQL + операции над множествами через самодельные UDFы на FreePascal).
← →
Тимохов (2003-12-25 13:19) [15]Что ничего страшного - [11] неверный код. Он просто в дельфи не будет рабоать. Я постмотрел анкету автора - любит паскаль - с паскале это работать будет, а в дельфи нет.
← →
Sandman25 (2003-12-25 13:24) [16][15] Тимохов © (25.12.03 13:19)
Я запустил. Оно сработало, записало вроде правильно. 15 для всех выбранных.
← →
Тимохов (2003-12-25 13:30) [17]На самом деле, я виноват - не узрел, что array[1..sizeof(tFontStyles)]of byte, т.е. фактически array[1..1]of byte.
Я просто раньше пользовался методом побайтной записи множеств в паскале - когда перешел на дельфи столкнулся в проблемами.
Виноват - невинмательно прочел.
← →
PVOzerski (2003-12-25 13:31) [18]Для сомневающихся (Delphi 3 - не какой-то там FPC :^) ):
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, IniFiles,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
IniFile:tIniFile;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
type
tBset=set of byte;
var
x,y:tBset;
s1:array[1..sizeof(tBset)]of byte absolute x;
s2:array[1..sizeof(tBset)]of byte absolute y;
i,code:integer;
b:byte;
begin
x:=[];
for i:=0 to pred(Memo1.lines.count)do
begin
val(Memo1.lines[i],b,code);
if code=0 then
include(x,b);
end;
for i:=1 to sizeof(tBset)do
IniFile.WriteInteger("S1","I"+inttostr(i),s1[i]);
for i:=1 to sizeof(tBset)do
S2[i]:=IniFile.ReadInteger("S1","I"+inttostr(i),0);
Label1.Caption:="";
for i:=0 to 255 do
if i in y then
Label1.Caption:=Label1.Caption+" "+inttostr(i);
end;
initialization
IniFile:=tIniFile.Create(ExtractFilePath(Paramstr(0))+"test.ini");
end.
← →
Тимохов (2003-12-25 13:35) [19]PVOzerski © (25.12.03 13:31) [18]
Сумлевающихся нет. Я уже сказал, чем было вызвано мое заблуждение: отрицательным опытом прошлого и невниманием настоящего.
← →
Тимохов (2003-12-25 13:37) [20]Во!
Я бы для пущей надежности данного механизма написал бы packed record! Хотя работать и так будет.
← →
Sandman25 (2003-12-25 16:12) [21]Зря я боялся лезть в typinfo.pas. Там до implementation всего 340 строчек. Действительно, можно без документации разобраться.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.013 c