ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月29日(金) 03:57

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 13 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2008年11月19日(水) 23:35 
たまにお世話になっていますkoboです。
こんばんは。

首記の通りなのですが、ヘルプセンターから引用したビットマップを表示するプログラムと
タブストップを使おうとモーダルダイアログにすると
あちこちでエラーが出ます。
主にビットマップを表示する為のコードから出ています。

各個での使用は出来ていますがモーダルダイアログにするとエラーがでます。
さて、これはこう言うものなのでしょうか?出来るはずなのでしょうか?
そもそもモーダルダイアログの意味も解らず、これにすればタブストップが使えるくらいにしか理解できていません。

やたらと長ったらしいコードなので載せる訳にもいかず、困った質問になりますが
なにか思い当たる節のある方に助け舟を出して頂きたく陳情にあがりました。

Ver4.24 OSはXPsp3です。


通報する
ページトップ
   
投稿記事Posted: 2008年11月20日(木) 19:46 
オフライン

登録日時: 2005年5月31日(火) 18:51
記事: 473
お住まい: 新潟県
> 首記の通りなのですが、ヘルプセンターから引用したビットマップを表示するプログラムと
> タブストップを使おうとモーダルダイアログにすると
> あちこちでエラーが出ます。
> 主にビットマップを表示する為のコードから出ています。
>
> 各個での使用は出来ていますがモーダルダイアログにするとエラーがでます。
> さて、これはこう言うものなのでしょうか?出来るはずなのでしょうか?
試す所か、ActiveBasicの起動すらもしてないんですが、もしかするとビットマップとは関係ないエラーかもしれませんね。
たまにエラーの原因となるコードと全然関係ない箇所を強調表示してくれます(笑)
もし、メインウィンドウをモーダルダイアログにしてるなら、たしかそれはダメだった気がしますし、それはビットマップとは関係ありません。

> そもそもモーダルダイアログの意味も解らず、これにすればタブストップが使えるくらいにしか理解できていません。
モーダルダイアログは、それを表示したアプリケーションの操作を不許可にするタイプのダイアログですね。
オプション設定のダイアログなんかに使われているのをよく見かけます。
たまに、テキストエディタで検索・置換ダイアログをモーダルにしてるのがあって、不便に思うこともあります(笑)

タブストップはウィンドウの種類に限らず、設定してやると使えたような気がします。

> やたらと長ったらしいコードなので載せる訳にもいかず、困った質問になりますが
とりあえず、コードが無いならもうちょっと状況を詳しくお願いします。
  • 1.メインウィンドウをモーダルダイアログにしているのか?
    2.モーダルダイアログを追加しているのか?
    3.ノーマルなメインウィンドウにビットマップを表示しているのか?
    4.モーダルなメインウィンドウにビットマップを表示しているのか?
    5.追加したモーダルダイアログにビットマップを表示しているのか?
疑問です。


通報する
ページトップ
 記事の件名: ダイアログの種類
投稿記事Posted: 2008年11月20日(木) 21:45 
7様。連続回答ご苦労様です。そしてありがとうございます。

1.メインウィンドウをモーダルダイアログにしているのか?
2.モーダルダイアログを追加しているのか?
3.ノーマルなメインウィンドウにビットマップを表示しているのか?
4.モーダルなメインウィンドウにビットマップを表示しているのか?
5.追加したモーダルダイアログにビットマップを表示しているのか?

1.メインウィンドウにビットマップを表示するコードをノーマルで作成していて
モーダルに変えるとエラーになりました。
2.メインウィンドウのみを使用中です。追加はしていません。
3.しています。メインウィンドウがノーマルでそれにビットマップを表示しています。
4.できませんでした。メインウィンドウをモーダルに変更したらエラーになりました。
5.追加はしていません。

メインウィンドウをノーマルで作成していて、タブストップがあったほうが良いなと思い、
以前参考にした質問であった方法
(モーダルダイアログに設定・DialogBox(0,"MainWnd")を追加・タブストップにチェック)
をしてテストに成功(たしか3つの設定だったはず)していたので
組み込んだらダメでした。

「アプリケーションの操作を不許可にするタイプ→モーダル」
との事ですので、ビットマップ表示の作業が操作に当たりエラーとなるのですね。
ビットマップを別ウィンドウで出すか
現在しってる方法じゃない方法でタブストップを実現させるかですね。

タブストップを使う方法は合ってたと思ったのですが勘違いかもしれません。
「タブストップはウィンドウの種類に限らず、設定してやると使えたような気がします。」
頭の片隅に、コードを書いて実現させる方法を見た気がしますので
もう一度、過去のテストの見直しと過去記事を探検してみます。

またお暇な時にでもお気づきの点がありましたら、どうぞ助け舟をよろしくお願いします。
一先ずこの回答で解ったことでアタックしてみます。ありがとうございます。


通報する
ページトップ
   
投稿記事Posted: 2008年11月21日(金) 20:13 
いろいろ試していますが
lstrcpyなど、文字列を扱っている部分でアクセス違反が生じます。
んな訳ないんですけどねぇ。

別に小さなpj作って試すと、大丈夫なのです。

ますます訳わからんorz

試しのCodeはコピペで作ったので、本体となんら変わりないのに。
困りました。ただ、タブストップさせたいだけなのに。

モーダル時にやっちゃいけない処理とかあるんでしょうか?


通報する
ページトップ
   
 記事の件名: 連続投稿すいません
投稿記事Posted: 2008年11月21日(金) 20:42 
試しの短いコードでもエラーを出せました。
どうも、プロシージャ内でグローバル領域で宣言した変数を
扱おうとするとエラーが出るようです。
たぶん常識範囲の間違いなのでしょうが、小生にはさっぱりです。

とりあえずは、コードをいじくりまわしてグローバル領域で変数を宣言しなくてもよいコードに
できるのかな・・・・・・がんばってみます


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2008年11月21日(金) 22:53 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
お住まい: 埼玉県東松山市
>lstrcpyなど、文字列を扱っている部分でアクセス違反が生じます。
生成される文字列を格納するのに十分な領域をあらかじめ割り当てていますか?
>どうも、プロシージャ内でグローバル領域で宣言した変数を 扱おうとするとエラーが出るようです。
グローバル変数はいつ初期化していますか?

短いコードを掲載できるなら、何が原因か分かるかもしれません。

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

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


通報する
ページトップ
投稿記事Posted: 2008年11月21日(金) 23:05 
オフライン

登録日時: 2005年5月31日(火) 18:51
記事: 473
お住まい: 新潟県
> 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


通報する
ページトップ
投稿記事Posted: 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


通報する
ページトップ
   
 記事の件名: 追記です。
投稿記事Posted: 2008年11月22日(土) 19:51 
「ですが動く理由もさっぱりです。」
のくだりは、「const に換えると何故動くのか解りません」です。
国語も勉強し直しかな・・・


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2008年11月23日(日) 10:49 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
お住まい: 埼玉県東松山市
そのcd="test"って実行されてないかも。
コード:
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
    cd="test"
End Sub
又は
コード:
Dim cd="test" As String
とすれば動くと思う。

ついでに・・・

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

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


通報する
ページトップ
 記事の件名: 勉強部屋
投稿記事Posted: 2008年11月23日(日) 17:24 
「そのcd="test"って実行されてないかも。」
目から鱗です。
あそこに書いておけば設定されると思っていました。

「gtdata関数内の~中略~にした方がいいと思う。」
ポインタだけ渡して処理を減らそうと・・・
・・・考えたら呼び出された関数内で宣言してるから外にポインタを
渡してもその内容は保障されないですよね。
それなら呼び出す関数側で宣言して渡さないとダメって今気付きました。

「前略~にしないと終端の0が入らない。」
これ、結構なやんだんです。
結合される側は終端は0が要るというのは解るんですけど
結合する側は要るのか?って実験では上手くいったので
要らないかなと思ったのですが要るんですね。

後述も勉強になります。
lstrcat(textC,"ABCD")
という記述を見たことがあり、それならlstrcat(textC,cd)でも
同じことだと思っていました。
strptrでちゃんと処理してあげないとダメなんですね。
なんとかString型から脱皮しようともがいている状態でして。
ここの掲示板とエディターのヘルプだけが教科書なので
とても助かっています。
これからもよろしくお願いします。
ありがとうございました^^


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2008年11月23日(日) 17:47 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
お住まい: 埼玉県東松山市
引用:
「gtdata関数内の~中略~にした方がいいと思う。」
ポインタだけ渡して処理を減らそうと・・・
・・・考えたら呼び出された関数内で宣言してるから外にポインタを
渡してもその内容は保障されないですよね。
それなら呼び出す関数側で宣言して渡さないとダメって今気付きました。
外にポインタを渡したのが警告の理由ではなく、その直後に(使用前に)freeしているので、
このあとどこかでcallocか何かが実行された時に文字が読み込めなくなる可能性があります。
一方callocで得た領域は(ポインタ型の)変数に入れる限りは「ただの値」なので
関数の外に持ち出せます。(外でfreeし忘れるとメモリリークで泣けますが。)
#String型は宣言や代入と同時に確保やら解放やらやってくれるあたり、判るまで分かりにくい・・・。

ゼロ終端文字を扱う限り、終端の0の分の領域は必要だと思います。
ヘルプのGetWindowTextLengthを見ると、
引用:
戻り値

関数が成功すると、取得したテキストのバイト数(終端の NULL 文字を除く)が返ります。
関数が失敗すると、0 が返ります。
と書いてあるので、GetWindowTextで全ての文字を受け取る場合は終端の0が入りきりません。
ところでGetWindowTextの方ですが、
引用:
定義

(省略)

nMaxCount
lpString バッファのサイズ(終端の NULL 文字を含む)をバイト単位で指定します。
となっているので、この値も+1しておいた方がいいかもしれません。
今回はcallocで確保しているので必要かどうか結構怪しいんですが。

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

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


通報する
ページトップ
 記事の件名: 結果報告
投稿記事Posted: 2008年11月30日(日) 16:29 
7様 konishi様 お久しぶりです。

結果報告します。

モーダルダイアログで設定したウィンドウにビットマップを載せれました。

原因

>>そのcd="test"って実行されてないかも。
これが全てでした。

何事もなかったかの様に、ビットマップで飾られたウィンドウ上の
エディットボックスをTABでカーソルが華麗に行き来しました。

まだまだ、解らないことがありまた頼ることもありますがよろしくおねがいします。


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

全ての表示時間は UTC+09:00 です


オンラインデータ

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


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

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