如何编写真值表和/或门的代码

时间:2014-03-03 10:13:30

标签: delphi delphi-7

我在一个包含2列的数据库中创建了一个表,并用1和0填充了这两列。在前端,我有tdbgrid,它显示数据库中的那些值。当我点击按钮时

  • 如果我在第3列中有1和0则必须显示0.
  • 如果是1和1然后是1。

这是我编写的代码,但它没有在网格中显示。

procedure TForm1.Button1Click(Sender: TObject);
begin
  i := ADODataSet1.FieldByName('id').AsInteger;
  j := ADODataSet1.FieldByName('id2').AsInteger;
  ADODataSet1.First;
  while not ADODataSet1.Eof do
  begin
    if (i = j) and (i<>j) then
    begin
      ShowMessage('true');
      //  Exit;
    end
    Else
      ShowMessage('false');
      //Exit;
    ADODataSet1.Next;
  end;
end;

如何编写该代码。

2 个答案:

答案 0 :(得分:0)

如果要实现OR门:

if (i = 1) or  (j = 1) then
  ShowMessage('true')
else
  ShowMessage('false');

如果你想实现AND门:

if (i = 1) and (j = 1) then
  ShowMessage('true')
else
  ShowMessage('false');

你的逻辑也存在缺陷,i和j永远不会更新:

ADODataSet1.First;
while not ADODataSet1.Eof do
begin
  i := ADODataSet1.FieldByName('id').AsInteger;
  j := ADODataSet1.FieldByName('id2').AsInteger;

  // Magic happens here

  ADODataSet1.Next;
end;

接下来,您可以使用布尔变量来清理代码:

var
  A,B,C : Boolean;
begin
  ADODataSet1.First;
  while not ADODataSet1.Eof do
  begin
    A := ADODataSet1.FieldByName('id').AsInteger = 1;
    B := ADODataSet1.FieldByName('id2').AsInteger = 1;

    // OR
    C := A or B;

    // AND
    C := A and B;

    // Do something with C.
    ShowMessage(BoolToStr(C));

    ADODataSet1.Next;
  end;
end;

并且不要忘记处理任何错误(例如,如果在字段中找到2,该怎么办。

答案 1 :(得分:0)

您的第三列必须是计算字段(将其命名为结果),您应该将此字段添加到数据集中,否则您无法在其中显示网格。

Defining a Calculated Field

为数据集ADODataSet1.OnCalcFields

添加事件处理程序

Programming a Calculated Field

procedure TYourForm.ADODataSet1CalcFields(DataSet: TDataSet);
begin
  if ( DataSet['id'] = 1 ) and ( DataSet['id2'] = 1 ) then
    DataSet['Result'] := 1
  else
    DataSet['Result'] := 0;
end;