スポンサーサイト 


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--/--

Category: スポンサー広告

TB: --  /  CM: --

top △

ラベルでゴニョゴニョ 


ラベルの枠内で連続的に流れるように表示したいと思っています

というのを見かけました。

kEnt137

上記画像の様な雰囲気でしょうか・・・・

周期的に「何かをする」場合、
自力でループする処理を書き DoEvents でイベントをとれるようにしておく・・・
何かのイベントが発生してループをやめたい場合、ループを抜けてどこに行きたい・・・
これ、考えていくと面倒なので・・・・「タイマー時」を良く使います。
(発生したイベント側で、タイマーを 0 に設定するだけで事足りるので)

ただ、タイマーの間隔を良く考えないと、CPU 負荷は大きくなります。

前置きはこの位にして、2通り考えてみました。
・ラベルの左マージンの増減で動いているように見せる
・表示する文字列操作で動いているように見せる
 

2通りと言っても、内部 VBA の記述が異なるだけでフォームは同じです。

フォーム「F1」を作成します。
・流れる文字列表示用のラベル「lab0」
・文字列入力用テキストボックス「txt1」
・開始用コマンドボタン「btn1」
・終了用コマンドボタン「btn2」
を配置します。
ラベルの高さは、1列表示するだけの高さにします。
※ 2列以上が表示される場合は、文字列が変に折り返した表示になってしまうので・・・

出来上がったフォーム「F1」を「F2」としてコピーしておきます。


ラベルの左マージンの増減で動いているように見せる

フォーム「F1」に以下を記述します。
Private Sub Form_Timer()
  Dim i As Long

  With Me.lab0
    i = .LeftMargin - 50
    If (i < 0) Then i = 0
    .LeftMargin = i
    If (i = 0) Then
      Me.TimerInterval = 150
      .Caption = Mid(.Caption, 2)
      If (Len(.Caption) = 0) Then Call btn1_Click
    End If
  End With
End Sub

Private Sub Form_Load()
  Me.txt1 = "1234567890"
End Sub

Private Sub btn1_Click()
  If (IsNull(Me.txt1)) Then Exit Sub
  With Me.lab0
    .Caption = Me.txt1
    .LeftMargin = .Width - .RightMargin
  End With
  Me.TimerInterval = 50
End Sub

Private Sub btn2_Click()
  Me.TimerInterval = 0
  Me.lab0.Caption = ""
End Sub

 
指定された文字列そのものを流すようにします。

初期は、.LeftMargin = .Width - .RightMargin として文字列自体が表示されない様に・・・
タイマーの間隔で .LeftMargin - 50 としますが、マージンを使い切ったら( < 0 )
さらに流す方法は考え付かなかったので、文字列先頭から1文字ずつ削除した表示にしていきます。
マージン変化での動きと、文字削除での動きに違和感が無い用に、タイマー間隔を調整します。
表示文字がなくなったら、開始ボタンの処理から繰り返すようにします。

※ マージンがなくなったら毎回 Me.TimerInterval = 150 していますが、他に影響はないと思います。
 が、.LeftMargin = 0 の時、さらに .LeftMargin = 0 を設定した場合、再表示は起こるんだろうか・・・
 再表示されるのなら、Caption 設定と2回表示されちゃうね・・・・(未検証)
 先頭で .LeftMargin = 0 の判別をした方が良いのかも・・・


表示する文字列操作で動いているように見せる

フォーム「F2」に以下を記述します。
Dim sShowString As String

Private Sub Form_Timer()
  Dim i As Long ' これは、いらなかった

  With Me.lab0
    .Caption = Mid(.Caption, 2)
    If (Len(.Caption) = 0) Then .Caption = sShowString
  End With
End Sub

Private Sub Form_Load()
  Me.txt1 = "1234567890"
End Sub

Private Sub btn1_Click()
  If (IsNull(Me.txt1)) Then Exit Sub
  sShowString = Space(60) & Me.txt1
  Me.lab0.Caption = sShowString
  Me.TimerInterval = 150
End Sub

Private Sub btn2_Click()
  Me.TimerInterval = 0
  Me.lab0.Caption = ""
End Sub

 
指定された文字列そのものがラベルに表示されない程度に、文字列先頭に空白を付加します。

初期の文字列を覚えておいて、タイマー間隔で先頭1文字を削除した表示にしていきます。
表示するものがなくなったら、初期文字列を使うようにします。



文字列がラベルの左端に到達するまでの動きは、マージン操作の方が滑らかかと・・・・

ただ、滑らか・・・タイマー間隔 or マージン増減量 を細かくすればできますが、
その分 CPU 負荷が上がるので、ほどほどに・・・・
(本来 Access でやりたいことは、これではないと思うので・・・・)

サンプルは以下
 バージョン 20002003 (2002)2007
 ファイル kEnt137_2000.zipkEnt137_2003.zipkEnt137_2007.zip
 サイズ 16,28216,83114,910
※ ファイルは zip 形式
※ 2007 以外は、2007 保存時に変換 & 各バージョンで動作確認 & 最適化

関連記事

2012/08/04

Category: やってみる

TB: --  /  CM: 0

top △

この記事に対するコメント

top △

コメントの投稿

Secret

top △


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。