2020年3月21日土曜日

SDを内部ストレージで扱うアレ

SDや端末変えたりする時に必ずヤルけど年に数回まとめてヤル程度の頻度なもんで、覚えるのもメンドウで(以下略
なのでホントにオレメモです。

1.adb shell の確認
 コマンドプロンプト起動([win]+[R]⇢ "cmd"⇢ [Shift]+[Ctrl]+[OK]押)
(管理者は必要ないと思うけど

 > adb shell

 Error吐いたら…
 ・ケーブルがデータ対応か
 ・USBデバッグがONか
 ・対応するVersionがinstallされているかSDK Managerで確認

2.SDをふつーに戻す
 Androidの設定⇢ストレージ
 内部共有ストレージのSDカード選択
 右上の︙⇢外部ストレージとしてフォーマット
 ⇢取り出しボタン押下後取り外し

3.SDのデバイスIDを確認
 新しいSD入れて認識したら

 $ sm list-disks
 disk:179,96 ←確認

4.Pertition割
 内部ストレージを25%通常SDを75%割当
 $ sm partition disk:179,96 mixed 25

 全部なら
 $ sm partition disk:179,96 private

5.おまけ
・内部ストレージ機能の有効化
 sm set-force-adoptable true

・移動させるのに便利なアプリ
 App Mgr III
(使ってないけど( ゚-゚)~゚

2018年6月5日火曜日

【VBA】配列の結合


VBAとかってさ、いろいろ甘く作ってくれてるから、
簡単に配列を結合できるコマンドがあったりしないかな?思ったんだけど…
…どうやら無いらしいorz

そんなわけで、ぐぐってたら、配列の要素をつなげてString型にするJoin()と、
逆に、Stringをセパレータで切り分けて配列にするSplit()を組み合わせてできるらしい。

  Dim Arr_A As Variant
  Dim Arr_B As Variant
  Dim Arr_C As Variant
  
  Arr_A = Array("あ", "い")
  Arr_B = Array("う", "え", "お")
  
  Arr_C = Split(Join(Arr_A) & " " & Join(Arr_B))

要点だけ書くとこう。

ここで、やっとVariant型ってのがどーゆーモノか、わかった気がする。
…ボク、いままで、Arrayつかって配列要素書くとき、
Dim Arr_A() As Variant
って書いてたのだ。
Array()を調べたとき、Exampleがこー書かれていて、
しかも、Variant型にしか入れられませんよ。と、注釈されていたのだ。
わかった気がすると、コレで動くのもわかった気がするけど、
まず、釈然としないながらも丸写ししてたボクがゆるせず、
あの説明を書いたヤツを(2048MB省略)

つまりはVariantの変数は、アドレスが格納されている。
ArrayやSplitの返り値は、配列の先頭メモリアドレスだってーコトがやっと理解できた。
恐らくは、BooleanでもObjectでも叩き込めるのは、
Variant型に指定した変数のサイズが変わるんではなく、
参照先がかわるだけなんじゃないかな( ゚-゚)~゚(わかった気分

そんなわけでテスト

Public Sub JoinAndSplit()
  
  Dim Arr_A As Variant
  Dim Arr_B As Variant
  Dim Arr_C As Variant
  Dim i As Integer
  
  Arr_A = Array("あ", "い")
  Arr_B = Array("う", "え", "お")
  
  VerTypeCheck (Arr_C)  'Empty:Empty値 (未初期化)
  
  Debug.Print Join(Arr_A)
  Debug.Print Join(Arr_B)
  
  Arr_C = Split(Join(Arr_A) & " " & Join(Arr_B))

  For i = 0 To UBound(Arr_C)
   Debug.Print Arr_C(i)
  Next

  VerTypeCheck (Join(Arr_B)) 'String:文字列型
  VerTypeCheck (Arr_A(0))    'String:文字列型
  VerTypeCheck (Arr_C)       '配列:Variant:バリアント型 (バリアント型配列にのみ使用)

End Sub

納得の結果(*゚-゚) ちなみに、VerTypeCheck は、変数がナニモノかを知るボク作関数
てゆか返り値はStringの方が使いやすいか。なにげによく使うのでそのうち変えよう。

…はて、文字列型はコレでいいとしてIntegerだったらどーすんだろ…
と、思い、ぺぺいっと…

Public Sub JoinAndSplit2()
  
  Dim Arr_A As Variant
  Dim Arr_B As Variant
  Dim Arr_C As Variant
  Dim i As Integer
  
  Arr_A = Array(1, 2)
  Arr_B = Array(3, 4, 5)
  
  VerTypeCheck (Arr_C)  'Empty:Empty値 (未初期化)
  
  Debug.Print Join(Arr_A)
  Debug.Print Join(Arr_B)
  
  Arr_C = Split(Join(Arr_A) & " " & Join(Arr_B))

  For i = 0 To UBound(Arr_C)
   Debug.Print Arr_C(i)
  Next

  VerTypeCheck (Join(Arr_B)) 'String:文字列型
  VerTypeCheck (Arr_A(0))    'Integer:整数型
  VerTypeCheck (Arr_C)       '配列:Variant:バリアント型 (バリアント型配列にのみ使用)

End Sub

おおお、Arr_A(0)がちゃんとIntegerになってる!!
すげーぜBASIC!!

って…ホントはLongにしたかったらどーすんだよ( ゚-゚)~゚
Array()で仕込むときにcastとかで明示的にできるんだろうか。
要素の一つを明示的に宣言した変数を入れりゃいいかも…?

…疑問は尽きないが、ねむいしめんどちいので、この件はココまで(ぉぃ


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導入