2017-05-24 1 views
0

をしてください、私はキャンバスの使用を支援する必要があります。 ユーザーはDBGridのタイトル列の上にマウスを移動すると、 タイトルの説明は、Delphi XE 3 で、この問題を消えます詳細については、のDBGridでCanvas.TextOutを使用する - デルファイXE 3

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 

私が投稿している答えを参照してください。

デルファイ7の回の出現しないことは、以下のコードに従ってください。

+0

はどのように行の高さを変更すること期待していますか?私はこのマシンでD7を利用することはできませんが、そこではD7も使えるとは思いません。代わりに、FormCreateイベントの行の高さを設定します。そしてなぜ 'Rect.Top'からのオフセットを使うのではなく' Canvas.TextOut'の呼び出しで '19'をハードコーディングしていますか? '19'を使う代わりにあなたがそうするように変更するとどうなりますか?あなたのコードは意味をなさない。 1行ごとにTitle.Captionを削除し、すべての行のすべてのセルのS1から同じテキストを描画します。このコードは決して働きませんでした。 –

+0

@KenWhite:「このコードは決して働かない」と言うのは間違いありません。確かに私のD7では正しく動作しません。 – MartynA

答えて

1

あなたが投稿した回答に含まれる追加情報は、あなたがやろうとしていることを理解するのをはるかに容易にします。あなたがより良い答えを早く得る可能性が高いので、将来の質問でそれをやろうとしてください。

とにかく、TDBGridをMike ShkolnikのTSMDBGridで置き換えることをお勧めします。参照:http://www.scalabium.com/smdbgrid.htmとアニメーションを見てください。

グリッドにはOnDrawColumnTitleイベントが含まれています。これは、TDBGridを使用してみようとするよりも、あなたが望むものを達成するのがはるかに簡単になると思います。私はあなたのコメントから、この提案に従って、あなたがしようとしていたことに成功したということを集めます。

オリジナルの答えは次のとおりです。

私はケンホワイトは言ったことに同意し、それに加えて、私はあなたのコード が誤認だと思います。私が何を意味するかを確認するには、これを試してみてください。

  1. コードエディタが あなたのForm1と重複しないようなIDEのデバッグレイアウトを保存します。これを行うことのポイントは、Form1がIDEをブレークポイントに置く を再描画することを強制されないようにすることです。

  2. DefaultDrawingをFalseに設定します。これは、 に設定されていることです。Grid1DrawColumnCellが本当にどのように壊れているかを真に隠蔽します。

  3. Grid1DrawColumnCellの最初の行にブレークポイントを設定します。つまり、 with TAccessDBGrid(grid1)です。

  4. コンパイルして実行します。フォームが画面に表示されている間にデバッガがブレークポイントのいくつかの 回停止することに注意してください。その後は、 はBPで停止しません。したがって、カスタムペイントは、グリッドが更新されるまで、フォームがスクリーンに表示されると、決して表示されません。フォームのOnResizeハンドラを使用してください。

  5. グリッド上でマウス を移動すると、タイトルキャプションが空白になる原因は何ですか?答えは、そうです! 、VCL.DBGrids.Pasではなぜ...

  6. を参照してくださいTCustomDBGrid.DrawCellでDrawTitleCellを見つけて WRITETEXT(キャンバス、TextRect、LFrameOffs、LFrameOffs、キャプション、アライメント、...

  7. にBPを配置するには
  8. あなたGrid1DrawColumnCellが を実行したとデバッガがCaption を評価し、ステップ6でWriteText BPセットに停止し、あなたが(あなたの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を上書きすることを検討してください。そうすれば、あなたは描画プロセス全体をより良くコントロールし、達成しようとしているものに近づくことができます。

Btwは、XE3よりも最近のDelphi Seatlleでコンパイルされているアプリケーションに基づいていますが、これは違いがありません。私が代わりにTitle.CaptionのCanvas.TextOutを使用

+0

私は自分の問題を説明する答えを加えました。 – alice

+0

ありがとうMartyn、TDBGridの代わりにTSMDBGridを使用する提案は私の問題を解決しました。 2つの列に対して1つのバンドを作成しました。おめでとう! – alice

0

理由は、私はタイトルに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

関連する問題