【发布时间】:2012-04-14 17:36:49
【问题描述】:
我目前非常头疼组件属性的类型转换。
在我的表单上,我有一个名为“场景”的 TPanel。同样在表单上,我有一个创建TSelection 的按钮,在该TSelection 中创建一个TImage,然后将图片加载到该TImage 中。 TSelection 的名称是通过称为“ImgObjName”的 TEdit 分配的。然后它将这个名字写入一个inifile。 TSelection 的事件被分配给代码中其他地方的过程。如您所知,TSelection 组件可以在运行时移动(和调整大小)。 TImage 的 HitTest 关闭,而 TSelection 开启。
上面的工作如我所愿,但下一部分是我卡住的地方。本质上,在计时器上,我想将每个子组件的一些属性选择写入 TMemIniFile。我愿意通过两种方式做到这一点;
1) 将每个孩子的属性写入单独的 TMemInifiles。
2) 将每个子项的属性写入单个 TMemIniFile,但让section 标识该部分中的值与哪个组件相关。
我尝试了几种不同的方法,但它们都给我带来了一些重大问题(通常是“索引超出范围”)。
我目前的方法是这样的;
ChgPos 是一个全局布尔变量,当触发 TSelection 对象之一的 mousedown 事件时为 TRUE,当触发 MouseUp 事件时为 FALSE。这个布尔过程非常适合这些目的,因此不需要进行任何更改。
TimerBar 是在设计时创建的TTrackBar。它的值根据计时器而变化。
AnimIni 是前面代码中分配的 TMemIniFile。为此,我将其设置为不释放文件(因此没有访问冲突)。
var
i: Integer;
PosX, PosY: Integer;
begin
for i := 0 to Scene.ChildrenCount - 1 do
begin
if Scene.Components[i] is TSelection then
begin
PosX := AnimIni.ReadInteger(IntToStr(Round(TimerBar.Value)) + '_Object' +
IntToStr(i), 'PosX', PosX);
PosY := AnimIni.ReadInteger(IntToStr(Round(TimerBar.Value)) + '_Object' +
IntToStr(i), 'PosY', PosY);
end;
end;
if ChgPos = False then
begin
if Scene.Components[i] is TSelection then
begin
(Scene.Components[i] as TSelection).Position.X := PosX;
(Scene.Components[i] as TSelection).Position.Y := PosY;
end;
end
else if ChgPos = True then
begin
AnimIni.WriteInteger(IntToStr(Round(TimerBar.Value)) + '_Object' +
IntToStr(i), 'PosX', Round((Scene.Children[i] as TSelection).Position.X));
AnimIni.WriteInteger(IntToStr(Round(TimerBar.Value)) + '_Object' +
IntToStr(i), 'PosY', Round((Scene.Children[i] as TSelection).Position.Y));
end;
end;
我正在努力弄清楚该去哪里。我收到“索引超出范围”错误。我还需要保存 TImage 组件属性(尤其是父级和位图位置,但我觉得目前让代码与至少一个组件一起工作对我来说很重要)。
我对类型转换有点陌生(因为我以前的所有项目都不需要它),但到目前为止我的所有经验都非常成功。只是在这种特殊情况下,事实证明它变得比我在没有帮助的情况下可以解决的复杂得多。
我确实尝试过WriteComponent 和ReadComponent,并使用多个文件实时流式传输与 TimerBar 的值相关的数据,但对于我想要实现的目标来说太慢了(尤其是在写入功能上)。 inifile 方法在我之前的测试中确实有效,但它实际上正在处理在运行时创建的多个组件的类型转换,我遇到了问题。
任何人都可以阐明潜在的解决方案或我应该前进的方向吗?
【问题讨论】:
-
你的 i 循环结束得太快了。
if ChgPos(以及其他)中 i 的状态未确定。
标签: delphi delphi-xe2 firemonkey