2017-05-24 64 views
0

请,我需要帮助帆布用途: 当用户在DBGrid中的标题栏移动鼠标, 标题描述德尔福XE 3. 这个问题会消失在Delphi 7使用Canvas.TextOut在DBGrid中 - 德尔福XE 3

不occurr按照下面的代码:

unit Unit1; 

interface 

uses 

Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, 
Graphics, Controls, Forms, Dialogs, Data.DB, Datasnap.DBClient, 
Grids, DBGrids, Types, StdCtrls; 

type 
TAccessDBGrid = class(TCustomGrid); 

type 
TForm1 = class(TForm) 

DataSource1: TDataSource; 
grid1: TDBGrid; 
cdsTabela: TClientDataSet; 
cdsTabelacodigo_1: TIntegerField; 
cdsTabelacodigo_2: TIntegerField;`enter code here` 

procedure grid1DrawColumnCell(Sender: TObject; const Rect: TRect; 
DataCol: Integer; Column: TColumn; State: TGridDrawState); 

procedure FormCreate(Sender: TObject); 

procedure FormResize(Sender: TObject); 

procedure grid1TitleClick(Column: TColumn); 

private 
    { Private declarations } 
public 
    { Public declarations } 
end; 

var 
Form1: TForm1; 

implementation 
    {$R *.dfm} 

procedure TForm1.FormCreate(Sender: TObject); 
    begin 
     cdsTabela.CreateDataSet; 
    end; 

procedure TForm1.FormResize(Sender: TObject); 
    begin 
     grid1.Refresh; 
    end; 

procedure TForm1.grid1DrawColumnCell(Sender: TObject; const Rect: TRect; 
DataCol: Integer; Column: TColumn; State: TGridDrawState); 
var 
S1 : string; 

begin 

with TAccessDBGrid(grid1) do 
begin 
    RowHeights[0] := 29; 
    Canvas.Brush.Color := clBtnFace; 
    case Column.Index of 
    0: 
    begin 
     Column.Title.Caption := ''; 
     S1 := 'Code'; 
    end; 
    1: 
    begin 
     Column.Title.Caption := ''; 
     S1 := 'Description'; 
    end; 
end; 

TDBGrid(Sender).Canvas.Font.Color:= clBlack; 
Canvas.TextOut(Rect.Left + 3, 19, S1); 
end; 
end; 

procedure TForm1.grid1TitleClick(Column: TColumn); 
begin 
ShowMessage('Title Click! '); 
end; 

end 

欲了解更多信息,请参阅我已经发布了答案。

+0

你怎么能指望改变行高后,你已经开始画行是去工作?我没有这台机器上的D7,但我不认为它在那里工作。改为在FormCreate事件中设置该行的高度。为什么你在调用'Canvas.TextOut'时对'19'进行硬编码,而不是使用'Rect.Top'中的偏移量?当你改变而不是使用'19'时会发生什么?你的代码没有意义;您将删除每一行上的Title.Caption,并在每行的每个单元格中从S1中绘制相同的文本。此代码从未工作。 –

+0

@KenWhite:你说“这段代码从来没有工作过”是完全正确的。它在我的D7中肯定无法正常工作。 – MartynA

回答

1

您发布的答案中包含的额外信息使得您更容易理解您正在尝试做什么,这很好。请在未来的问题中尝试做到这一点,因为它更有可能会更快地得到更好的答案。

无论如何,我建议你用Mike Shkolnik的TSMDBGrid替换你的TDBGrid。请参阅:http://www.scalabium.com/smdbgrid.htm并观看动画。

他的网格中包含一个OnDrawColumnTitle事件,我认为这会比通过TDBGrid实现想要的要容易得多。我从你的评论中收集到你已经遵循了这个建议,并成功地实现了你正在尝试做的事情。

原来的答复如下:

我同意肯·怀特说,但除此之外,我觉得你的代码 是错误的。要明白我的意思,试试这个:

  1. 保存一个IDE调试布局,其中的代码编辑器不 您Form1的重叠。这样做的目的是让Form1不会被强制重新绘制IDE在断点上存储的 。

  2. DefaultDrawing设置为False。这一点是,它设置为 真正隐藏你的Grid1DrawColumnCell是多么破碎。

  3. 在您的Grid1DrawColumnCell的第一行上设置断点,即 with TAccessDBGrid(grid1)

  4. 编译并运行。请注意,调试器在屏幕上正在绘制表单时在断点处停止几次 次,但在此之后,它根本不会在您的BP上停止。因此,一旦表单在屏幕上,您的自定义绘画就不会出现,直到您导致网格刷新为止。使用你的表单的OnResize处理程序。

  5. 那么,一旦将鼠标移动到网格上,将导致列标题标题为空。答案是,你这样做!要知道为什么......

  6. 在VCL.DBGrids.Pas,发现DrawTitleCell在TCustomDBGrid.DrawCell并把BP在 WRITETEXT(帆布,TextRect,LFrameOffs,LFrameOffs,标题,对齐,...

  7. 再次运行应用程序到您的Grid1DrawColumnCell已执行 并在WriteText BP组调试器停止在步骤6.评估Caption ,你会看到,它是空的(因为你Grid1DrawColumnCell已经清除了它,当然)点。我想你可以在你的DrawColumnCell退出之前将你的S1的值赋给列标题的标题,但是它的绘图 仍然是一团糟,你会看到如果你尝试

    case Column.Index of 
    0: begin 
    // Column.Title.Caption := ''; 
        S1 := 'Code'; 
        Column.Title.Caption := S1; 
    end; 
    1: begin 
    // Column.Title.Caption := ''; 
        S1 := 'Description'; 
        Column.Title.Caption := S1; 
    end; 
    

QED

所以基本上你与你Grid1DrawColumnCell浪费你的时间。如果你想知道是否可以自定义绘制列标题/标题,如果是的话,我建议你在做一些研究之后问一个新的q。如果你没有找到任何东西,你可以考虑派生一个TCustomDBGrid后代并覆盖它的DrawCell;这样,您可以更好地控制整个绘图过程,并且可以更接近您尝试实现的任何内容。

顺便说一句,以上是基于应用程序正在编译德尔福Seatlle,这是比XE3更新,但我怀疑这有什么区别。

+0

我添加了一个答案来解释我的问题。 – alice

+0

谢谢Martyn,您建议使用TSMDBGrid而不是TDBGrid解决了我的问题,它的功能更强大! 我创建了一个2列的乐队,现在工作!恭喜! – alice

0

我用,而不是Title.Caption Canvas.TextOut原因是 我需要写2行中的标题:

 Tests 
Test One Test Two 

,因为我想在写我,而不是使用Rect.Top“19”标题。 如果我使用Rect.Top,文本在列

的版本区域绘制Canvas.TextOut(Rect.Left + 3,19,S1);

跟随波纹管我真正的代码:

在Grid1DrawColumnCell:

with TAccessDBGrid(grid1) do 
begin 
    RowHeights[0] := 37; 
    Canvas.Brush.Color := clBtnFace; 

    case Column.Index of 
    0: begin 
     Column.Title.Caption := ''; 
     S1 := 'Code'; 
    end; 
    1: begin 
     Column.Title.Caption := ''; 
     Canvas.Font.Color := clBlack; 

     S1 := 'Tests'; 

     Canvas.Brush.Style := bsSolid; 
     Canvas.Brush.Color := clBtnFace; 
     Canvas.FillRect(Types.Rect(Rect.Left, 0, Rect.Left + 120, 18)); 
     Canvas.TextOut(Rect.Left + 3, 1, S1); 
     Canvas.Brush.Style := bsSolid; 

     S1 := 'Test One'; 
    end; 
    2: begin 
     Column.Title.Caption := ''; 
     S1 := 'Test Two'; 
    end; 
end; 

    Canvas.Font.Color:= clBlack; 
    Canvas.TextOut(Rect.Left + 3, 19, S1); 
end; 
+0

好吧,如果你在第一时间发布你的真实代码,它会有所帮助! – MartynA

+0

对不起,我认为我会简化代码,让你明白它。 但我不能。 拜托,你能帮我吗? – alice