[Delphi:90584] TStringGridの書式設定について?

1,810 views
Skip to first unread message

hiro

unread,
Jul 24, 2008, 7:35:36 AM7/24/08
to Del...@ml.users.gr.jp
hiroです お世話様です
TStringGridを使って入力Formを作成しようかと考えております
TDBGridなどはTFloatFieldのDispLayFormatで「#,##0」に設定すると
3桁カンマ入りの数値表示をしてくれますがTStringGridの場合
OnDrawCellなどで下記の様に設定しても、ちらついたり点滅したりして、してうまく表示できません
 
if ACol = 6 then//'単価'
   begin
    sTanka:=StringGrid1.Cells[6,ARow];
     StringGrid1.Cells[6,ARow]:=FormatFloat('#,##0.0', StrToFloat(sTanka));
   end;

TStringGridでFormatFloatなどの書式を使うよう方法がないでしょうか?
宜しくお願い致します
 
 

天野 潔

unread,
Jul 24, 2008, 8:16:29 AM7/24/08
to Del...@ml.users.gr.jp
天野です。

> if ACol = 6 then//'単価'
> begin
> sTanka:=StringGrid1.Cells[6,ARow];
> StringGrid1.Cells[6,ARow]:=FormatFloat('#,##0.0', StrToFloat(sTanka));
> end;

OnDrawCell イベントの中で Cells を書き換えるとまた再描画するので無限ループになります。
Cells を書き換えないで、次のように Canvas 上にテキストを描画してください。

//デフォルト色で塗りつぶして元のテキストを消す。
StringGrid1.Canvas.FillRect(Rect);
//新しいテキストを描画する。
StringGrid1.Canvas.TextOut(Rect.Left, Rect.Top + 2, FormatFloat('#,##0.0',
StrToFloat(sTanka));


hiro

unread,
Jul 25, 2008, 9:21:05 PM7/25/08
to Del...@ml.users.gr.jp
天野さん hiroです お世話様です
試行錯誤の末
下記の様に修正してみました
ちらつき、点滅はなくなったようですが、StringGrid1.Cells[4,Arow]には二重に描画されてしまい
右寄せにもならなくなりました
どのあたりが悪いのでしょうか?

procedure TInNewMitu.StringGrid1DrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);

function IfStrNumeric( S: string): boolean;
//整数かどうかの判定
var
i, d: integer;
begin
Val(S , i, d);
Result:= (d = 0);
end;

var
DRect :TRect;
Mode :Integer;
sTanka:string;
mSURYO:Double;
fTanka:String;//小数点のあるものは除いて整数かどうかの判定に使う
begin
//デフォルト色で塗りつぶして元のテキストを消す。
StringGrid1.Canvas.FillRect(Rect);

DRect.Top := Rect.Top + 2;
DRect.Left := Rect.Left + 2;
DRect.Right := Rect.Right - 2;
DRect.Bottom:= Rect.Bottom - 2;

if ACol = 0 then Mode := DT_RIGHT ;
if ACol = 1 then Mode := DT_RIGHT ;
if ACol = 2 then Mode := DT_RIGHT ;
if ACol = 3 then Mode := DT_LEFT ;
if ACol = 5 then Mode := DT_LEFT ;
if ACol = 8 then Mode := DT_LEFT ;

if ACol = 4 then//'単価'
begin
sTanka:=StringGrid1.Cells[4,ARow];

//fTanka=小数点のあるものは除いて整数かどうかの判定に使う
fTanka:=sTanka;
while Pos('.', fTanka) > 0 do
Delete(fTanka,Pos('.', fTanka),1);

if IfStrNumeric(fTanka) then// 数値だったら(判定)
begin
mSURYO:=StrToFloat(sTanka);
StringGrid1.Canvas.TextOut (DRect.Left, DRect.Top,
FormatFloat('#,##0.0',mSURYO));
end;
Mode := DT_RIGHT;
end;


DrawText(StringGrid1.Canvas.Handle, PChar(StringGrid1.Cells[ACol,ARow]),
Length(StringGrid1.Cells[ACol,ARow]), DRect, Mode);

end;

天野 潔

unread,
Jul 25, 2008, 10:56:27 PM7/25/08
to Del...@ml.users.gr.jp
hiroさん、こんにちは。天野です。

二重になるのは、TextOut と DrawText の両方使っているからでしょう。 DrawText
はいらないと思います。
また、StringGrid で右寄せする場合は、左端の座標を計算して指定しないとうまくいかないはずです。

DRect.Left := Rect.Right - TextWidth(FormatFloat('#,##0.0',mSURYO))) - 2;

という要領です。
FormatFloat の部分は一度変数に置き換えた方がわかりやすいかもしれません。

hiro

unread,
Jul 26, 2008, 12:34:33 AM7/26/08
to Del...@ml.users.gr.jp
天野さん hiroです
大変ありがとうございました
お蔭様で下記要領でStringGridを利用した入力フォームが出来そうです (*^_^*)

ところで、話は違いますが当方Delphi7(Ent),Delphi2007(Ent)も購入しましたがDelphi6(Pro)を常用しております
天野さんの常用Delphiは何でしょうか? 参考のためにお聞かせ戴ければ幸いです


procedure TInNewMitu.StringGrid1DrawCell(Sender: TObject; ACol, ARow:
Integer; Rect: TRect; State: TGridDrawState);
function IfStrNumeric( S: string): boolean;
//整数かどうかの判定
var
i, d: integer;
begin
Val(S , i, d);
Result:= (d = 0);
end;

var
DRect :TRect;
Mode :Integer;
sTanka:string;
mSURYO:Double;
fTanka:String;//小数点のあるものは除いて整数かどうかの判定に使う
begin

if ACol = 0 then begin
sTanka:=StringGrid1.Cells[0,ARow];
StringGrid1.Canvas.FillRect(Rect);
DRect.Left := Rect.Right - StringGrid1.Canvas.TextWidth(sTanka) - 2;
StringGrid1.Canvas.TextOut (DRect.Left, DRect.Top, sTanka);
end;

if ACol = 4 then//'単価'
begin
sTanka:=StringGrid1.Cells[4,ARow];
//fTanka=小数点のあるものは除いて整数かどうかの判定に使う
fTanka:=sTanka;
while Pos('.', fTanka) > 0 do
Delete(fTanka,Pos('.', fTanka),1);

if IfStrNumeric(fTanka) then//判定
begin
//デフォルト色で塗りつぶして元のテキストを消す。
StringGrid1.Canvas.FillRect(Rect);
mSURYO:=StrToFloat(sTanka);
sTanka:=FormatFloat('#,##0.0',mSURYO);//String型再利用
DRect.Left := Rect.Right - StringGrid1.Canvas.TextWidth(sTanka) - 2;
StringGrid1.Canvas.TextOut (DRect.Left, DRect.Top, sTanka);
end;
end;

end;


天野 潔

unread,
Jul 26, 2008, 6:45:28 AM7/26/08
to Del...@ml.users.gr.jp
hiroさん、こんにちは。天野です。

うまくいったようで何よりです。

私は実は最近では Delphi より C++Builder の方が多いのです。

使っているのは、Delphi 7、 C++Builder 6.0 ですが、開発機を Vista に切り替えたこともありこれからはDelphi 2007、C++Builder 2007 に切り替えて行かないといけないと思ってい
ます。
他でも話題になっているとおり、Delphi 7、 C++Builder 6.0 は Vista には正式対応していないので色々と具合が悪いのではないかと思っています。

ただしこれは全く個人的な感想で具体的にこれこれが悪いと挙げられる訳ではありません。

----- Original Message -----
From: "hiro" <1...@saishin.jp>
To: <Del...@ml.users.gr.jp>

hiro

unread,
Jul 27, 2008, 11:37:22 AM7/27/08
to Del...@ml.users.gr.jp
天野さんこんばんは hiroです いろいろと、ありがとうございましいた。
私は、Firebirdを中心としたにデータベースの開発を手伝ってます。
Delphiはバージョンアップの度に購入してますが、Delphi6のエディタが使い易くて(特に矩形選択など)なかなか抜け出せないでいます。今のところ私にとってはDelphiの生産性以上の物が見当たりません。
Linuxでの開発もたまに入るのでJAVAもいじってみましたがLazarusの存在を知ってからは結局LinuxもDelphiで
(日本語に弱いですが)やってるようなものです。

今後とも宜しくお願い致します。


Reply all
Reply to author
Forward
0 new messages