Option Explicit
'basp21のbregexpでperl5互換正規表現を使えるようにするための定義です。
'BREGEXP.DLLをWindowsのsystemディレクトリか
'VBアプリケーションを置くディレクトリにコピーしておく必要があります。
'bregexp.dllは、<Tatsuo Baba> babaq@hi-ho.ne.jpさん作成のdllです。
'http://www.hi-ho.ne.jp/babaq/index.html から入手可能です。
'正規表現の他にもpopメールが使えるなど、便利な機能満載です。

Private Declare Function Match Lib "bregexp" _
      (szRegstr As String, szTarget As StringAs String

Private Declare Function MatchEx Lib "bregexp" _
      (szRegstr As String, szTarget As String, mode As LongAs Variant

Private Declare Function bjReplace Lib "bregexp" Alias "Replace" _
      (szRegstr As String, szTarget As StringAs String

Private Declare Function Translate Lib "bregexp" _
      (szRegstr As String, szTarget As String, ret As StringAs Long

Private Declare Function Split Lib "bregexp" _
      (szRegstr As String, szTarget As String, limit As LongAs Variant
      
Private Declare Function OpenProcess Lib "kernel32" _
    (ByVal dwDesiredAccess As LongByVal bInheritHandle As Long, _
     ByVal dwProcessId As LongAs Long
Private Declare Function GetExitCodeProcess Lib "kernel32" _
    (ByVal hProcess As Long, lpExitCode As LongAs Long
Private Declare Function CloseHandle Lib "kernel32" _
    (ByVal hObject As LongAs Long

Private Const PROCESS_QUERY_INFORMATION = &H400&
Private Const STILL_ACTIVE = &H103&
      
      
'ファイルの関連付けに基づいてファイルを起動する
'http://www.remus.dti.ne.jp/~y-mac/apilib/fileexec.htmを参考にしました。

Private Declare Function ShellExecute Lib "shell32.dll" _
        Alias "ShellExecuteA" _
       (ByVal hwnd As LongByVal lpOperation As String, _
        ByVal lpFile As StringByVal lpParameters As String, _
        ByVal lpDirectory As StringByVal nShowCmd As LongAs Long

'ウィンドウをアクティブにし、現在のサイズと位置で表示する。
Private Const SW_SHOW = 5
'アプリケーションを開始したプログラムによって呼ばれた
'CreateProcess関数のSTARTUPINFO構造体で指定されたSW_フラグにより表示する。
Private Const SW_SHOWDEFAULT = 10
'ウィンドウをアクティブにし、最大化して表示する。
Private Const SW_SHOWMAXIMIZED = 3
'ウィンドウをアクティブにし、最小化して表示する。
Private Const SW_SHOWMINIMIZED = 2
'ウィンドウを最小化して表示する。アクティブなウィンドウはアクティブのまま。
Private Const SW_SHOWMINNOACTIVE = 7
'ウィンドウを現在の状態で表示する。アクティブなウィンドウはアクティブのまま。
Private Const SW_SHOWNA = 8
'ウィンドウを前回表示したサイズと位置で表示する。アクティブなウィンドウはアクティブのまま。
Private Const SW_SHOWNOACTIVATE = 4
'ウィンドウをアクティブにし表示する。ウィンドウが最小化または最大化されているときは
'元の状態に戻します。
Private Const SW_SHOWNORMAL = 1
'-----------------------------------------------------------------------------------------------------
Dim lRet As Long
      
'-----------------------------------------------------------------------------------------------------
      
Dim myHistory0
Dim myHistory1
Dim myHistory2
'Dim myHistoryNo As Integer

' 検索履歴のメモリ上のデータベース。
'Dim myHistoryStr As New Collection
Public myFileNo As Integer

' 検索履歴ファイルのファイル名
Const His_FILE = "clipsed1.ini"
Const okimari_FILE = "clipsed0.ini"

' 現在表示されている履歴コレクション内のインデックス。
Dim myCurrentHis As Long
Dim mycRows As Double



'◆Replace
Function xRep(inputRegstr As String, inputTarget As StringAs String

' Replace関数は、文字列中でパターンを検索し、もし見つかれば、置換テキストで置き換えた
' 文字列を返します。
' szRegstr : パターン。
' szTarget : 対象文字列。
' 戻り値   : 置換後の文字。
' パターンは、次のように指定します。パターンの詳細は、Perlのマニュアルを参照。
'   s/PATTERN/REPLACEMENT/gikm
'
'=xrep("s/<[^>]*>//g",B2) とすれば、短型一致。
    xRep = bjReplace(inputRegstr, inputTarget)
End Function
'◆Translate
Function xtrans(szRegstr As String, szTarget As StringAs String

' Translate関数は、検索リスト (SEARCHLIST) に含まれる文字を、対応する置換リスト
' (REPLACEMENTLIST) の文字に変換します。また、置換または削除が行なわれた、文字数を返します。
' szRegstr : パターン。
' szTarget : 対象文字列。
' ret      : 置換後の文字列。
' 戻り値   : 文字数。
' パターンは、次のように指定します。パターンの詳細は、Perlのマニュアルを参照。
'     tr/SEARCHLIST/REPLACEMENTLIST/cds
'
'        オプションには、
'          c   SEARCHLIST を補集合にする
'          d   見つかったが置換されなかった文字を削除する
'          s   置換された文字が重なったときに圧縮する
'          k   日本語を処理する。日本語をシングル文字として処理しない。
'
'          全角ひらがなを半角カナに変換。 →  =ASC(xtrans("tr/あ-ん/ア-ン/gk",A2))

Dim ctr As Long
ctr = Translate(szRegstr, szTarget, xtrans)

End Function

Function xsed(myRegexp As String, myTarget As String)
' sedもどきの関数 replaceかtranslateかを先頭のコマンドで判断します。

            xsed = xRep(myRegexp, myTarget)
End Function


Private Sub endcommand_Click()
  Unload Me
End Sub

Private Sub Form_Load()
    ' 履歴ファイルのサイズをチェックする。
    Call myCheckIniFileLen
    
    'クリップボードの情報をとりあえず表示する。
    clipKakunin_Click
    
    myHistory0 = Clipboard.GetText()
    LoadHistory App.Path & "\" & His_FILE, myRegstrBox

    LoadHistory App.Path & "\" & okimari_FILE, okimariBox
   
    myRegstrBox.SelText = "s///gk"
   
End Sub

Private Sub menu_explorer_Click()
    Dim IDProcess As Long
    IDProcess = ShellExecute(clipsed.hwnd, "open", App.Path, vbNullChar, "", SW_SHOW)

    'IDProcess = Shell(Environ("ComSpec") & " /c start http://hp.vector.co.jp/authors/VA021567/", vbHide)
End Sub


Private Sub myRegstrBox_GotFocus()
   ' myRegstrBoxの挿入位置を 2 文字目の後に設定します。
    'Filterモードか通常モードかのチェック 頭2文字、もしくは3文字で判断する
    Dim myChkFilterS2 As String
    Dim myChkFilterS3 As String
    
    myChkFilterS2 = Left(myRegstrBox.SelText, 2)
    myChkFilterS3 = Left(myRegstrBox.SelText, 3)
    
    
    If myChkFilterS2 = "s/" Or myChkFilterS2 = "m/" Then
        myRegstrBox.SelStart = 2
        myRegstrBox.SelLength = 0
    End If
    
    If myChkFilterS3 = "tr/" Then
        myRegstrBox.SelStart = 3
        myRegstrBox.SelLength = 0
    End If
        
    If myChkFilterS2 <> "s/" And myChkFilterS2 <> "m/" And myChkFilterS3 <> "tr/" Then
        myRegstrBox.SelStart = 0
        myRegstrBox.SelLength = 0
    End If
End Sub

Private Sub MenuAbout_Click()
    frmAbout.Show

End Sub

Private Sub MenuGuide_Click()
    Dialog1.Show

End Sub

Private Sub MenuHelpindex_Click()
' コモンダイアログを使って、ヘルプファイルを表示します。
' C:\WINDOWS\SYSTEM\COMDLG32.OCX が必要です。標準品?

   ' HelpCommand プロパティを設定します。
   CommonDialog1.HelpCommand = cdlHelpForceFile
   ' ヘルプ ファイルを指定します。
   CommonDialog1.HelpFile = App.Path & "\" & "clipsed.hlp"
'   ' Windows ヘルプ エンジンを表示します。
   CommonDialog1.ShowHelp

'ShellExecuteを使用したヘルプ表示
'    Dim IDProcess As Long
'    IDProcess = ShellExecute(clipsed.hwnd, "open", App.Path & "\" & "clipsed.hlp", vbNullChar, "", SW_SHOWDEFAULT)

End Sub

' ########## メニューバー処理 ###############

Private Sub MenuQuit_Click()
    ' 終了します
    Unload Me
End Sub

' ### 文字変換 ###

Private Sub MenuHK2ZK_Click()
    myMojiChikan ("カタカナをカタカナに")
End Sub

Private Sub MenuZK2HK_Click()
    myMojiChikan ("カタカナをカタカナに")
End Sub

Private Sub MenuXrev_Click()
    myMojiChikan ("文字反転")
End Sub

Private Sub MenuZ2H_Click()
    myMojiChikan ("全角を半角に")
End Sub

Private Sub MenuH2Z_Click()
    myMojiChikan ("半角を全角に")
End Sub

Private Sub MenuACap_Click()
    myMojiChikan ("単語先頭を大文字に")
End Sub

Private Sub MenuOmoji_Click()
    myMojiChikan ("大文字に変換")
End Sub

Private Sub MenuKomoji_Click()
    myMojiChikan ("小文字に変換")
End Sub

Private Sub MenuHira2Kana_Click()
    myMojiChikan ("ひらがなをカタカナに")
End Sub

Private Sub MenuKana2Hira_Click()
    myMojiChikan ("カタカナをひらがなに")
End Sub

Private Sub mojiCvt_Click()
    myMojiChikan ("MIMEデコード")
End Sub

Private Sub mojiCvtB_Click()
    myMojiChikan ("MIMEデコードB")
End Sub

Private Sub mojiCvtQ_Click()
    myMojiChikan ("MIMEデコードQ")
End Sub
Private Sub menu_sort_a_Click()
    myMojiChikan ("昇順ソート")
End Sub

Private Sub menu_sort_d_Click()
    myMojiChikan ("降順ソート")
End Sub

Private Sub menu_fil_uniq_n_Click()
    myMojiChikan ("uniq_n")
End Sub

Private Sub menu_fil_uniq_d_Click()
    myMojiChikan ("uniq_d")
End Sub

Private Sub menu_fil_uniq_dc_Click()
    myMojiChikan ("uniq_dc")
End Sub

'#### 履歴編集  ##############

Private Sub MenuEditHistory_Click()
    Call editIniFile(His_FILE)
End Sub

Private Sub Label1_Click()
    Call editIniFile(His_FILE)
End Sub

Private Sub MenuEditOkimari_Click()
    Call editIniFile(okimari_FILE)
End Sub

Private Sub okimariLabel_Click()
    Call editIniFile(okimari_FILE)

End Sub

'おきまりと履歴のリロード
Private Sub menu_reload_Click()
    LoadHistory App.Path & "\" & His_FILE, myRegstrBox
    myRegstrBox.Text = "s///gk"

    LoadHistory App.Path & "\" & okimari_FILE, okimariBox
End Sub
' ### 補助機能  ###
Private Sub MenuStrcount_Click()
        CountCrLf (myTextBox.Text)
End Sub

Private Sub Menumultidel_Click()
        delJufuku (myTextBox.Text)
End Sub

Private Sub Menumultiview_Click()
        exJufuku (myTextBox.Text)
End Sub


' ############## フォームの中にあるボタンの処理 #############

Private Sub runSed_Click()
' clipsedの本体です。実行ボタンが押された際の処理です。
    Dim myOutput As String
    Dim mySr As String
    Dim myS As String
    Dim mySedType As Integer
    Dim myRegStart1 As Integer
    Dim myRegStart2 As Integer
    Dim As Long
    Dim myRegType As String
    Dim myChkFilterS2 As String
    Dim myChkFilterS3 As String
    Dim myChkFilterType As Integer
    Dim myDelmNo As Integer
    
    mySr = myRegstrBox.Text
    myS = myTextBox.Text
    
    
    'Filterモードか通常モードかのチェック 頭2文字、もしくは3文字で判断する
    myChkFilterS2 = Left(mySr, 2)
    myChkFilterS3 = Left(mySr, 3)
    
    
    If myChkFilterS2 = "s/" Or myChkFilterS2 = "m/" Or myChkFilterS3 = "tr/" Then
        myChkFilterType = 0 '通常のBregexpを使うタイプが0
    Else
        myChkFilterType = 1 'Filterを使うタイプが1
    End If
    
    
    If myChkFilterType = 1 Then 'Filterモードらしきとき
         '状態表示をします。
        jotai.Caption = "変換中"
       
        myOutput = xFil(mySr, myS) '★Filterの実行!
    
    Else  ' 通常モードらしいとき

        mySedType = 0
        
        '初期値でリターンを押してしまった場合。意味がないので警告する。
        If mySr = "s///gk" Then
            MsgBox "入力コマンドを確認してください", vbCritical
            Exit Sub
        End If
        
        'デリミタの数によるエラー処理
        myDelmNo = CountString(mySr, "/")
        
        
        If myDelmNo >= 3 Then
            Else
            If myDelmNo >= 2 And myChkFilterS2 = "m/" Then
                Else
                    MsgBox "入力コマンドを確認してください", vbCritical
                    Exit Sub
            End If
        End If
        
        
        ' エラー処理2。
        myRegStart1 = InStr(mySr, "/") '置換パターンのはじまりの区切り位置
    
        For i = myRegStart1 + 1 To Len(mySr) '置換パターンの終わりの区切り位置
            myRegStart2 = InStr(i, mySr, "/")
            If Mid(mySr, myRegStart2 - 1, 2) <> "\$" Then Exit For
        Next i
        
        If InStr(mySr, "/") = 0 Then
            MsgBox "入力コマンドを確認してください", vbCritical
            Exit Sub
        End If
        
        'sedTypeの判断。mオプションを付けるか否かを^と$の有無で判断
        If Mid(mySr, myRegStart1 + 1, 1) = "^" Then
            mySedType = 1
        End If
        If Mid(mySr, myRegStart2 - 1, 1) = "$" And Mid(mySr, myRegStart2 - 2, 1) <> "\" Then
            mySedType = 1
        End If
        
        
        '置換実行
    '    myOutput = xsed(myRegstrBox.Text, myTextBox.Text)
    ' sedTypeにより複数行置換を可能にする。ただし、mオプションの方がほんとうはいい。後述。
        
        On Error Resume Next                ' エラー処理を設定します。
        
        '状態表示をします。
        jotai.Caption = "変換中"
    
    '   置換かトランスかを見分けます。
        myRegType = Left(mySr, InStr(mySr, "/") - 1)
    
        Select Case myRegType
            Case "s"    '置換の場合
                If mySedType = 1 Then
                    myOutput = crdelSed(mySr, myS)
                Else
                    myOutput = xRep(mySr, myS)
                End If
            
            Case "tr"   'トランスの場合
                myOutput = xtrans(mySr, myS)
            Case "m"    'Matchの場合
                    myOutput = xmatch(mySr, myS, m_rev.Value) 'マッチ行抽出はチェックBOXの状態で反転Xor
    
        End Select
    
    End If
    
    'ヒストリー変数に変換前文字列を代入する
    myHistory1 = myS
    
    ' 出力します。
    myTextBox.Text = myOutput
    
    '状態表示をします。
    jotai.Caption = "置換後文字列"
    manualHenko.Caption = ""
    
    'ヒストリ変数に変換後文字列を代入する
    myHistory2 = myOutput
    
    '検索式ヒストリをリストとファイルに追加します。
    If mySr <> myRegstrBox.List(0) Then
    'myRegstrBox.ListIndexだとだめなので、0を指定する。
        '履歴の古いものを消し先頭に持っていくルーチン
        'ファイルの削除を追加する必要がある。
        'とりあえず、ほっておく。(2002/01/18)
        'If mySr = myRegstrBox.List(myRegstrBox.ListIndex) Then
        '    myRegstrBox.RemoveItem myRegstrBox.ListIndex
        '    myRegstrBox.SelText = mySr
        'End If
        myRegstrBox.AddItem mySr, 0
        If Len(mySr) <= 200 Then ' 200バイトを超えるときには履歴ファイルに追加しない
            SaveHistory App.Path & "\" & His_FILE, mySr
        End If
    End If
    
    '状態表示をします。
    jotai.Caption = "変換終了"


End Sub

Private Sub myRegstrBox_KeyPress(KeyAscii As Integer)
        If KeyAscii = 13 Then
            KeyAscii = 0
            runSed_Click
        End If
End Sub


Private Sub multilineCmd_Click()
' 複数行補助ボタン
    multiLineForm.Show
End Sub

Private Sub History0_Click()
    myTextBox.Text = myHistory0
    jotai.Caption = "起動時のクリップボード内容"

End Sub

Private Sub History1_Click()
    myTextBox.Text = myHistory1
    jotai.Caption = "置換前文字列"
    manualHenko.Caption = ""

End Sub

Private Sub History2_Click()
    myTextBox.Text = myHistory2
    jotai.Caption = "置換後文字列"
    manualHenko.Caption = ""

End Sub


Private Sub okimarituika_Click()
    SaveHistory App.Path & "\" & okimari_FILE, myRegstrBox.Text
    okimariBox.AddItem myRegstrBox.Text, 0

End Sub

Private Sub clipKakunin_Click()
    ' クリップボードから変数にテキストを貼り付けます。
    myTextBox.Text = Clipboard.GetText()
    ' 出力します。
    jotai.Caption = "現在のクリップボード内容"
    manualHenko.Caption = ""

End Sub

Private Sub ClipTenso_Click()
    On Error Resume Next                ' エラー処理を設定します。
    
    Clipboard.Clear                 ' Clipboard オブジェクトの内容を消去します。
    Clipboard.SetText myTextBox.Text            ' Clipboard オブジェクトへ挿入します。
    jotai.Caption = "現在のクリップボード内容"
    manualHenko.Caption = ""

End Sub
Private Sub okimariBox_Click()
    On Error Resume Next                ' エラー処理を設定します。
    ' お決まりファイルの先頭と末尾の【】をコメントと見なして取り除く
    myRegstrBox.Text = xsed("s/^【.*?】\s*//gk", xrev(xsed("s/^\s*】.*?【\s*//gk", xrev(okimariBox.Text))))

End Sub

Private Sub mytextbox_KeyPress(KeyAscii As Integer)
    manualHenko.Caption = "変更"
End Sub

Private Sub cancel_Click()
    ' 終了します
    Unload Me
End Sub
Function LoadHistory(sFile As String, myTargetBox) As Boolean
    Dim myNextHis As String   ' 各履歴をファイルから読み込みます。
    Dim InFile As Integer   ' ファイルのディスクリプタ
    Dim myObjectBox
    
    Set myObjectBox = myTargetBox
    ' 次の未使用ファイル ディスクリプタを取得します。
    InFile = FreeFile
    
    ' ファイルが指定されているかどうかを確認します。
    If sFile = "" Then
        LoadHistory = False
        Exit Function
    End If
    
    ' ファイルを開く前に、ファイルが存在するかどうかを確認します。
    If Dir(sFile) = "" Then
        LoadHistory = False
        Exit Function
    End If
    
    ' テキスト ファイルからコレクションを読み込みます。
    
    myObjectBox.Visible = False
    myObjectBox.Clear

    Open sFile For Input As InFile
    While Not EOF(InFile)
        Line Input #InFile, myNextHis
        myObjectBox.AddItem myNextHis, 0
    Wend
    Close InFile
    myObjectBox.Visible = True


End Function

Function SaveHistory(sFile As String, myCurrentHis As StringAs Boolean
    ' 各履歴を書き込みます。
    Dim OutFile As Integer   ' ファイルのディスクリプタ
    
    ' 次の未使用ファイル ディスクリプタを取得します。
    OutFile = FreeFile
    
    ' ファイルが指定されているかどうかを確認します。
    If sFile = "" Then
        SaveHistory = False
        Exit Function
    End If
      
    ' テキスト ファイルへコレクションを書き込みます。
    Open sFile For Append As OutFile
    Print #OutFile, myCurrentHis
    Close OutFile

End Function
Function SaveTmpData(sFile As String, myCurrentHis As StringAs Boolean
    ' 各履歴を書き込みます。
    Dim OutFile As Integer   ' ファイルのディスクリプタ
    
    ' 次の未使用ファイル ディスクリプタを取得します。
    OutFile = FreeFile
    
    ' ファイルが指定されているかどうかを確認します。
    If sFile = "" Then
        SaveTmpData = False
        Exit Function
    End If
      
    ' テキスト ファイルへコレクションを書き込みます。
    Open sFile For Output As OutFile
    Print #OutFile, myCurrentHis
    Close OutFile

End Function



'フォームサイズを連動させる。
Private Sub Form_Resize()
    Const buttonArea = 2040
    Const buttonAreaTop1 = 600
    Const buttonAreaTop2 = 1080
    Const buttonAreaLeft1 = 1440
    Const buttonBoxWidth = 975
    
    myTextBox.Top = buttonArea
    myTextBox.Height = Abs(clipsed.ScaleHeight - buttonArea)
    'myTextBoxのHeightが負の値になるとエラーになる
    myTextBox.Left = 0
    myTextBox.Width = clipsed.ScaleWidth
    
    myRegstrBox.Top = buttonAreaTop1
    runSed.Top = buttonAreaTop1
    okimariBox.Top = buttonAreaTop2
    ClipTenso.Top = buttonAreaTop2
    
    myRegstrBox.Left = buttonAreaLeft1
    okimariBox.Left = buttonAreaLeft1
    
    runSed.Width = buttonBoxWidth
    ClipTenso.Width = buttonBoxWidth
    
    myRegstrBox.Width = Abs(clipsed.ScaleWidth - 2415)
    okimariBox.Width = Abs(clipsed.ScaleWidth - 2415)
    
    runSed.Left = Abs(clipsed.ScaleWidth - 990)
    ClipTenso.Left = Abs(clipsed.ScaleWidth - 990)
    
    
    'Debug.Print "myRegstrBox top:" & myRegstrBox.Top & " left:" & myRegstrBox.Left & " width:" & myRegstrBox.Width
    'Debug.Print "runsed top:" & runSed.Top & " left:" & runSed.Left & " width:" & runSed.Width
    
    'Debug.Print "okimariBox top:" & okimariBox.Top & " left:" & okimariBox.Left & " width:" & okimariBox.Width
    'Debug.Print "ClipTenso top:" & ClipTenso.Top & " left:" & ClipTenso.Left & " width:" & ClipTenso.Width
    
    'Debug.Print clipsed.ScaleWidth
    
End Sub

Function CountCrLf(myInputS As StringAs Long
'
' 文字列数と改行数を計算します。
'
Dim sL As Long
Dim myCrLfC As Long, myPos As Long
  sL = 0
  myCrLfC = 0
  myPos = 0
  If VarType(myInputS) <> 8 Or Len(myInputS) = 0 Then
    CountCrLf = 0
  Else
    myCrLfC = 0
    myPos = InStr(myInputS, vbCrLf)
    Do ;While myPos > 0
      myCrLfC = myCrLfC + 1
      myPos = InStr(myPos + 2, myInputS, vbCrLf)
    Loop
    sL = Len(myInputS) - (myCrLfC * 2) '文字数
    CountCrLf = myCrLfC + 1
  End If
  '状態表示をします。
  jotai.Caption = Format(sL, "##,##0") & "文字," & Format(CountCrLf, "##,##0") & "行," & Format(LenB(StrConv(myInputS, vbFromUnicode)), "##,##0") & "バイト"

End Function

'Public Function hankakuToZenkaku(s As String) As String

''  下記の古口さんのコードを大幅に改変したものです。変数名が同じなだけで、かなり異なったコードになりました。
''  連続する半角は、バッファにいれてまとめて変換するようにしました。おかげで濁音、撥音の認識をせずにすむようになったはずです。
''  これで少しはスピードアップできたのではないかとおもいます。が、それにしても遅い(+_;)

''  ハンカクカナを全角カナに変換する。
''  ハンカクカナをゼンカクに変換する関数 hankakuToZenkaku v0.9 1998.6.22
''
''  原作者  古口正巳  [koguchi@sf.airnet.ne.jp http://www.sf.airnet.ne.jp/koguchi/]
''
'
'
'    Dim i As Long 'counter
'    Dim sL As Long 'len(s)
'    Dim sS As String 'temp s
'    Dim sSHk As String '半角カナを保存するバッファ
'
'    i = 0
'    sL = 0
'    sS = ""
'    sSHk = ""
'
'    sL = Len(s)
'    For i = 1 To sL '最後の文字まで繰り返す
'        sS = Mid(s, i, 1) '文字を取り出して
'        If (sS < Chr(&HA0)) Or (sS > Chr(&HDF)) Then 'ハンカクカナ以外の場合
'            If sSHk <> "" Then '半角カナバッファに文字が有ればそれまでためていた半角バッファを全角変換し加える
'                hankakuToZenkaku = hankakuToZenkaku & StrConv(sSHk, vbWide)
'                sSHk = "" '半角バッファの初期化
'            End If
'            hankakuToZenkaku = hankakuToZenkaku & sS
'        Else
'            sSHk = sSHk & sS '半角バッファに入れる
'        End If
'    Next
'
'    If sSHk <> "" Then '最後が半角カナで終わっていた際の処理
'        hankakuToZenkaku = hankakuToZenkaku & StrConv(sSHk, vbWide)
'    End If
'End Function

Function hankakuToZenkaku2(s As StringAs String
'半角カナを一つずつ変換する
'こちらの方が速いなんて信じられないです。VBは &連結が遅すぎ
'NKF32.dllにまかせるという手もありますが、将来的に削除する可能性もあるので。

    Dim mySkana As String
    
    mySkana = s
    
    mySkana = xsed("s/ガ/ガ/gk", mySkana)
    mySkana = xsed("s/ギ/ギ/gk", mySkana)
    mySkana = xsed("s/グ/グ/gk", mySkana)
    mySkana = xsed("s/ゲ/ゲ/gk", mySkana)
    mySkana = xsed("s/ゴ/ゴ/gk", mySkana)
    mySkana = xsed("s/ザ/ザ/gk", mySkana)
    mySkana = xsed("s/ジ/ジ/gk", mySkana)
    mySkana = xsed("s/ズ/ズ/gk", mySkana)
    mySkana = xsed("s/ゼ/ゼ/gk", mySkana)
    mySkana = xsed("s/ゾ/ゾ/gk", mySkana)
    mySkana = xsed("s/ダ/ダ/gk", mySkana)
    mySkana = xsed("s/ヂ/ヂ/gk", mySkana)
    mySkana = xsed("s/ヅ/ヅ/gk", mySkana)
    mySkana = xsed("s/デ/デ/gk", mySkana)
    mySkana = xsed("s/ド/ド/gk", mySkana)
    mySkana = xsed("s/バ/バ/gk", mySkana)
    mySkana = xsed("s/パ/パ/gk", mySkana)
    mySkana = xsed("s/ビ/ビ/gk", mySkana)
    mySkana = xsed("s/ピ/ピ/gk", mySkana)
    mySkana = xsed("s/ブ/ブ/gk", mySkana)
    mySkana = xsed("s/プ/プ/gk", mySkana)
    mySkana = xsed("s/ベ/ベ/gk", mySkana)
    mySkana = xsed("s/ペ/ペ/gk", mySkana)
    mySkana = xsed("s/ボ/ボ/gk", mySkana)
    mySkana = xsed("s/ポ/ポ/gk", mySkana)
    mySkana = xsed("s/ヴ/ヴ/gk", mySkana)
    mySkana = xtrans("tr/ァアィイゥウェエォオカキクケコサシスセソタチッツテトナニヌネノハヒフヘホマミムメモャヤュユョヨラリルレロヮワヰヱヲンヵヶ。、「」・ー゚゙/ァアィイゥウェエォオカキクケコサシスセソタチッツテトナニヌネノハヒフヘホマミムメモャヤュユョヨラリルレロヮワヰヱヲンヵヶ。、「」・ー゜゛/gk", mySkana)

    hankakuToZenkaku2 = mySkana

End Function

Function zenkakuToHankaku(s As StringAs String
'全角カナを半角カナに一つずつ変換する

    Dim mySkana As String
    
    mySkana = s
    
    mySkana = xsed("s/ガ/ガ/gk", mySkana)
    mySkana = xsed("s/ギ/ギ/gk", mySkana)
    mySkana = xsed("s/グ/グ/gk", mySkana)
    mySkana = xsed("s/ゲ/ゲ/gk", mySkana)
    mySkana = xsed("s/ゴ/ゴ/gk", mySkana)
    mySkana = xsed("s/ザ/ザ/gk", mySkana)
    mySkana = xsed("s/ジ/ジ/gk", mySkana)
    mySkana = xsed("s/ズ/ズ/gk", mySkana)
    mySkana = xsed("s/ゼ/ゼ/gk", mySkana)
    mySkana = xsed("s/ゾ/ゾ/gk", mySkana)
    mySkana = xsed("s/ダ/ダ/gk", mySkana)
    mySkana = xsed("s/ヂ/ヂ/gk", mySkana)
    mySkana = xsed("s/ヅ/ヅ/gk", mySkana)
    mySkana = xsed("s/デ/デ/gk", mySkana)
    mySkana = xsed("s/ド/ド/gk", mySkana)
    mySkana = xsed("s/バ/バ/gk", mySkana)
    mySkana = xsed("s/パ/パ/gk", mySkana)
    mySkana = xsed("s/ビ/ビ/gk", mySkana)
    mySkana = xsed("s/ピ/ピ/gk", mySkana)
    mySkana = xsed("s/ブ/ブ/gk", mySkana)
    mySkana = xsed("s/プ/プ/gk", mySkana)
    mySkana = xsed("s/ベ/ベ/gk", mySkana)
    mySkana = xsed("s/ペ/ペ/gk", mySkana)
    mySkana = xsed("s/ボ/ボ/gk", mySkana)
    mySkana = xsed("s/ポ/ポ/gk", mySkana)
    mySkana = xsed("s/ヴ/ヴ/gk", mySkana)
    mySkana = xtrans("tr/ァアィイゥウェエォオカキクケコサシスセソタチッツテトナニヌネノハヒフヘホマミムメモャヤュユョヨラリルレロヮワヰヱヲンヵヶ。、「」・ー゜゛/ァアィイゥウェエォオカキクケコサシスセソタチッツテトナニヌネノハヒフヘホマミムメモャヤュユョヨラリルレロヮワヰヱヲンヵヶ。、「」・ー゚゙/gk", mySkana)

    zenkakuToHankaku = mySkana

End Function

Public Function delJufuku(s As StringAs String '重複行削除
    Dim As Long 'counter
    Dim sL As Long 'len(s)
    Dim sS As String 'temp s
    Dim myLine1 As String '前の行
    Dim myLine2 As String '次の行
    Dim cJ '重複行カウンタ
    
    If InStr(s, vbLf) = 0 Then  '一行しかなかったら処理を中断
        jotai.Caption = "中断! 1行しかありません"
        Exit Function
    End If
    
    sL = Len(s)
    myLine1 = ""
    myLine2 = ""
    cJ = 0
    
    For i = 1 To sL '最後の文字まで繰り返す
        sS = Mid(s, i, 1)
        myLine2 = myLine2 & sS
        If sS = vbLf Then '改行なら 改行は、LFだけで判定している。
            If StrComp(myLine1, myLine2, 0) <> 0 Then '重複していなかったら
                delJufuku = delJufuku & myLine2 '出力
                myLine1 = myLine2 'L2を L1 にスイッチ。
            Else
                cJ = cJ + 1
            End If
            myLine2 = ""
        End If
        
    Next i
        myLine1 = Mid(myLine1, 1, Len(myLine1) - 2)
        If StrComp(myLine1, myLine2, 0) <> 0 Then '重複していなかったら
            delJufuku = delJufuku & myLine2 '出力
        Else
            cJ = cJ + 1
        End If

    ' 出力します。
    If cJ = 0 Then
        jotai.Caption = "重複行はありませんでした"
    Else
        myHistory2 = delJufuku
        myHistory1 = s
        myTextBox.Text = delJufuku
        manualHenko.Caption = ""
        jotai.Caption = Format(cJ, "##,##0") & "行の重複行を削除しました"
    End If

End Function

Public Function exJufuku(s As StringAs String '重複行抽出
    Dim As Long 'counter
    Dim sL As Long 'len(s)
    Dim sS As String 'temp s
    Dim myLine1 As String '前の行
    Dim myLine2 As String '次の行
    Dim cJ '重複行カウンタ
    
    If InStr(s, vbLf) = 0 Then  '一行しかなかったら処理を中断
        jotai.Caption = "中断! 1行しかありません"
        Exit Function
    End If

    sL = Len(s)
    myLine1 = ""
    myLine2 = ""
    cJ = 0
    For i = 1 To sL '最後の文字まで繰り返す
        sS = Mid(s, i, 1)
        myLine2 = myLine2 & sS
        If sS = vbLf Then '改行なら 改行は、LFだけで判定している。
            If StrComp(myLine1, myLine2, 0) = 0 Then '重複していたら
                exJufuku = exJufuku & myLine2 '出力
                cJ = cJ + 1
            End If
            myLine1 = myLine2 'L2を L1 にスイッチ。
            myLine2 = ""
        End If
        
    Next i
        myLine1 = Mid(myLine1, 1, Len(myLine1) - 2)
        If StrComp(myLine1, myLine2, 0) = 0 Then '重複していたら
            exJufuku = exJufuku & myLine2 '出力
            cJ = cJ + 1
        End If
    
    ' 出力します。
    If cJ = 0 Then
        jotai.Caption = "重複行はありませんでした"
    Else
        myHistory2 = exJufuku
        myHistory1 = s
        myTextBox.Text = exJufuku
        manualHenko.Caption = ""
        jotai.Caption = Format(cJ, "##,##0") & "行、重複行がありました"
    End If

End Function

' Public Function lineSed(sR As String, s As String) As String '行単位置換(普通のsed)
' ' 2000/09/11 普通のsedと同じく、^や$が使えるようにした。
' ' mオプションを使うのが正当だが、仕様で改行を\nだけで判断しているため、行末$を使うとき\rを
' ' 考慮する必要がある。よって、その手間をなくすために、本コードがある。


'     Dim i As Long 'counter
'     Dim sL As Long 'len(s)
'     Dim sS As String 'temp s
'     Dim cTmp As Long ' tempCounter
'     Dim myLineOut As String '出力変数
'     Dim myLineTmp As String '処理行
'
'     sL = Len(s)
'     cTmp = 0
'     myLineOut = ""
'     myLineTmp = ""
'     For i = 1 To sL '最後の文字まで繰り返す
'         sS = Mid(s, i, 1)
'         If sS = vbLf Then 'Lfなら
'             sS = Mid(s, i - 1, 1) '一つ前を振り返り
'             If sS = vbCr Then 'それがCrなら、あわせてCrLfになるから改行と判断
'                 cTmp = Len(myLineTmp) 'Crまでの文字数を数えて
'                 myLineTmp = Mid(myLineTmp, 1, cTmp - 1) 'Crを除いた文字列を取り出す
'                 If myLineTmp <> "" Then '空行でなければ
'                     myLineOut = myLineOut & xsed(sR, myLineTmp) & vbCrLf ' 置換して追加
'                 Else
'                     myLineOut = myLineOut & vbCrLf '空行なら改行のみを追加
'                 End If
'                 myLineTmp = "" '処理行の初期化
'                 cTmp = 0
'             End If
'         Else
'             myLineTmp = myLineTmp & sS 'Lf以外なら読み込んだ文字を追加
'         End If
'     Next i
'         If myLineTmp <> "" Then '末尾に改行がないときの処理
'             myLineOut = myLineOut & xsed(sR, myLineTmp) '置換して追加
'         End If
'         lineSed = myLineOut '出力
' End Function

Public Function crdelSed(sR As String, s As StringAs String 'CRを無視した置換「mオプション対応用」

crdelSed = xsed("s/\n/\r\n/gk", xsed(sR & "m", xsed("s/\r//gk", s)))

End Function


Public Function xrev(s As StringAs String '行単位で文字列逆転
' 行単位で文字反転する.VB6の「StrReverse」関数を使っている.2001/05/29

     Dim As Long 'counter
     Dim sL As Long 'len(s)
     Dim sS As String 'temp s
     Dim cTmp As Long ' tempCounter
     Dim myLineOut As String '出力変数
     Dim myLineTmp As String '処理行

     sL = Len(s)
     cTmp = 0
     myLineOut = ""
     myLineTmp = ""
     'myTextBox.Text = ""
     
     For i = 1 To sL '最後の文字まで繰り返す
         sS = Mid(s, i, 1)
         If sS = vbLf Then 'Lfなら
             sS = Mid(s, i - 1, 1) '一つ前を振り返り
             If sS = vbCr Then 'それがCrなら、あわせてCrLfになるから改行と判断
                 cTmp = Len(myLineTmp) 'Crまでの文字数を数えて
                 myLineTmp = Mid(myLineTmp, 1, cTmp - 1) 'Crを除いた文字列を取り出す
                 If myLineTmp <> "" Then '空行でなければ
                     myLineOut = myLineOut & StrReverse(myLineTmp) & vbCrLf ' ★文字反転して追加★
                        ' 出力します。
                        'myTextBox.SelStart = Len(myTextBox.Text)
                        'myTextBox.SelText = StrReverse(myLineTmp) & vbCrLf
                 Else
                     myLineOut = myLineOut & vbCrLf '空行なら改行のみを追加
                     ' myTextBox.SelStart = Len(myTextBox.Text)
                     ' myTextBox.SelText = vbCrLf
                     
                 End If
                 myLineTmp = "" '処理行の初期化
                 cTmp = 0
             End If
         Else
             myLineTmp = myLineTmp & sS 'Lf以外なら読み込んだ文字を追加
         End If
     Next i
         If myLineTmp <> "" Then '末尾に改行がないときの処理
             myLineOut = myLineOut & StrReverse(myLineTmp) '★文字反転して追加★
             ' myTextBox.SelStart = Len(myTextBox.Text)
             ' myTextBox.SelText = StrReverse(myLineTmp)
             
         End If
          xrev = myLineOut '出力
          '  jotai.Caption = "置換後文字列"
          '  manualHenko.Caption = ""
          '
          '  myHistory2 = myTextBox.Text

         
End Function

Private Sub myMojiChikan(myExRepText)
' メニューから選択する場合のサブルーチン 2001/05/02追加
' ドロップダウンリストから援用
' 文字変換をします。半角カタカナ変換以外は、vbの関数のみを使用しています。
    Dim myOutput As String
    On Error Resume Next                ' エラー処理を設定します。
    
    If myTextBox.Text = "" Then Exit Sub ' 置換対象が空だったら何もしない。
    
    '状態表示をします。
    jotai.Caption = "変換中"

    myHistory1 = myTextBox.Text

'    myExRepText = zenkakuchikan.Text
'    これがあると、ドロップダウンリスト用になる
    
    Select Case myExRepText
        Case "大文字に変換"
            myOutput = StrConv(myTextBox.Text, vbUpperCase)
        Case "小文字に変換"
            myOutput = StrConv(myTextBox.Text, vbLowerCase)
        Case "単語先頭を大文字に"
            myOutput = StrConv(myTextBox.Text, vbProperCase)
        Case "半角を全角に"
            myOutput = xsed("s/\\/¥/gk", StrConv(myTextBox.Text, vbWide))
        Case "全角を半角に"
            myOutput = xsed("s/¥/\\/gk", StrConv(myTextBox.Text, vbNarrow))
        Case "ひらがなをカタカナに"
            myOutput = StrConv(myTextBox.Text, vbKatakana)
        Case "カタカナをひらがなに"
            myOutput = StrConv(myTextBox.Text, vbHiragana)
        Case "カタカナをカタカナに"
            myOutput = hankakuToZenkaku2(myTextBox.Text)
        Case "カタカナをカタカナに"
            myOutput = zenkakuToHankaku(myTextBox.Text)
        Case "文字反転"
            myOutput = xrev(myTextBox.Text)
        Case "MIMEデコード"
            myOutput = chCode(myTextBox.Text)
        Case "MIMEデコードB"
            myOutput = chCode(myTextBox.Text, "msJB")
        Case "MIMEデコードQ"
            myOutput = chCode(xsed("s/=1B/\e/gk", xsed("s/=\r\n//gk", xsed("s/=3D/=/gk", myTextBox.Text))), "msJB")
        Case "昇順ソート"
            myOutput = xFil("sort", myTextBox.Text)
        Case "降順ソート"
            myOutput = xFil("sort /r", myTextBox.Text)
        Case "uniq_n"
            myOutput = xFil("uniq", myTextBox.Text)
        Case "uniq_d"
            myOutput = xFil("uniq -d", myTextBox.Text)
        Case "uniq_dc"
            myOutput = xFil("uniq -dc", myTextBox.Text)
        Case ""
        Exit Sub
        
    End Select
    
    outTotxtBox (myOutput)
    '状態表示をします。
    jotai.Caption = "変換終了"
    

End Sub

Public Sub outTotxtBox(myOutput As String)

    ' 出力します。
    myTextBox.Text = myOutput
    jotai.Caption = "置換後文字列"
    manualHenko.Caption = ""
    
    myHistory2 = myOutput

End Sub


Public Function xmatch(myRegexp As String, s As String, fV As IntegerAs String 'マッチ行抽出
' 2001/07/08

     Dim As Long 'counter
     Dim sL As Long 'len(s)
     Dim sS As String 'temp s
     Dim cTmp As Long ' tempCounter
     Dim myLineOut As String '出力変数
     Dim myLineTmp As String '処理行
     Dim ret As Integer ' マッチ真偽
     
     'fVは、-fチェックボックスの真偽を現す。非チェック0、チェック1
     

     sL = Len(s)
     cTmp = 0
     myLineOut = ""
     myLineTmp = ""
     For i = 1 To sL '最後の文字まで繰り返す
         sS = Mid(s, i, 1)
         If sS = vbLf Then 'Lfなら
             sS = Mid(s, i - 1, 1) '一つ前を振り返り
             If sS = vbCr Then 'それがCrなら、あわせてCrLfになるから改行と判断
                 cTmp = Len(myLineTmp) 'Crまでの文字数を数えて
                 myLineTmp = Mid(myLineTmp, 1, cTmp - 1) 'Crを除いた文字列を取り出す
                 If myLineTmp <> "" Then '空行でなければ
                    ret = Match(myRegexp, myLineTmp) 'マッチを確認
                    If (ret Xor fV) Then  'マッチしたなら
                        myLineOut = myLineOut & myLineTmp & vbCrLf ' ★その行を追加★
                    End If
                 End If
                 myLineTmp = "" '処理行の初期化
                 cTmp = 0
             End If
         Else
             myLineTmp = myLineTmp & sS 'Lf以外なら読み込んだ文字を追加
         End If
     Next i
         If myLineTmp <> "" Then '末尾に改行がないときの処理
            ret = Match(myRegexp, myLineTmp) 'マッチを確認
            If (ret Xor fV) Then  'マッチしたなら
               myLineOut = myLineOut & myLineTmp & vbCrLf ' ★その行を追加★
            End If
         End If
         xmatch = myLineOut '出力
End Function

Sub myCheckIniFileLen()
    Dim lenHisFile  As Long 'ヒストリファイルのサイズを格納
    Dim lenOkiFile  As Long 'お決まりファイルのサイズを格納
    Dim myYesNo As Integer     'ボタンのYes/Noを格納
    Dim myErrMes As String
    Dim myOK As Integer
    myErrMes = vbCrLf & "整理すると起動が速くなります。" & vbCrLf & _
    "clipsedを起動してからOptionでも編集できます" _
    & vbCrLf & "整理しますか?"
        lenHisFile = FileLen(App.Path & "\" & His_FILE) 'ヒストリファイルサイズ
        lenOkiFile = FileLen(App.Path & "\" & okimari_FILE) 'お決まりファイルサイズ
        
        If lenHisFile >= 50000 Then 'ヒストリが50Kを超えていたら
            myYesNo = MsgBox("履歴ファイルのサイズが50Kを超えています。" & myErrMes, 52)
            Select Case myYesNo
            Case vbYes
                Call editIniFile(His_FILE)
                MsgBox ("編集が終わったらOKを押して下さい")
            End Select
        End If
        If lenOkiFile >= 5000 Then  'お決まりが50Kを超えていたら
            myYesNo = MsgBox("お気まきの表現ファイルのサイズが50Kを超えています。" & myErrMes, 52)
            Select Case myYesNo
            Case vbYes
                Call editIniFile(okimari_FILE)
                MsgBox ("編集が終わったらOKを押して下さい")
            End Select
        End If
        
End Sub



Function mycCountCrLf(myInputS As StringAs Long
'
' 文字列数と改行数を計算します。
'
Dim sL As Long
Dim myCrLfC As Long, myPos As Long
  sL = 0
  myCrLfC = 0
  myPos = 0
  If VarType(myInputS) <> 8 Or Len(myInputS) = 0 Then
    mycCountCrLf = 0
  Else
    myCrLfC = 0
    myPos = InStr(myInputS, vbCrLf)
    Do ;While myPos > 0
      myCrLfC = myCrLfC + 1
      myPos = InStr(myPos + 2, myInputS, vbCrLf)
    Loop
    sL = Len(myInputS) - (myCrLfC * 2) '文字数
    mycCountCrLf = myCrLfC + 1
  End If
 '状態表示をします。
 If Right(myInputS, 1) <> vbLf Then mycCountCrLf = mycCountCrLf + 1
 Debug.Print Format(sL, "##,##0") & "文字," & Format(mycCountCrLf, "##,##0") & "行," & Format(LenB(StrConv(myInputS, vbFromUnicode)), "##,##0") & "バイト"

End Function



'テキストファイルからの読み込み
'2001/12/27 Tomo
Function getTextFile(sFile As StringAs String

'    Dim myNextLine As String   ' 各履歴をファイルから読み込みます。
'    Dim myAllText As String
    Dim InFile As Integer   ' ファイルのディスクリプタ
    
    ' 次の未使用ファイル ディスクリプタを取得します。
    InFile = FreeFile
    
    ' ファイルが指定されているかどうかを確認します。
    If sFile = "" Then
        Exit Function
    End If
    
    ' ファイルを開く前に、ファイルが存在するかどうかを確認します。
    If Dir(sFile) = "" Then
        Exit Function
    End If
    
    ' テキスト ファイルからコレクションを読み込みます。
    Open sFile For Input As InFile
    
'    While Not EOF(InFile)
'        Line Input #InFile, myNextLine
'        myAllText = myAllText & myNextLine & vbCrLf
'    Wend
    
    If LOF(InFile) <> 0 Then    '出力結果ファイルサイズが 0 でないならば
        getTextFile = StrConv(InputB(LOF(InFile) - 1, #InFile), vbUnicode)
    Else                        '出力結果ファイルサイズが 0 であれば
        getTextFile = ""        'nullを出力
    End If
    
    Close InFile
    
'    getTextFile = myAllText
    
End Function


'◆filter関数
'2001/12/27 Tomo
Function xFil(inputRegstr As String, inputTarget As StringAs String

' Filterモードです。
' 直接sed32 grep nkf等のコマンドがかけます。
' szRegstr : パターン。
' szTarget : 対象文字列。
' 戻り値   : 置換後の文字。
    
      Dim IDProcess As Long
      Dim hProcess As Long
      Dim ExitCode As Long
      Dim ret As Long
      
      SaveTmpData App.Path & "\" & "cps0.tmp", inputTarget
      
      IDProcess = Shell(Environ("ComSpec") & " /c type cps0.tmp| " & inputRegstr & " > cps1.tmp", vbHide)
      hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 1, IDProcess)
      Do
          ret = GetExitCodeProcess(hProcess, ExitCode)
          DoEvents
      Loop While (ExitCode = STILL_ACTIVE)
      ret = CloseHandle(hProcess)

      'MsgBox " 終了しました ", vbInformation
      
      xFil = getTextFile(App.Path & "\" & "cps1.tmp")
      

End Function

Private Sub gotoclipsedHP_Click()
    Dim IDProcess As Long
    IDProcess = ShellExecute(clipsed.hwnd, "open", "http://hp.vector.co.jp/authors/VA021567/", vbNullChar, "", SW_SHOW)

    'IDProcess = Shell(Environ("ComSpec") & " /c start http://hp.vector.co.jp/authors/VA021567/", vbHide)
End Sub

Function CountString(myInputS As String, myTs As StringAs Long
'
' 文字数をカウントします。
'
    Dim As Integer
    
    CountString = 0
    
    For i = 1 To Len(myInputS)
    If Mid(myInputS, i, 1) = myTs Then
        CountString = CountString + 1
        End If
    Next

End Function

 


 

Private Sub okCmd_Click()
    Dim myRegB, myRegA
    myRegB = ""
    myRegA = ""
    
    If KensakuBox.Text <> "" Then
        myRegB = xRep("s/\r\n/\\r\\n/gk", xRep("s/[\\^.$|()\[\]*+?\/]/\\$&/gk", KensakuBox.Text))
    End If
    
    If ChikanBox.Text <> "" Then
        myRegA = xRep("s/\r\n/\\r\\n/gk", xRep("s/[\\^.$|()\[\]*+?\/]/\\$&/gk", ChikanBox.Text))
    End If
    
    clipsed.myRegstrBox.Text = "s/" & myRegB & "/" & myRegA & "/gk"
    Unload Me

End Sub


 

'Windows 95/98かWindows NT/2000かを判別する。
'APIの実装が異なることが多いので、これらのOSを判別しなければならないことが良くある。
'新山(へろぱ)さん<http://plaza5.mbn.or.jp/~heropa/vb25.htm> のコードを利用させていただいた。

Option Explicit

'OS判定用
Private Type tagOSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion      As Long
    dwMinorVersion      As Long
    dwBuildNumber       As Long
    dwPlatformId        As Long
    szCSDVersion        As String * 128
End Type

Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _
                                (lpVersionInformation As tagOSVERSIONINFO) As Long
Private Const VER_PLATFORM_WIN32_NT = 2

'ファイルの関連付けに基づいてファイルを起動する
'http://www.remus.dti.ne.jp/~y-mac/apilib/fileexec.htmを参考にしました。

Private Declare Function ShellExecute Lib "shell32.dll" _
        Alias "ShellExecuteA" _
       (ByVal hwnd As LongByVal lpOperation As String, _
        ByVal lpFile As StringByVal lpParameters As String, _
        ByVal lpDirectory As StringByVal nShowCmd As LongAs Long

'ウィンドウをアクティブにし、現在のサイズと位置で表示する。
Private Const SW_SHOW = 5
'アプリケーションを開始したプログラムによって呼ばれた
'CreateProcess関数のSTARTUPINFO構造体で指定されたSW_フラグにより表示する。
Private Const SW_SHOWDEFAULT = 10
'ウィンドウをアクティブにし、最大化して表示する。
Private Const SW_SHOWMAXIMIZED = 3
'ウィンドウをアクティブにし、最小化して表示する。
Private Const SW_SHOWMINIMIZED = 2
'ウィンドウを最小化して表示する。アクティブなウィンドウはアクティブのまま。
Private Const SW_SHOWMINNOACTIVE = 7
'ウィンドウを現在の状態で表示する。アクティブなウィンドウはアクティブのまま。
Private Const SW_SHOWNA = 8
'ウィンドウを前回表示したサイズと位置で表示する。アクティブなウィンドウはアクティブのまま。
Private Const SW_SHOWNOACTIVATE = 4
'ウィンドウをアクティブにし表示する。ウィンドウが最小化または最大化されているときは
'元の状態に戻します。
Private Const SW_SHOWNORMAL = 1
'-----------------------------------------------------------------------------------------------------

'
' Windows NT/2000であればTrueを返す。
'
Public Function IsNT() As Boolean
    Dim osvi        As tagOSVERSIONINFO
    Dim lngResult   As Long

    ' dwOSVersionInfoSizeに構造体のサイズをセットする。
    osvi.dwOSVersionInfoSize = Len(osvi)
    ' OSのバージョン情報を得る。
    lngResult = GetVersionEx(osvi)
    If (lngResult <> 0) Then
        IsNT = (osvi.dwPlatformId = VER_PLATFORM_WIN32_NT)
    End If
End Function


Sub editIniFile(myEditFileName As String)
'履歴ファイル編集のサブルーチン
    Dim myYesNo1 As Integer
    Dim IDProcess As Long

    
    If (IsNT = False And FileLen(App.Path & "\" & myEditFileName) >= 64000) Then 'OSチェックもする
        myYesNo1 = MsgBox("ファイルサイズが64Kを超えています。wordpadで開きますか?" & vbCrLf & _
        "Noを選択すると関連づけられたエディタで開きます。" & vbCrLf & _
        "ただし、64K以上を編集できないエディタだと落ちる可能性があります。 ", 51)
        Select Case myYesNo1
        Case vbYes
            IDProcess = Shell(Wordpaddir & " " & App.Path & "\" & myEditFileName, 1)

        Case vbNo
            'IDProcess = Shell(Environ("ComSpec") & " /c start " & App.Path & "\" & myEditFileName, vbHide)
            IDProcess = ShellExecute(clipsed.hwnd, "open", App.Path & "\" & myEditFileName, vbNullChar, "", SW_SHOW)
        Case vbCancel
            Exit Sub
        End Select
    Else    '2000系列なら
            'IDProcess = Shell(Environ("ComSpec") & " /c start " & App.Path & "\" & myEditFileName, vbHide)
            IDProcess = ShellExecute(clipsed.hwnd, "open", App.Path & "\" & myEditFileName, vbNullChar, "", SW_SHOW)
        'iRtn = Shell("notepad.exe " & App.Path & "\" & myEditFileName, 1)
    End If
        
End Sub

Function Wordpaddir() As String
    'wordpadの格納されているディレクトリーをレジストリより取得
    'HKEY_CLASSES_ROOT\Wordpad.Document.1\Protocol\StdFileEditing\Server
    Dim dum0
    Wordpaddir = GetKeyValue(HKEY_CLASSES_ROOT, "Wordpad.Document.1\Protocol\StdFileEditing\Server", "")
    Debug.Print Wordpaddir
    If Wordpaddir = "" Then
        dum0 = MsgBox("wordpadがインストールされているか確認してください。", , "Error!")
        Exit Function
    End If
End Function

Private Sub execEx(sExFilename As String)

End Sub