Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 是否可以将TFormBorderStyle属性类型转换为Integer,反之亦然?_Delphi_Configuration_Delphi 2010_Enumeration_Ini - Fatal编程技术网

Delphi 是否可以将TFormBorderStyle属性类型转换为Integer,反之亦然?

Delphi 是否可以将TFormBorderStyle属性类型转换为Integer,反之亦然?,delphi,configuration,delphi-2010,enumeration,ini,Delphi,Configuration,Delphi 2010,Enumeration,Ini,看起来我可以使用RTTI将TFormBorderStyle属性的枚举类型转换为字符串,并将其存储在我的INI文件中,反之亦然。然而,我假设我也可以从integer来回转换它,但它似乎不起作用。为什么? var Border: Integer = 3; procedure TfrmMain.FormCreate(Sender: TObject); begin BorderStyle:= TFormBorderStyle(Border); pnlHeader.Visible:= ShowH

看起来我可以使用RTTI将TFormBorderStyle属性的枚举类型转换为字符串,并将其存储在我的INI文件中,反之亦然。然而,我假设我也可以从integer来回转换它,但它似乎不起作用。为什么?

var
 Border: Integer = 3; 

procedure TfrmMain.FormCreate(Sender: TObject);
begin
 BorderStyle:= TFormBorderStyle(Border);
 pnlHeader.Visible:= ShowHeader;
 btnConfigure.Visible:= Configure;
 pnlFooter.Visible:= ShowFooter;
end;
使用Ord(bsDialog)转换为整数,使用TBorderStyle(integervalue)从integer返回

IniFile.WriteInteger('YourForm', 'Border', Ord(YourForm.BorderStyle));
...
YourForm.BorderStyle := TFormBorderStyle(IniFile.ReadInteger('YourForm', 'Border', 0));
使用Ord(bsDialog)转换为整数,使用TBorderStyle(integervalue)从integer返回

IniFile.WriteInteger('YourForm', 'Border', Ord(YourForm.BorderStyle));
...
YourForm.BorderStyle := TFormBorderStyle(IniFile.ReadInteger('YourForm', 'Border', 0));

尽管您特别要求转换为整数值或从整数值转换为整数值,但转换为字符串或从字符串转换为整数值并不复杂(“使用RTTI”的前景可能会让您望而却步),我相信您最好使用给定要求的转换(将值存储在INI文件中)

您将能够更清楚地看到这些值是什么,例如在INI文件中

要转换为/转换为的代码要求您使用TypInfo单元,如下所示:

  uses TypInfo;
此代码将生成表单样式的字符串表示形式:

  styleName := GetEnumName(TypeInfo(TFormBorderStyle), Ord(Form.BorderStyle));
此代码将生成表示表单样式枚举的字符串的表单样式值:

  Form.BorderStyle := TFormBorderStyle(GetEnumValue(TypeInfo(TFormBorderStyle), styleName));

如果您发现自己在代码中更经常这样做,那么当然可以将它们封装在一些漂亮的小助手函数中,这些函数称为(例如)BorderStyleToString():StringBorderStyleFromString():TFormBorderStyle

,尽管您特别要求转换为整数值或从整数值转换而来,字符串的转换并不复杂(“使用RTTI”的前景可能会让您感到不快),我相信您最好使用给定要求的转换(将值存储在INI文件中)

您将能够更清楚地看到这些值是什么,例如在INI文件中

要转换为/转换为的代码要求您使用TypInfo单元,如下所示:

  uses TypInfo;
此代码将生成表单样式的字符串表示形式:

  styleName := GetEnumName(TypeInfo(TFormBorderStyle), Ord(Form.BorderStyle));
此代码将生成表示表单样式枚举的字符串的表单样式值:

  Form.BorderStyle := TFormBorderStyle(GetEnumValue(TypeInfo(TFormBorderStyle), styleName));


如果您发现自己在代码中更经常这样做,那么当然可以将它们封装在一些漂亮的小助手函数中,这些函数称为(例如)BorderStyleToString():StringBorderStyleFromString():tformbordersstyle

,即
bsDialog
,它应该可以工作。使用
TFormBorderStyle
ord
。您显示的代码中的强制转换很好。你的问题在别处。与其说“它似乎不起作用”,不如确切地告诉我们它是如何失败的。当有人修改代码并将Border=2更改为Border=42时,你会得到各种各样的乐趣。您考虑过这个问题吗?这是
bsDialog
,它应该可以工作。使用
TFormBorderStyle
ord
。您显示的代码中的类型转换很好。你的问题在别处。与其说“它似乎不起作用”,不如确切地告诉我们它是如何失败的。当有人修改代码并将Border=2更改为Border=42时,你会得到各种各样的乐趣。你考虑过这个吗?嗯,他已经在做了。你可以在他的代码中看到。他的问题显然出在别的地方。好吧,我似乎还是没办法解决。我需要将主窗体的边框样式存储在ini文件中。我不在乎是将变量“border”声明为整数还是TFormBorderStyle。但是,我需要编写代码,以便在ini文件中读取和写入变量“border”。然后输入代码,将变量指定给窗体的borderStyle属性。默认值是bsSizeable(我假设是3?????)@Shane:这正是Ken的代码所做的!但是,您应该使用
ord(bsSizeable)
[这是
2
,而不是
3
],而不是
0
作为
ReadInteger
的第三个参数。[顺便说一句,有一两个问号就足够了。]@Shane:无论如何,你不应该写实际的数字
0
1
2
,等等。相反,你应该用
ord(bsNone)
ord(bsSingle)
ord(bsSizeable)
等等。@Sertac:我不知道,但我在上面读到了Shane:“Ken,这是值。我假设它是(bsDialog,bsNone,bsSingle,bsSizeable,等等)…0,1,2,3或可能是1,2,3,4。我想我错了,它bsSizeable=2”好吧,这就是他已经在做的。你可以在他的代码中看到。他的问题显然出在别的地方。好吧,我似乎还是没办法解决。我需要将主窗体的边框样式存储在ini文件中。我不在乎是将变量“border”声明为整数还是TFormBorderStyle。但是,我需要编写代码,以便在ini文件中读取和写入变量“border”。然后输入代码,将变量指定给窗体的borderStyle属性。默认值是bsSizeable(我假设是3?????)@Shane:这正是Ken的代码所做的!但是,您应该使用
ord(bsSizeable)
[这是
2
,而不是
3
],而不是
0
作为
ReadInteger
的第三个参数。[顺便说一句,有一两个问号就足够了。]@Shane:无论如何,你不应该写实际的数字
0
1
2
,等等。相反,你应该用
ord(bsNone)
ord(bsSingle)
ord(bsSizeable)
等等。@Sertac:我不知道,但我读到了上面的Shane:“Ken,这是值。我假设它是(bsDialog、bsNone、bsSingle、bsSizeable等)…0,1,2,3或可能是1,2,3,4。我想我错了,它bsSizeable=2”不必要地增加RTTI的开销以在简单类型和整数之间转换对我来说似乎毫无意义。而且,由于最终用户并不真正关心INI文件中的边框样式是什么样的,因此以牺牲开销为代价使其具有可读性对我来说也是非常错误的。如果有,那就不一样了