「self.name」で、ごくまれに、FormのNameプロパティの値を取得できず、文字化けした値を取得


E  2007-11-10 06:21:10  No: 28348

「Self.Name」のコーディングで
FormのNameプロパティの値(例;Formxxx)を取得する処理があります。

ごくまれに
FormのNameプロパティの値(例:Formxxx)でなく
文字化けした値(例:HワM)を取得すると思われる事象が起きています。

原因・対処方法を教えてください。

リソース不足が原因なのではと思っていいるのですが
事象が再現しない為、確認ができない状況です。


igy  2007-11-10 09:12:45  No: 28349

・Delphiのバージョンは何ですか?
・OSは何ですか?
・他のパソコンでも同じ現象ですか?それとも特定のパソコンでのみですか?
・“FormのNameプロパティの値(例;Formxxx)を取得する処理”のみのテストプログラム
  でもその現象がおこりますか?


KHE00221  2007-11-10 17:09:58  No: 28350

KHE00221 です

「Self.Name」のコーディングで
FormのNameプロパティの値(例;Formxxx)を取得する処理があります。

というのは

1)FormName := Self.Name  で取得して名前が  文字化けすると言う事ですか?

2)取得した直後に Caption := FormName 等で確認して文字化けしていますか?

3)プログラムのどこかで間違って Self.Name 周辺のアドレスに何か書き込んでいませんか?


E  2007-11-12 20:20:51  No: 28351

■で回答します。

・Delphiのバージョンは何ですか?
■Delphi 7.0 Build 4.453

・OSは何ですか?
■Windows2000 SP4 または
  WindowsXP

・他のパソコンでも同じ現象ですか?それとも特定のパソコンでのみですか?
■7台の端末で9回が発生しました。1台で3回発生し、それ以外の端末では1回ずつです。

・“FormのNameプロパティの値(例;Formxxx)を取得する処理”のみのテストプログラム
  でもその現象がおこりますか?
■現象はおきません。

1)FormName := Self.Name  で取得して名前が  文字化けすると言う事ですか?

ボタンクリックイベントの処理で、関数の引数にSelf.Nameを設定しています。

関数では、Oracleのストアドを呼び、
引数の値をOralceのTableに追加(Insert)しています。
OralceのTableに追加(Insert)した値が、ごくまれに文字化けしています。

同じストアドをJavaアプリでも呼んでいるのですが、
Javaアプリでは1度も文字化けしていません。

ストアドも問題なさそうなので、
Delphi部分が怪しいと思っています。

<ソース>

※「★」が該当の箇所

// ボタンクリックイベント
procedure TFormxxx.xxxClick(Sender: TObject);
begin
    TDMCommon.xxx( xxx, Self.Name, xxx, xxx, xxx ); // ★
end;

function TDMCommon.xxx(         p1 : String;
                                p2 : String; // ★
                                p3 : String;
                                p4 : Double;
                                p5 : String
                                                 ) : Boolean ;
begin

    With StoredProcXxx do
    begin
         StoredProcName := 'xxx.xxx.xxx';
         Params.Clear;
         Params.CreateParam(ftString,'pa1',ptInput);
         Params.CreateParam(ftString,'pa2',ptInput);
         Params.CreateParam(ftString,'pa3',ptInput);
         Params.CreateParam(ftFloat ,'pa4',ptInput);
         Params.CreateParam(ftString,'pa5',ptInput);
         Params.CreateParam(ftFloat ,'pa6',ptOutput);
         Params.CreateParam(ftString,'pa7',ptOutput);

         ParamByName('pa1').AsString   := p1;
         ParamByName('pa2').AsString   := p2; // ★
         ParamByName('pa3').AsString   := p3;
         ParamByName('pa4').AsString   := p4;
         ParamByName('pa5').AsFloat    := p5;

         if Prepared then UnPrepare;
            Prepare;

         // 引数の値をOralceのTableに追加(Insert)
         ExecProc;

         if ParamByName('pa6').AsFloat <> 0 then begin
            abort;
         end;
    end;
end;

2)取得した直後に Caption := FormName 等で確認して文字化けしていますか?
■文字化けしていません。

3)プログラムのどこかで間違って Self.Name 周辺のアドレスに何か書き込んでいませんか?
■確認方法がわかりません。
  確認方法を教えていただけますか?


KHE00221  2007-11-13 00:21:49  No: 28352

>2)取得した直後に Caption := FormName 等で確認して文字化けしていま?>すか?
>■文字化けしていません。

というのは

   >ParamByName('pa1').AsString   := p1;
   
   ここで Caption := P2; としても Caption には正常な値が表示されるが

   >OralceのTableに追加(Insert)した値が、ごくまれに文字化けしています。

   ということですか?

   >ParamByName('pa2').AsString   := p2; // ★
   >ParamByName('pa3').AsString   := p3;
   >ParamByName('pa4').AsString   := p4;
   >ParamByName('pa5').AsFloat    := p5;


もにゃ  2007-11-13 02:27:49  No: 28353

UNICODEで書かれてるんじゃないっすかね?
ちと確認してみてください。


E  2007-11-13 03:44:40  No: 28354

■で回答します。

>   >ParamByName('pa1').AsString   := p1;
>   
>   ここで Caption := P2; としても Caption には正常な値が表ヲされるが
>
>   >OralceのTableに追加(Insert)した値が、ごくまれに文字化けしています。
>
>   ということですか?
■はい。
Delphiのデバッグタ行で監視ョで値がForm名(例:Formxxx)
であることは確認しました。

試験では同じ処理をしてもForm名が取得できない事象が発生しませんし、
発生頻度がごくまれ(約1年間で9回発生)なので、
リソース不足など環境面が原因じゃないのかと考えています。

<(参考)文字化けしていた文字>
HワM
(廝
(截
ャM
0ク 
TxE
ワス7
ク絎
佯M
$M

>UNICODEで書かれてるんじゃないっすかね?
>ちと確認してみてください。
■UNICODEで書かれていないはずです。

  UNICODEで書かれているかの確認方法が
  わかななかったのですが、pasファイルを"wide"で検索した結果、
  0件だった為、UNICODEで書かれていない?


もにゃ  2007-11-13 07:23:51  No: 28355

ちゃんと文章を読んでませんでした。
すみません、UNICODEは忘れてください。
発生頻度が本当にごくまれそうですね。
私にはわかりませんです><


KHE00221  2007-11-13 18:59:13  No: 28356

>■はい。
>Delphiのデバッグタ行で監視ョで値がForm名(例:Formxxx)
>であることは確認しました

ということは

>「self.name」で、ごくまれに、FormのNameプロパティの値を取得できず、
>文字化けした値を取得

という問題ではないでしょう

StoredProc のソースを追って、どこで Self.name を与えた文字列が
変更されてしまっているのか調べてみてはどうでしょうか?


TOBY  URL  2007-12-02 08:57:29  No: 28357

TForm.Nameは、propertyエディタで、入力するものですので、
VCLが、正式にUNICODE対応していない以上、UNICODEが原因というのは考えられないと思います。

経験上、この手の不正に変数の内容が、書き変わる系は、
不正なアクセスによる、メモリ破壊が原因が主かと思います。

・ポインタで、アクセスしているところ
・PCharなどで、関数を渡しているところ
・同様に、APIなどに、PCharで渡しているところ
を疑ってみてください。

私も、過去に似たような状況に陥ったことがあります。

調べる方法は、
KHE00221さんのおっしゃられるように、

>StoredProc のソースを追って、どこで Self.name を与えた文字列が
>変更されてしまっているのか調べてみてはどうでしょうか?
デバッガの監視式に入れておいて、逐一見ていくのが、
確実だと思います。

あとは、OutputDebugString(PChar(Form1.Name))などを各所にしこんで、
デバッグ時にログを見る、という方法もあります。


TOBY  URL  2007-12-02 08:58:48  No: 28358

x ・PCharなどで、関数を渡しているところ
o ・PCharなどで、関数に渡しているところ


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

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






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