モーダルダイアログにするとビットマップ表示ができない
モーダルダイアログにするとビットマップ表示ができない
たまにお世話になっていますkoboです。
こんばんは。
首記の通りなのですが、ヘルプセンターから引用したビットマップを表示するプログラムと
タブストップを使おうとモーダルダイアログにすると
あちこちでエラーが出ます。
主にビットマップを表示する為のコードから出ています。
各個での使用は出来ていますがモーダルダイアログにするとエラーがでます。
さて、これはこう言うものなのでしょうか?出来るはずなのでしょうか?
そもそもモーダルダイアログの意味も解らず、これにすればタブストップが使えるくらいにしか理解できていません。
やたらと長ったらしいコードなので載せる訳にもいかず、困った質問になりますが
なにか思い当たる節のある方に助け舟を出して頂きたく陳情にあがりました。
Ver4.24 OSはXPsp3です。
こんばんは。
首記の通りなのですが、ヘルプセンターから引用したビットマップを表示するプログラムと
タブストップを使おうとモーダルダイアログにすると
あちこちでエラーが出ます。
主にビットマップを表示する為のコードから出ています。
各個での使用は出来ていますがモーダルダイアログにするとエラーがでます。
さて、これはこう言うものなのでしょうか?出来るはずなのでしょうか?
そもそもモーダルダイアログの意味も解らず、これにすればタブストップが使えるくらいにしか理解できていません。
やたらと長ったらしいコードなので載せる訳にもいかず、困った質問になりますが
なにか思い当たる節のある方に助け舟を出して頂きたく陳情にあがりました。
Ver4.24 OSはXPsp3です。
Re: モーダルダイアログにするとビットマップ表示ができない
> 首記の通りなのですが、ヘルプセンターから引用したビットマップを表示するプログラムと
> タブストップを使おうとモーダルダイアログにすると
> あちこちでエラーが出ます。
> 主にビットマップを表示する為のコードから出ています。
>
> 各個での使用は出来ていますがモーダルダイアログにするとエラーがでます。
> さて、これはこう言うものなのでしょうか?出来るはずなのでしょうか?
試す所か、ActiveBasicの起動すらもしてないんですが、もしかするとビットマップとは関係ないエラーかもしれませんね。
たまにエラーの原因となるコードと全然関係ない箇所を強調表示してくれます(笑)
もし、メインウィンドウをモーダルダイアログにしてるなら、たしかそれはダメだった気がしますし、それはビットマップとは関係ありません。
> そもそもモーダルダイアログの意味も解らず、これにすればタブストップが使えるくらいにしか理解できていません。
モーダルダイアログは、それを表示したアプリケーションの操作を不許可にするタイプのダイアログですね。
オプション設定のダイアログなんかに使われているのをよく見かけます。
たまに、テキストエディタで検索・置換ダイアログをモーダルにしてるのがあって、不便に思うこともあります(笑)
タブストップはウィンドウの種類に限らず、設定してやると使えたような気がします。
> やたらと長ったらしいコードなので載せる訳にもいかず、困った質問になりますが
とりあえず、コードが無いならもうちょっと状況を詳しくお願いします。
> タブストップを使おうとモーダルダイアログにすると
> あちこちでエラーが出ます。
> 主にビットマップを表示する為のコードから出ています。
>
> 各個での使用は出来ていますがモーダルダイアログにするとエラーがでます。
> さて、これはこう言うものなのでしょうか?出来るはずなのでしょうか?
試す所か、ActiveBasicの起動すらもしてないんですが、もしかするとビットマップとは関係ないエラーかもしれませんね。
たまにエラーの原因となるコードと全然関係ない箇所を強調表示してくれます(笑)
もし、メインウィンドウをモーダルダイアログにしてるなら、たしかそれはダメだった気がしますし、それはビットマップとは関係ありません。
> そもそもモーダルダイアログの意味も解らず、これにすればタブストップが使えるくらいにしか理解できていません。
モーダルダイアログは、それを表示したアプリケーションの操作を不許可にするタイプのダイアログですね。
オプション設定のダイアログなんかに使われているのをよく見かけます。
たまに、テキストエディタで検索・置換ダイアログをモーダルにしてるのがあって、不便に思うこともあります(笑)
タブストップはウィンドウの種類に限らず、設定してやると使えたような気がします。
> やたらと長ったらしいコードなので載せる訳にもいかず、困った質問になりますが
とりあえず、コードが無いならもうちょっと状況を詳しくお願いします。
- 1.メインウィンドウをモーダルダイアログにしているのか?
2.モーダルダイアログを追加しているのか?
3.ノーマルなメインウィンドウにビットマップを表示しているのか?
4.モーダルなメインウィンドウにビットマップを表示しているのか?
5.追加したモーダルダイアログにビットマップを表示しているのか?
ダイアログの種類
7様。連続回答ご苦労様です。そしてありがとうございます。
1.メインウィンドウをモーダルダイアログにしているのか?
2.モーダルダイアログを追加しているのか?
3.ノーマルなメインウィンドウにビットマップを表示しているのか?
4.モーダルなメインウィンドウにビットマップを表示しているのか?
5.追加したモーダルダイアログにビットマップを表示しているのか?
1.メインウィンドウにビットマップを表示するコードをノーマルで作成していて
モーダルに変えるとエラーになりました。
2.メインウィンドウのみを使用中です。追加はしていません。
3.しています。メインウィンドウがノーマルでそれにビットマップを表示しています。
4.できませんでした。メインウィンドウをモーダルに変更したらエラーになりました。
5.追加はしていません。
メインウィンドウをノーマルで作成していて、タブストップがあったほうが良いなと思い、
以前参考にした質問であった方法
(モーダルダイアログに設定・DialogBox(0,"MainWnd")を追加・タブストップにチェック)
をしてテストに成功(たしか3つの設定だったはず)していたので
組み込んだらダメでした。
「アプリケーションの操作を不許可にするタイプ→モーダル」
との事ですので、ビットマップ表示の作業が操作に当たりエラーとなるのですね。
ビットマップを別ウィンドウで出すか
現在しってる方法じゃない方法でタブストップを実現させるかですね。
タブストップを使う方法は合ってたと思ったのですが勘違いかもしれません。
「タブストップはウィンドウの種類に限らず、設定してやると使えたような気がします。」
頭の片隅に、コードを書いて実現させる方法を見た気がしますので
もう一度、過去のテストの見直しと過去記事を探検してみます。
またお暇な時にでもお気づきの点がありましたら、どうぞ助け舟をよろしくお願いします。
一先ずこの回答で解ったことでアタックしてみます。ありがとうございます。
1.メインウィンドウをモーダルダイアログにしているのか?
2.モーダルダイアログを追加しているのか?
3.ノーマルなメインウィンドウにビットマップを表示しているのか?
4.モーダルなメインウィンドウにビットマップを表示しているのか?
5.追加したモーダルダイアログにビットマップを表示しているのか?
1.メインウィンドウにビットマップを表示するコードをノーマルで作成していて
モーダルに変えるとエラーになりました。
2.メインウィンドウのみを使用中です。追加はしていません。
3.しています。メインウィンドウがノーマルでそれにビットマップを表示しています。
4.できませんでした。メインウィンドウをモーダルに変更したらエラーになりました。
5.追加はしていません。
メインウィンドウをノーマルで作成していて、タブストップがあったほうが良いなと思い、
以前参考にした質問であった方法
(モーダルダイアログに設定・DialogBox(0,"MainWnd")を追加・タブストップにチェック)
をしてテストに成功(たしか3つの設定だったはず)していたので
組み込んだらダメでした。
「アプリケーションの操作を不許可にするタイプ→モーダル」
との事ですので、ビットマップ表示の作業が操作に当たりエラーとなるのですね。
ビットマップを別ウィンドウで出すか
現在しってる方法じゃない方法でタブストップを実現させるかですね。
タブストップを使う方法は合ってたと思ったのですが勘違いかもしれません。
「タブストップはウィンドウの種類に限らず、設定してやると使えたような気がします。」
頭の片隅に、コードを書いて実現させる方法を見た気がしますので
もう一度、過去のテストの見直しと過去記事を探検してみます。
またお暇な時にでもお気づきの点がありましたら、どうぞ助け舟をよろしくお願いします。
一先ずこの回答で解ったことでアタックしてみます。ありがとうございます。
文字列を扱うとエラー な訳ないのに
いろいろ試していますが
lstrcpyなど、文字列を扱っている部分でアクセス違反が生じます。
んな訳ないんですけどねぇ。
別に小さなpj作って試すと、大丈夫なのです。
ますます訳わからんorz
試しのCodeはコピペで作ったので、本体となんら変わりないのに。
困りました。ただ、タブストップさせたいだけなのに。
モーダル時にやっちゃいけない処理とかあるんでしょうか?
lstrcpyなど、文字列を扱っている部分でアクセス違反が生じます。
んな訳ないんですけどねぇ。
別に小さなpj作って試すと、大丈夫なのです。
ますます訳わからんorz
試しのCodeはコピペで作ったので、本体となんら変わりないのに。
困りました。ただ、タブストップさせたいだけなのに。
モーダル時にやっちゃいけない処理とかあるんでしょうか?
>lstrcpyなど、文字列を扱っている部分でアクセス違反が生じます。
生成される文字列を格納するのに十分な領域をあらかじめ割り当てていますか?
>どうも、プロシージャ内でグローバル領域で宣言した変数を 扱おうとするとエラーが出るようです。
グローバル変数はいつ初期化していますか?
短いコードを掲載できるなら、何が原因か分かるかもしれません。
生成される文字列を格納するのに十分な領域をあらかじめ割り当てていますか?
>どうも、プロシージャ内でグローバル領域で宣言した変数を 扱おうとするとエラーが出るようです。
グローバル変数はいつ初期化していますか?
短いコードを掲載できるなら、何が原因か分かるかもしれません。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
Re: 連続投稿すいません
> lstrcpyなど、文字列を扱っている部分でアクセス違反が生じます。
> んな訳ないんですけどねぇ。
先に書いた、「たまにエラーの原因となるコードと全然関係ない箇所を強調表示」というのも、メモリ操作してると多発する現象ですね。
> どうも、プロシージャ内でグローバル領域で宣言した変数を
> 扱おうとするとエラーが出るようです。
おそらくメモリが確保される前に、空のグローバル変数を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
短いコード載せるの忘れてました。
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"が原因なのでしょうか(?д?)
領域確保は一応+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
そのcd="test"って実行されてないかも。又はとすれば動くと思う。
ついでに・・・
コード: 全て選択
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
cd="test"
End Sub
コード: 全て選択
Dim cd="test" As String
ついでに・・・
ここをクリックすると省略された文章が表示されます [ここをクリックすると内容が表示されます]
gtdata関数内のはにした方がいいと思う。
はにしないと終端の0が入らない。
の最後のas byteは不要。
ととはみたいにStrPtrでString型の値を括ったほうがいいと思う。
AB3系だと文字列操作関連のこの手のバグは大抵上手く動いちまうんだけど・・・
コード: 全て選択
gtdata=textC
コード: 全て選択
gtdata=MakeStr(textC)
コード: 全て選択
textA=calloc(lenA)
コード: 全て選択
textA=calloc(lenA+1)
コード: 全て選択
Sub fp(text as BytePtr) as byte
コード: 全て選択
lenB=lstrlen(cd)
コード: 全て選択
lstrcat(textC,cd)
コード: 全て選択
fp(gtdata())
コード: 全て選択
lenB=lstrlen(StrPtr(cd))
AB3系だと文字列操作関連のこの手のバグは大抵上手く動いちまうんだけど・・・
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
勉強部屋
「そのcd="test"って実行されてないかも。」
目から鱗です。
あそこに書いておけば設定されると思っていました。
「gtdata関数内の~中略~にした方がいいと思う。」
ポインタだけ渡して処理を減らそうと・・・
・・・考えたら呼び出された関数内で宣言してるから外にポインタを
渡してもその内容は保障されないですよね。
それなら呼び出す関数側で宣言して渡さないとダメって今気付きました。
「前略~にしないと終端の0が入らない。」
これ、結構なやんだんです。
結合される側は終端は0が要るというのは解るんですけど
結合する側は要るのか?って実験では上手くいったので
要らないかなと思ったのですが要るんですね。
後述も勉強になります。
lstrcat(textC,"ABCD")
という記述を見たことがあり、それならlstrcat(textC,cd)でも
同じことだと思っていました。
strptrでちゃんと処理してあげないとダメなんですね。
なんとかString型から脱皮しようともがいている状態でして。
ここの掲示板とエディターのヘルプだけが教科書なので
とても助かっています。
これからもよろしくお願いします。
ありがとうございました^^
目から鱗です。
あそこに書いておけば設定されると思っていました。
「gtdata関数内の~中略~にした方がいいと思う。」
ポインタだけ渡して処理を減らそうと・・・
・・・考えたら呼び出された関数内で宣言してるから外にポインタを
渡してもその内容は保障されないですよね。
それなら呼び出す関数側で宣言して渡さないとダメって今気付きました。
「前略~にしないと終端の0が入らない。」
これ、結構なやんだんです。
結合される側は終端は0が要るというのは解るんですけど
結合する側は要るのか?って実験では上手くいったので
要らないかなと思ったのですが要るんですね。
後述も勉強になります。
lstrcat(textC,"ABCD")
という記述を見たことがあり、それならlstrcat(textC,cd)でも
同じことだと思っていました。
strptrでちゃんと処理してあげないとダメなんですね。
なんとかString型から脱皮しようともがいている状態でして。
ここの掲示板とエディターのヘルプだけが教科書なので
とても助かっています。
これからもよろしくお願いします。
ありがとうございました^^
外にポインタを渡したのが警告の理由ではなく、その直後に(使用前に)freeしているので、kobo さんが書きました:「gtdata関数内の~中略~にした方がいいと思う。」
ポインタだけ渡して処理を減らそうと・・・
・・・考えたら呼び出された関数内で宣言してるから外にポインタを
渡してもその内容は保障されないですよね。
それなら呼び出す関数側で宣言して渡さないとダメって今気付きました。
このあとどこかでcallocか何かが実行された時に文字が読み込めなくなる可能性があります。
一方callocで得た領域は(ポインタ型の)変数に入れる限りは「ただの値」なので
関数の外に持ち出せます。(外でfreeし忘れるとメモリリークで泣けますが。)
#String型は宣言や代入と同時に確保やら解放やらやってくれるあたり、判るまで分かりにくい・・・。
ゼロ終端文字を扱う限り、終端の0の分の領域は必要だと思います。
ヘルプのGetWindowTextLengthを見ると、
と書いてあるので、GetWindowTextで全ての文字を受け取る場合は終端の0が入りきりません。戻り値
関数が成功すると、取得したテキストのバイト数(終端の NULL 文字を除く)が返ります。
関数が失敗すると、0 が返ります。
ところでGetWindowTextの方ですが、
となっているので、この値も+1しておいた方がいいかもしれません。定義
(省略)
nMaxCount
lpString バッファのサイズ(終端の NULL 文字を含む)をバイト単位で指定します。
今回はcallocで確保しているので必要かどうか結構怪しいんですが。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。