tagCANDY CGI VBレスキュー(花ちゃん) - 自作:文字列連結用クラス(VB6.0) - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
自作:文字列連結用クラス(VB6.0)
元に戻る スレッド一覧へ 記事閲覧
このページ内の検索ができます。(AND 検索や OR 検索のような複数のキーワードによる検索はできません。)

自作:文字列連結用クラス(VB6.0) [No.130の個別表示]
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
日時: 2007/08/20 19:40
名前: GOD

***********************************************************************************
* カテゴリー:[文字列処理][基本コード][]                                          *
* キーワード:文字列連結,文字をつなぐ,,,,                                         *
***********************************************************************************

-----------------------------------------------------------------------------------
投稿者:GOD - 文字列連結用クラス(VB6.0)   2007/08/20 19:40
-----------------------------------------------------------------------------------

文字連結(&連結)は回数を重ねると非常に重くなるので作ってみました。

'--- StringEx.cls
Option Explicit

'******************************************************************************
'【概要】
'   文字列連結用クラス
'【作成】
'   Ver.1.00 GOD
'【履歴】
'   Ver.1.01 GOD
'   ・MemAdjust() 関数
'       必要な領域値よりも多くの領域を確保していたので修正
'   Ver.1.02 GOD
'   ・AddForward() 関数
'       "" の連結回避
'   ・AddRear() 関数
'       "" の連結回避
'******************************************************************************

'文字列の増加値
Private Const ADDNUM As Long = 1024

'管理文字列
Private mStr As String
'管理中の文字列の長さ
Private mlngCnt As Long
'領域内の位置
Private mlngForwardPos As Long
'文字列領域のサイズ
Private mlngForwardCntMax As Long
'領域内の位置
Private mlngRearPos As Long
'文字列領域のサイズ
Private mlngRearCntMax As Long



'------------------------------------------------------------------------------
'   インスタンス処理
'------------------------------------------------------------------------------

'******************************************************************************
'【概要】
'   変数の初期化を行う
'【引数】
'   なし
'【返値】
'   なし
'【作成】
'   Ver.1.00 GOD
'【履歴】
'******************************************************************************
Private Sub Class_Initialize()
    Call Init
End Sub



'------------------------------------------------------------------------------
'   プロパティ
'------------------------------------------------------------------------------

'******************************************************************************
'【概要】
'   文字列を取得/設定する
'【引数】
'   Value           :文字列
'【返値】
'   文字列
'【作成】
'   Ver.1.00 GOD
'【履歴】
'******************************************************************************
Public Property Get Text() As String
    Text = Mid$(mStr, mlngForwardPos, mlngCnt)
End Property
Public Property Let Text(Value As String)
    Call Init
    Call AddRear(Value)
End Property



'------------------------------------------------------------------------------
'   メソッド
'------------------------------------------------------------------------------

'******************************************************************************
'【概要】
'   文字列を連結する
'【引数】
'   FStr            :前方に連結する文字列
'   RStr            :後方に連結する文字列
'【返値】
'   なし
'【作成】
'   Ver.1.00 GOD
'【履歴】
'******************************************************************************
Public Sub AddString(Optional FStr As String, _
                     Optional RStr As String)
    If FStr <> "" Then
        Call AddForward(FStr)
    End If
    If RStr <> "" Then
        Call AddRear(RStr)
    End If
End Sub

'******************************************************************************
'【概要】
'   前方に文字列を連結する
'【引数】
'   AddStr          :連結文字列
'【返値】
'   なし
'【作成】
'   Ver.1.00 GOD
'【履歴】
'   Ver.1.02 GOD
'       "" に対応
'******************************************************************************
Public Sub AddForward(AddStr As String)
    Dim lngSize As Long

    lngSize = Len(AddStr)
'↓ Ver.1.02 GOD ---"" の連結回避
'    Call MemAdjust(lngSize, True)
'    Mid(mStr, mlngForwardPos - lngSize, lngSize) = AddStr
'    mlngForwardPos = mlngForwardPos - lngSize
'    mlngCnt = mlngCnt + lngSize
    If lngSize > 0 Then
        Call MemAdjust(lngSize, True)
        Mid(mStr, mlngForwardPos - lngSize, lngSize) = AddStr
        mlngForwardPos = mlngForwardPos - lngSize
        mlngCnt = mlngCnt + lngSize
    End If
'↑ Ver.1.02 GOD ---"" の連結回避
End Sub

'******************************************************************************
'【概要】
'   後方に文字列を連結する
'【引数】
'   AddStr          :連結文字列
'【返値】
'   なし
'【作成】
'   Ver.1.00 GOD
'【履歴】
'   Ver.1.02 GOD
'       "" に対応
'******************************************************************************
Public Sub AddRear(AddStr As String)
    Dim lngSize As Long

    lngSize = Len(AddStr)
'↓ Ver.1.02 GOD ---"" の連結回避
'    Call MemAdjust(lngSize, False)
'    Mid(mStr, mlngRearPos, lngSize) = AddStr
'    mlngRearPos = mlngRearPos + lngSize
'    mlngCnt = mlngCnt + lngSize
    If lngSize > 0 Then
        Call MemAdjust(lngSize, False)
        Mid(mStr, mlngRearPos, lngSize) = AddStr
        mlngRearPos = mlngRearPos + lngSize
        mlngCnt = mlngCnt + lngSize
    End If
'↑ Ver.1.02 GOD ---"" の連結回避
End Sub

'******************************************************************************
'【概要】
'   文字列の長さを取得する
'【引数】
'   なし
'【返値】
'   文字列の長さ
'【作成】
'   Ver.1.00 GOD
'【履歴】
'******************************************************************************
Public Function GetStrlen() As Long
    GetStrlen = mlngCnt
End Function



'------------------------------------------------------------------------------
'   未公開メソッド
'------------------------------------------------------------------------------

'******************************************************************************
'【概要】
'   変数の初期化を行う
'【引数】
'   なし
'【返値】
'   なし
'【作成】
'   Ver.1.00 GOD
'【履歴】
'******************************************************************************
Private Sub Init()
    mStr = ""
    mlngCnt = 0
    mlngForwardPos = 1
    mlngForwardCntMax = 0
    mlngRearPos = 1
    mlngRearCntMax = 0
End Sub

'******************************************************************************
'【概要】
'   領域の調整を行う
'【引数】
'   Size            :追加サイズ
'   Forward         :追加位置(True-前, False-後)
'【返値】
'   なし
'【作成】
'   Ver.1.00 GOD
'【履歴】
'   Ver.1.01 GOD
'       必要な領域値よりも多くの領域を確保していたので修正
'******************************************************************************
Private Function MemAdjust(Size As Long, _
                           Optional Forward As Boolean = True) As Long
    Dim lngNextSize As Long
    Dim lngAddSize As Long

'↓ Ver.1.01 GOD ---必要な領域値の計算方法を変更
'    lngNextSize = mlngCnt + Size
'    If Forward Then
'        If lngNextSize >= mlngForwardCntMax Then
'            lngAddSize = ((lngNextSize) - mlngForwardCntMax) + _
'                            (ADDNUM - (lngNextSize Mod ADDNUM))
'            mStr = String$(lngAddSize, vbNullChar) & mStr
'            mlngForwardCntMax = mlngForwardCntMax + lngAddSize
'            mlngForwardPos = mlngForwardPos + lngAddSize
'            mlngRearPos = mlngRearPos + lngAddSize
'        End If
'    Else
'        If lngNextSize >= mlngRearCntMax Then
'            lngAddSize = ((lngNextSize) - mlngRearCntMax) + _
'                            (ADDNUM - (lngNextSize Mod ADDNUM))
'            mStr = mStr & String$(lngAddSize, vbNullChar)
'            mlngRearCntMax = mlngRearCntMax + lngAddSize
'        End If
'    End If
    If Forward Then
        lngNextSize = mlngCnt - ((mlngRearPos - 1) - mlngForwardCntMax) + Size
        If lngNextSize > mlngForwardCntMax Then
            lngAddSize = (lngNextSize - mlngForwardCntMax) + _
                            (ADDNUM - (lngNextSize Mod ADDNUM))
            mStr = String$(lngAddSize, vbNullChar) & mStr
            mlngForwardCntMax = mlngForwardCntMax + lngAddSize
            mlngForwardPos = mlngForwardPos + lngAddSize
            mlngRearPos = mlngRearPos + lngAddSize
        End If
    Else
        lngNextSize = (mlngRearPos + Size - 1) - mlngForwardCntMax
        If lngNextSize > mlngRearCntMax Then
            lngAddSize = (lngNextSize - mlngRearCntMax) + _
                            (ADDNUM - (lngNextSize Mod ADDNUM))
            mStr = mStr & String$(lngAddSize, vbNullChar)
            mlngRearCntMax = mlngRearCntMax + lngAddSize
        End If
    End If
'↑ Ver.1.01 GOD --- 必要な領域値の計算方法を変更
End Function


'--- Form1.frm(速度比較用)
Option Explicit

Private Declare Function timeGetTime Lib "winmm.dll" () As Long

Private Sub Command1_Click()
    Dim lngCount As Long
    Dim lngSTime As Long

    Command1.Enabled = False
    lngSTime = timeGetTime

    Dim strTest As New StringEx
    For lngCount = 0 To 20000
'        Call strTest.AddForward(Chr(&H41 + lngCount Mod 26))
'        Call strTest.AddRear(Chr(&H41 + lngCount Mod 26))
        Call strTest.AddString(Chr(&H41 + lngCount Mod 26), _
                               Chr(&H41 + lngCount Mod 26))
    Next
'    Debug.Print strTest.Text
    Debug.Print timeGetTime - lngSTime & "ms"
    Command1.Enabled = True
End Sub

Private Sub Command2_Click()
    Dim strTest As String
    Dim lngCount As Long
    Dim lngSTime As Long

    Command2.Enabled = False
    lngSTime = timeGetTime
    For lngCount = 0 To 20000
        strTest = (Chr(&H41 + lngCount Mod 26)) & strTest & _
                  (Chr(&H41 + lngCount Mod 26))
    Next
'    Debug.Print strTest
    Debug.Print timeGetTime - lngSTime & "ms"
    Command2.Enabled = True
End Sub

*** 2007/08/20 19:39 修正
Text プロパティに "" の代入を考慮して修正。
メンテ

Page: 1 |

 投稿フォーム               スレッド一覧へ
題  名 スレッドをトップへソート
名  前
パスワード (記事メンテ時に使用)
投稿キー (投稿時 投稿キー を入力してください)
コメント

   クッキー保存   
スレッド一覧へ