问题是关于dbGrid,Combobox等的问题,有兴趣可以看一看。

时间:2021-03-11 14:14:44
1)如何在用户点击dbgrid时获得当前行的top或Rect???
   以前有人告诉我在  ondrawdatacell 里,可我的代码怎么也不往里面去。
   有别的办法吗??
2)如何在combobox中实现类是ie地址输入时的功能。
   就是当用户输入一个字母后,自动dropdown并且将top定位到第一个包含输入窜
   得位子。但输入的值不能变,只有客户选择后才能将值添道输入栏里。
3)当combobox dropdown 时我设置下拉框比combobox本身宽,这时下拉列表于combobox
   是左对齐  如何让其右对齐呢??
4)在com/dcom程序中如何实现服务器端向客户端发送信息呢(如:弹出一个对话框等)
   最好能有相关的文章最好。我按《delphi 5 开发人员指南》的做了。可它的例程当
   client,server在同一机器时好用,一分开就不能用了。
   

                           请高手指点,前面几个问题最好能详细写清
                           最后一个问题,可以介绍几篇文章也可。

14 个解决方案

#1


1.你可以在dbgrid的oncellclick事件里看看相关的query对应的记录的序号,就知道第几行了。
2.在onchange里每次都与你的TStrings里列出的待选项相比,如果...就...,然后,下面就太简单了,不说了。
3.左对齐。
4.用socket尝试一下。

#2


Bob7946(X度空间)

   我kao,你真NB.
   佩服佩服。
   无话可说…………

#3


关注前三个,第四个好象不在同一个域的计算机用com/Dcom经常出错

#4


你的代码要跳入ondrawcell里面,则你首先要draw一下你的dbgrid,你不重画它的话,是无法实现你的想法的。
当前行的top,这个我不太懂你的意思,如果是希望等到当前行在dbgrid的位置的话,应该是可以通过获得记录之间的相对位置计算出来的。

#5


cobi(小新国际) :
    Top , Rect 不懂???
    我想知道当前选定的cell得left,top,width,height,bottom,right。
    这回你该明白了吧。呵呵。
    

#6


1.响应OnCellClick,然后用到一个小偷的本事:
  TThiefGrid = class(TDBGrid)
  public
    function CellRect(ACol, ARow: Longint): TRect;

    property Col;
    property Row;
  end;

function TThiefGrid.CellRect(ACol, ARow: Longint): TRect;
begin
  Result := inherited CellRect(ACol, ARow);
end;

在你的OnCellClick中写:
  with TThiefGrid(DBGrid1) do
  CurrCellRect := CellRect(Col, Row);

2.ComboBox好象就有该功能,你可以在输入好后按向下键然后回车即可。

3.CB_GETCOMBOBOXINFO可以得到DropDownList的窗口句柄,然后设置窗口位置即可。


#7


问题2我已经实现,只是觉得不满意。
3)问题  我就是想知道如何设置位置。详细点好不好??
4)最关键的问题怎么没人说????

#8


1.得到CELL RECT在stringGrid的OnMouseUp中加入下面的代码。

  var
  RowCnt,ColCnt:integer;
  aRect: TRect;
begin
  if Button =  mbLeft then
    begin
     StringGrid2.MouseToCell(x, y, ColCnt, RowCnt);
     aRect := StringGrid2.CellRect(ColCnt, RowCnt);
     ...

2.
  在onkeydown里处理
  if not combobox1.DroppedDown then Combobox1.DropedDown := True;
  ...

3.在combobox的ondrawItem()加入下面的代码,并且style := csOwnerDrawFixed;


var
  AText: string;
begin
  AText := ComboBox1.Items[Index];
  With Control as TComboBox do
  begin
    begin
      Canvas.Brush.Color := clWhite;
      Canvas.FillRect(Rect);
      DrawText(Canvas.Handle, PChar(AText), Length(AText), Rect, DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX or DT_RIGHT)
    end;//关键是DRAWTEXT 的参数设置,DT_RIGHT,
    if odSelected in State then
    begin
      Canvas.Brush.Color := clWhite;
      Canvas.FillRect(Rect);
      Canvas.TextOut(Rect.Left + 3, Rect.Top, TComboBox(Control).Items[Index]);
    end;
    if odFocused in State then
    begin
      Canvas.Brush.Color := clNavy;
      Canvas.FillRect(Rect);
      Canvas.TextOut(Rect.Left + 3, Rect.Top, TComboBox(Control).Items[Index]);
    end;
  end;

也可以加上SHOWHINT...


#9


问题3)大家可能误解了。我是要下拉的那个框框的右面与combobox的右面对齐,而不是其中的字符。

#10


3)问题  我就是想知道如何设置位置。详细点好不好??
----------------------------------------------------
看一下WIN32 API的帮助就明白了

var
  cbbInfo: TCOMBOBOXINFO;
  rct: TRect;
begin
  ComboBox1.Perform( CB_GETCOMBOBOXINFO, 0, Integer(@cbbInfo) );
  GetWindowRect( cbbInfo.hwndList, rct );
  对rct进行调整
  MoveWindow( cbbInfo.hwndList, rct.left, rct.top, rct.right-rct.left, rct.bottom-rct.top, False );

#11



CB_GETCOMBOBOXINFO 我的机器找不到 [Error] Unit2.pas(105): Undeclared identifier: 'CB_GETCOMBOBOXINFO'

2)问题但我用上(下)键移动到当前最上(最下)需要滚动时速度特别慢。怎样才能让他们飞一样的快呢??

#12


那就用GetComboBoxInfo吧:
GetComboBoxInfo( ComboBox1.Handle, cbbInfo );
好象更好用些。:)

CB_GETCOMBOBOXINFO是Windows新版本中的(XP):Windows NT/2000 or later: Requires Whistler.

==========================================
移到最上/下用Ctrl+PageUp, Ctrl+PageDown

#13


我就是要用上(下)建。我要浏览。
如何能让他向delphi的提示上下移动那么快??

#14


Delphi的提示应该是自己写的,如果你想要那样的效果,就不能用ComboBox了,自己写一个就可以了。(Windows的ComboBox做了一些处理,所以有延迟效果)

#1


1.你可以在dbgrid的oncellclick事件里看看相关的query对应的记录的序号,就知道第几行了。
2.在onchange里每次都与你的TStrings里列出的待选项相比,如果...就...,然后,下面就太简单了,不说了。
3.左对齐。
4.用socket尝试一下。

#2


Bob7946(X度空间)

   我kao,你真NB.
   佩服佩服。
   无话可说…………

#3


关注前三个,第四个好象不在同一个域的计算机用com/Dcom经常出错

#4


你的代码要跳入ondrawcell里面,则你首先要draw一下你的dbgrid,你不重画它的话,是无法实现你的想法的。
当前行的top,这个我不太懂你的意思,如果是希望等到当前行在dbgrid的位置的话,应该是可以通过获得记录之间的相对位置计算出来的。

#5


cobi(小新国际) :
    Top , Rect 不懂???
    我想知道当前选定的cell得left,top,width,height,bottom,right。
    这回你该明白了吧。呵呵。
    

#6


1.响应OnCellClick,然后用到一个小偷的本事:
  TThiefGrid = class(TDBGrid)
  public
    function CellRect(ACol, ARow: Longint): TRect;

    property Col;
    property Row;
  end;

function TThiefGrid.CellRect(ACol, ARow: Longint): TRect;
begin
  Result := inherited CellRect(ACol, ARow);
end;

在你的OnCellClick中写:
  with TThiefGrid(DBGrid1) do
  CurrCellRect := CellRect(Col, Row);

2.ComboBox好象就有该功能,你可以在输入好后按向下键然后回车即可。

3.CB_GETCOMBOBOXINFO可以得到DropDownList的窗口句柄,然后设置窗口位置即可。


#7


问题2我已经实现,只是觉得不满意。
3)问题  我就是想知道如何设置位置。详细点好不好??
4)最关键的问题怎么没人说????

#8


1.得到CELL RECT在stringGrid的OnMouseUp中加入下面的代码。

  var
  RowCnt,ColCnt:integer;
  aRect: TRect;
begin
  if Button =  mbLeft then
    begin
     StringGrid2.MouseToCell(x, y, ColCnt, RowCnt);
     aRect := StringGrid2.CellRect(ColCnt, RowCnt);
     ...

2.
  在onkeydown里处理
  if not combobox1.DroppedDown then Combobox1.DropedDown := True;
  ...

3.在combobox的ondrawItem()加入下面的代码,并且style := csOwnerDrawFixed;


var
  AText: string;
begin
  AText := ComboBox1.Items[Index];
  With Control as TComboBox do
  begin
    begin
      Canvas.Brush.Color := clWhite;
      Canvas.FillRect(Rect);
      DrawText(Canvas.Handle, PChar(AText), Length(AText), Rect, DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX or DT_RIGHT)
    end;//关键是DRAWTEXT 的参数设置,DT_RIGHT,
    if odSelected in State then
    begin
      Canvas.Brush.Color := clWhite;
      Canvas.FillRect(Rect);
      Canvas.TextOut(Rect.Left + 3, Rect.Top, TComboBox(Control).Items[Index]);
    end;
    if odFocused in State then
    begin
      Canvas.Brush.Color := clNavy;
      Canvas.FillRect(Rect);
      Canvas.TextOut(Rect.Left + 3, Rect.Top, TComboBox(Control).Items[Index]);
    end;
  end;

也可以加上SHOWHINT...


#9


问题3)大家可能误解了。我是要下拉的那个框框的右面与combobox的右面对齐,而不是其中的字符。

#10


3)问题  我就是想知道如何设置位置。详细点好不好??
----------------------------------------------------
看一下WIN32 API的帮助就明白了

var
  cbbInfo: TCOMBOBOXINFO;
  rct: TRect;
begin
  ComboBox1.Perform( CB_GETCOMBOBOXINFO, 0, Integer(@cbbInfo) );
  GetWindowRect( cbbInfo.hwndList, rct );
  对rct进行调整
  MoveWindow( cbbInfo.hwndList, rct.left, rct.top, rct.right-rct.left, rct.bottom-rct.top, False );

#11



CB_GETCOMBOBOXINFO 我的机器找不到 [Error] Unit2.pas(105): Undeclared identifier: 'CB_GETCOMBOBOXINFO'

2)问题但我用上(下)键移动到当前最上(最下)需要滚动时速度特别慢。怎样才能让他们飞一样的快呢??

#12


那就用GetComboBoxInfo吧:
GetComboBoxInfo( ComboBox1.Handle, cbbInfo );
好象更好用些。:)

CB_GETCOMBOBOXINFO是Windows新版本中的(XP):Windows NT/2000 or later: Requires Whistler.

==========================================
移到最上/下用Ctrl+PageUp, Ctrl+PageDown

#13


我就是要用上(下)建。我要浏览。
如何能让他向delphi的提示上下移动那么快??

#14


Delphi的提示应该是自己写的,如果你想要那样的效果,就不能用ComboBox了,自己写一个就可以了。(Windows的ComboBox做了一些处理,所以有延迟效果)