TStringGridの固定セルを任意に配置するには?


グリ  2015-11-07 02:05:51  No: 47718

初めまして。
Delphi2007で、ストリンググリッドで入力画面を作る事になりました。
入力不可な項目を固定セルにし、入力可能項目を通常セルにする必要があります。
通常、固定セルは左からFixedCol分固定セルを設定するしかないのですが、任意のセルを固定セルにすることは可能なのでしょうか。
悩ましいのは、一番左がコンボボックスでの入力で、可能なら左から2〜4番目を固定セルにし、5〜6を入力セルにし、7番目(最右端)のセルを固定セルにしたいのですが・・・。
こういったグリッドは、そもそも実現可能なのか、可能だとしたらどうやったら実現できるかを質問させて下さい。


tor  2015-11-07 02:41:29  No: 47719

固定セルというのは「スクロールしてもその場にとどまって移動しないセル」のことですが
たとえば固定セルが真ん中にあって、その状態で左右にスクロールしたらいったいどんな動きをするの?ヲサと考えると激しく頭の痛い問題を生む気が……

求めているのは、固定セルじゃなくて単に「入力できないセル」なんじゃないでしょうか?
それだったら、セルを選択した時にその場所に応じてヲサマヲサからナを外したり戻したりすればいいんじゃないかと思います。
見た目も入力禁止っぽくしたい、というならカスタム描画すればいいですね。
これもこの掲示板で検索すれば例が出てくると思います。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアオッアアッーケィ月ゥ アアコウウコウイ  書込者ノト:ロ 」 ァ」ハノ

 ン

というわけで、おそらく求めているものとは違うと思いますが
純然たる興味から「真ん中の列が固定されているグリッド」を作ってみました。
真面目にやろうとしたらちらつかないように描画を最適化したり、マモッヌナヤとかの面倒もみたりしなくてはいけませんが
コンセプトの検証用ということでそこは割愛しています。
不思議な世界をお楽しみくださいコュゥ

ヲサヲサッッヲサスクロールしないよう固定する列番号を指定する
ヲサヲサニノリナト゜テマフモヲサスヲサロアョョウャヲサカンサ

ッッッヲサニノリナト゜テマフモヲサの列が固定されているとみなして、ずらした列番号を求める関数
ッッッヲサタヲサヲサ対象のヌ
ッッッヲサタロッンヲサ゜ヲサ列番号。計算後の列番号がここに入る
ッッッヲサタヲサ指定された列が固定列なら
ヲサ゜゜ィコヲサヤモヌサヲサヲサ゜コヲサノゥコヲサツサ

ヲサヲサコヲサノサ
ヲサヲサコヲサノサ

ヲサヲサヲサ゜ヲサヲサヲサョニテヲサ
ヲサヲサ
ヲサヲサヲサヲサメヲサコスヲササヲサッッヲサ本来の固定列はそのまま
ヲサヲサ
ヲサヲサ
ヲサヲサ
ヲサヲサヲサヲサヲサコスヲサョフテヲサュヲサョニテサヲサッッヲサいま何列分スクロールしているか
ヲサヲサヲサヲサメヲサコスヲサ゜ヲサュヲサヲサヲサニノリナト゜テマフモサヲサッッヲサ固定列に該当する場合は
ヲサヲサヲサヲサヲサメヲサ
ヲサヲサヲサヲサ
ヲサヲサヲサヲサヲサヲサッッヲサこの列は固定列
ヲサヲサヲサヲサヲサヲサトィ゜ャヲサゥサ
ヲサヲサヲサヲサ
ヲサヲサヲサヲサヲサヲサ゜ヲサヲサスヲサョフテヲサヲサヲサッッヲサスクロールして見えなくなっている列は計算しても意味がないので無視する(そもそもここまで来ないはず)
ヲサヲサヲサヲサ
ヲサヲサヲサヲサヲサヲサッッヲサ自分より左にあった固定列が、自分より右に移動したか調べる
ヲサヲサヲサヲサヲサヲサヲサコスヲサ゜ヲサュヲササ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサョニテヲサヲサヲサコスヲサョニテサ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサスヲサ゜ヲサ
ヲサヲサヲサヲサヲサヲサ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサニノリナト゜テマフモヲサ
ヲサヲサヲサヲサヲサヲサヲサヲサ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサッッヲサ固定列を飛ばして、その右の列番号を求める(固定列が連続しているケースに注意)
ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサニノリナト゜テマフモヲサ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサノィ゜ゥサ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサノィゥサ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲササ
ヲサヲサヲサヲサヲサヲサヲサヲサ
ヲサヲサヲサヲサヲサヲサヲサヲサ
ヲサヲサヲサヲサヲサヲサヲサヲサ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサノィゥサ
ヲサヲサヲサヲサヲサヲサヲサヲササ
ヲサヲサヲサヲサヲサヲササ
ヲサヲサヲサヲササ
ヲサヲササ

ヲサヤニアョヌアトティモコヲサヤマサヲサチテャヲサチメコヲサノサヲサメコヲサヤメサヲサモコヲサヤヌトモゥサ

ヲサヲサコヲサヤモヌサ
ヲサヲサコヲサヤテサ
ヲサヲサ゜コヲサノサ

ヲサヲサヲサコスヲサモヲサヲサヤモヌサ
ヲサヲサヲサコスヲサョテサ

ヲサヲサッッヲサこのセルに描画する列番号を求める
ヲサヲサ゜ヲサコスヲサチテサ
ヲサヲサヲサ゜゜ィャヲサ゜ゥヲサ
ヲサヲサヲサヲサノィモャヲサニゥサヲサッッヲサこの列は固定列

ヲサヲサッッヲサセルの背景を通常通り描画してョョョ
ヲサヲサョツョテヲサコスヲサョテサ
ヲサヲサョニョチィョニゥサ
ヲサヲサヲサニヲサヲサモヲサ
ヲサヲサ
ヲサヲサヲサヲサョツョテヲサコスヲサョニテサ
ヲサヲサ
ヲサヲサヲサヲサモヲサヲサモヲサ
ヲサヲサ
ヲサヲサヲサヲサョツョテヲサコスヲサネサ
ヲサヲサヲサヲサョニョテヲサコスヲサネヤサ
ヲサヲササ
ヲサヲサョニメィメゥサ
ヲサヲサッッヲサずらした列の文字列を描画する
ヲサヲサョヤマィメョフャヲサメョヤャヲサョテロ゜ャヲサチメンゥサ

ヲサヤニアョヌアヤフティモコヲサヤマゥサ

ヲサヲサッッヲサスクロールしたら、それに応じて新旧の「固定」列を再描画しなくてはならないが
ヲサヲサッッヲサそこまでやる元気がなかったので割愛。単純に全体を再描画する
ヲサヲサィモヲサヲサヤモヌゥョノサ

スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアオッアアッーケィ月ゥ アアコウオコイケ  書込者ノト:ロ 」 ァ」ハノ

 ン

さて、本来の要望であると思われる「特定の列を入力不可にする」方法はここの過去ログを参照してください。
コッッョョョッュットツツモッョソォイーーエーケッーエーケーーケイョ

また、
ヲサヲサ一番左がコンボボックスでの入力で
というところから「列によって入力方法を変えたい」という要求もあるようですが
これについてはヘョリメチルさんのサンプルが参考になると思います。

ーオオ゜ドロップダウンリストを実装したヲサヤモヌヲサコンポーネント
コッッョョョットッモッーオオ゜ヤトモヌョ
スススススススススススススススススススススススススススススススススススススススス
ニコ グリ
トコ イーアオッアアッーケィ月ゥ アエコオイコウク  書込者ノト:ロ 「・「   ン

さん、ご返信とサンプルプログラムまでご親切にありがとうございました。
入力できないセルにするのは分かるのですが、フォーカスの当たらない固定セルにすることができないか、悩み中なのです。やっぱり無理なんでしょうね。
ちなみに横スクロールはしません。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアオッアアッーケィ月ゥ アキコーーコアイ  書込者ノト:ロ 」 ァ」ハノ

 ン

うむ、整理すると「固定セル」のウ大特徴は
ィアゥヲサスクロールしない
ィイゥヲサ入力できない
ィウゥヲサ選択できない
なのですが、ィアゥの特性はいらなくてィイゥィウゥが欲しい。で、ィイゥは解決しているけどィウゥが分からないということですね?

ヲサヲサやっぱり無理なんでしょうね。
と諦めるのは早すぎというもの。
少なくとも、マモテイベントでテモスにして拒否してしまえば「フォーカスが当たらないようにする」ことは簡単にできます。
マウス操作しか考慮しないなら、これで十分ですね。

キー操作を考慮すると、これだけでは問題があります。「固定セル」の壁に阻まれて、向こう側に移動できません。
これについては、マヒトで矢印キーを処理して、移動しようとしている先が「固定セル」ならその先まで飛び越えるように動かしてやればいいかと。
スススススススススススススススススススススススススススススススススススススススス
ニコ グリ
トコ イーアオッアアッアウィ金ゥ アカコオクコーイ  書込者ノト:ロ 「・「   ン
モコ 

さん、ご返信とアドバイスありがとうございました。
何とか、納得の行くものが出来ました。入力はキーボードからのみの入力に対応するのが大変(フォーカスの制御等)でした。
そして、やはり入力不可であることを視覚的に見せるために、固定セルを立体的に描画することにしたので、一部コードを貼っておきます。

トテイベントで、次のような描画をしています。

ヲサヲサヤヲサコスヲサモヌアョテロチテャヲサチメンサ
ヲサヲサヲサモヌアヲサヲサ
ヲサヲサヲサヲサテョニメィメゥサ
ヲサヲサヲサヲサヲサィチメヲサヲサヲサーゥヲサヲサヌニィチテゥヲサヲサ
ヲサヲサヲサヲサヲサヲサッッヲサ固定列っぽく描画
ヲサヲサヲサヲサヲサヲサトナィテョネャヲサメャヲサツトメ゜メチノモナトノホホナメャヲサツニ゜メナテヤゥサ
ヲサヲサヲサヲササ
ヲサヲサヲサヲサメョヤヲサコスヲサメョヤヲサォヲサイサ
ヲサヲサヲサヲサメョフヲサコスヲサメョフヲサォヲサイサ
ヲサヲサヲサヲサッッヲサセルに文字列が入りきれない場合に固定列っぽく描画したのが崩れないように右側をュイにしておく
ヲサヲサヲサヲサメョメヲサコスヲサメョメヲサュヲサイサ
ヲサヲサヲサヲサトヤィテョネャヲサミティヤゥャヲサュアャヲサメャヲサニゥサ
ヲサヲササ

※ヌニ関数は固定列の定義リストを取得します。ヤが返ると固定列です
  ニは文字列のアライメントを設定しています


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

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






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