2017-02-24 31 views
1

私は、データセットにLiveBindingを使用するDelphi XE8でマルチデバイスアプリケーションを作成しています。Delphi-ボタンクリックでActionListを呼び出す方法は?

TFXXBindNavigateDeleteを含む、FMXのための多くのLB固有のアクションがあります。私FMXBindNavigateDelete1あるActionList1のアクションに

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    if cdsOrdersSTATUS.Value='READY' then 
    begin 
    ShowMessage('Your Order Is Already READY/PENDING!'); 
    end 
    else 
    begin 
    TAction(ActionList1.Actions[0]).Execute; //Not working,why? 
    end; 
end; 

最初の(そして唯一の)項目:コードをクリックして

ボタン:私はこのようなボタンクリックハンドラ内でこれを使用しようとしています。

問題はさらにコードTAction(ActionList1.Actions[0]).Execute実行した場合、現在のデータセットのレコードが削除さないので、どうやら TFMXBindNavigateDeleteのアクションは効果がありません、です。なぜこれは、そして私はそれを動作させることができますか?

図。 ActionList1:

ActionList

+0

です。 'TButton.Action'プロパティにActionを代入し、ボタンが自動的にそれを呼び出させるだけで何が問題になりますか?あなたは本当に何を達成しようとしていますか? –

+0

cdsOrdersSTATUS.Value = 'READY'ならば begin ShowMessage( 'あなたの注文はすでに準備完了です!'); end else begin ActionList1.Actions [0] .Name:= 'LiveBindingsBindNavigateDelete1'; end; –

+0

私はあなたが何を言おうとしているのか分かりません。 Actionの 'OnExecute'イベントを呼び出すだけなら、' Execute() 'メソッドを呼び出します。 –

答えて

3

実際に、Iこれは良い質問だと思うし、downvoteに値するものではありません。

問題を再現できます。私はFMX形式で2つのボタンを置く。私は Button1のOnClickをButton1Clickに、Button2のActionLiveBindingsBindNavigateDelete1に設定しました。

Button2をクリックすると、「レコードを削除しますか?」という標準がポップアップします。現在のレコード を削除します。

ただし、Button1をクリックすると、elseブロックが実行されても、[レコードを削除しますか?]確認 はではありません。が表示されるため、レコードは削除される可能性がありません。

理由は、コード

function TCustomAction.Execute: Boolean; 
begin 
    Result := False; 
    if Supported and not Suspended then 
    begin 
    Update; 
    if Enabled and AutoCheck then 
     if (not Checked) or (Checked and (GroupIndex = 0)) then 
     Checked := not Checked; 
    if Enabled then 
     Result := ((ActionList <> nil) and ActionList.ExecuteAction(Self)) or 
     ((Application <> nil) and Application.ExecuteAction(Self)) or inherited Execute or 
     ((Application <> nil) and Application.ActionExecuteTarget(Self)); 
    end; 
end; 

Enabledプロパティは Updateへの呼び出し時にFalseに設定されるように、デフォルトで思われているので、if Enabled then ...が実行されません。私は Updateの呼び出し中にEnabledをTrueに設定する方法を見つけることができませんでした。多分誰かがそれをやる方法を知っています。 Button2の場合

、実行は、それが実行 レコード削除ルーチンをもたらすことでAction.ExecuteTarget(Self)への呼び出しであるTComponent.ExecuteActionと に渡します。 TComponent.ExecuteActionがコンポーネントで Actionを関連付ける方法、つまり、実行されますように。

そうで、そこから、あなたの問題は、コードを調整する方法になるために私には見えました答えはかなり明白でした。すべてのことが必要なの

はその識別子を変更する、アクションを呼び出すしないアクションの `NAME`を変更するこの

procedure TForm1.Button1Click(Sender: TObject); 
begin 
if cdsOrdersSTATUS.Value='READY' then 
    begin 
    ShowMessage('Your Order Is Already READY/PENDING!'); 
    end 
    else 
    begin 
    Button1.ExecuteAction(LiveBindingsBindNavigateDelete1); // <- this works 
    //LiveBindingsBindNavigateDelete1.Execute; //Not working,why? 
    end; 
end; 
+0

ありがとうございます!それは働いている:))))))))))) –

+0

おそらくあなたは本当に明確にするために質問を書き換えることができます –

+0

@DavidHeffernan:私は行ってきました。 – MartynA

-1

私はあなたがやりたいことを正確に理解していなかったが、あなたはそれのインデックスでアクションをトリガーする場合は、あなたがこのような何か行うことができます。

TAction(ActionList1.Actions[0]).Execute; 
+0

@Dear Sima TAction(ActionList1.Actions [0])。実行します。私のquationを更新する方法で働いていない! –

+0

@AlexKirov "* not working *"どのように正確に?より具体的にする必要があります。あなたはどんな行動を期待していますか?代わりに何をしているのですか? –

+0

@AlexKirovはActionListの中で 'LiveBindingsBindNavigateDelete1'という名前で起動しようとしているアクションですか?もしそうなら、 'TAction(ActionList1.Actions [0])。Execute()'の代わりに 'LiveBindingsBindNavigateDelete1.Execute()'を呼び出すことができます。リスト内のアクションのインデックスに頼らないでください。 –

関連する問題