应该先将stringgrid的options->goRowSelect设为true。

解决方案 »

  1.   

      我已解决了这个问题,可改成Delphi
      若满意,别忘了加分噢,我花了半天时间。void GetRC(TStringGrid *StringGrid1,int X,int Y,
              int  &row,int &col)
    {
        row=col=-1;
        int s;
        s=StringGrid1->RowHeights[0];
        if (Y<=s)
            row=0;    //是固定行
        else
            for (int i=StringGrid1->TopRow;
                      i<StringGrid1->RowCount &&
                      s<=StringGrid1->GridHeight; i++)
                {
                    s+=StringGrid1->RowHeights[i]+
                      StringGrid1->GridLineWidth;
                    if (Y<=s)
                    {
                        row=i;
                        break;
                    }
                }
        s=StringGrid1->ColWidths[0];
        if (X<=s)
            col=0;    // 是固定列
        else
            for (int i=StringGrid1->LeftCol;
                      i<StringGrid1->ColCount &&
                        s<=StringGrid1->GridWidth; i++)
                {
                    s+=StringGrid1->ColWidths[i]+
                      StringGrid1->GridLineWidth;
                    if (X<=s)
                    {
                        col=i;break;
                    }
                }
    }void __fastcall TForm1::StringGrid1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
        int row=-1,col=-1;
        GetRC(StringGrid1,X,Y,row,col);
        if (row>=0 && col>=0)
            ShowMessage("这是第"+String(row)+"行\n\n"
                    "    第"+String(col)+"列");
    }  
      

  2.   

     排序就更简单,用TStringList::Sort(),若非字典顺序,
    就用 TStringList::CustomSort(),不过要自行遍个比较
    函数.Delphi类似void __fastcall TForm1::StringGrid1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
        int row=-1,col=-1;
        GetRC(StringGrid1,X,Y,row,col);
        if (row>=0 && col>=0)
            ShowMessage("这是第"+String(row)+"行\n\n"
                    "    第"+String(col)+"列");
        if (row>0 && col==0)  // 点击了固定行了
           {    // 对行排序
                TStringList *ss=new TStringList();
                ss->AddStrings(StringGrid1->Rows[row]);
                ss->Sort();
                StringGrid1->Rows[row]=(TStrings *)ss;
                delete ss;
           } 
    } }  
      

  3.   

     bcb,我已经再c++builder中给你加了分了,在这里我再给你加上20分。你如果把排序问题做好,我就把剩下的分都给你。
     我用的TStringList是带对象的,即用TStringList->AddObject((*TObject)ss)加入的,
    TStringGrid的一行就是一个对象值,希望你能对TStringList中对象的任意属性将TStringList排序。
      

  4.   


       你要求的排序不应该算难,主要是有一个
    例子让你参考。任意属性都可排序,关键要
    自行编写一个 比较的回调 函数,下面的
      MyCompFun1( )及MyCompFun2( )就要两个
    这样函数;通过两个索引下标项index1与
    index2,访问到你要排序的关键属性值,
    假设存放到中间变量value1、value2中,
    然而设法比较这两个值,若 > 则须设法返回
    正值,= 返回0 ,< 返回负值,简单灵活。
    我假想你的对象结构是 MyObject,有个
    属性.ABC是排序关键字int __fastcall  MyCompFun1(TStringList  *List,
                            int index1,int index2)
    {
        String value1=List->Strings[index1];
        String value2=List->Strings[index2];
        return(value1.AnsiCompare(value2));
    }typedef
        struct {       // 用户目标对象结构
                 int ABC;
                 int v1;
               }  MyObject;int __fastcall  MyCompFun2(TStringList  *ss,
                            int index1,int index2)
    {
        MyObject *p1=(MyObject *)ss->Objects[index1];
        MyObject *p2=(MyObject *)ss->Objects[index2];    int value1,value2;    if (p1==NULL)      // 要考虑是否空指针
            value1=0;
        else
            value1=p1->ABC;    if (p2==NULL)
            value2=0;
        else
            value2=p2->ABC;    return(value1-value2);
    }void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        TStringList *ss=new TStringList();
        ss->AddStrings(ListBox1->Items);
        ss->CustomSort(MyCompFun1);   // 比较函数作参数排序
        ListBox1->Items=ss;
        delete ss;
    }
    不知能否达到你的要求?????
      

  5.   

    我也想知道这个问题的解决办法,可bcb用的是c吧,难道在delphi中stringgrid就没有对点击事件的处理吗,sztanj老兄如果已经知道处理方法请email给我一份代码好吗,谢谢!!!祝大家有个好心情!