procedure ItemAdd; {菜单的动态添加___自定义的过程}
var
  aItem: TMenuItem;
  i: Integer;
begin
  with frmMain.ADOQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('select c_Name from Account');
    ExecSql;
    Open;
  end;
  for i:=1 to frmMain.ADOQuery1.RecordCount do
  begin
    aItem:=TMenuItem.Create(nil);
    aItem.Caption:=frmMain.ADOQuery1.fieldbyname('c_Name').AsString;
    {aItem.OnClick:=MenuClick;}
    frmMain.MainMenu1.Items.Items[2].Items[0].Add(aItem);
    frmMain.ADOQuery1.Next;
  end;
end;现在想编写 OnClick 事件,能根据菜单的Caption值,在DBGrid中列出相关的数据.
比如:
某菜单的Caption 是"我的现金",点击之后,在 DBGrid 中列出表 "Account" 的字段 "c_Name" 是" 我的现金" 的记录

解决方案 »

  1.   

    procedure TForm1.MenuClick(Sender: TObject);
    begin
      ShowMessage((Sender as TMenuItem).Caption);
    end;从你的MenuItem的Caption取得例如"我的现金" 然后再对其进行数据库的查询过滤
      

  2.   

    能具体点吗 ?
    var
    SelStr: string;  //  MenuItem 的 Caption 能否直接 附值给 SelStr ?
    ...
    Sql.Add('Select * from Account where c_Name = ' + SelStr);
    ...
      

  3.   

    SelStr := (Sender as TMenuItem).Caption;
    SelStr := StringReplace(SelStr, '&', '', [rfReplaceAll]); //替换掉Caption中的&符号,默认是有一个&符号表示下划线的热键的,数据库查询的时候不需要它,替换掉
    ...
    Sql.Add('Select * from Account where c_Name = ' + SelStr);
    ...
      

  4.   

    非常感谢,问题基本解决.
    不过
    Sql.Add('Select * from Account where c_Name = ' + SelStr); 有问题
    上述语句在SQl 2000中 即为:Select * from Account where c_Name = 我的现金;这是错的.
    SQL 语句中 对 string 的值要用 单引号,这个怎么解决?
      

  5.   

    Sql.Add('Select * from Account where c_Name = ' + SelStr); 有问题
    上述语句在SQl 2000中 即为:Select * from Account where c_Name = 我的现金;这是错的.
    SQL 语句中 对 string 的值要用 单引号,这个怎么解决?
    --------------------------------------
    可以
      Sql.Add('Select * from Account where c_Name = ' + '''' + SelStr + '''');
    也可以
      Sql.Add('Select * from Account where c_Name = :aPara');
      Parameters.ParamByName('aPara').Value := SelStr;
      

  6.   

    记录怎么为零条?
    是不是 SelStr 的值有问题 ?
      

  7.   

    如果是SQL Server 的话,把你的SQL 语句 放到查询分析器中运行试试看
      

  8.   

    SelStr := (Sender as TMenuItem).Caption;
    SelStr := StringReplace(SelStr, '&', '', [rfReplaceAll]); //替换掉Caption中的&符
    第一个SelStr 的值: '张三的现金(Y)'
    第二个SelStr 的值: '张三的现金(Y)'
    没有变化
      

  9.   


      function Del(const S: string): string;
      var
        ilPos, irPos: Integer;
      begin
        Result := StringReplace(S, '&', '', [rfReplaceAll]); //如果全部是中文的话,&符号在()里面,如果是英文的话,可能没有()
        ilPos := Pos('(', Result);
        irPos := Pos(')', Result);
        System.Delete(Result, ilPos, irPos - ilPos + 1);
      end;SelStr := (Sender as TMenuItem).Caption;
    SelStr := Del(SelStr);
      

  10.   

    var
      I: Integer;
      S: string;
      C: char;
    begin
      S := '12345';
      for I := 1 to Length(S) do
      begin
        C := S[I]; //读取第I个字符到字符C中
      end;
    end;