このコードは、指定されたルート コンポーネント内のすべての TFMXControl を収集します。親とコンポーネント名の先頭を調べます。このコードは、Win32 32.bit Windows ターゲットでは正常に動作しますが、Nexus (Android プラットフォーム) では動作せず、LANC soubrutine の最初の行でページ フォールトが発生します。何も思いつきません.. :(
procedure Twmenetlevel.collectXMLControl(root:TComponent;parent:Tcomponent;fieldleading:string;xmlnode:IXMLNode;controlsetting:boolean);
var n:IXMLNode;
procedure feldolgozas(c:tfmxobject);
var s:string;
node:IXMLNode;
begin
if lowercase(copy(c.Name,1,3))=fieldleading then
begin
s:=withoutnumbers(lowercase(c.Name));
node:=xmlnode.ChildNodes.FindNode(s);
if not assigned(node) then
begin
node:=xmlnode.AddChild(s);
end;
case controlsetting of
false: begin //olvasás a kontrollokból az XML-be
if c is tedit then
node.Text:=(c as tedit).Text;
if c is Tcalendaredit then
node.Text:=(c as tCALENDARedit).Text;
if c is TTimeEdit then
node.Text:=(c as TTimeEdit).Text;
if c is TNumberBox then
node.Text:=(c as TNumberBox).Text;
end;
true:begin // a kontrollok beállítása XML szerint
if c is tedit then
(c as tedit).Text:=node.Text;
if c is Tcalendaredit then
(c as tCALENDARedit).Text:=node.Text;
if c is TTimeEdit then
(c as TTimeEdit).Text:=node.Text;
if c is TNumberBox then
(c as TNumberBox).Text:=node.Text;
end;
end;
end;
end;
function isparent(parent:tcomponent;prechild:tfmxobject):boolean;
begin
result:=false;
if assigned(prechild) then
begin
if prechild.parent=parent then
result:=true
else
begin
result:=isparent(parent,prechild.parent);
end;
end;
end;
procedure lanc(c:tcomponent);
var i,j:integer;
cp:tcomponent;
begin
j:=c.ComponentCount;
for i := 0 to c.ComponentCount-1 do
begin
cp:=c.components[i];
if (cp is tfmxobject) then
begin
if (isparent(parent,cp as tfmxobject)) then
begin
feldolgozas(c.components[i] as tfmxobject);
end;
end;
lanc(c.components[i]);
end;
end;
begin
lanc(root);
end;
これも機能しませんが、非常に簡単です。(Win32 は正常に動作) (Tform1 シンプル モバイル フォーム)
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
s:string;
begin
for i := 0 to self.ComponentCount-1 do
begin
s:=s+self.Components[i].Name;
end;
end;