現在選択されている StringGrid のセル Low、Col を知るには

解決


mathA  2009-11-25 06:01:29  No: 36257

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;


risa  2009-11-25 06:39:14  No: 36258

余計なお世話かもしれませんが、各ボタンの「tag」プロパティに0から9まで
の数字を割り振っておけば、この程度で書けます。
(もちろん、10個のボタンにはイベントとして割り当てておく必要がありますが。)

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  FNumStr := IntToStr(TSpeedButton(Sender).Tag) + FNumStr;
  StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row] := FNumStr;
end;


delphi大好き  2009-11-25 08:48:16  No: 36259

簡単な試しですが、以下でどうでしょうか??

以前,ストレンジグリッドを使ったソフトを作った時、ストレンジグリッドで最初は自分も何ヶ月か悩みました^^;
環境は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;


KHE00221  2009-11-25 09:08:26  No: 36260

StringGrid1.Selection かな


mathA  2009-11-25 15:49:54  No: 36261

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 プロパティは,現在選択されている領域の境界を指定します」
とありますので文字列自体の位置はわからないのではないでしょうか。


mathA  2009-11-25 16:43:30  No: 36262

> StringGrid1.Selection かな
  すみません。最初の質問の答えにはなっていますよね。ただこのプロパティからはその名前からし
てもっといろいろな情報が得られると思っていました(笑)。


tor  2009-11-25 19:33:15  No: 36263

> たとえば '123' と入力して後 '1203' とするには StringGrid1.Cells[Col, Row] の文字列のカーソル位置を知る必要がありますが、これなんかどうするのでしょう。
> またセルの文字列が選択されているかどうかも知りたいのですが。
StringGrid内部のエディタはInplaceEditorというプロパティで取り出せるので
それのSelStartやSelLengthを使えばいいですね。

InplaceEditorはprotectedなのでそのままではアクセスできませんが
使えるようにするTipsをどこかで見たな……と思って検索したらここの過去ログにあったり。
「StringGridで選択位置に文字を挿入するには?」
https://www.petitmonte.com/bbs/answers?question_id=3281


mathA  2009-11-26 01:37:34  No: 36264

torさんありがとうございます。
  無事解決できました。それにしてもわざわざ継承してコンポを作ることなく protected 部
にアクセスができる方法があるんですねえ!  初めて知りました。


ぽむぽむ  2009-11-26 22:58:09  No: 36265

解決しているけど
TStringGrid=class(Grids.TStringGrid);
この宣言に代えておけば、キャストしなくても・・・。


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

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






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