2006-06-30(Fri)

EyeTREKイヤホン修理

オリンパス工業製「アイトレック」の右チャンネルが聞こえなくなっちまった。

これは1年半前先輩に頼み込み、とてつもなく安く譲ってもらったもの。
# だって先輩は45万もするHMDに乗り換えてたんだしヨゥ・・・。
確か当日の飲み会の飲み代程度でイイヨって事で5千円くらいで譲ってもらった。(2人でヤフオクで検索したら1.5万円くらいだったんだけど)
EyeTREK

初期型なのだが未だに現役で、寝ながらハロモニでウハウハするのに最適だ。まだまだ壊れてもらっては困る。
ライン分断

寝ながら見てて本当に寝てしまうのが原因だろうか、イヤホンのコード部分が目に見えて断線しているので、別のものに交換することにする。

続きを読む

2006-06-20(Tue)

リストビュー第5回 指定レコードを削除する

小休止 7 8 回

第5回 指定レコードを削除する

ジャックバウアーです。「24」の録画に失敗しました。
残念です。

さて今回はアイテムの削除をやる。
アイテムを削除すると、アイテムの固有32ビット値も歯抜けになるわけで(見えないけど)、削除後にそれの整列もやりたいと思う。
これまでの1~3回4回で加えた分に追加する。

1)メニュー項目の追加
アイテム削除用のメニューを追加。
IDIDM_DelItem にした。


2)アイテム削除
選択行を削除するようにしてみる。
選択行を判別するのは、第4回のアイテム削除と全く同じ処理になる。
ここでは面倒くさいからコピペして書き換える。
実戦ではもっとエクセレントな方法で無駄を省いてくれたまへ。

/*メニュー:アイテム削除*/
Sub MainWnd_IDM_DelItem_MenuClick()
    Dim lvi As LVITEM           'リストビューアイテムの構造体
    Dim j As Long
    Dim AllRecord As Long
    '全行数を取得
    AllRecord = SendMessage( hList, LVM_GETITEMCOUNT, 0, 0 )
    'アイテムが存在しなかった場合は終了
    If AllRecord <= 0 Then Exit Sub
    '選択されたレコードを調べる
    lvi.mask = LVIF_STATE               'アイテム状態について弄るよ
    lvi.stateMask = LVIS_SELECTED       '状態は選択状態のみを対象に操作しますよ
    For j = 0 to AllRecord - 1          '全てのレコードについて調べる(レコード番号は先頭が 0 です)
        lvi.iItem = j                   'インデックス(縦)
        SendMessage( hList, LVM_GETITEM, 0, VarPtr(lvi) As Long )   'アイテム取得
        '選択されているレコードなら削除する
        if lvi.state = LVIS_SELECTED then
            SendMessage( hList, LVM_DELETEITEM, j, 0 )  '削除
            AllRecord = AllRecord - 1   '全行数が1行減る
            j = j - 1                   '削除した1行が詰まるから、もう一回その行を調査
        End If
    Next
    '固有32ビット値を振りなおす
    lvlpRenew()
End Sub

削除の処理は1行だけ。
hListLVM_DELETEITEM を送ればアイテムを削除できる。
wParam削除するインデックス番号lParam0 を指定する。
最後に固有32ビット値を整理するが、この後も良く使う予定なので、lvlpRenew() という別な関数を用意する。

3)アイテムの固有32ビット値の整列
やっていることは単純。
先頭のインデックスから順に、0 1 2 …と連番で固有32ビット値を設定しているだけ。
俺はこれをやっておかないでソートや入れ替えでハマった。

/*固有32ビット値を振りなおす*/
Sub lvlpRenew()
    Dim lvi As LVITEM           'リストビューアイテムの構造体
    Dim i As Long
    Dim AllRecord As Long
    '全行数を取得
    AllRecord = SendMessage( hList, LVM_GETITEMCOUNT, 0, 0 )
    'アイテム分ループ
    lvi.mask = LVIF_PARAM   '固有32ビット値について弄るよ
    While i < AllRecord
        lvi.iItem = i           'i 行目のアイテム
        lvi.lParam = i          '固有32ビット値を i に設定
        SendMessage( hList, LVM_SETITEM, 0, VarPtr(lvi) As Long)    '振りなおす
        i = i + 1
    Wend
End Sub


今回は以上。
実行して適当なレコードを選択後、メニューからアイテム削除を選択するれば、選択レコードが削除されると思う。

じゃ!ハロモニを見て寝る。

続きを読む

2006-06-16(Fri)

リストビュー第4回 選択されているレコードを取得する

小休止 7 8 回

第4回 選択されているレコードを取得する

なんか小休止でやっちゃったが、選択されているレコードを調べて、そのアイテムを取得するようにしてみる。
これまでのソースに手を加える。

1)ソースの変更

第3回で追加した「アイテム取得」処理を変更し、現在選択されているレコードの内容を表示するようにしてみる。

/*メニュー:アイテム取得*/
Sub MainWnd_IDM_GetItem_MenuClick()
    Dim lvi As LVITEM           'リストビューアイテムの構造体
    Dim buf[256] As Byte        'アイテム格納用
    Dim buf2 As String
    Dim i As Long
    Dim j As Long
    Dim AllRecord As Long
    'リストビューの全レコード数を取得
    AllRecord = SendMessage( hList, LVM_GETITEMCOUNT, 0, 0 )
    '選択されたレコードを調べる
    lvi.mask = LVIF_TEXT or LVIF_STATE  '状態とアイテムのテキストについて弄るよ
    lvi.stateMask = LVIS_SELECTED       '状態は選択状態のみを対象に操作しますよ
    For j = 0 to AllRecord -1           '全てのレコードについて調べる(レコード番号は先頭が 0 です)
        lvi.iItem = j                   'インデックス(縦)
        lvi.pszText = VarPtr(buf[0])    '格納するバッファのポインタ
        lvi.cchTextMax = 256            '格納するサイズ(Byte)
        'アイテム情報取得
        For i = 0 to 1
            lvi.iSubItem = i            'サブアイテム(横)
            SendMessage( hList, LVM_GETITEM, 0, VarPtr(lvi) As Long )   'アイテム取得
            buf2 = buf2 + MakeStr( buf As *Byte ) + " "
        Next
        '選択されているレコードなら表示する
        if lvi.state = LVIS_SELECTED then
            '表示
            MessageBox( hMainWnd, buf2, "レコード"+Str$(j), MB_OK )
        End If
        buf2 = ""
    Next
End Sub


今回は状態とテキストを同時に取得している。
レコード数が多い場合は状態のみを調査し、該当した時にテキストを取得すると若干スピードアップすると思う。
そもそも大量のレコードを扱う場合は、仮想リストビューを使うと良い事になっている。(ここでは割愛)

追記: LVM_GETNEXTITEM で短く高速に調べられる。
例)
i = SendMessage( hListWnd, LVM_GETNEXTITEM, -1, LVNI_SELECTED or LVNI_FOCUSED )


今回の任務は以上。短かった・・。
2006-06-14(Wed)

reViSiT

VORC をチェックすると reViSiT という VST プラグインが紹介されていた。

トラッカーから離れられずβ版のうちから renoise ユーザーとなっていたけど長所短所はあるわけで、あ~ Cubase 良いかもなぁ。なんて思うこともしばしば。
しかし MML で育った俺はトラッカーのほうが曲作りやすいヨーっ!と結局 renoise だったりしながら今日に至る。

でも reViSiT はどうやら他のシーケンサーの VST としてトラッカーが動作するものらしい。 スクリーンショットには「reViSiT in Cubase」な画面もあり、ちょっと弄ってみたい気がしてきたゾ。
あ、でも俺 Cubase 持ってねえや。
2006-06-11(Sun)

リストビュー小休止 便利なメッセージ

小休止 6 7 8 回

小休止 便利なメッセージ

リストビューに送るメッセージは LVCOLUMN , SETLVITEM , GETLVITEM などが出てきたが、他にもよく使うであろうメッセージを書いておこっかなと。
より詳しい内容や他のメッセージについては、例によって検索するなり文献をあたるなりしたほうが身のためです。

LVM_GETITEMCOUNT
全部で何レコードあるのか返してくれる。

ex.)
Dim AllRecord As Long
AllRecord = SendMessage( hList, LVM_GETITEMCOUNT, 0, 0 ) '全レコード数取得



LVM_DELETEALLITEM
リストビューのアイテムを一発でクリア(削除)してくれる。
但し、ActiveBasic 4.24.00 の時点ではメッセージが定義されていないので、プログラムの先頭などで自分で定義する。

ex.)
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
const LVM_DELETEALLITEM = &H1009 'リストビュー全消去メッセージ規定値


SendMessage( hListWnd, LVM_DELETEALLITEM , 0, 0) 'リストビュー全消去



LVM_GETITEM
アイテムの状態を取得できる。
状態というのは選択されていたり、フォーカスされていたりする状態のこと。
LVITM 構造体の適切なメンバに値を入れると、.state メンバにアイテムの状態が格納される。

ex.)
Dim lvi As LVITEM 'リストビューアイテム構造体
lvi.mask = LVIF_STATE 'アイテムの状態を弄るよ
lvi.stateMask = LVIS_SELECTED or LVIS_FOCUSED '特定の状態のみ操作できる
lvi.iItem = 0 '状態を取得するインデックス
SendMessage( hListWnd, LVM_GETITEM, 0, VarPtr(lvi) As Long ) '状態取得
If lvi.state = LVIS_FOCUSED then
適当な処理
End If


.state に入る値はこんなのがある。

LVIS_SELECTEDアイテムが選択状態を持つ
LVIS_FOCUSEDアイテムがフォーカス状態を持つ
LVIS_CUTアイテムがカット&ペーストの対象状態を持つ(マーク色が付く)
LVIS_DROPHILITEDアイテムがドラッグ&ドロップの対象状態を持つ(マーク色が付く)



LVM_SETITEM
アイテムの状態を設定できる。LVM_GETITEM の逆。

ex.)
Dim lvi As LVITEM 'リストビューアイテム構造体
lvi.mask = LVIF_STATE 'アイテムの状態を弄るよ
lvi.stateMask = LVIS_DROPHILITED '特定の状態のみ操作できる
lvi.state = LVIS_DROPHILITED 'ドラッグ&ドロップの対象としてマーク色を付ける
lvi.iItem = 0 '状態を取得するインデックス
SendMessage( hListWnd, LVM_SETITEM, 0, VarPtr(lvi) As Long ) '状態取得

.stateMask は特定の状態のみを操作できる。
この例ではドラッグ&ドロップの対象状態のみを操作しているので、アイテムの他の状態(選択状態など)は変化しない。
んで、.stateLVIS_DROPHILITED なのでマーク色が「付く」。解除するには .state0 にすれば良い。

全ての状態を操作したい場合は .stateMask-1 を指定する。
2006-06-11(Sun)

リストビュー第3回 リストビューのアイテムを取得してみる

小休止 7 8 回

第3回 リストビューのアイテムを取得してみる

メニューから先頭のレコード内容を表示する処理を追加してみる。
第1回第2回 の続きだふ。

1)メニューを設定する
プロジェクトエディタのマテリアルから「Menu」を右クリックし「メニューを挿入」をクリック。


メニューID は MainMenu とでもして、次のように定義した。
(「実験」はポップアップ、「アイテム取得」の ID は IDM_GetItem にしてある。)


次に、MainWnd の RAD ツール右の「メニュー」を、今ほど作成した MainMenu に設定。
メインウィンドウを右クリックして「メニューによるイベント」をクリックする。

すると、定義したメニューの一覧が出るので「アイテム取得」をダブルクリックし、コーディングを行う。


2)アイテムを取得する
今回はとりあえず一番上のレコードに格納されているアイテムを取得してみる。
本当に取得できたか、最後に内容をメッセージボックスで表示する。

/*メニュー:アイテム取得*/
Sub MainWnd_IDM_GetItem_MenuClick()
    Dim lvi As LVITEM           'リストビューアイテムの構造体
    Dim buf[256] As Byte        'アイテム格納用
    Dim buf2 As String
    Dim i As Long
    'アイテム取得
    lvi.mask = LVIF_TEXT
    lvi.iItem = 0                   'インデックス(縦)
    lvi.pszText = VarPtr(buf[0])    '格納するバッファのポインタ
    lvi.cchTextMax = 256            '格納するサイズ(Byte)
    For i = 0 to 1
        lvi.iSubItem = i            'サブアイテム(横)
        SendMessage( hList, LVM_GETITEM, 0, VarPtr(lvi) As Long )   'アイテム取得
        buf2 = buf2 + MakeStr( buf As *Byte ) + " "
    Next
    '表示
    MessageBox( hMainWnd, buf2, "アイテム取得テスト", MB_OK )
End Sub


前回、アイテムの格納で SETLVITEM というメッセージを送ったが、今回は取得なので GETLVITEM を送る。
そのまんまの名前でうれしく思います、大統領。

前回同様、.iItem にレコードのインデックス番号(縦方向)、.iSubItem にサブアイテム(横方向)を指定。
リストビューに GETLVITEM を送ると、.pszText に指定したアドレスへアイテムの内容が入るので、buf のアドレスを指定しておけば格納される。

次のサブアイテムを取得するためには、.iSubItem の値を変える。
今回は ForNext で回してみた。

でもって実行すると次のようになる。

無事取得でけた。

以降、ここまでの MainWnd.sbp 全ソースコード

続きを読む

2006-06-11(Sun)

懐かしの片手コントローラをゲット

突然 ZANAC×ZANAC がプレイしたくなったが、持っていないのでファミコンの ZANAC をプレイ。 益々やりたくなる。

中古ショップを覗くが見つからず、代わりに片手コントローラの「 ASCIIグリップV~ダビスタ対応モデル(210円)」を発見。
ascii_grip1-1.jpg

前から使ってみたかったのだよ、コレを。
ダビスタはやらないが AVG なんかを寝ながら出来そうだし。
たった 210円でしばし悩むが、購入。空けてみたら新品だったヨ。
ascii_grip1-2.jpg

さて、何をプレイするか・・・。
2006-06-10(Sat)

リストビュー第2回 アイテムを格納してみる

小休止 7 8 回

第2回 アイテムを格納してみる

第1回で作成したリストビューにアイテムを配置してみる。
ソースコードは第1回の続きなので、そういうことで。

1)カラムを作る
まず、それっぽくカラムを作ってみる。
縦がレコード(行)で、横がカラム(列)。(別な呼び方もある。文中コロコロ書き方が変わるかも知れん)
ウィンドウ作成時の処理に以下のコードを追加。
'カラム初期設定
Dim clm As LVCOLUMN 'リストビューカラム構造体
Dim i As Long
Dim buf As String
clm.mask = LVCF_FMT or LVCF_WIDTH or LVCF_TEXT  'マスクの設定(書式と幅と文字を弄るよ)
clm.fmt = LVCFMT_LEFT           'カラムの書式(左詰でお願いします)
clm.cx = 100                    'カラムの幅(とりあえず100で)
For i = 0 to 2
    buf = "カラム" + Str$( i )
    clm.pszText = StrPtr( buf ) 'カラムに表示する文字
    SendMessage( hList, LVM_INSERTCOLUMN, i, VarPtr(clm) As Long) 'カラム作成
Next


LVCOLUMN 構造体の .mask にどのメンバを操作するか指定。
今回はカラムの書式と幅と文字を弄るよ~と指定してある。
.fmt メンバ には書式、.cx メンバには幅、.pszText メンバにはカラムに表示する文字を指定する。

作成するときは SendMessage で hListLVM_INSERTCOLUMN を送る。
パラメータは lParam にカラム作成位置、wParamLVCOLUMN 構造体のアドレスをセット。
ForNext で3つカラムを作ってみた。


2)アイテムを格納する
アイテムをリストビューにぶち込んでみる。
ぶち込み方の説明なので、これもウィンドウ作成時にやってしまう。
ウィンドウ作成時の処理に以下のコードを追加。
Dim lvi As LVITEM   'リストビューアイテム構造体
For i = 0 to 5
    lvi.mask = LVIF_TEXT or LVIF_PARAM  'マスクの設定(アイテムの文字と、固有32ビット値を弄るよ)
    lvi.lParam = i                      '固有32ビット値(とりあえず 0 )
    lvi.iItem = i                       'インデックス(縦方向)の位置
    lvi.iSubItem = 0                    'サブアイテム位置(横方向)、アイテム(先頭)を参照する場合は 0
    buf = "アイテム" + Str$( i )
    lvi.pszText = StrPtr( buf )         'レコード挿入時のアイテムの内容
    SendMessage( hList, LVM_INSERTITEM, 0, VarPtr(lvi) As Long) 'アイテム(つかアイテムの入ったレコード)を挿入
    'サブアイテムを格納してみる
    lvi.mask = LVIF_TEXT                'マスクの設定
    lvi.iSubItem = 1                    'カラム(横方向)位置
    buf = "サブアイテム" + Str$( 5 - i )
    lvi.pszText = StrPtr( buf )         'レコード挿入時の先頭アイテムの内容
    SendMessage( hList, LVM_SETITEM, 0, VarPtr(lvi) As Long)    'アイテムを格納
Next


新規でアイテムを挿入すると、先頭アイテムが格納されたレコードが作成される。
2つ目以降のサブアイテム(横方向ね)を格納したい場合は、作成したレコードに対してサブアイテムを格納するという手順になる。

アイテムの固有32ビット値というのは、アイテムには見えないけどそーゆー値が振られていて、その値はソートやレコードの入れ替えをする時に必要になってくる。
俺は面倒なので、最初全部固有32ビット値を 0 で作成して、後でまとめて全レコードの固有32ビット値を連番で整理するようなやり方をよくやる。 ま、今回は格納時に 0,1,2・・・と入れてみた。
これについては後に出てくる「削除」のときの説明で触れようと思う。

これでアイテムの格納は終わり。実行してみると以下のようになる。

第1回の 1)でのチェック項目や、2)のスタイル設定を色々変えて実行してみるのだ。

以下、ウィンドウ作成時のソースまとめ(ここでは見にくいがコメントは取らないでおいた)
/*ウィンドウ作成時*/
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
    'リストビュー初期設定
    hList = GetDlgItem( hMainWnd, ListView1 )    'リストビューのハンドルを取得
    SendMessage( hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0,
            LVS_EX_GRIDLINES or LVS_EX_FULLROWSELECT or LVS_EX_FLATSB )   'スタイル設定

    'カラム初期設定
    Dim clm As LVCOLUMN 'リストビューカラム構造体
    Dim i As Long
    Dim buf As String
    clm.mask = LVCF_FMT or LVCF_WIDTH or LVCF_TEXT  'マスクの設定(書式と幅と文字を弄るよ)
    clm.fmt = LVCFMT_LEFT           'カラムの書式(左詰でお願いします)
    clm.cx = 100                    'カラムの幅(とりあえず100で)
    For i = 0 to 2
        buf = "カラム" + Str$( i )
        clm.pszText = StrPtr( buf ) 'カラムに表示する文字
        SendMessage( hList, LVM_INSERTCOLUMN, i, VarPtr(clm) As Long) 'カラム作成
    Next
    Dim lvi As LVITEM   'リストビューアイテム構造体
    For i = 0 to 5
        lvi.mask = LVIF_TEXT or LVIF_PARAM  'マスクの設定(アイテムの文字と、固有32ビット値を弄るよ)
        lvi.lParam = i                      '固有32ビット値(とりあえず 0 )
        lvi.iItem = i                       'インデックス(縦方向)の位置
        lvi.iSubItem = 0                    'サブアイテム位置(横方向)、アイテム(先頭)を参照する場合は 0
        buf = "アイテム" + Str$( i )
        lvi.pszText = StrPtr( buf )         'レコード挿入時のアイテムの内容
        SendMessage( hList, LVM_INSERTITEM, 0, VarPtr(lvi) As Long) 'アイテム(つかアイテムの入ったレコード)を挿入
        'サブアイテムを格納してみる
        lvi.mask = LVIF_TEXT                'マスクの設定
        lvi.iSubItem = 1                    'カラム(横方向)位置
        buf = "サブアイテム" + Str$( 5 - i )
        lvi.pszText = StrPtr( buf )         'レコード挿入時の先頭アイテムの内容
        SendMessage( hList, LVM_SETITEM, 0, VarPtr(lvi) As Long)    'アイテムを格納
    Next
End Sub

2006-06-10(Sat)

リストビュー第1回 リストビューを作ってみる

小休止 7 8 回

ActiveBasic の覚書的に色々書いてみる。
「とにかく○○なソフトが必要なのに一から調べてらんねー」という人には役立つかもしれないし、もう知っていることかもしれない。
全ては自分の仕事を便利にするために。

さて、俺的にはよく使う「リストビュー」について書く。
リストビューとはエクスプローラでおなじみのこんな感じのコントロール。(クリックで拡大)
クリックで拡大

4つの表示形態があるが、レポート表示タイプの使い方が判ると、ちょっと仕事で欲しいようなツールをサクっと作れるので便利だ。 というわけで、リストビューでも更に俺的に重宝しているレポート表示タイプについて書いてみる。
予定としては以下の8回に分けてリストビューの基本を書き留めておこうかと思っている。

第1回 リストビューを作ってみる
第2回 アイテムを格納してみる
第3回 リストビューのアイテムを取得してみる
小休止 便利なメッセージ
第4回 選択されているレコードを取得する
第5回 指定レコードを削除する
第6回 マウスの当たり判定
第7回 カラムをクリックしてソートする
第8回 レコードをドラッグして入れ替える

では1回目の本文へいってみよ。

続きを読む

2006-06-09(Fri)

チャリキズ

くそう。会社の駐車場に止めていたら、厨房のチャリにキズつけられた・・。
学生からお金取るわけにも行かず、落ち込む。

それほど大したキズではないが、爪に引っかかるくらいの深さはある。
タッチペンだっけ?近くのイエローハットには自分の色がなかったので、遠回りしてオートバックスでサンドペーパーやコンパウンド等と一緒に購入して帰宅。
今度の休みに時間があれば何とかしてみる。
プロフィール

nakami

Author:nakami
可愛いテンプレートに似合う俺
うそAチームのスミス大佐

NAVI
カテゴリー
最近の記事
リンク
FC2カウンター
ブログ内検索
RSSフィード
sponsored link