ラベルの最適な表示方法は?

解決


  2003-04-24 08:40:32  No: 106871

ラベルを高速に表示したいのですが、どうすれば高速になりますか?
いい方法あれば教えてください。用途は1秒間に20回ぐらい位置を変えて表示してます。
なのでかなりちらつきます。
あと透明不透明などありますが、どちらが高速なんでしょうか?


アミーゴとサンバ  2003-04-24 13:49:26  No: 106872

1秒間に20回の表示でちらついて見えるのはラベルコントロール以前に
データ量や処理速度の問題のような気がしますが、取りあえず
Withステートメントを使ってみてはどうですか?
With Label1
    .Caption = "aaa"
    .Top = itsTop
    .Left = itsLeft
End With
.................みたいに


nanashi  2003-04-24 19:00:39  No: 106873

移動にはMoveメソッドを使った方が良いです。
あと不透明の場合はBackColorで塗り潰し処理を行うので透明の方が速度が速い、と聞いたことがあります。
……リソースを食わない、だったかも知れません(^^;


  2003-04-25 01:41:43  No: 106874

>1秒間に20回の表示でちらついて見えるのはラベルコントロール以前に
>データ量や処理速度の問題のような
そうですね。データ量が結構ありますね・・・
withがやっぱり最適なんでしょうか?
Clipcontrolとかはラベルには適応してませんよね?


Loreley  2003-04-25 02:12:28  No: 106875

私もMoveメソッドのほうがいいと思いますよ。
たとえば
Label1.Top = 50
'*1
label1.Left = 500
'*2
とした場合、
*2の位置だけでなく
*1の位置でも再描画されてしまいます

Moveでそれが防げるのかどうか正確にはわかりませんが、
時間がかかっているなら描画処理を減らす工夫も
必要ですよね。
暇だったんで、測定してみました(笑)
.frm(リストボックス、ラベル、ボタン、各1)
Private Declare Function timeGetTime Lib "winmm.dll" () As Long

Private Sub Command1_Click()
Dim i As Long
Dim j As Long
Dim k As Long
Dim stTime As Long
For k = 0 To 4
    stTime = timeGetTime
    For i = 0 To 400
        For j = 0 To 400
            Select Case k
            Case 0
                Label1.Left = i 'とくになし
                Label1.Top = j
                Label1.Width = i
                Label1.Height = j
            Case 1
                With Label1 'with
                    .Left = i
                    .Top = j
                    .Width = i
                    .Height = j
                End With
            Case 2
                Call Label1.Move(i, j, i, j) 'Move
            Case 3
                Label1.Visible = False '非表示
                Label1.Left = i
                Label1.Top = j
                Label1.Width = i
                Label1.Height = j
                Label1.Visible = True
            Case 4
                With Label1 '非表示 with
                    .Visible = False
                    .Left = i
                    .Top = j
                    .Width = i
                    .Height = j
                    .Visible = True
                End With
            End Select
        
        Next
        DoEvents
    Next
    List1.AddItem CStr(timeGetTime - stTime)
Next

End Sub

うちの環境では非表示&withにするのが一番早かったです。
見た目もあまりちらつかず。

まぁそのほかの環境にもよりけりなんで
なんともいえませんが


Say  2003-04-25 07:07:07  No: 106876

高速移動したいのなら、コントロールを動かすのでなく、
動かしたい「絵(文字)」をGDIでブロック転送したほうがいいのでは?


  2003-04-27 04:27:41  No: 106877

どうもみなさんありがとう御座います。
動かすのはmoveが最適なのですね。
わかりました

表示だけなら

1ーーーーーーーーーーーーー
With Label1
    .Caption = "aaa"
End With

2ーーーーーーーーーーー
Label1="aaa"

3ーーーーーーーーーーー
Label1.caption="aaa"

でいうと1番が一番速いのですよね?

’−−−−−−−−−−−−−−−−
あとラベルに表示する変数なんですけど

宣言とかしといたほうがはやいのでしょうか?
変数に入れる数字は5000〜0ぐらいです

1−−−−−−−−−−−−−
dim a

a=int ( Rnd(1) * 5000)

2−−−−−−−−−−−−−−−−
dim a as integer

a=int ( Rnd(1) * 5000)

3−−−−−−−−−−−−−
宣言無し
a=int ( Rnd(1) * 5000)

でいうとやっぱり2が一番速いですか?


Loreley  2003-04-27 05:24:23  No: 106878


    Dim a
    a = Int(Rnd(1) * 5000)
    Label1.Caption = CStr(a)
-------------------------------------

    Dim a as integer
    a = Int(Rnd(1) * 5000)
    Label1.Caption = CStr(a)
--------------------------------------

    Dim a as integer
    a = CInt(Rnd(1) * 5000)
    Label1.Caption = CStr(a)

の3つをプロシージャにして、
50万回ずつ呼びました。
AABCの順に呼んで
(Aを2回呼んでいるのは、初回は必ず時間がかかったので)
A(2回目) 3708 (Dim a)
B        2729 (Dim a As Integer)
C        2988 (CInt)
(単位ミリ秒)
という結果です
順番を逆にしても結果は同じ。

しかしまぁ無視できる範囲ではないでしょうか。

宣言無しは、プログラム的に推奨できないので試していません。


  2003-04-30 00:46:01  No: 106879

どうも実際に調べていただけたようで有難う御座います。As Integerはつけたほうがいいんですね。解決しました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加