2018年5月23日水曜日

コントロール一覧からTextBoxだけ選んでみる

Formsでフォーム一覧、Controlsでコントロール一覧が取得できるのは、なんとなくわかってた。
そのコントロールがナニモノかとゆー判断をドコでするんだろう思ったら、
TypeName()関数ってモノが用意されてた。
一番上にさらっと”objecttype 型のオブジェクト”とか書いてあって、
先日書いたVarType()が定数で返すのに対して、Stringで帰ってくる関数?
と、あやうく流すトコだった。
…いざStringで返されると、定数で帰ってきた方が扱いやすいな( ゚-゚)~゚と思ったり(ぉぃ

TypeName()くん。変数の型だけでなく、オブジェクトの型も教えてくれる。

Private Sub Select_TextBox()
  Dim Con_Type As String
  Dim Con As Control
  For Each Con In Me.Controls
    Con_Type = TypeName(Con)
    If Con_Type = "Textbox" Then
      Debug.Print Con_Type & ":" & Con.Name
    Else
      Debug.Print Con_Type
    End If
  Next
End Sub

コレで、Me(フォーム)に直接乗っかってるオブジェクト…
コントロールの種類がずらずら表示され、
TextBoxだけ、そのコントロール名も併記する例。

これで決まったコントロールだけ初期化するなどできる。んじゃないかな( ゚-゚)~゚


2018年5月22日火曜日

コントロールをまとめて表示/非表示にする

なんかの言語でやったんだ。
フレームにコントロールを並べてグループ化し、まとめて表示させたり非表示にさせたり。
ソレをAccessVBAでやりたいんだけどどーしたらいい?とぐぐったら、
『Accessでは用意されていない。コントロールを拾ってループ処理する。』
と、ゆー模範解答があった。

 『…実に興味深い。』

そこで、代替手段を考えてみた。
…5分後…ふつーにタブにコントロール乗せられるじゃん( ゚-゚)~゚


こんな感じ。タブの名前はタブ10。その中のページ”Test用”。
このタブの部分の名前=表題として出てしまって、消すことは出来なかった。
Accessははみ出して配置できないのが難点かなぁ。
VBAからやろうとしたらなんか怒られたし。

そんなわけで、コマンドボタン9ぽちると、

Private Sub コマンド9_Click()
   タブ10.Visible = Not タブ10.Visible
End Sub

が、動いて、(True/Falseが入れ替わり)
タブ10と乗っかってるコントロールがまとめて出たり消えたりします。

もちろん、その後ろになにかコントロールを隠しておけば、それが表示されます。
複数のタブを重ねても、タブコントロールのVisibleを操作するだけなので、
複数のフォームを開くことなく、簡便にフォームの内容を変化させられます。

…いやまぁ、素直に別フォーム開いた方が遥かにキレイで簡便なんですが、
今回は手順をおって進める仕組みなので…( ゚-゚)~゚

 『ありえない?ありえないなんてありえない。』


2018年5月18日金曜日

変数やプロパティの型を知りたい

VarTypeって関数がある。
返り値と定数を比べろってぇモノ。大変不親切である。
まぁ、わりとなんでも融通利かせちゃうVBならこんなもんかと思わなくもない(ぉぃ
でも、ボクは明示的に宣言するのがスキである。あとで大事故にならないように。

そんなわけで、お手軽に調べられるよう、こんなモンをつくって、
標準モジュールに置いておくようにした。


Public Sub VerTypeCheck(ByRef Variable)
  Dim VarType_Number
  Dim Str_Return As String
  Str_Return = ""
  
  VarType_Number = VarType(Variable)
  If VarType_Number > vbArray Then
    Str_Return = "配列:"
    VarType_Number = VarType_Number - vbArray
  End If
  
  Select Case VarType_Number
    Case vbEmpty
      Debug.Print (Str_Return & "Empty:Empty値 (未初期化)")
    Case vbNull
      Debug.Print (Str_Return & "Null:Null値 (無効な値)")
    Case vbInteger
      Debug.Print (Str_Return & "Integer:整数型")
    Case vbLong
      Debug.Print (Str_Return & "Long:長整数型")
    Case vbSingle
      Debug.Print (Str_Return & "Single:単精度浮動小数点数型")
    Case vbDouble
      Debug.Print (Str_Return & "Double:倍精度浮動小数点数型")
    Case vbCurrency
      Debug.Print (Str_Return & "Currency:通貨型")
    Case vbDate
      Debug.Print (Str_Return & "Date:日付型")
    Case vbString
      Debug.Print (Str_Return & "String:文字列型")
    Case vbObject
      Debug.Print (Str_Return & "Object:オートメーション オブジェクト")
    Case vbError
      Debug.Print (Str_Return & "Error:エラー値")
    Case vbBoolean
      Debug.Print (Str_Return & "Boolean:ブール型")
    Case vbVariant
      Debug.Print (Str_Return & "Variant:バリアント型 (バリアント型配列にのみ使用)")
    Case vbDataObject
      Debug.Print (Str_Return & "DataObject:非OLEオートメーションオブジェクト")
    Case vbDecimal
      Debug.Print (Str_Return & "Decimal:10進数型")
    Case vbByte
      Debug.Print (Str_Return & "Byte:バイト型")
    Case vbArray
      Debug.Print (Str_Return & "Array:配列")
    Case Else
      Debug.Print (Str_Return & "???:わかんない:" & VarType(Variable))
  End Select

End Sub


VerTypeCheck 変数やプロパティ
とか、
Call VerTypeCheck(変数やプロパティ)
って呼び出してやると、Debugにナニモノかを吐き出してくれる。
仕様上、”Array:配列”が出力されるコトはないんだけど、一応Caseに含ませてある。
やってることは、まぁMSDNでゆってること丸写しなだけ( ゚-゚)~゚

[Access]ちっこいけど便利なアレ。








フォームデザインのとき、レコードソースを指定すると出てきてくれるこの子。
フィールド名をひょいひょいドラッグアンドロップだけで、連結コントロールが作れて大変便利。

…×押して消してしまった(パニック

そんな便利な彼女の名は、『フィールドリスト』。
メニューの[表示]→[フィールドリスト]で再会できました(*゚-゚)
よかったよかった。

[Access]ラベルとかコロンとか勝手につけないようにしてみる。

ちからは『過度な情報はインターフェイスのアクセシビリティを下げる』と思っている。
簡単にいうと、見てわかるモンに表題なんかつけんな!ってコト。
主に、閲覧画面の場合、どう見たって、ソコには名前が入ってるんだから、
ソコにわざわざ「名前:」なんてラベルつける必要はない。と思っている。
まして、帳票フォームに(以下略

そんなわけで、フォームデザイン時、勝手につけられるのを防ぐ方法。

『ツールボックス』のラベルつけたくない子をぽちる。ツールバーんトコのでもOK
今回はテキストボックス。チェックボックスとかにも同じコトができる。


すると、規定の[コントロール名]って画面が開くので

「ラベル自動作成」をいいえにする。同様に「コロン付加」も外せる。

これで、『このファイルのみ』勝手につける設定を外すコトができる。
Access自体の規定にはできないぽ。

帳票フォームの場合、フォームヘッダにラベルがあると見やすいので、
ボクは先に、必要分のフォームにラベル付きで作っておいて、
それ以外は、この、規定をいじってから作るようにしよう!と決めました。

…でも、次の開発んときには、とっくに忘れてて、
勝手に作られてあひゃ!ってなるに10点( ゚-゚)~゚


2018年5月16日水曜日

TopMostでハマってみた。

最前面に表示するプロパティ.TopMost = Trueを指定したハズのtoolが隠れてしまった。
どっか間違ってたかな?ちゃんとTopに来てたと思ったんだが…と、リビルド。
お、ちゃんとTopに来てる来てる。別マシンにコピって…あれ?( ゚-゚)~゚
…なんかの拍子に.TopMostが機能しなくなる?

テストモジュール作ってみたけど、最初のビルドでは隠れてしまったり、
コード内で指定してやったら、なんかちゃんと動いてるぽ?
…とおもったら、アレ?隠れた?てゆか、どのバージョン動かしてる?オレ!?

って、なったので、元々のTOOLに、こしょーり、ココをクリックすると、
.TopMostの値を表示する仕掛けを仕込んでみた。
再現が楽しみ(*゚-゚)

ちなみにコレがテストモジュール。気に入ったぜ、リッチテキストボックス!


  Private Sub TopMost_Test()
    Me.Rtb_Display.Clear()
    Me.Rtb_Display.AppendText("TopMost_Test" & vbCrLf)
    Me.Rtb_Display.AppendText("フォームデザインのまま" & vbCrLf)
    Me.Rtb_Display.AppendText("TopMost:" & Me.TopMost & vbCrLf)
  End Sub
  Private Sub Btn_Etc_Click(sender As Object, e As EventArgs) Handles Btn_Etc.Click
    Me.TopMost = Not Me.TopMost
    Me.Rtb_Display.AppendText("Codeで指定" & vbCrLf)
    Me.Rtb_Display.AppendText("TopMost:" & Me.TopMost & vbCrLf)
  End Sub

試す方はフォームに、ボタン: Btn_Etc と リッチテキストボックス: Rtb_Display を用意してあげてください。 …いねーと思うけど( ゚-゚)~゚ ん~、VBのコード内部(FormのLoadの最後)で、Me.TopMost = true 、ReleaseでRebuildした子がなんか安定してる気がする。

多次元配列の要素数をとってみる。

2次元配列をぐるぐるさせるのに、1次元配列と同様、.Lengthで終了判断したら、
実行時にOut of rangeだかで怒られた( ゚-゚)~゚
…じゃぁ、こうだ!Arr(0).Length!!
コンパイルすら通らなかった(笑

素直にググると、.GetLengthなるプロパティがあった。
ちょっと動作確認で作ってみた。

  Private Sub GetLength_Sample()
    Dim Arr(3, 5, 9) As String
    Dim i, j, k As Integer
    Debug.Print(Arr.GetLength(0)) '4
    Debug.Print(Arr.GetLength(1)) '6
    Debug.Print(Arr.GetLength(2)) '10

    For i = 0 To Arr.GetLength(0) - 1
      For j = 0 To Arr.GetLength(1) - 1
        For k = 0 To Arr.GetLength(2) - 1
          Debug.Print(i & ":" & j & ":" & k)
        Next
      Next
    Next
  End Sub

うむ。コレでよし(*゚-゚)

てゆかね、それなら1次元配列でも、.GetLengthを使うべきでしょ( ゚-゚)~゚
あちこちで、.Lengthで終了判定させてるExampleあるけど、
多次元でも対応できる.GetLengthに統一すべきだと声を大にして言いたい!!
…ボクみたいにハマるヤツがいるから( ゚-゚)~゚

ソレよりもまぁ、配列宣言と、要素数、MAXの添字が
ばらんばらんなVBの配列のほーが分かりづらいが。

元々、BASICで、配列のINDEXは1から始まっていたので、すげースッキリしてたのに、
他の言語との対応のためかねぇ…中途半端にINDEXだけを0からにしやがって。
どうせ変えるなら、そっくりそのままCなりと同様にすればよかったのに…。

2018年5月15日火曜日

クリップボードを監視してみる。

作業がペンディングになり開発?が止まるとブログの更新も止まってしまう。こまった。

そんなわけで、VBでクリップボードを監視してみる。
vistaより前は、なにやら不都合のある関数を使っていたらしいのだが、
vista以降は、AddClipboardFormatListenerなるAPI関数が用意されているらしい。
そんなわけで、vistaより前のPCでは動かないハズなプログラム。
そのうちXPで試してみよう。


Public Class MainForm
  'API宣言
  Private Declare Function AddClipboardFormatListener Lib "user32" (ByVal hWnd As IntPtr) As Boolean
  Private Declare Function RemoveClipboardFormatListener Lib "user32" (ByVal hWnd As IntPtr) As Boolean
  'クリップボードに書かれたWnnProc定数:WM_DRAWCLIPBOARD = &H031D
  Private Const WM_DRAWCLIPBOARD As Integer = &H31D

  Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    AddClipboardFormatListener(Me.Handle)
  End Sub

  Private Sub MainForm_Closed(sender As Object, e As EventArgs) Handles Me.Closed
    RemoveClipboardFormatListener(Me.Handle)
  End Sub

  Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    Dim iData As IDataObject = Clipboard.GetDataObject()

    If m.Msg = WM_DRAWCLIPBOARD Then
      Debug.Print("")
      If iData.GetDataPresent(DataFormats.Text) Then
        Debug.Print(CType(iData.GetData(DataFormats.Text), String))
      End If
    End If

    MyBase.WndProc(m)
  End Sub
End Class

AddClipboardFormatListenerで、
Windowメッセージでクリップボードの更新を受け取れるようにし、
内容の型をチェックしtextならDebug.Printする。
フォームを閉じるときRemoveClipboardFormatListenerしてるけど、いらない処理だよな( ゚-゚)~゚
ちなみにWndProc()は、ひっきりなしに呼ばれる関数なため、
Ifの外にはよけーな動作をさせないように。
てゆか、クリップボード関連のモノだけをHOOKするよーな方法がありそうなモンだが…
なんかすげーオーバーヘッド食ってる気がして(Debugger見る限り気のせい)なんかイヤ(ぉぃ

追記:XPで動かしてみた。
 Debugだけじゃなく、RichTextBoxとかゆーなんか贅沢そーなヤツに吐いてみた。
 とりあえず開発環境のWin10。
 うんうん、想定通りの動作。

  そしてXPくん。
ふつーに怒られた( ゚-゚)~゚
なんかもうちょっと異常な動作を期待したのに(*゚-゚)

…UserID?気にしない気にしない(ぉぃ


2018年5月7日月曜日

google/code-prettify導入 その2

先の記事で、code-prettifyの公式HPからコードをコピペしたら、
なんかキレイに成形されてたので、もしかして簡単なのか?と、
ちょっといじりたくなった。

<pre class="prettyprint linenums" style="box-sizing: border-box; overflow-wrap: break-word; overflow: auto; word-break: break-all; word-wrap: break-word;">
  source code here
</pre>

なんかちょっと近づいた(*゚-゚)
<pre>にちょみっと書き足しただけ。
でも長い文章は折り返してほしいのだけれども、なんかスクロールバーが出てしまう。
いやまぁ知ってる人は、そう設定してるじゃん!って言うかもだけど…( ゚-゚)~゚

てゆか、ちょっと調べてみたけれども、
いろいろオプションだのの説明してくれてる人たちがいたが、
未だに、こんな可読性の低いHtmlやCSSを手書きしてるのか?
なんかWordとかみたいにイメージ書いたら
HtmlとかCSSに翻訳してくれるよーなモンなんか簡単に作れそうな気がするのだが…

ボク的導入方法はこちらgoogle/code-prettify導入

2018年5月6日日曜日

google/code-prettify導入

google/code-prettifyを導入してみた。
例はこちら
外部ファイルを持てないBloggerでは、別のサーバなりからCSSファイルをもらう方法もとれるらしいが、Google内部で済ませたいからBlogger選んだのにヨソも使うぐらいなら引っ越すわ!ぐらいにめんどちいので、なんとかならんか?と本気で調べてみたら、code-prettifyなるものがあるとゆーこと、CDN…コンテンツデリバリーネットワークだっけ?…から、CSSをもってこれるとゆーことがわかったのでやってみた。

…いろいろハマったわっ!orz

ボクのHTMLの知識ってのは、ウチにある本…最新版!Ver.1.1!とうたってる本の範囲。
CSSって聞いたことあるぞ。スタイルシートってのとは違うのか?( ゚-゚)~゚
ってレベル(笑

でも、実際やることは、2手順。
しかも、一つは、一回設定すりゃソレでOK。

そんなわけで、やること。
まず、新しい投稿で、test用の記事を作ります。
そこでHTMLモードで、
<pre class="prettyprint linenums">
source code here
</pre>
と、書きます。(公式からコピペしたらなんかキレイに(*゚-゚)
source code hereのトコロに、適当な言語を…まぁそのままでもいいけど( ゚-゚)~゚
投稿したら、別ウィンドウででも、そのページを表示しておいてください。

次は、Auto-Loaderの設置
Bloggerのテーマ→HTMLの編集を開き、</head>を探します。
([Ctrl]+[F]で検索ウィンドウが出せます。/headで検索すればOK)
<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>
その直前に、この行を追加します。

[テーマの保存]をポチったら、先程のtest用記事をリロード[F5]します。
コレで表示が変わり、行番号が追加されれば成功。
もし表示が変わらなければ、どっか間違ってます。一旦、[変更を元に戻す]をポチって
見直し、やり直しをオススメします。
ボクは敢行したため、テーマを新規に選び直すハメになりました(*゚-゚)テヘ

ちなみに、この変更は、Blogger的最適化が行われるらしく、記述順や、
なんてゆーの?</>この閉じる方の…タグ?の書式が簡略化されたりするけど気にしない。


次はカスタマイズ。といっても、簡易にいじれる範囲は大したコトはできないけど。

●テーマの設定方法。
ココ( skin gallery)から、好みのテーマを選びます。
Auto-Loader(テーマの変更で追加した行)に、skinの設定をします。
< script  src = " https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?skin=sunburst"></ script >
ここで大きな罠。
skin galleryではskin名が大文字混じりで書かれています。
でも、skin=…には、全て小文字で入れてやらないと正しく動作しませんでした。
ボクの2時間を返せorz

次に、test用記事の部分。
linenumsオプションを、判別しやすいように入れました。
コレは行番号を表示するオプション。不要なら外してください。
skinによっては、しましまになります。しましまっていいよね(*゚-゚)(なにが?

こちらは記事毎に毎回書く(ボクはひな形をtextでつくってコピペするコトにした)ので、
簡単にTPOに応じて使い分けられると思います。

あとは、一応、自動的に言語の判断はしてくれるらしいのだけど、明示する方法。
Auto-Loaderに、lang=を追加します。
< script  src = " https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?lang=vb&amp;lang=basic&amp;lang=css&amp;lang=sql&amp;lang=wiki&amp;skin=sunburst"></ script >
こんな感じ(だんだん適当になってきた。
ボク環境では、公式の記述じゃうまく書けず、
&を&ampと書き換え…エスケープ?する必要がありました。

index of language handlersで、対応している言語を確認できます。
基本的にはSouce Fileの拡張子と同じだそうです。
…CとかHtmlとかどこいった( ゚-゚)~゚

ちなみに、記事の側で、
<pre class="prettyprint lang-vb">
source code here
</pre>
と、(自動判断の?)ヒントを書くコトもできます。
…でも、Auto-LoaderでLoadしてない言語はどーなるんだろう( ゚-゚)~゚(調べろよ

そんなわけで、公式な書式はココから。

ホントなら、VBEと同じ色にできたら最高なんだけど、
がっつりCSSとかいじって外部ファイルとしてuploadできないとだめぽ。

いっそそれなら、Sourceコピペしたら、色指定したHTML吐き出すようなtool作ろうかとか、
時代を逆行した考えがよぎってしまいました(*゚-゚)

もちっとカスタマイズできた(*゚-゚)



グラフィックドライバーのリセット ショートカットキー

ボクのセカンドマシンは、ビデオボードがイかれてるのか、ドライバが悪いのか、
いつぞやのWindowsの大型Update以来、
各種メニューが表示されないとか、 メッセージボックスの内容が表示されないとか、
そーゆー不具合に直面している。
いろいろ考えられる対策はしたのだが、
時間が経つと再発したりで解決には至っていない。

だがしかし、2018Aprilの大型UpdateでMicrosoftがなんかやらかしたらしく、
Chromeとか使うとPCがフリーズしてしまう状況がでるよーになったらしい。
そろそろ対応完了のようだけど…  対応までの一時的な処置として、
「ディスプレイドライバのリセット」のショートカットキーを公開した。

[Win]+[Ctrl]+[Shift]+[B]

…見事不具合解消したよ( ゚-゚)~゚

まぁ、時間たてば、また現象がでるとは思うんだけど、
そしたらまた、[Win]+[Ctrl]+[Shift]+[B]叩いてやりゃOKだろう(*゚-゚)

まぁ、ディスプレイドライバは最適なのを入れてるつもりなので、
やっぱり(?)ビデオボードの物理的問題だと思われる。
おそらく、アプデで、なんかしらの不適切な状態を拾うように変わって、
転げ回ってるんじゃないかと。

ちなみに、syslogには何も出ていない。
元はWin7マシンだったかなぁ?
対応するビデオボードが中古でも1万近くして
金かけてまで直すマシンでもないしなぁ( ゚-゚)~゚と諦めていたトコロに、
すげー朗報(こらこらこら)が届いて超ラッキーでした(*゚-゚)

※2日半後追記
 未だに元気にさくさく反応してくれます。
 根本的なトコを解決してくれたぽい。
 もしかして、実家のPCのコンテキストメニューの表示にラグがあったのも直ってるかも?