我还是初学者,我一直试图通过自己解决这个问题,但我想我运气不好。我认为这可能很简单,但这是合约。
我有3个复选框。每个人在按下按钮时在文本文件中写入特定行,但如果没有选择。我想要显示一条消息。但是,即使选中了一个复选框,也会弹出消息。这是代码:(顺便说一句,随意建议任何其他代码,使其更容易/更清晰)
if cbSCV.Checked then
WriteLn(permFile, 'scv');
if cbMP.Checked then
WriteLn(permFile, 'mp');
if cbBTK.Checked then
WriteLn(permFile, 'btk');
if not (cbBTK.Checked) and not (cbMP.Checked) and not (cbBTK.Checked) then
showmessage('Choose at least 1 option.');
答案 0 :(得分:6)
尝试将if sentence
替换为
if not (cbBTK.Checked) and not (cbMP.Checked) and not (cbSCV.Checked) then
因为您正在检查cbBTK.checked
值两次
答案 1 :(得分:6)
对于它的价值,我可能会颠倒逻辑并编写像这样的麻烦测试:
if not (cbBTK.Checked or cbMP.Checked or cbSCV.Checked) then
答案 2 :(得分:2)
补充@ soid的answer:我可能会这样写:
procedure TForm1.CheckIt;
var
Count: Integer;
procedure HandleCheckBox(ACheckBox: TCheckBox; const AID: string);
begin
if ACheckBox.Checked then
begin
WriteLn(permFile, AID);
Inc(Count);
end;
end;
begin
Count := 0;
HandleCheckBox(cbSCV, 'scv');
HandleCheckBox(cbMP, 'mp');
HandleCheckBox(cbBTK, 'btk');
if Count = 0 then
ShowMessage('Choose at least 1 option.');
end;
这是一些更多的行,但如果您以后需要第四个或第五个复选框,那么恕我直言会更容易出错,更“自动”。
答案 3 :(得分:1)
我会像这样重写它:
if cbSCV.Checked then WriteLn(permFile, 'scv');
if cbMP .Checked then WriteLn(permFile, 'mp' );
if cbBTK.Checked then WriteLn(permFile, 'btk');
if not (cbSCV.Checked) and
not (cbMP .Checked) and
not (cbBTK.Checked) then
showmessage('Choose at least 1 option.');
这需要相同数量的行,但将重复的元素放在一起,以便于快速读取整个构造,并找到不遵循模式的位置。你的错误,我们在代码中都有,如果它是这样写的,就更容易看到。
答案 4 :(得分:1)
嗯。对于那些我喜欢基于集合的方法。 一种方法是这个
type
TEnumSomething = (esSCV, esMP, esBTK);
TSomethingSet = set of TEnumSomething;
{var section}
var
Conj: TSomethingSet;
{code section}
Conj := [];
if cbSCV.checked then
begin
Conj := conj + [esSCV];
WriteLn(permFile, 'scv');
end;
{do this for the other 2 checkboxes}
If Conj = [] then ShowMessage('');
您还可以将Conj
设为表单字段并设置复选框
在他们的OnClick事件上设置/取消设置。
警告:可能缺少一些语法细节,我现在不在delphi IDE上......
答案 5 :(得分:0)
我可能不会像这样重写它,但是,嘿,这很有趣。我在工作,我这里没有Delphi,所以这只是示例代码。泛型!
type
TCheckBoxDict: TDictionary<String, TCheckBox>;
var
Dict: TCheckBoxDict;
function HandleCheckBoxes(ADict: TCheckBoxDict) : boolean;
var
Key: String;
CheckBox: TCheckBox;
begin
Result := false;
for Key in ADict.Keys do
if ADict.Items[Key].Checked then
begin
WriteLn(permFile, Key);
Result := true;
end;
end;
begin
Dict := TCheckBoxDict.Create;
Dict.Add('scv', cbSCV);
Dict.Add('mp', cbMP);
Dict.Add('btk', cbBTK);
if not HandleCheckBoxes(Dict) then
ShowMessage('Choose at least one option');
Dict.Destroy;
end;