MRUに関して、教えてください – プログラミング – Home

MRUに関して、教えてください
 
通知
すべてクリア

[解決済] MRUに関して、教えてください


柊太郎
 柊太郎
(@柊太郎)
ゲスト
結合: 17年前
投稿: 8
Topic starter  

いろいろ調べましたが、基本的なところで悩んでいます。

メニュー(File)にある「最近使ったファイル」に、ファイル名の追加を行うところまで
は、何とかなりました。

追加は
AfxGetApp()->AddToRecentFileList( FileName );
で、行っています。
GetDocument()->SetPathName( FileName, TRUE );
でも試しました。

メニュー(File)を、プルダウンしたときにも、正しく並んでいます。

しかし、ファイル名が複数表示されている場合に、古いものを選択すると、見かけの表
示の並び順は変わるのですが、実際に取り出せるファイル名は、立ち上げ時に表示され
ているファイル名のままで、取り出したときの並び順が更新されません。

予想される原因は、取り出し方か、更新方法にあると思うのですが、手段が分かりませ
ん。

取り出しは、
AfxGetApp()->GetProfileString(Recent File List,File**,");
で、レジストリから行っています。

上記の、追加ではレジストリの更新まで行われていないものと思います。

レジストリの更新、またはMRUからのデータの取り方など、ご存知の方いましたら、ぜひ
アドバイスをお願いします。

OS:Win98
VC++:V6(SP3)
SDI:FomeView


引用未解決
トピックタグ
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

CRecentFileList クラスを使ってみては?


返信引用
chamaro
 chamaro
(@chamaro)
ゲスト
結合: 17年前
投稿: 19
 

>レジストリの更新、またはMRUからのデータの取り方など、ご存知の方いましたら、ぜ

アドバイスをお願いします。

1)レジストリの更新
CWinApp::SaveStdProfileSettings()を呼ぶ

2)MRUからのデータの取り方
CWinApp::m_pRecentFileListから取り出す

どちらでも好きな方をどうぞ。

尚、どちらもprotectedなので、操作はCWinAppから派生したクラスで行う必要がありま
す。


返信引用
柊太郎
 柊太郎
(@柊太郎)
ゲスト
結合: 17年前
投稿: 8
Topic starter  

ありがとうございました。

> 1)レジストリの更新
> CWinApp::SaveStdProfileSettings()を呼ぶ

これで、解決できました。
ありがとうございました。

今回の機能を検討していて、気になった点があります。
・アプリ実行中にレジストリの更新をするのは、一般的ではないのでしょうか?
 プロパティシートの更新などで反映するように、よくあることかと思っていました。
・CViewクラスから、CWinAppの派生クラスのメンバー関数を実行させたい場合、グロー
バルなCWinAppクラスポインタを作り、CViewクラスから実行する手段をとりましたが、
他の手段もありますか?

すでに解決した内容なので、教えていただければ、今後の参考にしたいと思います。
よろしくお願いします。


返信引用
rikizo
 rikizo
(@rikizo)
ゲスト
結合: 18年前
投稿: 20
 

>CViewクラスから、CWinAppの派生クラスのメンバー関数を実行させたい場合、グロー
>バルなCWinAppクラスポインタを作り、CViewクラスから実行する手段をとりましたが、
>他の手段もありますか?

AfxGetApp()とか。


返信引用
rikizo
 rikizo
(@rikizo)
ゲスト
結合: 18年前
投稿: 20
 

>AfxGetApp()とか。

あ、ごめん、勘違い。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

> ・アプリ実行中にレジストリの更新をするのは、一般的ではないのでしょうか?
別に問題無いのでは。

> 追加は
> AfxGetApp()->AddToRecentFileList( FileName );
> で、行っています。
の結果が
> 取り出しは、
> AfxGetApp()->GetProfileString(Recent File List,File**,");
> で、レジストリから行っています。
で取り出せなかったという事のようですが、現象から見ると、AddToRecentFileListが
直接レジストリに書き込まず、CWinApp内で保持し、プログラム終了か何かのタイミング
で書き込んでいるだけではないでしょうか。
で、その「CWinApp内で保持」しているのが、m_pRecentFileList。

AddToRecentFileListの役割はMRUに追加することであって、レジストリに書き込む事
ではない。だから、考え方としては
> 2)MRUからのデータの取り方
> CWinApp::m_pRecentFileListから取り出す
の方が正解と思う。解決したんだから、どちらでもいいんでしょうけど。
# あくまでも私見です。


返信引用
chamaro
 chamaro
(@chamaro)
ゲスト
結合: 17年前
投稿: 19
 

>・アプリ実行中にレジストリの更新をするのは、一般的ではないのでしょうか?
> プロパティシートの更新などで反映するように、よくあることかと思っていました。
どちらでも良いと思います。
プロパティーシートと言っても、随時書き込むアプリもあれば、終了時にしか書き込ま
ないアプリもあると思いますよ。
一番大事なのは、アプリがクラッシュしても問題ないような作りになっている事です

>・CViewクラスから、CWinAppの派生クラスのメンバー関数を実行させたい場合、グロー
>バルなCWinAppクラスポインタを作り、CViewクラスから実行する手段をとりましたが、
>他の手段もありますか?
その方法は駄目駄目です。
駄目な理由は、MFCにはAfxGetApp()という関数が既に用意されているにも関わらず、
無意味な変数を作っている為。
この戻り値をキャストして使いましょう。


返信引用
柊太郎
 柊太郎
(@柊太郎)
ゲスト
結合: 17年前
投稿: 8
Topic starter  

アドバイスありがとうございます。

クラスポインタの件、修正しました。
確かに、指摘の通りです。
つい、入門編の参考書の手順で作成してしまいました。

これでは、C言語などでよくやる、ファイル分割したけれど、すべての変数はグローバ
ル・・・と、同じ状態でしたね。

レジストリの更新に限らず、アプリがクラッシュしても大丈夫なこと。
忘れがちな、事ですね。

動けばいいや・・・で、終わらずに、今後も勉強を続けてゆきます。

ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました