FireMonkeyのTStringGridの入力でListViewやダイアログを表示させたい

解決


Moe  2023-11-12 02:50:19  No: 151264  IP: 192.*.*.*

Delphi11.3のFireMonkey(FMX)でマルチデバイス向けアプリケーションを開発しています。
TStringGridを使用し、PopupColumn列を追加したしたのですが、選択肢が多い場合に探すのが非常に大変になります。
そこで、通常のポップアップを表示せずに、代替手段としてListViewやダイアログなどを準備しておき、そちらを表示する良い方法はございませんでしょうか?
※理想としては、ポップアップを表示するための上下の三角形をクリックすると、代替手段で準備したListViewやダイアログが表示される

因みに現在は、
FMXのTStringGridのTPopupColumnのイベントにはOnClickがありますのが、こちらのイベントで何とか出来ないのかなぁと思うところではございますが、publishedではないためかオブジェクトインスペクタには表示されません。
この様な場合のコードの記述も方法も分かっておらず、現在はTStringGridのOnCellClickで次の様に記述しています。
procedure TForm1.GridListCellClick(const Column: TColumn;
  const Row: Integer);
begin
  if Column.Name = 'ColumnUser' then
    DialogSearchUser.Show;
end;
上記のコードではセル選択時にダイアログが表示はされますが、上下の三角形をクリックした時ではないので、もっと良い方法がございましたら是非アドバイス頂けませんでしょうか。

編集 削除
AAAAA  2023-11-12 06:16:48  No: 151265  IP: 192.*.*.*

こんな感じ?
procedure TForm6.StringGrid1CellClick(const Column: TColumn; const Row: Integer);
var
    X,Y,X1,Y1: Single;
    C: TColumn;
    ACOL,AROW: Integer;
    ARECT: TRECT;
    PopupColumn: TPopupColumn;
begin
    if Column is TPopupColumn then
    begin
      PopupColumn := TPopupColumn(Column);
      X := Screen.MousePos.X - Form6.Left - StringGrid1.Position.X;
      Y := Screen.MousePos.Y - Form6.Top  - StringGrid1.Position.Y - 10;
      X1 := Form6.Left + StringGrid1.Position.X +   3;
      Y1 := Form6.Top  + StringGrid1.Position.Y +  33;
      StringGrid1.CellByPoint(X,Y,ACOL,AROW);
      ARECT := StringGrid1.CellRect(ACOL,AROW);

      Form7 := TForm7.Create(Self);
      Form7.Left := Trunc(X1+ARECT.Left);
      Form7.Top  := Trunc(Y1+ARECT.Top );
      Form7.ListBox1.Items.Assign(PopupColumn.Items);
      if Form7.ShowModal = mrOK then
      begin

      end;
      Form7.Free;
    end;
end;

編集 削除
Moe  2023-11-12 12:55:44  No: 151268  IP: 192.*.*.*

AAAAAさん
アドバイス有難うございます。早速コードを記述してみましたところ、どうしてか、X := Screen.MousePos.X - Form6.Left - StringGrid1.Position.X;
のところでACCESS VIOLATIONが発生してしまいます。わたくしの環境だけでなんでしょうかねぇ。。。細かくみて行きますと、Form6.Leftで落ちてしまい益々謎に陥っています。
もしかして、ScaledLayoutを使用しているのが良くないのでしょうか?

編集 削除
Moe  2023-11-12 14:03:53  No: 151269  IP: 192.*.*.*

さらに、不思議なのは、
TStringGridのOnCellClickでForm6.Leftを取得しようとするとACCESS VIOLATIONが発生してしまうのですが、
TStringGridのOnSelectCellでForm6.Leftを取得は正常に行く点です。
この違いが分からず悩んでいます。やはり作りが悪いのでしょうかねぇ。。。

編集 削除
AAAAA  2023-11-12 21:02:09  No: 151270  IP: 192.*.*.*

uses
    Unit2;  //Form2 に ListBox を置く

var
  SAVE_COL,SAVE_ROW: Integer;

procedure TForm1.FormCreate(Sender: TObject);
begin
    PopupColumn1.Items.Add('AAAAA');
    PopupColumn1.Items.Add('BBBBB');
    PopupColumn1.Items.Add('CCCCC');
    PopupColumn1.Items.Add('DDDDD');
    PopupColumn1.Items.Add('EEEEE');

    PopupColumn1.ReadOnly := True;
end;

procedure TForm1.StringGrid1CellClick(const Column: TColumn; const Row: Integer);
var
    PopupColumn: TPopupColumn;
    ARECT: TRECT;
    X1,Y1: Single;
begin
    if Column is TPopupColumn then
    begin
      PopupColumn := TPopupColumn(Column);
      X1 := Left + StringGrid1.Position.X +   3;
      Y1 := Top  + StringGrid1.Position.Y +  33;
      ARECT := StringGrid1.CellRect(SAVE_COL,SAVE_ROW);

      Form2 := TForm2.Create(Self);
      Form2.Left := Trunc(X1+ARECT.Left);
      Form2.Top  := Trunc(Y1+ARECT.Top );
      Form2.ListBox1.Items.Assign(PopupColumn1.Items); //PopupColumn の ITEM を ListBox にコピー
      if Form2.ShowModal = mrOK then
      begin
      end;
      Form2.Free;
    end;

end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; const ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
    SAVE_COL := ACOL;
    SAVE_ROW := AROW;
end;

編集 削除
Moe  2023-11-12 23:33:21  No: 151271  IP: 192.*.*.*

AAAAAさん
早朝から返信頂きまして本当に有難うございます。
ご提示頂いたコードで、ほぼ思い通りの事が出来るようになりました。
PopupColumn1.ReadOnly := True;とする事がポイントの1つなんですね。。。凄いです。
お蔭様で朝からテンション高くDelphiに向き合えます。

編集 削除