选择多个复选框以执行条件

时间:2017-07-08 12:57:43

标签: windows checkbox pascal lazarus freepascal

一旦我选择了2个复选框,我想要一个文本文件在memo1中显示内容。 我该怎么做?

我尝试了下面的代码,但我似乎无法正确使用。

if CheckBox1.Checked and CheckBox2.Checked then
begin
memo1.lines.LoadFromFile('files\RS.txt');
end;

我也希望能够单独选择复选框。 (如果将它们组合在一起,可以防止单独检查它们)

Checkbox1:

procedure TForm1.CheckBox1Change(Sender: TObject);
begin
   memo1.lines.LoadFromFile('files\R.txt');
end;

Checkbox2:

procedure TForm1.CheckBox2Change(Sender: TObject);
begin
   memo1.lines.LoadFromFile('files\S.txt');
end;

任何建议/改进将不胜感激。

运行Lazarus IDE v1.6.4

Windows 10 x64

3 个答案:

答案 0 :(得分:4)

我假设你的目标是生成一个依赖于的文件名 两个复选框的布尔状态的特定组合 - 请参阅下面的示例代码这样做的关键是它有助于分离 您希望文件名的定义来自您想要做什么 用它。

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Lines.LoadFromFile(GetFileName);
end;

function TForm1.GetFileName: String;
begin
  //  Return empty string if neither checkbox is checked
  Result := '';

  if Checkbox1.Checked and Checkbox2.Checked then
    Result := 'files\RS.txt'
  else  // if we reach here only one of the checkboxes, or neither, is checked
    if Checkbox1.Checked then
      Result := 'files\R.txt'
    else
      if Checkbox2.Checked then
        Result := 'files\S.txt'
end;

我在开始时为函数的Result分配了一个空字符串,以确保始终定义Result

重要您会注意到上面的内容使用复选框的更改事件。原因是,如果永远不会触发Change事件,您可能无法获得所需的结果(或期望) - 例如,如果一个CheckBox在IDE中设置为Checked但另一个未设置为Checked,并且您希望获得正确的文件名,无论用户是否实际点击了其中任何一个。

答案 1 :(得分:3)

据我了解,您需要以下行为:

  • 有两个复选框
  • 有一个备忘录字段
  • 根据两个复选框的状态,备注字段中的文本将更改

如果这种理解是正确的:

我通常不使用Pascal,但您的问题似乎与使用的编程语言无关。我会这样做:

只要相应的复选框状态发生变化,就会调用TForm1.CheckBox1ChangeTForm1.CheckBox2Change这两个程序。

我会写第三个procedure并从两个程序中调用第三个procedure。除了在另外两个程序中调用第三个procedure之外,我什么都不做。

在第三个procedure中,我会评估要做什么 - 取决于两个复选框的状态。

答案 2 :(得分:1)

如果双击事件,设计者将自动生成每个事件的单独checkboxchange序列。然而,这不是一个严格的决定。

如果你有初始代码片段,例如checkbox1change,你可以通过使用checkbox2的onchange下拉列表将checkbox2的onchange指向现有的checkbox1change