喫茶XRAYトップページ

[▲前のスレッド]

[11242] TSaveDialogダイアログの挙動返信 削除
2017/7/9 (日) 17:36:46 Mr.XRAY
Delphi 2005 + Windows 8.1 の環境で
TSaveDialog のダイアログが表示されないという現象が発生する.
と言うのですが,何か情報ないでしょうか ?
この環境でテストできる状態がないんです.

確か,初期ディレクトリの設定が云々というのは見た記憶があるのですが.

テストコードは以下です.

procedure TForm21.BitBtn6Click(Sender: TObject);
var
  FileName   : String;
begin
   //ファイル名をセットする
  SaveDialog1.FileName := '予定表';

  //ファイル選択のオープンダイアログを表示
  if (SaveDialog1.Execute = True) then
      ShowMessage('File : '+ SaveDialog1.FileName)
  else
       ShowMessage('Save file was cancelled');
end;

  SaveDialog1.FileName := '予定表';

のコードを削除するとダイアロは表示されるようです.
少なくても,Delphi XE(UP1) Pro + Windows 7 U64(SP1) では発生しません.
ファイル名の指定があってもなくてもダイアログは表示されます.


# メールでの問い合わせのコードをそのまま掲載しています.


[11243] Re:TSaveDialogダイアログの挙動返信 削除
2017/7/9 (日) 18:01:23 Mr.XRAY
> と言うのですが,何か情報ないでしょうか ?

Quality Central 調べようと思ったらログインできない ?
Quality Central ってログイン必要でしたっけ...


[11246] Re2:TSaveDialogダイアログの挙動返信 削除
2017/7/9 (日) 22:23:53 福士
> Quality Central 調べようと思ったらログインできない ?
先月末くらいに一部で話題になってましたが、QCは事実上閉鎖されてQPに一本化されましたが、
特に移行はされていないので、要するに消えちゃいました、という状態です。FBでの
やりとりが一番詳しいかな?(読めない人はごめんなさい)
https://www.facebook.com/groups/delphiusers/permalink/708150382706445/

[11250] Re3:TSaveDialogダイアログの挙動返信 削除
2017/7/10 (月) 15:35:26 Mr.XRAY
▼ 福士さん
> > Quality Central 調べようと思ったらログインできない ?
> 先月末くらいに一部で話題になってましたが、QCは事実上閉鎖されてQPに一本化されましたが、
> 特に移行はされていないので、要するに消えちゃいました、という状態です。FBでの
> やりとりが一番詳しいかな?(読めない人はごめんなさい)
> https://www.facebook.com/groups/delphiusers/permalink/708150382706445/


あっ,そうなんてずか.知りませんでした.ハハハッ.
私読めない人です.ハイ.


[11244] Re:TSaveDialogダイアログの挙動返信 削除
2017/7/9 (日) 18:16:33 igy
▼ Mr.XRAYさん

もしかしたら、'表'の文字がいけなかったりして(¥が含まれると)・・・

SaveDialogの不審な挙動
http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+200703/07030003.txt


あと、(関係ないかもしれませんが)Delphi2005はアップデート 3 まで適用されているか、など気になりますね。


[11245] Re2:TSaveDialogダイアログの挙動返信 削除
2017/7/9 (日) 20:42:43 Mr.XRAY
▼ igyさん

> もしかしたら、'表'の文字がいけなかったりして(¥が含まれると)・・・
>
> SaveDialogの不審な挙動
> http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+200703/07030003.txt


おおっ,これは.ヒットしませんでした.
Delphi 2005 特有と思って... ハハハッ.
こんなことがあるんですね.

Delphi 2005 は Ansi 版ですね.たしかに \ の $5C があります.

[\ をバックスラッシュ以外の文字として扱うには U+00A5 を指定する]
http://mrxray.on.coocan.jp/Delphi/Others/Yen_Backslash.htm#02

ありがとうございます.
 
> あと、(関係ないかもしれませんが)Delphi2005はアップデート 3 まで適用されているか、など気になりますね。

ですね.


[11247] Re3:TSaveDialogダイアログの挙動返信 削除
2017/7/10 (月) 06:40:23 Mr.XRAY
スミマせん.
ちょっと意外な方向への展開になってしまいました.
保存のダイアログは使用しなで,バッチファイルで処理するようです.

したがって,Delphi 2005 で保存ファイル名を指定した場合の
TSaveDialog の表示の問題については確認できないことになりました.


[11248] Re:TSaveDialogダイアログの挙動返信 削除
2017/7/10 (月) 14:18:54 taka
▼ Mr.XRAYさん
> Delphi 2005 + Windows 8.1 の環境で
> TSaveDialog のダイアログが表示されないという現象が発生する.
> と言うのですが,何か情報ないでしょうか ?
> この環境でテストできる状態がないんです.


こんにちは、
久しぶりにのぞくとDelphi2005ネタなので試してみました。
コードを削除なしに
Windows8.1,10どちらも 予定表 正常に動作します

SaveDialog1.InitialDirに変な値がはいっているとか
SaveDialog1.Optionsの設定になにか不気味な設定があるとか
MAX_PATHを超えているとか
どこかでメモリ違反やっちゃたとか
ではないですかね?

> ちょっと意外な方向への展開になってしまいました.
試したくなったときは汚染されていない状態で
もう一度チェックするといいかもですね。
  with TSaveDialog.Create(self) do
  try
//  InitialDir := 'フォルダ名';
    FileName := '予定表';
    //ファイル選択のオープンダイアログを表示
    if (Execute = True) then
        ShowMessage('File : '+ FileName)
    else
         ShowMessage('Save file was cancelled');
  finally
   free;
  end;


[11249] Re2:TSaveDialogダイアログの挙動返信 削除
2017/7/10 (月) 15:30:11 Mr.XRAY
▼ takaさん,どうもです.

> 久しぶりにのぞくとDelphi2005ネタなので試してみました。
> コードを削除なしに
> Windows8.1,10どちらも 予定表 正常に動作します


ありゃ !
私も Ansi 版だとそうなるかと思って,といっても
同じ様な使い方をしてきていますが,記憶にないのですが
Delphi 6, Delphi 2007 でやってみました.

ダイアログ表示されました.

> 試したくなったときは汚染されていない状態で
> もう一度チェックするといいかもですね。


ですね.
お手数かけました.
こういうことは,やっぱり解決しておいた方がいいと思うんですよね.
そうすれば,現象そのものだけでなく,開発に関係する何かが得られると思っています.

# 本当はどこかのコミュニティの場で質問した方がいいような...
# この喫茶XRAY でもいいとは思いますが...


[11252] Re3:TSaveDialogダイアログの挙動返信 削除
2017/7/10 (月) 17:05:42 igy
▼ Mr.XRAYさん
> ありゃ !
> 私も Ansi 版だとそうなるかと思って,といっても
> 同じ様な使い方をしてきていますが,記憶にないのですが
> Delphi 6, Delphi 2007 でやってみました.
>
> ダイアログ表示されました.


Delphi7で試してみました。

  SaveDialog1.FileName := '予定表';
だと、ダイアログ表示しますが、
  SaveDialog1.FileName := '予定\';
だと、ダイアログ表示しませんねぇ。

Delphi 2005 アップデート 2
http://support.embarcadero.com/jp/article/35987
には、

> 日本語Windows 95/98/MEで、Delphi 2005のVCLコントロールが日本語文字を表示できない問題の解決
> デバッグ時に表示される CPUビュー内のメモリダンプビューで、「表示形式の指定」の選択にかかわらず、
> マルチバイトキャラクターを表示できない問題の解決


とかあるので、もしかしたら、Delphi 2005 update 1以前で生成したプログラムでは、
マルチバイトキャラクタが適切に処理できなかったりして・・



[11253] Re4:TSaveDialogダイアログの挙動返信 削除
2017/7/10 (月) 17:58:29 Mr.XRAY
▼ igyさん

> Delphi7で試してみました。
>
>   SaveDialog1.FileName := '予定表';
> だと、ダイアログ表示しますが、
>   SaveDialog1.FileName := '予定\';
> だと、ダイアログ表示しませんねぇ。


Delphi 6 Pro(UP2) でやってみました.
ダイアログは表示されませんでした.
Delphi 2007-R2 では表示しました.

> とかあるので、もしかしたら、Delphi 2005 update 1以前で生成したプログラムでは、
> マルチバイトキャラクタが適切に処理できなかったりして・・


ということで間違いなさそうですね.
Ansi 文字「表」のコードポイントは $955C です.$5C の文字は \ です.


[11254] Re4:TSaveDialogダイアログの挙動返信 削除
2017/7/10 (月) 21:22:39 taka
▼ igyさん
> ▼ Mr.XRAYさん
>   SaveDialog1.FileName := '予定表';
> だと、ダイアログ表示しますが、
>   SaveDialog1.FileName := '予定\';
> だと、ダイアログ表示しませんねぇ。


GetSaveFileName : ユーザーがキャンセル または 閉じる
                  または、エラーが発生すると0を返します
https://msdn.microsoft.com/ja-jp/library/cc364728.aspx

CommDlgExtendedError
https://msdn.microsoft.com/ja-jp/library/cc410721.aspx
https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms646916(v=vs.85).aspx


ShowMessageFmt('Save file was cancelled [%.2X]', [CommDlgExtendedError]);

0x3002 FNERR_INVALIDFILENAME
ファイル名が無効です。


[11255] Re5:TSaveDialogダイアログの挙動返信 削除
2017/7/10 (月) 22:35:49 Mr.XRAY
> ShowMessageFmt('Save file was cancelled [%.2X]', [CommDlgExtendedError]);
>
> 0x3002 FNERR_INVALIDFILENAME
> ファイル名が無効です。


なるほど.
\ が可哀そうです.こんなにいじられて.ハハハッ.


[11256] Re5:TSaveDialogダイアログの挙動返信 削除
2017/7/11 (火) 08:49:43 taka
まとめ
(1) SaveDialog1.FileName の最後の文字が \ で終わる
    または、 / | < : " が文字列内に含まれていると
    CommDlgExtendedErrorが発生し、Dialog は表示されない。

(2) Delphi 2005は、update2まで当てていないと
    マルチバイト文字が正常に処理さずシングルバイト処理される可能性があり
    内部でファイル名を破壊したあとにGetSaveFileName関数を呼び出す可能性がある。

  with SaveDialog1 do
  begin
//  InitialDir := 'フォルダ名';
    FileName := Edit1.Text;
    //ファイル選択のオープンダイアログを表示
    if (Execute = True) then
        ShowMessage('File : '+ FileName)
    else
    begin
      case CommDlgExtendedError of // CommDlg.CommDlgExtendedError
        0 : ShowMessage('Save file was cancelled');
        $3002 : ShowMessage('ファイル名が無効です。');
      else
        ShowMessageFmt('Error : CommDlgExtendedError 0x%X',[CommDlgExtendedError]);
      end;
    end;
  end;


[11257] まとめ返信 削除
2017/7/11 (火) 11:58:46 Mr.XRAY
▼ takaさん
> まとめ

あらら,スミマセン.
igy さんがレスでよく書いているように,update のチェックは基本ですね.

>         ShowMessageFmt('Error : CommDlgExtendedError 0x%X',[CommDlgExtendedError]);

これいいですね.気に入りました.
こういう表示にしておけば分かりやすいです.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82