컨트롤의 가시성을 제어하는 동작을 사용하려고합니다. 내 코드는 다음과 같습니다액션을 사용하여 컨트롤의 가시성을 결정하려면 어떻게해야합니까?
파스칼 파일
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ActnList, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
ActionList1: TActionList;
Action1: TAction;
CheckBox1: TCheckBox;
procedure Action1Update(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Action1Update(Sender: TObject);
begin
(Sender as TAction).Visible := CheckBox1.Checked;
end;
end.
양식 파일
object Form1: TForm1
object Button1: TButton
Left = 8
Top = 31
Action = Action1
end
object CheckBox1: TCheckBox
Left = 8
Top = 8
Caption = 'CheckBox1'
Checked = True
State = cbChecked
end
object ActionList1: TActionList
Left = 128
Top = 8
object Action1: TAction
Caption = 'Action1'
OnUpdate = Action1Update
end
end
end
양식이 처음 버튼이 표시 실행 확인란을 선택하면. 그런 다음 확인란의 선택을 취소하면 단추가 사라집니다. 확인란을 다시 선택하면 버튼이 다시 나타나지 않습니다.
나는 이것에 대한 이유는 TCustomForm.UpdateActions
에서 다음 지역 함수 내에서 발견 될 수 있다고 생각 :
procedure TraverseClients(Container: TWinControl);
var
I: Integer;
Control: TControl;
begin
if Container.Showing and not (csDesigning in Container.ComponentState) then
for I := 0 to Container.ControlCount - 1 do
begin
Control := Container.Controls[I];
if (csActionClient in Control.ControlStyle) and Control.Visible then
Control.InitiateAction;
if (Control is TWinControl) and (TWinControl(Control).ControlCount > 0) then
TraverseClients(TWinControl(Control));
end;
end;
Control.Visible
의 검사가 다시 자동으로 업데이트 할 수있는 기회를 점점 내 행동을 차단하기 위해 나타납니다.
문제를 올바르게 진단 했습니까? 품질 보증 보고서를 제출해야합니까? 누구든지 해결 방법을 알고 있습니까?
어째서 ['OnUpdate'] (http://docwiki.embarcadero.com/Libraries/en/Vcl.ActnList.TAction.OnUpdate)를 사용하고 있습니까? – TLama
@TLama : 그것이 바로 그 때문입니다. 가장 자주, 나는 당신이'Visible'보다는'Enabled'를 설정했다고 생각합니다. –
이것은 버그이거나 적어도 Misbegotten-Feature입니다. 모든 작업에 대해 Enabled 및 Visible을 설정할 수 있어야하며 연결된 컨트롤은 Enabled 값과 Visible 값을 포함하도록 새로 고쳐야합니다. 여기에 ActionUpdate가 필요한 경우 수행하려는 디커플링 종류가 중단됩니다. 이제 확인란이 작업과 결합되어야합니다. 난 단지 OnUpdate를 사용하여 표시에 대한 변경 사항을 중지하고 확인란을 onclick에서 한 줄로 표시하거나 표시하지 않도록 설정합니다. –