STRINNGGRIDの固定列のみフォントを指定するには

解決


黒猫  2008-04-15 08:26:39  No: 30506

度々すみません。STRINGGRIDについてよろしくお願いします。

タイトルのとおり、第1列を固定列にしているのですが、この列のみそれ以外のセルとフォントサイズを変えたいのです。
過去の書き込み、検索等調べたのですが分かりません。
よろしくお願いいたします。


moru  2008-04-15 16:06:16  No: 30507

if (StringGrid1.Col <= StringGrid1.FixedCols) then
    with StringGrid1 do begin
     Canvas.Font.Name := 'MS ゴシック';  // ←ここ追加
     Canvas.FillRect(Rect);
     S := Cells[ACol,ARow];
     DrawText(Canvas.Handle, Pchar(S), Length(S), Rect, DT_SingleLine or DT_VCenter or DT_Center);
    end;

あとは"固定列"の条件をつけてOKだと思います。

http://www.geocities.co.jp/SiliconValley-SanJose/2560/delphi4/graphics/TFont.htm


まちだ  2008-04-16 01:25:44  No: 30508

ん〜、前の書き込みから考えるに何か誤解しているような気がします。
(していなかったらごめんなさい。)

今回の場合、StringGridの標準描画をoff(DefaultDrawing=False)にして、
OnDrawCellに自前の描画ルーチンを書いてあげることで実現可能だと思います。

標準描画された後に文字を表示しているから2重に表示される。
FillRectで文字が表示された後に、ベタで塗りつぶしをしているから、
1つ目の文字が消去され、2回目の文字描画だけが残り
文字が1つになったように見える。

要するに、標準描画機能が邪魔なわけです。

DefaultDrawingをFalseにして
OnDrawCellイベントに、以下のプログラムを追加してみてください。
他の属性は考えてみてくださいね。

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  with StringGrid1.Canvas do begin
    // 条件による各種設定
    if gdFixed in State then begin
      // ========== 固定行設定
      Brush.Color :=  StringGrid1.FixedColor;
      // ========== 文字設定
      Font        := StringGrid1.Font;
      Font.Name   :=  'MS ゴシック';
    end else if (gdSelected in State) and Not(gdFocused in State) then begin
      // ========== 選択状態でフォーカスがない場合の設定
      Brush.Color :=  clHighLight;
      // ========== 文字設定
      Font        := StringGrid1.Font;
      Font.Color  :=  clWindow;
    end else begin
      // ========== 通常状態・フォーカス状態の色
      Brush.Color :=  StringGrid1.Color;
      // ========== 文字設定
      Font        := StringGrid1.Font;
    end;
    // ========== 下地描画
    FillRect(Rect);
    // ========== 文字描画
    InflateRect(Rect, -2, -2);
    DrawText(Handle, PChar(StringGrid1.Cells[ACol, ARow]), -1, Rect,
        DT_VCENTER or DT_CENTER or DT_SINGLELINE);
    InflateRect(Rect, 2, 2);
    // ========== 固定行影描画
    if (gdFixed in State) and StringGrid1.Ctl3D then begin
      Pen.Color := clBtnHighlight;
      Polyline([Point(Rect.Left, Rect.Bottom - 1), Rect.TopLeft,
                     Point(Rect.Right, Rect.Top)]);
    end;
    // ========== フォーカス枠描画
    if gdFocused in State then
      DrawFocusRect(Rect);
  end;
end;


黒猫  2008-04-17 02:34:45  No: 30509

まちだ様、moru様、早速のご教示ありがとうございます。
おかげで解決しました。
おっしゃるようにまったく誤解というか、判っていないというか、でした。
私はVB6からDELPHIに転向を試みている最中です。VB6はヘルプもサンプルコードが親切で、それなりのことが、それなりに出来てきたのですがDELPHIは、やはり構造をしっかり理解しないとなかなか進まないなーと実感しています。それでも、納期は待ってくれませんので、参考書を傍らに悪戦苦闘しています。
こんなことまでいちいち書き込むなよ!と言う声が聞こえそうですが、とにかくこのサイトが頼りです。
今後もどうぞよろしくお願いします。


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

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






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