如果那么其他循环问题delphi

时间:2011-05-10 01:50:20

标签: delphi loops if-statement

我还是初学者,我一直试图通过自己解决这个问题,但我想我运气不好。我认为这可能很简单,但这是合约。

我有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.');

6 个答案:

答案 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;