ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2018年8月15日(水) 13:49

All times are UTC+09:00




新しいトピックを投稿する  トピックへ返信する  [ 8 件の記事 ] 
作成者 メッセージ
 記事の件名: #promptについて
投稿記事Posted: 2010年3月18日(木) 03:10 
オフライン

登録日時: 2006年6月02日(金) 18:20
記事: 105
つい先ほどまで普通に実行できていたプロジェクトなのですが、今デバッグ実行を
すると「プログラムを実行しています(デバッグ中)」という表示のまま何も表示されず
何の音沙汰もなくなってしまいます。
またそこで「中断」ボタンを押しても普段なら「プログラムはコード &H0 で終了しました。」等のメッセージが表示されるはずなのにそれも表示されず、ただボタンが
「閉じる」表示に変わるだけです。(「プログラムを実行しています(デバッグ中)」の表示のまま)
色々試行錯誤してみたのですが、プログラムの冒頭に書いていた「#prompt」を
コメントアウトして飛ばすとエラー無く正常にデバッグ実行されます。
(ただそれが原因なのかどうかは分かりません。)

上手く実行できていた以前の時とプログラム事体は殆ど何も改変してないような
感じなのですが、ただ前回実行時に「変数表示のために表示していたプロンプトウインドウ」を「最小化」してそのままプロジェクトを閉じたかな、と。それくらいしか
何か変わったことをやった記憶はありません。

他のプロジェクトではプロンプトウインドウは正しく表示されます。
AB ver.4.24を使っており、それでの現象です。
また同じコンピュータにAB ver.2.62もインストールしてあり時々使っています。

この現象についてお気づきのことがありましたら是非教えて下さい。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2010年3月18日(木) 13:47 
>上手く実行できていた以前の時とプログラム事体は殆ど何も改変してないような
感じなのですが
その改変が重要なんじゃないのかな?

>色々試行錯誤してみたのですが
具体的に、どんなことをしたのです?
当然先頭にDebug入れたんですよね?
リリースコンパイルもしたんですよね?
どんなコードを書いたのか提示せずに答えを求める理由を教えてください。


通報する
ページトップ
   
投稿記事Posted: 2010年3月18日(木) 22:25 
オフライン

登録日時: 2006年6月02日(金) 18:20
記事: 105
ぼんさん、レスありがとうございます。
仰られる通りコードも書かず、申し訳ありません。
エラー自体は出てないので該当コードがどこなのか、まずそこの見当が
付かず、かといってプログラム全体を書くとなると少し長くなり過ぎるもの
だったのであのような形になってしまいました。いずれにせよちょっと雲を
掴むような質問になってしまい反省しています。

リリースコンパイルは正常に通ります。で、リリースコンパイルの時、
「#prompt」を入れたものでも正常に完了し、そのEXEファイルを実行したとき
プロンプトウインドウは正しく表示されます。
問題はデバッグ実行の時で。

とりあえずどこが原因なのか調べようと、まず自分の書いたプログラムを
全てスキップするようにMainWndのクリエイト・イベント冒頭に
「Exit Sub」を置きました。
また、リサイズ・イベントも中身を全てコメント・アウト。
デストロイ・イベントも全てコメントアウト。
とりあえずこれで#promptを書いた状態でデバッグ実行をすると
これは正常にプロンプトウインドウが表示されました。

それから一つずつコメントアウトした所を元に戻していったのですが。
まずデストロイ・イベントからコメントアウトを取ると、、、
プロンプトは表示されなくなりました。
そこで更にデストロイイベント内部をコメントアウトでチェックしていくと、
(プロジェクト名)_DestroyObjects()
PostQuitMessage(0)
という箇所があるのですが、この
「(プロジェクト名)_DestroyObjects()」をコメントアウトすると
プロンプトウインドウはまた表示されるようになりました。

しかしこれはもともとABが書いてくれていたもので
今まで何の問題も無かったところなので「果たしてそれが原因なんだろうか」と
つい思ってしまいます。
ぼんさんの言われるとおり「自分の書いた何らかの改変」が影響を
与えていると考えるのが自然に思えるのですが、まだそれが絞りきれず
にいます。

という訳で、まだ検討中です。
お気付きのことがありましたらまた教えて下さい。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2010年3月18日(木) 22:54 
openheart@inter7.jp
ソースまとめて送ってくだされば、分かりやすいです。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2010年3月18日(木) 23:21 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
住所: 埼玉県東松山市
ちょっと聞いた限りでは原因が分かりませんが、#promptとプロジェクト中のウインドウは同時に使う事を前提としていないような気もします。

(...)_DestoryObjects()が原因だと言うのは信じにくいのですが
プロジェクトフォルダ内のCallback.wbpに(...)_DestoryObjects()が自動で書かれる筈なので、それを見れば解決するかもしれません。

hideタグとcodeタグを用いると、プログラムの長さを気にせずにここに投稿できますよ。
[hide=test]どう書いているかは引用返信を見るなりして理解する事。
コード:
'test
[/hide]

_________________
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。


通報する
ページトップ
投稿記事Posted: 2010年3月19日(金) 02:40 
オフライン

登録日時: 2006年6月02日(金) 18:20
記事: 105
経過報告ですが、その後、
コメントアウトするのではなくプログラムそのものを
殆ど全削除してテストしたところ
****_DestroyObjects()を残してもデバッグ実行、
正常に実行できました。(当たり前といえば当たり前なんですが)
やはり自分の書いたプログラムがエラーには出ない何か原因が
あるものと思います。
別に保存しておいたものから少しずつプログラムを戻していって
チェックするしか無いですが、ただその原因がどうして
****_DestroyObjects()に影響するのか見当が付かないですね。。。

(konisiさんレスありがとうございます。Callbackは覘いてみたんですが、
異常は(今のところ)見つけられませんでした。
それから、プログラムリストの掲載についてなのですが、
プロジェクト内に作成したウインドウが27個あり、それぞれにコードが
付いている状態なのでちょっと見ていただくのは現実的ではないなと
思っています。せめて該当箇所の見当でも付けばと思っていたんですが。
いずれにしても「リリースコンパイル後のEXEで正常にプロンプトウインドウが
表示される」というのがどうにも引っかかるんですよね。何事も無かったかの
ように。。)


通報する
ページトップ
 記事の件名: テストの結果です。
投稿記事Posted: 2010年3月19日(金) 19:10 
オフライン

登録日時: 2006年6月02日(金) 18:20
記事: 105
ここまでのテスト結果を。

そもそも「***_DestroyObjects()」はプログラム開発の一番初めに
存在していて、その時にこの現象は現れて無かった訳だから、
「***_DestroyObjects()」を残した状態でプログラムを削っていけば
必ずどこかで正常なデバッグ実行が出来る時が来る筈、という前提で
テストを進めて行ったのですが、
最終的にある一文をコメントアウトするかしないかで
現象が現れるかどうかという箇所に突き当たりました。
コード:
'閉じるボタンの無効化
 EnableMenuItem(GetSystemMenu(hTitleWnd, FALSE), SC_CLOSE, MF_GRAYED)
アプリのタイトルとなるウインドウの「閉じるボタン」を無効化
するという目的の物なのですが、これをコメントアウトすると、正常に通りました。
(つまり、同じ現象が「***_DestroyObjects()」と「EnableMenuItem」という
「二つの全く別の箇所の有る無し」で出現することになります。)

ただこれについてはそもそもABのBackSearchから持ってきたもので
それ自体の動作は確認しています。実際この箇所をそれが属する
タイトルウインドウ単体と共に別に抜き出して実行するときちんと
デバッグ実行出来ました。
そこで、ちょっとダメ元で同じ動作をする別の命令で書き換えたら
どうなるかと以下のように書いたら、
コード:
'閉じるボタンの無効化
 Dim mii As MENUITEMINFO
 mii.cbSize=SizeOf(MENUITEMINFO)
 mii.fMask=MIIM_STATE
 mii.fState=MFS_GRAYED
 SetMenuItemInfo(GetSystemMenu(hTitleWnd, FALSE),SC_CLOSE,MF_BYCOMMAND,mii)
こうすると(理由は分からないのですが)デバッグ実行は正常に戻りました。

もしかしてと思い、ここでこれを「EnableMenuItem」に戻し、
「***_DestroyObjects()」もそのままにし、
「上の二つとも間違いでは無い」という前提で別の所を
切っていって正常に戻る時があるかどうか試していったのですが
これが複数の箇所で見つかりました。

・メインウインドウのクリエイトで宣言されているサブスレッドの
CreateThread文をコメントアウトするかしないか。(コメントアウトで正常に)

・そのサブスレッド内、三つあるPeekMessage文を「三つ全て」コメントアウト
するかしないか。(三つともコメントアウトで初めて正常に戻る)

・メインウインドウのメニューから開くモーダルダイアログ内の
コードの「SetDlgItemText」をコメントアウトするかしないか。(コメントアウトで正常に)

恐らく探せば他にもあるのではないかと思います。
ただし見つけられた上記のものは、一見しただけではお互いに関連が無く、
総合して何かが見えてくるという感じがしないものばかりです。
特に「SetDlgItemText」については、これはあるサブの一番末尾に
コード:
Sub ****()
 …
 …
 SetDlgItemText
End Sub
という状態で書かれているのですが、アポストロフィーなどで
コメントアウトすると正常デバッグ実行出来るのに、
コード:
Sub ****()
 …
 …
 Exit Sub
 SetDlgItemText
End Sub
と「Exit Sub」でスキップすると正常デバッグ実行に戻らないまま
です。

これらのことから思うに、「どうやらそれらの部分が"実行"されているかどうかは
問題ではないかもしれない」とも思えます。
つまり「実行時」に何か問題があるのではなくて「コンパイル時」に
何かが起きているんじゃないか、と。
特に「***_DestroyObjects()」はアプリが閉じられるときに初めて実行される
筈で、そこの影響でアプリがまず「表示もされない」というのはどうにも、、
という感じがします。(ただリリースコンパイルでは表示されます)

…とりあえず今はここまで、なのですが。
また何か分かりましたら。


通報する
ページトップ
 記事の件名: テストの続きです。
投稿記事Posted: 2010年3月21日(日) 00:16 
オフライン

登録日時: 2006年6月02日(金) 18:20
記事: 105
続きです。

テストを続ける内、他にもいくつかのデバッグ実行 可/不可のスイッチのような
箇所を見つけたのですが、それらから少し不思議な規則性を感じました。

前述の箇所で
EnableMenuItemはプロジェクト中に一回使用 →その箇所をコメントアウトで実行可
SetDlgItemTextはプロジェクト中に一回使用 →その箇所をコメントアウトで実行可
CreateThreadプロジェクト中に一回使用 →その箇所をコメントアウトで実行可
PeekMessageはプロジェクト中に三回使用 →その「三箇所全部」をコメントアウトで実行可
(後のテストでPeekMassege他にも複数箇所に散らばるものが見られました。)

…同じスイッチらしきプロシージャのコールが複数箇所に散在するとき、それらを「全部」押さえないといけない。
要するに「何でもいいからプロシージャのコールの"種類"を減らせ」ということなのかなと。
EnableMenuItemやSetDlgItemText、あるいは一番初めに見つけた「***_DestroyObjects()」は、たまたまそれが「一回使用」だけのものだったために発見され易かったのか。
 それで考えるとEnableMenuItemを「SetMenuItemInfo」で書き換えた時上手く行ったのは、(実は「SetMenuItemInfo」はプロジェクト中、他の場所で使っていたので)書き換えると結果的に使用プロシージャの種類は一つ減る。それが原因なのかなと思ったんですが。。("Exit Sub"でダメだったのも、それでは使用プロシージャの種類数が減らないからか、と)

だとすると、逆に、(一旦デバッグ実行が可の状態にしておいて)新しい仮プロシージャを一つ作り、それをコールすればまた不可の状態に戻る筈、としてテストしてみたんですが、結果はデバッグ実行が可のままで、スイッチにはなりませんでした。
(他にも自作のプロシージャではなく、これまで一度も使っていない「IsWindowVisible」などを呼んでみたりしたんですが、それで不可の状態に戻ることは無く。
Destroyイベントの「PostQuitMessage(0)」もプロジェクト中一度、そこでしか存在を確認してないのにコメントアウトしても状態が変わらないのも矛盾します。)

これでは説明は出来ない感じですね。

またお気付きのことがありましたら教えて下さい。


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 8 件の記事 ] 

All times are UTC+09:00


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[1人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by KONISHI Yohsuke