StringGrid のOnDrawCell内で特定の条件で線を引く

解決


Syake  2004-08-06 05:40:04  No: 10253

皆さん、こんばんわ  お世話になります。
少々頭が煮えています。

特定条件で
OnDrawCellのイベント内で特定条件で線を引こうとしました
---------------------------------------
var
   TxtPotion :Cardinal;
   intFontSize :Integer;
   BufRect :TRect;
begin
   // 表示時の反転色(青色)を表示させない処理
   with TStringGrid(Sender ).Canvas do
   begin
      if ( gdSelected in State ) then
      begin
         Brush.Color := TStringGrid( Sender ).Color;
         Font.Color := TStringGrid( Sender ).Font.Color;
      end;
      if (ARow > 0) and (ACol = 0) then
      begin
        FillRect( Rect );
      end;
   end;
   // 文字の表示位置
   if ARow = 0 then
   begin
     TxtPotion := DT_CENTER or DT_VCENTER Or DT_SINGLELINE; //センター
      intFontSize := 11;
   end else begin
      if ACol in [0..4] then
      begin
     if ACol in [0,3,4] then
        begin
           TxtPotion := DT_RIGHT or DT_VCENTER Or DT_SINGLELINE; //右寄せ
           intFontSize := 11;
        end else if ACol = 1 then
        begin
           intFontSize := 10;
           TxtPotion := DT_CENTER Or DT_EDITCONTROL; //2行に表示
           if TStringGrid(Sender).Cells[51,ARow] = '1' then
           begin
              // 線を引きます
              TStringGrid(Sender).Canvas.Pen.Color := clBlack;
              TStringGrid(Sender).Canvas.MoveTo(Rect.Left,Rect.Bottom div 2);
              TStringGrid(Sender).Canvas.LineTo(Rect.Right,Rect.Bottom div 2);
           end;
        end else
        begin
           TxtPotion := DT_LEFT or DT_VCENTER Or DT_SINGLELINE;
           intFontSize := 11;
        end;
      end;
   end;
   TStringGrid(Sender ).Canvas.FillRect(Rect);
   Rect.Top := Rect.Top + 2;
   TStringGrid(Sender).Canvas.Font.Size := intFontSize;
   DrawText(TStringGrid(Sender ).Canvas.Handle,PChar(TStringGrid(Sender ).Cells[ACol,ARow]),
           Length(TStringGrid(Sender ).Cells[ACol,Arow]),Rect,TxtPotion);
end;
------------------------------------------------------------
ところが、条件に合った行のCell内に線を引かず、全然違う行のCellに線を
引いてしまいます。
何が悪いのかわかりません。
何方か、ご教授頂ければ幸いです。


Basser  2004-08-06 18:47:11  No: 10254

>TStringGrid(Sender).Canvas.MoveTo(Rect.Left,Rect.Bottom div 2);
>TStringGrid(Sender).Canvas.LineTo(Rect.Right,Rect.Bottom div 2);

Y座標の計算がおかしいのでは?


HOta  2004-08-06 19:09:30  No: 10255

線を引いた後で
TStringGrid(Sender ).Canvas.FillRect(Rect);
塗りつぶしているように見えます。


Syake  2004-08-06 19:24:52  No: 10256

こんにちわ  
Basserさん、HOtaさんありがとうございます。
言葉が足りなかったようです。m(__)m

StringGridで特定条件Cells[51,ARow]の値が'1'だったらCells[1,ARow]
のCell内に真ん中に横線を引こうと考えました。

結果を正しく見るために、Pen.Color := clRedに変えました。
ちなみに、RowCount:=4で全てのCells[51,ARow]の値を'1'にすると
1行目はCellの枠の上の線とCell内の真ん中に横線
2行目はCellの枠の上の線とCell内の真ん中に横線
の四本が引かれているようです。
上記の条件なら各Cellの真ん中に横線が表示されることを
期待したのですが・・・
//-------------------------------------------------------//
if ARow <> 0 then
begin
  if ACol = 1 then
   begin
     if TStringGrid(Sender).Cells[51,ARow] = '1' then
      begin
        BufRect := TStringGrid(Sender).CellRect(ACol,ARow);
         TStringGrid(Sender).Canvas.Pen.Color := clRed;
         TStringGrid(Sender).Canvas.MoveTo(BufRect.Left ,(BufRect.Bottom div 2));
         TStringGrid(Sender).Canvas.LineTo(BufRect.Right,(BufRect.Bottom div 2));
      end;
   end;
end;
//-------------------------------------------------------//
HOtaさんの言われたように、DrawTextの後に上記処理を移動しました。
が、結果的には同じになってしまいました。


Syake  2004-08-06 19:34:36  No: 10257

すいません。文章が違ってました。
>ちなみに、RowCount:=4で全てのCells[51,ARow]の値を'1'にすると
FixedRows := 1  RowCount:=5です。
>1行目はCellの枠の上の線とCell内の真ん中に横線
>2行目はCellの枠の上の線とCell内の真ん中に横線
>の四本が引かれているようです。
の4本だけ引かれます。


土壷  2004-08-06 19:35:46  No: 10258

こういうのが ドツボにハマった状態なんですかね...(^^ゞ
Canvas.MoveTo(Rect.Left, Rect.Top+(Rect.Bottom-Rect.Top) div 2);
Canvas.LineTo(Rect.Right,Rect.Top+(Rect.Bottom-Rect.Top) div 2);


Syake  2004-08-06 21:49:12  No: 10259

土壷さん  こんにちわ
そういうことだったんですね。

>こういうのが ドツボにハマった状態なんですかね...(^^
いや〜何て言うか・・・でした。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加