ラベルを高速に表示したいのですが、どうすれば高速になりますか?
いい方法あれば教えてください。用途は1秒間に20回ぐらい位置を変えて表示してます。
なのでかなりちらつきます。
あと透明不透明などありますが、どちらが高速なんでしょうか?
1秒間に20回の表示でちらついて見えるのはラベルコントロール以前に
データ量や処理速度の問題のような気がしますが、取りあえず
Withステートメントを使ってみてはどうですか?
With Label1
.Caption = "aaa"
.Top = itsTop
.Left = itsLeft
End With
.................みたいに
移動にはMoveメソッドを使った方が良いです。
あと不透明の場合はBackColorで塗り潰し処理を行うので透明の方が速度が速い、と聞いたことがあります。
……リソースを食わない、だったかも知れません(^^;
>1秒間に20回の表示でちらついて見えるのはラベルコントロール以前に
>データ量や処理速度の問題のような
そうですね。データ量が結構ありますね・・・
withがやっぱり最適なんでしょうか?
Clipcontrolとかはラベルには適応してませんよね?
私も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にするのが一番早かったです。
見た目もあまりちらつかず。
まぁそのほかの環境にもよりけりなんで
なんともいえませんが
高速移動したいのなら、コントロールを動かすのでなく、
動かしたい「絵(文字)」をGDIでブロック転送したほうがいいのでは?
どうもみなさんありがとう御座います。
動かすのは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が一番速いですか?
A
Dim a
a = Int(Rnd(1) * 5000)
Label1.Caption = CStr(a)
-------------------------------------
B
Dim a as integer
a = Int(Rnd(1) * 5000)
Label1.Caption = CStr(a)
--------------------------------------
C
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)
(単位ミリ秒)
という結果です
順番を逆にしても結果は同じ。
しかしまぁ無視できる範囲ではないでしょうか。
宣言無しは、プログラム的に推奨できないので試していません。
どうも実際に調べていただけたようで有難う御座います。As Integerはつけたほうがいいんですね。解決しました。
ツイート | ![]() |