stringgridのデータ格納プロパティについて


やまだ  2013-09-25 04:46:32  No: 45334

こんにちは。

いつもお世話になっております。
開発環境は、win7(sp1)、delphiXE3 enterpriseです。

いまstringgridを使ってデータを表示しています。
画面上にstringgrid、画面中央にボタン、画面下にテキストボックスとコンボボックスを配置しています。

操作はstringgridで選択したデータをボタンクリックで、テキストボックスとコンボボックスにデータを表示します。

画面下は入力エリアになっています。

stringgridには以下のデータがセットされています。

with StringGrid1 do
begin
 Objects[2,Row]:=項目コード
 Cells[1,Row]:=分類名
 Cells[2,Row]:=項目名
end;

ボタンをクリックすると、以下のようにデータがセットされます。

テキストボックス←分類名をセット
コンボボックス←項目コードからコンボボックスの値を検索してitemindexをセット

コンボボックスには、項目名+項目コードで値がセットされています。

stringgridのObjectsプロパティを使っているためか理由は分からないのですが、「プロジェクトXXXは例外クラスEInvalidPointer(メッセージ '無効なポインタ操作')を送出しました。」というメッセージが出ます。

しかも1度目は出ず、2度目に必ず出ます。

Objectsプロパティが良くないのでしょうか?

stringgridでcells以外にデータを格納できるようなもの他に無いでしょうか?

spreadは列を非表示にできたので対応できたのですが、stringgridは列を非表示に出来ないみたいです。

列幅=0は、列サイズを変更できるようにするため難しいです。

よろしくお願いします。


igy  2013-09-25 06:40:56  No: 45335

>stringgridのObjectsプロパティを使っているためか理由は分からないのですが、「プロジェクトXXXは例外クラスEInvalidPointer(メッセージ '無効なポインタ操作')を送出しました。」というメッセージが出ます。

ソースコード上で例外が発生している箇所を特定してみるのは、いかがですか?

>Objectsプロパティが良くないのでしょうか?

正しく使用していれば、問題ない気がします。

>開発環境は、win7(sp1)、delphiXE3 enterpriseです。

もし、まだアップデートを適用してないようでしたら、

  Delphi XE3 Enterprise(Update未適用)

と書いたほうがよいかもしれませんね。


deldel  2013-09-25 17:55:35  No: 45336

もう一個TStringGridを追加して、これはVisibleをFalseにして、
項目コードを同じ行に追加するっていうのが簡単かな?


やまだ  2013-09-25 19:11:16  No: 45337

いろいろ試してみてるんですが、なかなか上手くいきません。

入力エリアのコンボボックスの値検索が良くないのかと、入力エリアにコンボボックスの代わりにテキストボックスを配置してみました。

編集ボタンをクリックで、stringgridからデータを読み取り入力エリアのテキストボックスにセットします。

with stringgrid1 do
begin
 edit1.text:=string(Objects[1,Row]);
 edit2.text:=string(Objects[3,Row]);
 edit3.text:=string(Objects[4,Row]);
end;

更新ボタンクリックで、入力エリアのテキストボックスからstringgridにデータをセットします。

with stringgrid1 do
 Objects[1,Row]:=TObject(edit1.text)
 Objects[3,Row]:=TObject(edit2.text);
 Objects[4,Row]:=TObject(edit3.text);
end;

編集→更新→編集のとき「edit2.text:=string(Objects[3,Row]);」でエラーが発生します。

Objectsプロパティは1行に1つしか格納できないのでしょうか?

よろしくお願いします。


tor  2013-09-25 21:09:49  No: 45338

最初の例にあった「項目コード」というのは単なる整数値でしょうか、それとも文字列なのでしょうか?ヲサ文字列だとしたら問題ありです。

マは基本的に、データのある場所を指し示す「ポインタ」でしかありません。
ポインタの指す先に本物のデータがちゃんとあることを保証する必要があります。
しかし、単に文字列をマに代入しただけだと、その後で元の文字列のメモリが解放されてしまう可能性があります。
そうなると、存在しないメモリを参照してエラーが発生します。
ィアゥヲサ自分でメモリを用意して、そこに文字列をコピーする
ィイゥヲサそのメモリをマに設定する
という手順を踏む必要があります。もちろん、必要がなくなったら(グリッドが破棄される場合などにも)メモリを開放する処理も必要です。

ちなみに割り当てるデータが整数値の場合、ポインタを単なる整数型とみなして
  ョマロャヲサンヲサコスヲサヤマィ数値ゥサ
  ョョョ
  数値ヲサスヲサノィョマロャヲサンゥサ
のようにキャストして使うというのはよく使われるテクニックです。
しかし、単なる数値以上のデータ型で同じやり方は真似できないので気を付けてください。
スススススススススススススススススススススススススススススススススススススススス
ニコ やまだ
トコ イーアウッーケッイオィ水ゥ アオコーケコイウ  書込者ノト:ロ 「。「 「「 ン
モコ 

おっしゃられている通り、項目コードは文字列です。

教えていただいたことを参考にして、もう一度調べなおして思い通りのプログラムが書けました。

動きも思っていた通りになりました。

ありがとうございました。
スススススススススススススススススススススススススススススススススススススススス
ニコ ヘョリメチル
トコ イーアウッーケッイオィ水ゥ アカコオエコイカ  書込者ノト:ロ ァ。 。 ン

こんなところが参考になれば,

ロマロンって何だろうン
コッッョョョッネッホッホーイウョ


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

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






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