コードがやたらと長くなるため一部省略します^^;
こんな関数を作ってみたんですけど、
当然ながら遅いんです。
vbCrLfの個数をカウントして、行数を求める関数(LenLines)を
ファイル全体に向かって使っているので…。
Public Function SplitDocument(Document As String, PageLength As String)
Dim TemDoc() As String, RetDoc() As String, i As Integer, e As Integer
ReDim TemDoc(LenLines(Document)) As String
ReDim RetDoc(Int(LenLines(Document) / PageLength)) As String
TemDoc = Split(Document, vbCrLf)
For e = 0 To UBound(RetDoc)
For i = e * PageLength To e * PageLength + PageLength - 1
If i = UBound(TemDoc) Then Exit For
If i = e * PageLength Then RetDoc(e) = TemDoc(i) Else RetDoc(e) = RetDoc(e) & vbCrLf & TemDoc(i)
Next
Next
SplitDocument = RetDoc
End Function
せめて文章全体の行の数がすぐにわかれば、いくぶんか早くなりそうな気はするんですけど、
そんなAPIとかありませんか?あるような気がするんですけど…。
ちなみにどこにも出力していないので、
SendMessageは使えないです…。
ああっと、上の関数の目的は、
1つのファイルを何行かごとで分割表示したら、表示もラクだし閲覧するぶんには使いやすいんじゃないかなと言うことで…。
あああ、いちばん上のLenLinesを二回呼び出してるのは、
一回にすれば少しましになりますね…^^;
う〜ん、そういうAPI聞いたことありませんねぇ・・・。
APIってあまり便利関数は提供してないので
たぶん、ないと思います。
文字列での演算は遅いので
できる限りバイト配列にした方が少しは速くなるかもしれませんね。
基本的には、一定量作って表示。
後は、裏で処理するしかないと思います。
> できる限りバイト配列にした方が少しは速くなるかもしれませんね。
つまり、バイナリで読みこんで、13,10(CRLF)を検索すればいいんでしょうか?
でもjoinとかで戻してから検索すると、結局文字列演算になっちゃいますけど…。
じゃなくて、instrとかとはまったく無縁な検索方法でっていうことですか?
> でもjoinとかで戻してから検索すると、
> 結局文字列演算になっちゃいますけど…。
元データは文字列ってことなんでしょうか。
ファイルって書いてあったのでファイルをバイト配列に読み込んで
改行を検出したものから順番に文字列にしていけば良いかな、
って思ったんですが。
うん…ファイルとは限らないので…。
でも変換関数で変換すればいいんですね、
やってみます。ありがとうございました。
やってみよう…はいいんですけど、
肝心の変換関数が間違っているらしく出来ません。
Public Function AsByte(bytecode As String)
On Error Resume Next
Dim s() As Byte
s = StrConv(bytecode, vbFromUnicode)
AsByte = s
End Function
うーん、そんな関数ほかにありましたっけ…。
まさか、s=bytecode じゃあダメでしょうし…。
RtlMoveMemoryを使ってはどうでしょう。
ポインタを渡してUnicode単位で処理すれば
文字列型の配列への分散も容易になります。
こちらで試した所、問題なく動作しました。
ごめんなさい、ここだけ遅れてしまいました。
RtlMoveMemoryAPIの宣言がなかったです…。
あ、でもそうそう、メモリ上にテキストボックスを作って、
そこからSendMessageでしらべればわかりますね、
そうそう、そうですよぉ、ありがとうございました♪
SendMessageで解決しましたか。
できるだけ速くってことなので
RtlMoveMemoryをお薦めしたんですが・・・。
参考までにAPI宣言です。
巷ではCopyMemoryという名でAliasされていますが。
Declare Sub RtlMoveMemory Lib "kernel32" (Destination As Any, Source As Any, ByVal Length As Long)
そういえばsplitした時点でもうわかってるんですねぇ、ばかばか^^;
ツイート | ![]() |