StringGridのObjectプロパティ


やまだ  2013-10-22 20:57:30  No: 45449

こんにちは。
いつもお世話になっております。

開発環境は、win7(sp1)、delphiXE3enterprise(update適用なし)です。

随分前に同じような質問をしたんですが、また同じようなエラーで困っています。

画面は2つあります。

stringgridを貼ったリスト画面と、テキストボックス等を貼った入力画面です。

stringgridの列0(Objects[0,Row])にコードを格納しています。
リスト画面で抽出ボタンを押したときと、入力画面でOKボタン押したときです。

リスト画面には「新規作成」と「開く」メニューボタンがあります。

stringgridは行選択で、selectcellイベントでメニューボタンの「新規作成」「開く」の使用可否を列0のコードの有無で決めています。

抽出ボタンを押したとき、「新規作成」と「開く」の使用可否を決めるコードは動いています。

リスト画面の抽出ボタンを押したときと、入力画面でOKボタンを押したときはエラーは発生しません。

ただ、入力画面でOKボタンを押した後入力画面は閉じるのですが、その後で抽出ボタンを押したとき「モジュール'ABC.exe'のアドレス007357B6でアドレス00000000に対する読み取り違反が起きました。」と出ます。

ちなみにコードは以下の通りです。

リスト画面で抽出ボタンを押したときと、入力画面でOKボタン押したときのコード

function fPString(s:string);
begin
  New(result);
  result^:=s;
end;

with StringGrid1 do
begin
  Objects[0,intRow]:=TObject(fPString(strData));
end;

「新規作成」「開く」の使用可否を決めるコード

ToolButton1.enabled:=length(PString(Objects[0,Row])^)=0;
ToolButton2.enabled:=not ToolButton1.enabled;

入力画面からobjectプロパティに書き込む前に以下のようにfreeしたんですが、そのfreeのところで上記と同じようなエラーメッセージが出ました。

      for t := 0 to ColCount-1 do
      begin
        Objects[t,intRow].Free;
      end;

正直どうなっているのか分かりません。

どうにかエラーを解除できないものでしょうか?

よろしくお願いします。


やまだ  2013-10-22 21:17:57  No: 45450

追加します。

入力画面からリスト画面のstringgridに書き込んだ後、repaintとかrefreshを書いてみたんですが改善しませんでした。


tor  2013-10-22 22:49:23  No: 45451

ヲサヲサホィゥサ
ヲサヲサマロャメンョニサ

メモリを確保する方法と解放する方法は対になっているので、違うものを混ぜてはいけません。
たとえばヤマョテしたものはヤマョニ、ヌヘしたものはニヘ。ホしたものはトです。

なお、トする時にはちゃんと元の型に合わせたポインタを渡さないと正しく解放できないので注意してください。
……ってそもそもミモの返す型が何なのかわかりませんが、仮にミモだということにして
  ヲサコヲサミモサ
  ョョョ
  ヲサコスヲサミモィマロャヲサノメンゥサ
  トィゥサ
という感じですね。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアウッアーッイイィ火ゥ アエコーイコーオ  書込者ノト:ロ 」 ァ」ハノ

 ン

補足ですが、そのホィゥのくだりも怪しい気がします。
本当に文字列の中身の分までちゃんとメモリを確保できているのでしょうか?
単に文字列を指すポインタをコピーしているだけに見えるのですが。

定跡的なやり方は
アョヲサ文字列の長さを調べて、そのサイズ分の領域をヌヘで確保する
イョヲサ確保したメモリの中に、文字列の中身をコピーする
です。
面倒くさければ、あらかじめ必要十分な固定サイズの領域を持った型を定義して使うとか
モをメンバ変数として持つクラスを定義して、そのままマとして使うといった方法もありますが……
スススススススススススススススススススススススススススススススススススススススス
ニコ やまだ
トコ イーアウッアーッイイィ火ゥ アオコーエコウイ  書込者ノト:ロ 「。「 「「 ン

いろいろありがとうございます。

入力画面からプロパティ書き込む前にトしましたが、やはり入力画面を閉じてリスト画面の抽出ボタンをクリックすれば先ほど書いたメッセージがでてしまいます。

入力画面を出す前は、何回抽出ボタンを押してもエラーは出ません。

何故に入力画面を閉じた後、リスト画面の抽出ボタンクリックでエラーが出るようになるのでしょうか?

よろしくお願いします。
スススススススススススススススススススススススススススススススススススススススス
ニコ ネマ
トコ イーアウッアーッイイィ火ゥ アカコーカコーイ  書込者ノト:ロ 「ィ「」。。 ン

ロ読み取り違反ンはマが無い場合に出るエラーです。
マを設定していないテを参照しようとはしていませんか?

操作が終わるまでマは解放してはいけません。
スススススススススススススススススススススススススススススススススススススススス
ニコ 今夜が
トコ イーアウッアーッイイィ火ゥ アカコウアコウカ  書込者ノト:ロ 」「「 ン

ヲサヲサ本当に文字列の中身の分までちゃんとメモリを確保できているのでしょうか?
ヲサヲサィ略ゥ
ヲサヲサ定跡的なやり方は
ヲサヲサアョヲサ文字列の長さを調べて、そのサイズ分の領域をヌヘで確保する
ヲサヲサイョヲサ確保したメモリの中に、文字列の中身をコピーする

トのモ型はマネージド型ですからそういった処理は自動的に行われます。
ミモはホットさえ行えばあとは通常のモと同じです。
失礼ですが正直言って見当違いの指摘ではないでしょうか。
スススススススススススススススススススススススススススススススススススススススス
ニコ やまだ
トコ イーアウッアーッイイィ火ゥ アカコオオコエエ  書込者ノト:ロ 「。「 「「 ン

デバッグしながら確認したのでデータは確実にあります(セットするまでは確認しました)。

ヲサ操作が終わるまでマは解放してはいけません。
リスト画面の抽出ボタンを押した直後にを解放しています。ただ解放した後にに再度セットしています。

分からないのが、リスト画面の抽出ボタンは連続で何回押してもエラーは出ないのですが、別画面(入力画面)からリスト画面のにをセットした場合(をセットして入力画面を閉じた場合)にリスト画面の抽出ボタンを押したときエラーが出ます。

子画面(この場合は入力画面)からリスト画面のにデータをセットしたらエラーになったりするのでしょうか?
スススススススススススススススススススススススススススススススススススススススス
ニコ モ
トコ イーアウッアーッイウィ水ゥ ーーコイウコオイ  書込者ノト:ロ 」、ヤァ 、ヘ ヒトチソセ    オ ン

現在の状況を再現する最小のプログラムを作って公開してはどうでしょうか?

現在提供されているコードと説明だと現状を把握するのが困難ですし。
スススススススススススススススススススススススススススススススススススススススス
ニコ おかぽん
トコ イーアウッアーッイエィ木ゥ ークコウアコオキ  書込者ノト:ロ 「。」」、 ン

モヌで表示したくない文字列があるのなら、ヤモフとか使って、別管理にしてしまったほうが
ラクなんじゃないんでしょうか?
モヌへの追加と同時にモフにも追加しておけば、行インデックスの指定ミスもなさそうだし、
メモリの確保・開放にも悩まされずに済むと思うのですが。
単純にマロテマフャヲサメマランがーか否かの判定であれば、適当な数値をミキャストするだけで済みます。
確保したメモリの文字列をどのように使うのか記載がないようでしたのでね(読み落としかもしれませんが)。
スススススススススススススススススススススススススススススススススススススススス
ニコ ヒネナーーイイア
トコ イーアウッアーッイエィ木ゥ アオコイエコエキ  書込者ノト:ロ 「。ァ「 ン

マに格納するのがモだけなら

モヌアョマロテャメンヲサコスヲサヤマィモゥサ
モヲサコスヲサモィヤモヌョマロテャメンゥサ

でいいんじゃないのか
スススススススススススススススススススススススススススススススススススススススス
ニコ やまだ
トコ イーアウッアーッイオィ金ゥ アーコウクコウク  書込者ノト:ロ 「。「 「「 ン

いろいろ試しました。

それで、オブジェクトをキャストしてを取っていたのが原因みたいでした。

この箇所です。
ヤツアョコスィミモィマローャメンゥ゛ゥスーサ

お騒がせしました。

もう一つ分からないことがあって質問させてください。

以前教えてもらったことで、
ヲサ操作が終わるまでマは解放してはいけません。
というのがありました。

これは入力画面からリスト画面の上のア行(選択行)に書き込む際の以下のようなクリア処理も必要でないということで良いのでしょうか?

ヲサヲサヲサヲサヲサヲサヲサヲサコスヲサーヲサヲサテテュアヲサ
ヲサヲサヲサヲサヲサヲサヲサ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサトィミモィマロャメンゥゥサ
ヲサヲサヲサヲサヲサヲサヲササ

申し訳ございませんが、教えてもらえないでしょうか。

よろしくお願いします。


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

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






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