ab.com コミュニティ https://www.activebasic.com/forum/ |
|
モーダルダイアログにするとビットマップ表示ができない https://www.activebasic.com/forum/viewtopic.php?t=2503 |
ページ 1 / 1 |
作成者: | kobo [ 2008年11月19日(水) 23:35 ] |
記事の件名: | モーダルダイアログにするとビットマップ表示ができない |
たまにお世話になっていますkoboです。 こんばんは。 首記の通りなのですが、ヘルプセンターから引用したビットマップを表示するプログラムと タブストップを使おうとモーダルダイアログにすると あちこちでエラーが出ます。 主にビットマップを表示する為のコードから出ています。 各個での使用は出来ていますがモーダルダイアログにするとエラーがでます。 さて、これはこう言うものなのでしょうか?出来るはずなのでしょうか? そもそもモーダルダイアログの意味も解らず、これにすればタブストップが使えるくらいにしか理解できていません。 やたらと長ったらしいコードなので載せる訳にもいかず、困った質問になりますが なにか思い当たる節のある方に助け舟を出して頂きたく陳情にあがりました。 Ver4.24 OSはXPsp3です。 |
作成者: | 7 [ 2008年11月20日(木) 19:46 ] |
記事の件名: | Re: モーダルダイアログにするとビットマップ表示ができない |
> 首記の通りなのですが、ヘルプセンターから引用したビットマップを表示するプログラムと > タブストップを使おうとモーダルダイアログにすると > あちこちでエラーが出ます。 > 主にビットマップを表示する為のコードから出ています。 > > 各個での使用は出来ていますがモーダルダイアログにするとエラーがでます。 > さて、これはこう言うものなのでしょうか?出来るはずなのでしょうか? 試す所か、ActiveBasicの起動すらもしてないんですが、もしかするとビットマップとは関係ないエラーかもしれませんね。 たまにエラーの原因となるコードと全然関係ない箇所を強調表示してくれます(笑) もし、メインウィンドウをモーダルダイアログにしてるなら、たしかそれはダメだった気がしますし、それはビットマップとは関係ありません。 > そもそもモーダルダイアログの意味も解らず、これにすればタブストップが使えるくらいにしか理解できていません。 モーダルダイアログは、それを表示したアプリケーションの操作を不許可にするタイプのダイアログですね。 オプション設定のダイアログなんかに使われているのをよく見かけます。 たまに、テキストエディタで検索・置換ダイアログをモーダルにしてるのがあって、不便に思うこともあります(笑) タブストップはウィンドウの種類に限らず、設定してやると使えたような気がします。 > やたらと長ったらしいコードなので載せる訳にもいかず、困った質問になりますが とりあえず、コードが無いならもうちょっと状況を詳しくお願いします。
|
作成者: | kobo [ 2008年11月20日(木) 21:45 ] |
記事の件名: | ダイアログの種類 |
7様。連続回答ご苦労様です。そしてありがとうございます。 1.メインウィンドウをモーダルダイアログにしているのか? 2.モーダルダイアログを追加しているのか? 3.ノーマルなメインウィンドウにビットマップを表示しているのか? 4.モーダルなメインウィンドウにビットマップを表示しているのか? 5.追加したモーダルダイアログにビットマップを表示しているのか? 1.メインウィンドウにビットマップを表示するコードをノーマルで作成していて モーダルに変えるとエラーになりました。 2.メインウィンドウのみを使用中です。追加はしていません。 3.しています。メインウィンドウがノーマルでそれにビットマップを表示しています。 4.できませんでした。メインウィンドウをモーダルに変更したらエラーになりました。 5.追加はしていません。 メインウィンドウをノーマルで作成していて、タブストップがあったほうが良いなと思い、 以前参考にした質問であった方法 (モーダルダイアログに設定・DialogBox(0,"MainWnd")を追加・タブストップにチェック) をしてテストに成功(たしか3つの設定だったはず)していたので 組み込んだらダメでした。 「アプリケーションの操作を不許可にするタイプ→モーダル」 との事ですので、ビットマップ表示の作業が操作に当たりエラーとなるのですね。 ビットマップを別ウィンドウで出すか 現在しってる方法じゃない方法でタブストップを実現させるかですね。 タブストップを使う方法は合ってたと思ったのですが勘違いかもしれません。 「タブストップはウィンドウの種類に限らず、設定してやると使えたような気がします。」 頭の片隅に、コードを書いて実現させる方法を見た気がしますので もう一度、過去のテストの見直しと過去記事を探検してみます。 またお暇な時にでもお気づきの点がありましたら、どうぞ助け舟をよろしくお願いします。 一先ずこの回答で解ったことでアタックしてみます。ありがとうございます。 |
作成者: | kobo [ 2008年11月21日(金) 20:13 ] |
記事の件名: | 文字列を扱うとエラー な訳ないのに |
いろいろ試していますが lstrcpyなど、文字列を扱っている部分でアクセス違反が生じます。 んな訳ないんですけどねぇ。 別に小さなpj作って試すと、大丈夫なのです。 ますます訳わからんorz 試しのCodeはコピペで作ったので、本体となんら変わりないのに。 困りました。ただ、タブストップさせたいだけなのに。 モーダル時にやっちゃいけない処理とかあるんでしょうか? |
作成者: | kobo [ 2008年11月21日(金) 20:42 ] |
記事の件名: | 連続投稿すいません |
試しの短いコードでもエラーを出せました。 どうも、プロシージャ内でグローバル領域で宣言した変数を 扱おうとするとエラーが出るようです。 たぶん常識範囲の間違いなのでしょうが、小生にはさっぱりです。 とりあえずは、コードをいじくりまわしてグローバル領域で変数を宣言しなくてもよいコードに できるのかな・・・・・・がんばってみます |
作成者: | konisi [ 2008年11月21日(金) 22:53 ] |
記事の件名: | |
>lstrcpyなど、文字列を扱っている部分でアクセス違反が生じます。 生成される文字列を格納するのに十分な領域をあらかじめ割り当てていますか? >どうも、プロシージャ内でグローバル領域で宣言した変数を 扱おうとするとエラーが出るようです。 グローバル変数はいつ初期化していますか? 短いコードを掲載できるなら、何が原因か分かるかもしれません。 |
作成者: | 7 [ 2008年11月21日(金) 23:05 ] |
記事の件名: | Re: 連続投稿すいません |
> lstrcpyなど、文字列を扱っている部分でアクセス違反が生じます。 > んな訳ないんですけどねぇ。 先に書いた、「たまにエラーの原因となるコードと全然関係ない箇所を強調表示」というのも、メモリ操作してると多発する現象ですね。 > どうも、プロシージャ内でグローバル領域で宣言した変数を > 扱おうとするとエラーが出るようです。 おそらくメモリが確保される前に、空のグローバル変数をlstrcpy()関数で弄っちゃったからエラーになったんだと思います。 グローバル変数を使わない方法は以下のようになります。(動くから良いやレベルなので罠があるかも) コード: ' メインウィンドウのコマンドボタン1を押すと、モーダルダイアログを表示 Sub MainWnd_CommandButton1_Click() Dim lpStr As LPSTR ' モーダルダイアログで割り当てたポインタを受け取る lpStr=DialogBox(hMainWnd,"SubWnd") MessageBox(hMainWnd,lpStr,"おkおk",MB_OK) ' 解放しましょう free(lpStr) End Sub ' モーダルダイアログのコマンドボタン1を押すと、メモリを確保し文字列を代入 Sub SubWnd_CommandButton1_Click() Dim lpStr As LPSTR ' 確保しましょう lpStr=malloc(256) lstrcpy(lpStr,"aiueokakikukeko") ' モーダルダイアログで割り当てたポインタを渡す EndDialog(hSubWnd,lpStr) End Sub |
作成者: | kobo [ 2008年11月22日(土) 19:47 ] |
記事の件名: | 短いコード載せるの忘れてました。 |
konisi様 7様 いつもありがとうございます。 領域確保は一応+100とか余分に取ってみましたがダメでした。 グローバル変数は冒頭の ' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。 の直下でしています。 以下、コードを短いコードを載せます。 dim cd as string cd ="test" をconst cd="test"にすると動きました。 理由がわかりません。N88の知識ベースの私には同意義に見えるのですが・・ 本チャンの長いコードの方は、お借りした方法でなんとか動きました。 ですが動く理由もさっぱりです。 もちろん cdをstringではなく、同じ場所でBytePtrで領域も確保して用意してもやっぱりエラーです。 dim cd as string cd ="test"> const cd="test"が原因なのでしょうか(?д?) コード: '----------------------------------------------------------------------------- ' イベント プロシージャ '----------------------------------------------------------------------------- ' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。 ' ウィンドウ ハンドル: hMainWnd ' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。 DialogBox(0,"MainWnd") dim cd as string cd ="test" '----------------------------------------------------------------------------- ' ウィンドウメッセージを処理するためのコールバック関数 Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord ' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。 ' イベントプロシージャの呼び出しを行います。 MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam) End Function '----------------------------------------------------------------------------- ' ここから下は、イベントプロシージャを記述するための領域になります。 Sub MainWnd_Destroy() booktest_DestroyObjects() PostQuitMessage(0) End Sub Sub MainWnd_CommandButton1_Click() fp(gtdata()) End Sub Function gtdata() as String dim textA as BytePtr dim textC as BytePtr dim lenA as long dim lenB as long dim hEdit as HWND hEdit=GetDlgItem(hMainWnd,EditBox1) lenA=GetWindowTextLength(hEdit) textA=calloc(lenA) GetWindowText(hEdit,textA,lenA) lenB=lstrlen(cd) textC=calloc(lenA+lenB+1) lstrcat(textC,textA) lstrcat(textC,cd) gtdata=textC free(textA) free(textC) End Function Sub fp(text as BytePtr) as byte dim hEdit as HWND dim length as long hEdit=GetDlgItem(hMainWnd,EditBox3) 'テキスト データの長さを取得 length=GetWindowTextLength(hEdit) 'すべての部分を選択する SendMessage(hEdit,EM_SETSEL,0,length) SendMessage(GetDlgItem(hMainWnd,hEdit), WM_CUT, 0, 0) SendMessage(hEdit, WM_SETTEXT, 0, text) End Sub |
作成者: | kobo [ 2008年11月22日(土) 19:51 ] |
記事の件名: | 追記です。 |
「ですが動く理由もさっぱりです。」 のくだりは、「const に換えると何故動くのか解りません」です。 国語も勉強し直しかな・・・ |
作成者: | konisi [ 2008年11月23日(日) 10:49 ] |
記事の件名: | |
そのcd="test"って実行されてないかも。 コード: Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) cd="test" End Sub又は コード: Dim cd="test" As Stringとすれば動くと思う。 ついでに・・・ ここをクリックすると省略された文章が表示されます [ここをクリックすると内容が表示されます]
gtdata関数内の コード: gtdata=textCは コード: gtdata=MakeStr(textC)にした方がいいと思う。 コード: textA=calloc(lenA)は コード: textA=calloc(lenA+1)にしないと終端の0が入らない。 コード: Sub fp(text as BytePtr) as byteの最後のas byteは不要。 コード: lenB=lstrlen(cd)と コード: lstrcat(textC,cd)と コード: fp(gtdata())は コード: lenB=lstrlen(StrPtr(cd))みたいにStrPtrでString型の値を括ったほうがいいと思う。 AB3系だと文字列操作関連のこの手のバグは大抵上手く動いちまうんだけど・・・ |
作成者: | kobo [ 2008年11月23日(日) 17:24 ] |
記事の件名: | 勉強部屋 |
「そのcd="test"って実行されてないかも。」 目から鱗です。 あそこに書いておけば設定されると思っていました。 「gtdata関数内の~中略~にした方がいいと思う。」 ポインタだけ渡して処理を減らそうと・・・ ・・・考えたら呼び出された関数内で宣言してるから外にポインタを 渡してもその内容は保障されないですよね。 それなら呼び出す関数側で宣言して渡さないとダメって今気付きました。 「前略~にしないと終端の0が入らない。」 これ、結構なやんだんです。 結合される側は終端は0が要るというのは解るんですけど 結合する側は要るのか?って実験では上手くいったので 要らないかなと思ったのですが要るんですね。 後述も勉強になります。 lstrcat(textC,"ABCD") という記述を見たことがあり、それならlstrcat(textC,cd)でも 同じことだと思っていました。 strptrでちゃんと処理してあげないとダメなんですね。 なんとかString型から脱皮しようともがいている状態でして。 ここの掲示板とエディターのヘルプだけが教科書なので とても助かっています。 これからもよろしくお願いします。 ありがとうございました^^ |
作成者: | konisi [ 2008年11月23日(日) 17:47 ] |
記事の件名: | |
引用: 「gtdata関数内の~中略~にした方がいいと思う。」 外にポインタを渡したのが警告の理由ではなく、その直後に(使用前に)freeしているので、ポインタだけ渡して処理を減らそうと・・・ ・・・考えたら呼び出された関数内で宣言してるから外にポインタを 渡してもその内容は保障されないですよね。 それなら呼び出す関数側で宣言して渡さないとダメって今気付きました。 このあとどこかでcallocか何かが実行された時に文字が読み込めなくなる可能性があります。 一方callocで得た領域は(ポインタ型の)変数に入れる限りは「ただの値」なので 関数の外に持ち出せます。(外でfreeし忘れるとメモリリークで泣けますが。) #String型は宣言や代入と同時に確保やら解放やらやってくれるあたり、判るまで分かりにくい・・・。 ゼロ終端文字を扱う限り、終端の0の分の領域は必要だと思います。 ヘルプのGetWindowTextLengthを見ると、 引用: 戻り値 と書いてあるので、GetWindowTextで全ての文字を受け取る場合は終端の0が入りきりません。関数が成功すると、取得したテキストのバイト数(終端の NULL 文字を除く)が返ります。 関数が失敗すると、0 が返ります。 ところでGetWindowTextの方ですが、 引用: 定義 となっているので、この値も+1しておいた方がいいかもしれません。(省略) nMaxCount lpString バッファのサイズ(終端の NULL 文字を含む)をバイト単位で指定します。 今回はcallocで確保しているので必要かどうか結構怪しいんですが。 |
作成者: | kobo [ 2008年11月30日(日) 16:29 ] |
記事の件名: | 結果報告 |
7様 konishi様 お久しぶりです。 結果報告します。 モーダルダイアログで設定したウィンドウにビットマップを載せれました。 原因 >>そのcd="test"って実行されてないかも。 これが全てでした。 何事もなかったかの様に、ビットマップで飾られたウィンドウ上の エディットボックスをTABでカーソルが華麗に行き来しました。 まだまだ、解らないことがありまた頼ることもありますがよろしくおねがいします。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |