我在获取属性中的变量时遇到了一些问题。
这是原始的工作代码:
// Note: "b1" is the name of the component in this case a TChromium component.
MainForm.b1.Browser.MainFrame.ExecuteJavaScript
我需要插入变量而不是名称,所以我这样做了:
MainForm.'+myVariable+'.Browser.MainFrame.ExecuteJavaScript
上面给出了一个错误:
[dcc32错误] main.pas(225):E2029预期标识符但发现字符串常量
我做错了什么?
答案 0 :(得分:1)
如果你可以有多个实例,并且它们可以增长,而是将它们保存在列表中。
TChromium(FList.Items[I]).Browser.MainFrame.ExecuteJavaScript;
这意味着您还需要在运行时添加它们:
FList.Add(TChromium.Create(...));
您需要考虑如何选择在不同情况下使用的实例。例如。您可以拥有一个页面控件,其中每个页面都链接到特定的TChromium
实例。
答案 1 :(得分:1)
这是我不时使用的功能。这将返回树中所有子组件的平面列表:
Function GetAllRecursive(var AList : TList<TComponent>;
AParent : TComponent) : TList<TComponent>;
var
i: integer;
Begin
If AParent = nil Then begin
result := AList;
Exit;
end else
AList.Add(AParent);
for i := 0 to AParent.ComponentCount - 1 do
GetAllRecursive(AList, AParent.Components[i]);
result := AList;
End;
您可以将其修改为仅获取TChromium
个组件,或者稍后可以对其进行过滤,例如:
//in type definition
private
FComponents : TList<TComponent>;
FChromiums : TList<TChromium>;
//... etc
procedure TForm1.FormCreate(Sender: TObject);
var
cpt : TComponent;
begin
FComponents := TList<TComponent>.Create;
FChromiums := TList<TChromium>.Create;
GetAllRecursive(FComponents, self);
for cpt in FComponents do
if cpt is TChromium then FChromiums.Add(cpt as TChromium);
end;
然后您可以将其用作
for cpt in FChromiums do ExecuteJS(cpt);
带
procedure TForm1.ExecuteJS(AChromium: TChromium);
begin
AChromium.Browser.MainFrame.ExecuteJavaScript;
end;