「Self.Name」のコーディングで
FormのNameプロパティの値(例;Formxxx)を取得する処理があります。
ごくまれに
FormのNameプロパティの値(例:Formxxx)でなく
文字化けした値(例:HワM)を取得すると思われる事象が起きています。
原因・対処方法を教えてください。
リソース不足が原因なのではと思っていいるのですが
事象が再現しない為、確認ができない状況です。
・Delphiのバージョンは何ですか?
・OSは何ですか?
・他のパソコンでも同じ現象ですか?それとも特定のパソコンでのみですか?
・“FormのNameプロパティの値(例;Formxxx)を取得する処理”のみのテストプログラム
でもその現象がおこりますか?
KHE00221 です
「Self.Name」のコーディングで
FormのNameプロパティの値(例;Formxxx)を取得する処理があります。
というのは
1)FormName := Self.Name で取得して名前が 文字化けすると言う事ですか?
2)取得した直後に Caption := FormName 等で確認して文字化けしていますか?
3)プログラムのどこかで間違って Self.Name 周辺のアドレスに何か書き込んでいませんか?
■で回答します。
・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 周辺のアドレスに何か書き込んでいませんか?
■確認方法がわかりません。
確認方法を教えていただけますか?
>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;
UNICODEで書かれてるんじゃないっすかね?
ちと確認してみてください。
■で回答します。
> >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で書かれていない?
ちゃんと文章を読んでませんでした。
すみません、UNICODEは忘れてください。
発生頻度が本当にごくまれそうですね。
私にはわかりませんです><
>■はい。
>Delphiのデバッグタ行で監視ョで値がForm名(例:Formxxx)
>であることは確認しました
ということは
>「self.name」で、ごくまれに、FormのNameプロパティの値を取得できず、
>文字化けした値を取得
という問題ではないでしょう
StoredProc のソースを追って、どこで Self.name を与えた文字列が
変更されてしまっているのか調べてみてはどうでしょうか?
TForm.Nameは、propertyエディタで、入力するものですので、
VCLが、正式にUNICODE対応していない以上、UNICODEが原因というのは考えられないと思います。
経験上、この手の不正に変数の内容が、書き変わる系は、
不正なアクセスによる、メモリ破壊が原因が主かと思います。
・ポインタで、アクセスしているところ
・PCharなどで、関数を渡しているところ
・同様に、APIなどに、PCharで渡しているところ
を疑ってみてください。
私も、過去に似たような状況に陥ったことがあります。
調べる方法は、
KHE00221さんのおっしゃられるように、
>StoredProc のソースを追って、どこで Self.name を与えた文字列が
>変更されてしまっているのか調べてみてはどうでしょうか?
デバッガの監視式に入れておいて、逐一見ていくのが、
確実だと思います。
あとは、OutputDebugString(PChar(Form1.Name))などを各所にしこんで、
デバッグ時にログを見る、という方法もあります。
x ・PCharなどで、関数を渡しているところ
o ・PCharなどで、関数に渡しているところ
ツイート | ![]() |