• ベストアンサー

ランダムアクセスファイルの扱い方

VB2005です。(以前はVB6で開発していました。) 文字列(VB6で 「test as string * 5」 などとしていたもの)を任意のレコードに保存、読込、変更などをしようとしています。 VB6ではうまくできたものが、VB2005になったとたん、まったくVB6での知識が通用せず困っています。ヘルプを読んでみたものの「2 バイトの記述子」やらなんやらとわけのわからないことばかりで、行き詰まりました。 VB6で type test test1 as string * 5 test2 as string * 5 test3 as string *5 end type と定義していたものを、VB2005でレコード番号を指定して書込、読込などをするにはどのようにすればよいでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

VB2005では 固定文字列の宣言方法が変わりました VBFixedString属性をつけて宣言しないと固定文字列にはなりません Structure Test <VBFixedString(5)> dim s1 as String <VBFixedString(5)> dim s1 as String <VBFixedString(5)> dim s1 as String End Structure といった具合に構造体を宣言します 読み取りイベントにおいて dim objTest as new Test dim ff as Integer = FreeFile() FileOpen( ff, "ファイルパス", OpenMode.Ramdom, OpenAccess.Read) FileGet( ff, objTest, レコード番号) FileClose(ff) といった具合で 読み込みできると思います # 付属のMSDNの VisualBasic   Visual Basic 6.0ユーザー向けヘルプ     言語の変更点       プログラミング要素のサポートに関する変更の概要 辺りを熟読してみましょう

xiaolong_goo
質問者

お礼

試してみた結果、書込みはできたのですが、読込の時にFileGet( ff, objTest, レコード番号)のところで「objTestの値をstringに変換できません。」というエラーが発生しました。 ヘルプを確認したところ、エラーを解消するには・・・ ●式のデータ型が変換先のデータ型に変換できるものであることを確認します。(私の考え->全部stringで宣言した変数しか使っていないのになぜ?) ●<type2> が配列の場合は、New 句で型名の後にかっこと中かっこの両方を指定します。次のコードは、配列の正しい初期化方法を示します。 (私の考え->配列ではないし、これとは違う・・・) と書いてあったのですが、この意味すら理解できない状況です。

xiaolong_goo
質問者

補足

ありがとうございます。よく読んでみたつもりなのですが、馬鹿なものでいろいろと理解に苦しんでいます。 取り合えづ教えていただいたコードも参考しながら少し考えてみたいと思います。

その他の回答 (1)

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.1

具体的にどこが分からないのでしょう? > VB6での知識が通用せず > ヘルプを読んでみたものの「2 バイトの記述子」やらなんやらとわけのわからないことばかりで、行き詰まりました。 「2 バイトの記述子」に関する記述は、VB6でもありましたよ・・・ つまり、「VB6の知識」ですけど・・・ 例えば、以下は「VB6のヘルプ」の「Get ステートメント」からの抜粋です。 ---------------------------------------------------------- ユーザー定義型の要素でない可変長文字列を使う場合、 Get ステートメントはデータ長を示す 2 バイトの記述子を認識せずに 文字列変数の持つ値の文字数と同じバイト数を読み込みます。 ----------------------------------------------------------

xiaolong_goo
質問者

お礼

dsuekichiさん、redfox63さん、お騒がせいたしましたがいろいろ試した結果うまくできました。 ありがとうございました。

xiaolong_goo
質問者

補足

え?・・・ VB6の時にはまったく意識していませんでした・・・ VB6では、ほとんど昔のBASICの知識と、本やネットでのサンプルコードだけでなんとかしていたので、まったく初耳でした・・お粗末でごめんなさい。もう少し考えて見ます。

関連するQ&A

  • VB6の変数宣言で、末尾に"*"と数値がつく構文の意味

    社内で開発された既存のVB6プロジェクトのソースコードを解析しています。 その中で、標準モジュール内に以下のような構文がありました。 '----------- Public Type BufData KaiinID As String * 4 MiseCode As String * 8 (以下省略) End Type '----------- ユーザ定義型の要素を宣言している記述ですが、 それぞれ末尾の「* 4」や「* 8」は何をしているのでしょうか? "ユーザー定義型 アスタリスク"などで検索しましたが、 これといった情報を見つけられませんでした。 (質問者はjavaのコーディング経験は1年ほどあるんですが、VBはまだ数日です。) よろしくお願いします。

  • 2次元配列について

    VB6.0で開発しています。 以前COBOLをしていて、VBではどのように定義するかがわからなかったので質問します! ----------- COBOL ----------------- 01 TBL-AREA. 03 TBL OCCURS 6. 05 TBL-IX OCCURS 16. 07 TBL-IX PIC 9(07). 07 TBL-NAME PIC N(20). と定義した場合はVBではどのように記述するのですか? Public Type TBL_AREA TBL_TEXT As Integer TBL_Caption As String End Type Public TBLArray() As TBL_AREA ReDim TBLArray(6,16) と記述してみたものはいいものの、処理の記述方法がわかりません(恥)

  • アクセスのクエリでSplit関数は使えないのですか

    レコードにaaa/bbb/cccと入っていて、 クエリで SELECT Split([テーブル1]![フィールド1],"/") AS test FROM テーブル1; とすると、 式に未定義関数 <関数名> があります。(Error 3085) になります。 VBAでやるとしたら Sub test() Dim str As String str = "aaa/bbb/ccc" Debug.Print Split(str, "/")(1) End Sub のような事がしたいのですが クエリでは無理なのでしょうか?

  • 構造体のコピー

    VB6ですが、構造体のコピーは正しくできるのでしょうか type a test1(0 to 5) as byte test2 as integer test3 as string end type dim b1 as a dim c1 as a b1.test = 2 c1 = b1 私はここで、c1.test2が0だった

  • ASCIIコードについて

    VB6の質問です。 ↓例で、Record変数にASCIIコードを含んだ文字列が入ります。 Select文で各条件で、処理をしたいのですがASCIIコードの定義がわかりません。 ご教授していただないでしょか? Dim Record As String Private Sub test() ・ ・ Record = (STX)1234(ACK)5678(EOT)  ・ End Sub Select Record Case "(STX)" ← 'Case 02H?? ・ Case "(ACK)" ← 'Case 06H??  ・ Case "(EOT)" ← 'Case 03H?? ・ Case Else End Select

  • VB.NETのデリゲートについて

    VB.NETのデリゲートについて質問です。 以下のプログラムなのですが、 デリゲート型をインスタンス化しているところで、コンストラクタにパラメータを渡していますが、 そのコンストラクタはどこに定義されているのでしょうか。 (AddressOf t1.Ohayou)というパラメータが渡されていますが、このパラメータを受け取っているコンストラクタがどれなのかが分かりません。 ご教示よろしくお願いいたします。 Delegate Sub Myprint(ByVal s As String) Module Module1 Sub Main() Dim t1 As Test1 = New Test1() Dim t2 As TEst2 = New Test2() Dim d As Myprint = New Myprint(AddressOf t1.Ohayou) d.Invoke("VB太郎") d = New Myprint(AddressOf t2.Konbanwa) d.Invoke("VB太郎") End Sub End Module Class Test1 Sub Ohayou(ByVal s As String) Console.WriteLine("おはようございます。{0}です。", s) End Sub End Class Class Test2 Sub Konbanwa(ByVal s As String) Console.WriteLine("こんばんわ。{0}です。", s) End Sub End Class

  • VB6のTYPE文をVB.NETのStructureに変えるとき

    VB6のTYPE文をVB.NETのStructureに変えるとき 下記VB6のコードをVB.NETのStructureに変える場合 Type kouzou1 i As Integer j As Integer a As String * 20 b As String * 50 End Type を下記にしてみたのですが *20,*50のところは、どのように表現するのでしょうか。 Structure kouzou1 Dim i As Integer Dim j As Integer Dim a As String * 20 <- ステートメントの終わりを示してくださいのエラーになる。 Dim b As String * 50 <- ステートメントの終わりを示してくださいのエラーになる。 End Structure お教え下さい。

  • 構造体をランダムファイルに書き込みたいのですが

    .NETで構造体をランダムファイルに書き込む処理を作成していますが、エラーになります。 構造体宣言は Public Structure aaa   Public aa as DateTime   Public bb() as int16   Public Sub Init()     ReDim bb(100)   End Sub End Structure Public wData As New aaa ファイル登録時に FileOpen(iFileNo, sFileName, OpenMode.Random, , , len(wData)) FileOut(iFileNo, wData, iRecord) 上記のFilePutを実行した時点で、 「レコード長が正しくありません」 とエラーが出ます。 オープンするファイルナンバーやレコードは、 初回登録時は共に、1で問題ありません。 VBのイメージで作成したのですが、どうもうまくいきません。 なにとぞ、お教えください。

  • VB.NETでのiniファイル読込について。

    .netでのiniファイル読込がうまくいきません。 何が悪いのかさっぱりわかりません。 ご指摘お願いいたします。 環境 os :xp 開発ソフト VB.NET ver 1.1.4322 SP1 ソース Private Declare Function GetPrivateProfileString Lib "kernel32" _ Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, _ ByVal lpKeyName As String, _ ByVal lpDefault As String, _ ByVal lpReturnedString As String, _ ByVal nSize As Long, _ ByVal lpFileName As String) As Long '実行ファイルパスの取得 *VB6のapp.path Shared Function GetAppPath() As String Return System.IO.Path.GetDirectoryName( _ System.Reflection.Assembly.GetExecutingAssembly().Location) End Function Function INI_DBPATH_READ(ByVal FilePath As String) As String Dim lngRet As Long   '読み込みバッファ(固定長) Dim strGetBuff As String = 256   'iniファイルより読み込む文字列のサイズ Dim intGetSize As Integer   'セクション名 Dim strSection As String   'キー名 Dim strKey As String   '読み込みエラー時の出力文字列 Dim strErr As String   'iniファイル名(フルパス) Dim striniFn As String strGetBuff = Space(256) strSection = "TIFF_FOLDER" strKey = "PATH" strErr = "失敗" striniFn = Replace(GetAppPath(), "\bin", "\Ini") & "\test.ini" intGetSize = 256 'strGetBuffに文字列を取得する lngRet = GetPrivateProfileString(strSection, strKey, strErr, _ strGetBuff, intGetSize, striniFn) '末尾のNull除去 MsgBox(Microsoft.VisualBasic.Left(strGetBuff, InStr(strGetBuff, Chr(0)) - 1)) End Function iniファイルの内容 [TIFF_FOLDER] PATH=成功

  • ファイル読み込みと構造体について

    Q1 VB始めたばかりの超初心者です。クイズゲームを作成したく、構造体を用意したいのですが、同じ構造体を100個用意したい場合どのように宣言するのでしょうか? Public Type mondai_REC Question As String * 100 choice(5) As String * 30 justness(3) As Byte End Type ↑の構造体を100個用意したいのです。 また100個用意して、その中のchoice()を参照したい場合どのように使うのでしょうか? Q2 テキストファイルを読み込み、この構造体に格納したいと考えてます。ファイルをオープン・クローズドする、任意の文字(たとえば”。”)がみつかめまで読み込むなど、固定長でない文字列の入ったファイルを読み込むのに便利な関数を教えてください。 よろしくお願いいたします。