0

このコードは、指定されたルート コンポーネント内のすべての 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;
4

1 に答える 1

1

障害を主張する最初の行は次のとおりです。

j:=c.ComponentCount;

はローカル変数であるため、それが問題jであると結論付けることができますc。したがって、明らかにcインスタンスへの有効な参照ではありません。

さて、cは関数のパラメータで、 を渡しrootました。rootこのことから、に渡したパラメータTwmenetlevel.collectXMLControlは無効であると結論付けました。

したがって、次のステップは、への呼び出しを調べて、Twmenetlevel.collectXMLControl渡したパラメーターが無効である理由を突き止めることです。

于 2013-11-25T21:37:06.027 に答える