ページ 1 / 1
デバッグでOK、リリースで表示文字がおかしい?
Posted: 2005年11月24日(木) 12:19
by ポテト
たびたびすいません。
デバッグコンパイルでは正常に表示されるのですが、
リリースコンパイルではおかしいのです。
WindowsXP SP2
AB41001~AB41103
リースコンパイル時
起動後 ms_cnt = 0 のときは、マウスを動かしても表示されているのですが
ms_cnt = 1 のとき、マウスを動かすと表示がおかしくなってしまいます。
宜しくお願いします。
コード: 全て選択
Dim mouse_1X As Double
Dim mouse_1Y As Double
Dim mouse_2X As Double
Dim mouse_2Y As Double
Dim fontname = "MS ゴシック" As BytePtr
Dim moldx As Single
Dim moldy As Single
'--------------------------------------------------------------------
Sub MainWnd_MouseMove(flags As Long, x As Long, y As Long)
Dim ms1x As String
Dim ms1y As String
Dim ms2x As String
Dim ms2y As String
If kind_b >= 1 Then '描画時
Mouse_Near_Blt(moldx, moldy)'旧XY位置にマウスの近くに
貼り付け(位置情報)
If ms_cnt = 0 Then '描画前
ms1x = ms1x + "X="
ms1x = ms1x + Double_To_String(mouse_1X, 10, 3)'As BytePtr
ms1y = ms1y + "Y="
ms1y = ms1y + Double_To_String(mouse_1Y, 10, 3)
Text_Dsp(x, y-40, 1, fontname, 12, 0, ms1x)
Text_Dsp(x, y-27, 1, fontname, 12, 0, ms1y)
Else '描画中
ms2x = ms2x + "X="
ms2x = ms2x + Double_To_String(mouse_2X - mouse_1X, 10, 3)
ms2y = ms2y + "Y="
ms2y = ms2y + Double_To_String(mouse_2Y - mouse_1Y, 10, 3)
Text_Dsp(x, y-40, 3, fontname, 12, 0, ms2x)
Text_Dsp(x, y-27, 3, fontname, 12, 0, ms2y)
End If
End If
moldx = x '前のマウス位置保存
moldy = y
End Sub
Posted: 2005年11月24日(木) 18:40
by マティ
以下の変数はどの様に指定しているのでしょうか?
mouse_1X
mouse_1Y
mouse_2X
mouse_2Y
とりあえず、宣言を行うさいに初期化を行うことをお勧めします。
PS.ActiveBasic4.11.xでコンパイルが通るとは思えないのですが・・・
Posted: 2005年11月24日(木) 22:20
by ポテト
> 以下の変数はどの様に指定しているのでしょうか?
> mouse_1X
> mouse_1Y
> mouse_2X
> mouse_2Y
> とりあえず、宣言を行うさいに初期化を行うことをお勧めします。
>
> PS.ActiveBasic4.11.xでコンパイルが通るとは思えないのですが・・・
マティさん、さっそく有難う御座います。
マウスクリックゼロ(ms_cnt=0) mouse_1X
mouse_1Y
マウスクリック一回目(ms_cnt>0) mouse_2X
mouse_2Y
には、起動時に5000+(マウス位置 / 10)が入っています。
どうやら、Double_To_String()に問題がありそうです。
しばらく考えてみます。
しかし、デバッグコンパイルは通るんですよね?
有難う御座いました。
Posted: 2005年11月24日(木) 23:01
by マティ
> マウスクリックゼロ(ms_cnt=0) mouse_1X
> mouse_1Y
> マウスクリック一回目(ms_cnt>0) mouse_2X
> mouse_2Y
分かりました。クリックイベントで変数を設定しているわけですね!
ところで、[ファイル名]_debug.exeと[ファイル名]_debug.mdlを削除して再度デバッグコンパイルできますか?
また、AB4をインストールしたフォルダーがActiveBasicならフォルダーを別名に変更して、再度最新版を展開するとどうなります。
お教え下さい。
私の環境では、AB4.11.03では以下のコードがコンパイルできないのです。
コード: 全て選択
Dim fontname = "MS ゴシック" As BytePtr
> どうやら、Double_To_String()に問題がありそうです。
開示可能であれば、
Double_To_Stringを調査しましょうか?
プライベートメッセージでもかまいませんよ!
Posted: 2005年11月25日(金) 06:42
by Uhsp
関係ないかも知れませんが calloc() lstrcpy() を頻繁に呼び出すコード
を記述するとデバッグ時は問題なく動作し
リリースされた物はMemoryReadErrorで停止してしまいます。
:使用方法が間違っているのかもしれませんが...。
Posted: 2005年11月25日(金) 08:14
by マティ
Uhspさん
calloc()で確保した領域を使用後は、必ずfree()で開放しますよね!それなら、calloc()は問題無いです。
lstrcpy()でデータを転送する際に、
①転送元のデータがNULL(0)で終わらない
②calloc()で確保した領域以上データを転送する
と、余分なデータを書き換える為、システムが不安定になる場合があります。
調査の方向
皆さんの環境(Ver4.11.03)では、以下のコードがコンパイル出来ますか?
コード: 全て選択
Dim fontname = "MS ゴシック" As BytePtr
ABは、デバッグコンパイルが正常にコンパイル出来た場合、ソースの一部を変更しない限り、再コンパイルしない仕様になっていると思います。
その為、旧バージョンで作成したデバッグモジュールがデバッグモードで動作し、リリースコンパイルを行うと、新バージョンでコンパイルしますので、コンパイル出来ないと予想しています。
もう一つの可能性
Text_Dsp、Double_To_Stringは
ポテトさんが作成した
ユーザDLLで、旧バージョンでコンパイルを行った。
新バージョンで呼び出しを行うと、データのアライメントがずれて、うまく動かない
Posted: 2005年11月25日(金) 08:43
by ポテト
> 私の環境では、AB4.11.03では以下のコードがコンパイルできないのです。
>
コード: 全て選択
Dim fontname = "MS ゴシック" As BytePtr
>
> > どうやら、Double_To_String()に問題がありそうです。
>
> 開示可能であれば、
Double_To_Stringを調査しましょうか?
> プライベートメッセージでもかまいませんよ!
大変失礼しました。
Dim fontname = "MS ゴシック" As BytePtr ではなくて、
MainWnd_Create()の中で
fontname = "MS ゴシック" で設定していました。
初心者で恥ずかしいけれど、Double_To_String()です。
内容は、だいぶ前に作ったので忘れました!
コード: 全て選択
'倍制度浮動小数点に符号と小数点を付け桁数を指定して文字列で返す
'Dbl=変換数値 cnt=桁 dot=小数点以下(5以下)
Function Double_To_String(Dbl As Double, cnt As Long,
dot As Integer) As BytePtr
Dim buffer[255] As Byte
Dim buf As BytePtr
Dim buf_hi As String
Dim buf_lo As String
Dim dec As Long
Dim sin As Long
If cnt > 15 Then
Double_To_String = "Error-Over15"
Exit Function
End If
buf = _ecvt(Dbl, cnt, dec, sin) '倍制度浮動小数点を文字列に変換
dec_b=dec
If dec_b > 0 Then '小数点位置
If sin = 1 Then '符号処理
lstrcpy(buffer, "-") '符号(-)を付ける
Else
lstrcpy(buffer, " ") '符号無し
End If
buf_hi = Left$(buf,dec_b) '小数点から上位を取得
lstrcat(buffer, buf_hi) '小数点から上位を表示
lstrcat(buffer, ".") '小数点を追加
buf_lo = Mid$(buf, dec_b+1, dot)'元のバッファーの小数点以下
lstrcat(buffer, buf_lo)
Else
If sin = 1 Then '符号処理
lstrcpy(buffer, "-") '符号(-)を付ける
Else
lstrcpy(buffer, " ") '符号無し
End If
lstrcat(buffer, "0.")
If dot > 5 Then dot=5
Select Case (dot) '小数点以下数
Case 1
If dec_b = 0 Then
buf_lo = Left$(buf,1)
End If
Case 2
If dec_b = 0 Then
buf_lo = Left$(buf,2)
End If
If dec_b = -1 Then
lstrcat(buffer, "0")
buf_lo = Left$(buf,1)
End If
Case 3
If dec_b = 0 Then
buf_lo = Left$(buf,3)
End If
If dec_b = -1 Then
lstrcat(buffer, "0")
buf_lo = Left$(buf,2)
End If
If dec_b = -2 Then
lstrcat(buffer, "00")
buf_lo = Left$(buf,1)
End If
Case 4
If dec_b = 0 Then
buf_lo = Left$(buf,4)
End If
If dec_b = -1 Then
lstrcat(buffer, "0")
buf_lo = Left$(buf,3)
End If
If dec_b = -2 Then
lstrcat(buffer, "00")
buf_lo = Left$(buf,2)
End If
If dec_b = -3 Then
lstrcat(buffer, "000")
buf_lo = Left$(buf,1)
End If
Case 5
If dec_b = 0 Then
buf_lo = Left$(buf,5)
End If
If dec_b = -1 Then
lstrcat(buffer, "0")
buf_lo = Left$(buf,4)
End If
If dec_b = -2 Then
lstrcat(buffer, "00")
buf_lo = Left$(buf,3)
End If
If dec_b = -3 Then
lstrcat(buffer, "000")
buf_lo = Left$(buf,2)
End If
If dec_b = -4 Then
lstrcat(buffer, "0000")
buf_lo = Left$(buf,1)
End If
End Select
lstrcat(buffer, buf_lo)
End If
Double_To_String = buffer
End Function
Posted: 2005年11月25日(金) 09:06
by ポテト
またまた失礼しました。
一部書きぬけてしまいました。
コード: 全て選択
Function Double_To_String(Dbl As Double, cnt As Long,
dot As Integer) As BytePtr
Dim buffer[255] As Byte
Dim buf As BytePtr
Dim buf_hi As String
Dim buf_lo As String
Dim dec As Long
Dim sin As Long
Dim dec_b As Long 'これが抜けていました。
まだ抜けているかもしれません。
Posted: 2005年11月25日(金) 12:05
by ゲスト
処理の途中でWinAPIを呼び出していますので、処理の実行中にイベントが発生し、描画がおかしくなっている可能性があります。
処理中に発生したイベントを無視する為のコードを入れて実験してみましょう
コード: 全て選択
Dim MsgDisp=0 As Long
Sub MainWnd_MouseMove(flags As Long, x As Long, y As Long)
Dim ms1x As String
Dim ms1y As String
Dim ms2x As String
Dim ms2y As String
If MsgDisp<>0 Then Exit Sub '実行中は処理をスキップする
MsgDisp=1
'既存の命令
MsgDisp=0
End Sub
Posted: 2005年11月25日(金) 12:30
by マティ
上のゲストは私です。
職場から送ったので、ログインを忘れていました。
Posted: 2005年11月25日(金) 20:33
by ポテト
マティさん有難う御座います。
> 処理の途中でWinAPIを呼び出していますので、処理の実行中にイベントが発生し、描画がおかしくなっている可能性があります。
> 処理中に発生したイベントを無視する為のコードを入れて実験してみましょう
>
コード: 全て選択
> If MsgDisp<>0 Then Exit Sub '実行中は処理をスキップする
> MsgDisp=1
>
> '既存の命令
>
> MsgDisp=0
>
上のCodeで実行したところ、だいぶ良くなったのですが、
たまに、おかしいのです。(リリース時)
ドロップダウンメニューで、ms_cntを1にしているのですが、
そのメニュー上で、少しドラッグしてしまうと、たまに、
おかしい表示になってしまうような気がします。
マウスをUPした条件で行っても、おなじようです。
Uhspさんにも、アドバイスいただきまして、
有難う御座いました。
Posted: 2005年11月26日(土) 21:15
by マティ
プルダウンメニューを表示している際の
kind_bの値はいくつになっています?
つまり、描画を行う事になっています?
①kind_b=0なら正しい処理を作成しています。
その際のエラーは、背景を書き戻す座標を壊している事なので以下の処理で修正出来ると思います。
コード: 全て選択
moldx = x '前のマウス位置保存
moldy = y
End If
'' moldx = x '前のマウス位置保存
'' moldy = y
End Sub
②kind_b>0の時
メニューを出しているときは、
kind_b=0となるようにプログラムを修正して下さい。
そして①の修正を行うと正しく表示出来ると思います。
Posted: 2005年11月27日(日) 09:16
by ポテト
マティさん、有難う御座います。
> プルダウンメニューを表示している際の
kind_bの値はいくつになっています?
> つまり、描画を行う事になっています?
>
>
①kind_b=0なら正しい処理を作成しています。
> その際のエラーは、背景を書き戻す座標を壊している事なので以下の処理で修正出来ると思います。
>
コード: 全て選択
> moldx = x '前のマウス位置保存
> moldy = y
> End If
> '' moldx = x '前のマウス位置保存
> '' moldy = y
> End Sub
>
>
>
②kind_b>0の時
> メニューを出しているときは、
kind_b=0となるようにプログラムを修正して下さい。
> そして①の修正を行うと正しく表示出来ると思います。
上の
Codeに直して実行したところ、
やはり、同じ症状が出てしまいました。
そこで、
Double_To_String()の変数の
Byte、BytePtrを
Stringに
変更して、
lstrcpy、lstrcat などを使わずに書き直しましたところ、
いまのところ、正常に実行できています。
いろいろ、おさわがせしました。
マティさん、
Uhspさん有難うございました。
またよろしくお願いします。