ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月28日(日) 04:57

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




新しいトピックを投稿する  トピックへ返信する  [ 13 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2005年11月24日(木) 12:19 
たびたびすいません。
デバッグコンパイルでは正常に表示されるのですが、
リリースコンパイルではおかしいのです。
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 
オフライン

登録日時: 2005年8月23日(火) 00:15
記事: 161
お住まい: 沖縄県
以下の変数はどの様に指定しているのでしょうか?
mouse_1X
mouse_1Y
mouse_2X
mouse_2Y
とりあえず、宣言を行うさいに初期化を行うことをお勧めします。

PS.ActiveBasic4.11.xでコンパイルが通るとは思えないのですが・・・


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年11月24日(木) 22:20 
> 以下の変数はどの様に指定しているのでしょうか?
> 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 
オフライン

登録日時: 2005年8月23日(火) 00:15
記事: 161
お住まい: 沖縄県
> マウスクリックゼロ(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 
 関係ないかも知れませんが calloc() lstrcpy() を頻繁に呼び出すコード
を記述するとデバッグ時は問題なく動作し
リリースされた物はMemoryReadErrorで停止してしまいます。

:使用方法が間違っているのかもしれませんが...。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2005年11月25日(金) 08:14 
オフライン

登録日時: 2005年8月23日(火) 00:15
記事: 161
お住まい: 沖縄県
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 
> 私の環境では、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 
またまた失礼しました。
一部書きぬけてしまいました。
コード:
 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 
処理の途中で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 
オフライン

登録日時: 2005年8月23日(火) 00:15
記事: 161
お住まい: 沖縄県
上のゲストは私です。
職場から送ったので、ログインを忘れていました。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年11月25日(金) 20:33 
マティさん有難う御座います。

> 処理の途中でWinAPIを呼び出していますので、処理の実行中にイベントが発生し、描画がおかしくなっている可能性があります。
> 処理中に発生したイベントを無視する為のコードを入れて実験してみましょう
>
コード:
 
>     If MsgDisp<>0 Then Exit Sub  '実行中は処理をスキップする
>     MsgDisp=1
> 
>        '既存の命令
> 
>     MsgDisp=0
> 
上のCodeで実行したところ、だいぶ良くなったのですが、
たまに、おかしいのです。(リリース時)
ドロップダウンメニューで、ms_cntを1にしているのですが、
そのメニュー上で、少しドラッグしてしまうと、たまに、
おかしい表示になってしまうような気がします。
マウスをUPした条件で行っても、おなじようです。
Uhspさんにも、アドバイスいただきまして、
有難う御座いました。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2005年11月26日(土) 21:15 
オフライン

登録日時: 2005年8月23日(火) 00:15
記事: 161
お住まい: 沖縄県
プルダウンメニューを表示している際の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 
マティさん、有難う御座います。

> プルダウンメニューを表示している際の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、BytePtrString
変更して、lstrcpy、lstrcat などを使わずに書き直しましたところ、
いまのところ、正常に実行できています。
いろいろ、おさわがせしました。
マティさん、Uhspさん有難うございました。
またよろしくお願いします。


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

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


オンラインデータ

このフォーラムを閲覧中のユーザー: Semrush [Bot] & ゲスト[18人]


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

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