SpeedButton(10個用意し、各々0〜9を割り当てる)をクリックして数値データを現在選択されている StringGrid のセルに入力したいのですが、選択されているセルの Low、Col を知るにはどうしたらいいのでしょうか?
procedure TForm1.sb0Click(Sender: TObject);
begin
if (Sender as TSpeedButton) = sb0 then FNumStr := FNumStr+'0'
else if (Sender as TSpeedButton) = sb1 then FNumStr := FNumStr+'1'
else if (Sender as TSpeedButton) = sb2 then FNumStr := FNumStr+'2'
else if (Sender as TSpeedButton) = sb3 then FNumStr := FNumStr+'3'
else if (Sender as TSpeedButton) = sb4 then FNumStr := FNumStr+'4'
else if (Sender as TSpeedButton) = sb5 then FNumStr := FNumStr+'5'
else if (Sender as TSpeedButton) = sb6 then FNumStr := FNumStr+'6'
else if (Sender as TSpeedButton) = sb7 then FNumStr := FNumStr+'7'
else if (Sender as TSpeedButton) = sb8 then FNumStr := FNumStr+'8'
else if (Sender as TSpeedButton) = sb9 then FNumStr := FNumStr+'9';
StringGrid.Cells[j,i] := FNumStr; //j,iを知りたい
end;
余計なお世話かもしれませんが、各ボタンの「tag」プロパティに0から9まで
の数字を割り振っておけば、この程度で書けます。
(もちろん、10個のボタンにはイベントとして割り当てておく必要がありますが。)
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
FNumStr := IntToStr(TSpeedButton(Sender).Tag) + FNumStr;
StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row] := FNumStr;
end;
簡単な試しですが、以下でどうでしょうか??
以前,ストレンジグリッドを使ったソフトを作った時、ストレンジグリッドで最初は自分も何ヶ月か悩みました^^;
環境はturbo Delphi2006(無償版)です。
ストレンジグリッドのSelectCellで、現在のセルの位置を取得できます。
var
Form1: TForm1;
row1,col1:integer;
implementation
{$R *.dfm}
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if sender = SpeedButton1 then
StringGrid1.Cells[col1,row1] := '1';
if sender = SpeedButton2 then
StringGrid1.Cells[col1,row1] := '2';
if sender = SpeedButton3 then
StringGrid1.Cells[col1,row1] := '3';
if sender = SpeedButton4 then
StringGrid1.Cells[col1,row1] := '4';
if sender = SpeedButton5 then
StringGrid1.Cells[col1,row1] := '5';
if sender = SpeedButton6 then
StringGrid1.Cells[col1,row1] := '6';
if sender = SpeedButton7 then
StringGrid1.Cells[col1,row1] := '7';
if sender = SpeedButton8 then
StringGrid1.Cells[col1,row1] := '8';
if sender = SpeedButton9 then
StringGrid1.Cells[col1,row1] := '9';
end;
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
begin
col1 := ACol; row1 := ARow;
StringGrid1.Selection かな
function CheckDecNum(const S: String):Boolean;
var
i: Integer;
begin
Result := True;
for i := 1 to Length(S) do
begin
if ( not (S[i] in ['0'..'9','-']) ) //キー入力で必要
or ( (S[i] = '-') and (i > 1) ) then
begin
Result := False;
break
end;
end;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
i: Integer;
NumStr: string;
begin
i := TSpeedButton(Sender).Tag;
NumStr := StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row];
if i = 10 then
NumStr := '-'+NumStr
else
NumStr := NumStr + IntToStr(i);
if CheckDecNum(NumStr) then
StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row] := NumStr;
end;
risa さんのコードを参考にしました。こういう場合は SelectCell を使うまでもないようですね。ただ実用的なものを作るとなると意外と難しい。
たとえば '123' と入力して後 '1203' とするには StringGrid1.Cells[Col, Row] の文字列のカーソル位置を知る必要がありますが、これなんかどうするのでしょう。またセルの文字列が選択されているかどうかも知りたいのですが。
> StringGrid1.Selection かな
私もそう思ったのですがヘルプを読むと
「Selection プロパティは,現在選択されている領域の境界を指定します」
とありますので文字列自体の位置はわからないのではないでしょうか。
> StringGrid1.Selection かな
すみません。最初の質問の答えにはなっていますよね。ただこのプロパティからはその名前からし
てもっといろいろな情報が得られると思っていました(笑)。
> たとえば '123' と入力して後 '1203' とするには StringGrid1.Cells[Col, Row] の文字列のカーソル位置を知る必要がありますが、これなんかどうするのでしょう。
> またセルの文字列が選択されているかどうかも知りたいのですが。
StringGrid内部のエディタはInplaceEditorというプロパティで取り出せるので
それのSelStartやSelLengthを使えばいいですね。
InplaceEditorはprotectedなのでそのままではアクセスできませんが
使えるようにするTipsをどこかで見たな……と思って検索したらここの過去ログにあったり。
「StringGridで選択位置に文字を挿入するには?」
https://www.petitmonte.com/bbs/answers?question_id=3281
torさんありがとうございます。
無事解決できました。それにしてもわざわざ継承してコンポを作ることなく protected 部
にアクセスができる方法があるんですねえ! 初めて知りました。
解決しているけど
TStringGrid=class(Grids.TStringGrid);
この宣言に代えておけば、キャストしなくても・・・。
ツイート | ![]() |