ブログ主が仕事や個人的に学んだPC系・プログラミング系(VBAとかHTML)について書いていく備忘録ブログ。
※ここで記載する内容はあくまで「個人的に」上手くいく内容です。ご使用には十分注意してください
[1] [2]
Posted by 若槻風亜 - 2021.11.09,Tue
こちらで修正した修正コードの内容が
仕事中に欲しくなったので自分用に。
■ファイルのエンコードを取得してファイルを読み込む
Dim MyFile as Strng
Dim Str2 as String
Myfile = "開くファイルのパス"
Call CheckDefaultEncode(MyFile)
'=======================================================
' 文字コードの判別
' 参照↓
' 参照↓
' https://dobon.net/vb/dotnet/string/getencodingobject.html ←ここのコメント欄
' https://dobon.net/vb/dotnet/string/getencodingobject.html
' http://nonsoft.la.coocan.jp/SoftSample/VB.NET/SampleCode2Code.html
'=======================================================
Sub CheckDefaultEncode(ByVal File0 As String)
'■変数の設定
Dim bs As Byte() = IO.File.ReadAllBytes(File0)
Dim bytCheck As Byte()
Dim strCheck As String
Dim Enc as String
Dim Reader as IO.StreamReader
Dim Reader as IO.StreamReader
'■順番にエンコードを読み込み、通常文字列とバイト数を比較して一致したものを読み込み
For cnt = 1 To 6
'△処理回数によって対象を変更
If cnt = 1 Then Enc = "shift_jis"
If cnt = 2 Then Enc = "euc-jp"
If cnt = 3 Then Enc = "iso-2022-jp"
If cnt = 4 Then Enc = "utf-8"
If cnt = 5 Then Enc = "utf-16"
If cnt = 6 Then Enc = "UNICODE"
'△文字列とバイトを読み込み比較。一致したら内容を読み込み
strCheck = System.Text.Encoding.GetEncoding(Enc).GetString(bs)
bytCheck = System.Text.Encoding.GetEncoding(Enc).GetBytes(strCheck)
If bs.SequenceEqual(bytCheck) Then
'★読み込み(1行ずつ読みたい場合はループで回す)
Reader = New IO.StreamReader(File0, System.Text.Encoding.GetEncoding(Enc))
Reader = New IO.StreamReader(File0, System.Text.Encoding.GetEncoding(Enc))
TextBox1.Text = Reader.ReadToEnd
’★解除
Reader.Close
Reader.Dispose
'★読み終わったので処理を抜ける
’★解除
Reader.Close
Reader.Dispose
'★読み終わったので処理を抜ける
Exit For
End If '---読み込み値が一致するかどうか
Next '---エンコード分処理を回すFor-Next
End Sub
PR
Posted by 若槻風亜 - 2019.10.20,Sun
(対象)VS2017(Visual Studio/VB.NET)
ネットで探しても中々ズバリこれ、というのが
出てこなかったのでまとめてみます。
タイトル通り、VS/VBでリッチテキストボックスの
指定行に移動するソースサンプル。
実際の動作はこちらのファイルを参照
――――――――――――――――――――――――――――――――
'■リッチテキストボックスのスクロール用
Public Declare Function SendMessage Lib "USER32.dll" Alias "SendMessageA" (
ByVal hWnd As System.IntPtr, ByVal Msg As Int32,
ByVal wParam As Int32, ByRef lParam As Point) As IntPtr
Public Declare Function SendMessage2 Lib "USER32.dll" Alias "SendMessageA" (
ByVal hWnd As IntPtr, ByVal msg As UInteger, ByVal wParam As Integer,
ByVal lParam As Integer) As Integer
Public EM_GETFIRSTVISIBLELINE As UInteger = 206
Public EM_LINEINDEX As UInteger = 0
Public Pos As Point
Public I As Long
Public J As Long
Public K As Long
Public Dbl1 As Double
'===========================================================
' 移動押下時
'===========================================================
Private Sub Bt_移動_Click(sender As Object, e As EventArgs) Handles Bt_移動.Click
'■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
' 右端で折り返してもしなくても移動可
' (RT_データ.WordWrap = False/True)
'■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
'■テキストの中身が数字じゃない場合は処理を抜ける
If Not IsNumeric(Text_移動先.Text) Then
MsgBox("移動先番号は数字で入力してください", vbExclamation, "【注意】")
Text_移動先.Select()
Text_移動先.SelectAll()
Exit Sub
End If '---入力値が数字かどうかの判断
'■設定した数字を取得
I = CLng(Text_移動先.Text) '---Integerでもいい
'■対象行があるかないかを判断
J = RT_データ.Lines.Length
If I > J Then _
MsgBox("指定行が最大行よりも大きい値です", vbExclamation, "【注意】") : _
Exit Sub
'■行の高さを取得
' 参照 : https://dobon.net/vb/bbs/log3-52/30480.html
With RT_データ
Dbl1 = .GetPositionFromCharIndex(
.GetFirstCharIndexFromLine(2)).Y -
.GetPositionFromCharIndex(.GetFirstCharIndexFromLine(1)).Y
End With
'■対象行にジャンプ
' http://pineplanter.moo.jp/non-it-salaryman/2017/11/23/csharp-scroll-control/
' C#→VB変換 :http://www.carlosag.net/Tools/CodeTranslator/
' 変数の対応表:http://www.webtropy.com/articles/dll-api.aspx?dll=crypt32
Pos = New Point(0, CInt((I - 1) * Dbl1))
SendMessage(RT_データ.Handle, 1246, 0, Pos)
'■対象行を選択
' https://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=8248&forum=7
'-----先頭行を取得
J = SendMessage2(RT_データ.Handle, EM_GETFIRSTVISIBLELINE, 0, CInt((I - 1) * Dbl1))
'-----対象行を選択
K = 0
For cnt = 0 To J - 1
K += Len(RT_データ.Lines(cnt).ToString) '---指定行の文字列を取得
K += 1 '---改行分を追加で加算
'Debug.Print("K:String = " & K & ":" & RT1.Lines(cnt).ToString)
Next
RT_データ.SelectionStart = K
RT_データ.Select()
End Sub
――――――――――――――――――――――――――――――――
VS2017と2019でしか試してませんが、
恐らくVBの方でも使用可能かと。
Posted by 若槻風亜 - 2016.12.27,Tue
Posted by 若槻風亜 - 2016.09.11,Sun
(対象)VB2010(VB.NET)
初歩的ですが、フォルダがあるか・ファイルが
あるかを確認する方法です。
1.フォルダの有無を確認
If System.IO.File.Exists("フォルダパス\") Then
MsgBox("指定フォルダは存在します")
Else
MsgBox("指定フォルダは存在しません")
End If
※フォルダパス例)C:/test/
→ Cドライブのテストフォルダ
※フォルダパス例)C:/test/
→ Cドライブのテストフォルダ
2.ファイルの有無を確認
If System.IO.File.Exists("ファイルのフルパス") Then
MsgBox("指定ファイルは存在します")
Else
MsgBox("指定ファイルは存在しません")
End If
※ファイルのフルパス例)C:/test/aaa.txt
→ Cドライブテストフォルダの「aaa.txt」
ブログ主は最近「System」の部分は抜いて書いて
いることが多いです。僅かでも省略出来るところは
省略したい面倒くさがりや精神。
※ファイルのフルパス例)C:/test/aaa.txt
→ Cドライブテストフォルダの「aaa.txt」
ブログ主は最近「System」の部分は抜いて書いて
いることが多いです。僅かでも省略出来るところは
省略したい面倒くさがりや精神。
Posted by 若槻風亜 - 2016.03.18,Fri
(対象)VB2010(VB.NET)
今回はVB2010でのタブコントロール(タブページ)の
ドラッグ&ドロップによる並べ替えです。
ドラッグ&ドロップによるタブの並べ替えはタブコントロールを
使用する際、それがユーザーが増やせるタイプであれば
あるほど欲しくなる機能だと思います。
しかし、いざ検索しても出てくるのは難しい
ものばかり。かく言うブログ主も挑戦して
挫折しました。
それでも何とか並べ替えしたい。
そう思って試行錯誤した結果、簡単に並べ替えられる
方法を作成できました。
それがこちら↓
(必要なコントロール)
・TabControl(名前:TabControl1)
・Timer(名前:Timer1)
(ソース)
'■変数
Public Tab1 As TabPage '---移動するタブ
Public Tab2 As TabPage '---移動先のタブ
Public TabPosX1 As Double '---移動するタブのX位置
Public TabPosY1 As Double '---移動するタブのY位置
Public TabPosX2 As Double '---移動先のX位置
Public TabPosY2 As Double '---移動先のY位置
Public TimeCount As Integer '---MouseMoveしている間にカウントされ続ける値
Public I As Integer '---諸動作
Public SortFlg As Boolean '---ソート中かどうかの判断用
'===========================================================
' タブの並べ替え
' ※右に移動 = 色が変わったタブの右側に移動
' ※左に移動 = 色が変わったタブの左側に移動
'===========================================================
'1.MouseDownで現在のタブを取得
Private Sub TabControl1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles TabControl1.MouseDown
'■現在地(X-Y)
TabPosX1 = e.X
TabPosY1 = e.Y
'■タブの取得
I = -1 : Tab1 = Nothing
For cnt = 0 To TabControl1.TabCount - 1
If TabControl1.GetTabRect(cnt).Contains(TabPosX1, TabPosY1) Then Tab1 = TabControl1.TabPages(cnt) : I = cnt : Exit For
Next '---タブの数だけ回すFor-Next
'■タイマーをオンにして加算を開始
TimeCount = 0
Timer1.Start()
End Sub
'2.タイマーで値を増やす:Timerは200ミリ秒くらいごとに起動するようにしておく
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
'■値を加算し、ゼロを超えれば長押し中なのでカーソルの形式を変える
TimeCount += 1
If TimeCount > 0 Then Cursor = Cursors.NoMoveHoriz
End Sub
'3.移動先の場所を取得
Private Sub TabControl1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TabControl1.MouseMove
'■カーソルのある位置を動くたびに取得
TabPosX2 = e.X
TabPosY2 = e.Y
End Sub
'4.MouseUpされたとき、ただのクリックか長押しかを判断し、長押しならマウスが離された先に移動
Private Sub TabControl1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TabControl1.MouseUp
'■TimerCountの値が2未満なら処理を抜ける(2以上ある場合は確実に長押し)
Cursor = Cursors.Arrow '---カーソルを元に戻す
Timer1.Stop() '---タイマーを止める
If TimeCount < 2 Then Exit Sub
'■移動先のタブを取得
I = -1 : Tab2 = Nothing
For cnt = 0 To TabControl1.TabCount - 1
If TabControl1.GetTabRect(cnt).Contains(TabPosX2, TabPosY2) Then Tab2 = TabControl1.TabPages(cnt) : I = cnt : Exit For
Next '---タブの数だけ回すFor-Next
If IsNothing(Tab2) Then Exit Sub
'■現在のタブを指定位置に追加し、元々のタブを削除
SortFlg = True '←SelectIndexChangeに何か処理が入っておりそれを行われると困る場合はこれでIF分挟んで処理を抜ける
TabControl1.TabPages.Remove(Tab1)
TabControl1.TabPages.Insert(I, Tab1)
SortFlg = False
'■元々開いていたタブを開く
TabControl1.SelectedTab = Tab1
End Sub
以上です。通常の移動のやり方と違うので「+」のマークは出ませんし
少々不恰好です。
が、多少不恰好でもとにかく移動機能が欲しい! の方には
オススメかなと。
※この並べ替えは後日アップ予定のフリーソフトに
使用している機能です。
プロフィール
HN:
若槻風亜
性別:
女性
職業:
会社員
趣味:
創作、プログラミング
自己紹介:
仕事や個人で学んだことをまとめておきたかったがために備忘録ブログを立ち上げました。
あくまで自分が学んだこと・自分が出来たことなので、ご覧くださる場合は参照レベルでお願いします。
あくまで自分が学んだこと・自分が出来たことなので、ご覧くださる場合は参照レベルでお願いします。
ブログ内検索
カレンダー
最新記事
(12/31)
(12/30)
(03/27)
(11/09)
(10/07)
P R
最新トラックバック
コガネモチ
フリーエリア
Template by mavericyard*
Powered by "Samurai Factory"
Powered by "Samurai Factory"