2013-12-08 8 views
5

私はその行を右クリックして、文字列グリッド内の行からすべてのセルのテキストをストライクしたいと思います。私のコードは大丈夫ですが、行からクリックされたセルはストライクされません(もう一方のウェル)!また、私はライン上で最初にクリックする必要がありますし、右クリックして続行し、私はちょうど右クリックしたいが、方法がわからない: -/ マイコード:stringgrid(delphi)でテキストを打つ方法

procedure TForm1.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
    var 
    i, j: integer; 
begin 
    if Button = mbRight then 
    begin 
    j:=StringGrid1.Selection.Top; 
    If MessageDlg('Disable row '+IntToStr(j), 
     mtConfirmation, [mbYes, mbNo], 0, mbYes) =mrYes then 
    begin 
     With Stringgrid1 As TStringGrid Do 
     With Canvas Do 
     begin 
      for i := 0 to 2 do 
      begin 
      Rect := CellRect (i, StringGrid1.Selection.Top); 
      Font.Style := Font.Style + [fsStrikeOut]; 
      FillRect(Rect); 
      DrawText(Canvas.Handle, PChar(Cells[i,j]), -1, Rect ,DT_CENTER); 
      end; 
     end; 
    end; 
    end; 
end; 

のwonderfull! ! ストライク状態を保存する場合は、「x」を含む列も追加します。 それは私がフォームを作成するときしかし 私はこれらの行を打つためにform.createでそのコードを使用しようと、3欄に をstringrid値といくつかの「X」を読み込む正常に動作しますが、

:-(動作しません。プロパティ行以来
for J := 1 to stringGrid1.RowCount-1 do 
begin 
if stringGrid1.Cells[3,J]='x' then 
for I:=1 to 2 do 
    begin 
    StringGrid1.Canvas.Font.Style := Font.Style + [fsStrikeOut]; 
    StringGrid1.Canvas.Brush.Color := clBtnFace; // title 
    StringGrid1.Canvas.FillRect(Rect); 
    Rect.Top := Rect.Top + 4; 
    drawText(Canvas.Handle, PChar(StringGrid1.Cells[I, J]), -1, Rect, DT_CENTER); 
    StringGrid1.Invalidate; 
    end 
    else 
    begin 
    StringGrid1.Canvas.Font.Style := Font.Style - [fsStrikeOut]; 
    StringGrid1.Canvas.Brush.Color := clBtnFace; // title 
    StringGrid1.Canvas.FillRect(Rect); 
    Rect.Top := Rect.Top + 4; 
    drawText(Canvas.Handle, PChar(StringGrid1.Cells[I, J]), -1, Rect, DT_CENTER); 
    StringGrid1.Invalidate; 
    end; 
end; 

任意のアイデア???

+4

あなたの描画コードは大丈夫ですが、全体的なアイデアは機能しません。あなたが描いたストライクスルーテキストは消去され、セルはデフォルトスタイルで再描画されます。 OnDrawCellハンドラを記述し、すべてのセルを描画する必要があります。 –

+0

FCのコメントに加えて、OnMouseDownハンドラは単にデータの状態を更新し、再描画を呼び出して再描画をトリガーする必要があります。 OnDrawCellハンドラは、描画中のセルに対してストライクスルーを使用するかどうかを決定するために、この状態を調べる必要があります。 –

+0

あなたは* selection *に興味がありません。あなたはマウスがクリックされた場所に興味があります。 'StringGrid1.Selection.Top'を' StringGrid1.MouseCoord(X、Y).Y'に置き換えてください。それらのうちの2つがあります(もちろん、後者には「j」を使用できます)。 –

答えて

3

は(迅速かつ整数として汚れなど)を使用すると、最初の項目のオブジェクトに削除済みとしてマークされているに関する必要な情報を格納するかもしれないのTStrings型のものです。ペイントは、格納された情報を使用してOnDrawCellで行われます。

const 
    CRLF = #13#10; 


procedure TForm3.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); 
var 
    i: Integer; 
begin 
    With TStringGrid(Sender) do 
    begin 
    With Canvas Do 
    begin 
     if Integer(Rows[ARow].Objects[0]) = 1 then 
     Font.Style := Font.Style + [fsStrikeOut] 
     else 
     Font.Style := Font.Style - [fsStrikeOut]; 
     if ARow = 0 then 
     Brush.Color := clBtnFace // title 
     else 
     Brush.Color := clWhite; 
     FillRect(Rect); 
     Rect.Top := Rect.Top + 4; 
     DrawText(Canvas.Handle, PChar(Cells[ACol, ARow]), -1, Rect, DT_CENTER); 
    end; 
    end; 
end; 

procedure TForm3.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
const 
    C_Message: Array [0 .. 1] of String = ('Disable', 'Enable'); 
var 
    C, R: Integer; 
begin 
    StringGrid1.MouseToCell(X, Y, C, R); 
    if (Button = mbRight) and (C > -1) and (R > 0 { -1 }) then 
    begin // Allow Disable or Enable depending on the stored state 
    if (MessageDlg(C_Message[Integer(StringGrid1.Rows[R].Objects[0])] + ' row ' + IntToStr(R), mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes) then 
    begin 
     If Integer(StringGrid1.Rows[R].Objects[0]) = 0 then 
     StringGrid1.Rows[R].Objects[0] := TObject(1) 
     else 
     StringGrid1.Rows[R].Objects[0] := TObject(0); 
     StringGrid1.Invalidate; // force repainting 
    end; 
    end; 
end; 

procedure TForm3.FormCreate(Sender: TObject); 
var 
    R, C: Integer; 
begin // Demo content 
    With StringGrid1 do 
    begin 
    FixedCols := 0; 
    DefaultDrawing := false; 
    Rowcount := 6; 
    Colcount := 4; 
    DefaultColWidth := 100; 
    Rows[0].Text := 'COL 1' + CRLF + 'COL 2' + CRLF + 'COL 3' + CRLF + 'COL 4'; 
    for R := 1 to Rowcount - 1 do 
     for C := 0 to Colcount - 1 do 
     Cells[C, R] := Format('Content %d - %d', [C + 1, R]); 
    end; 
end; 
関連する問題