> 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));
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;
二重になるのは、TextOut と DrawText の両方使っているからでしょう。 DrawText
はいらないと思います。
また、StringGrid で右寄せする場合は、左端の座標を計算して指定しないとうまくいかないはずです。
DRect.Left := Rect.Right - TextWidth(FormatFloat('#,##0.0',mSURYO))) - 2;
という要領です。
FormatFloat の部分は一度変数に置き換えた方がわかりやすいかもしれません。
ところで、話は違いますが当方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;
うまくいったようで何よりです。
私は実は最近では 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>
今後とも宜しくお願い致します。