データの読込方法


orz  2007-02-27 22:38:41  No: 135527

ピクチャボックスに線を描画しようと思い開発しています。
ソースで座標を記述し表示することはできました。しかし
処理を変えて座標をメモ帳で記述し、プログラム上でメモ帳に記述した座標を読み込んで表示するというものを作ってるんですが、
メモ帳からの読込方法がまったくわかりません。どうか助言をお願いします。開発環境はVB6.0です。


黒頭巾  2007-02-27 23:40:42  No: 135528

Open "メモ帳ファイルのパス" For Input As #1    
    Do While Not EOF(1)
        Input #1, i
        fileData = fileData + i
    Loop

    debug.print fileData
Close #1

とりあえず、ファイルの読込方法の一例。
後は読み込んだデータ(fileData)を煮るなり焼くなり…。
ちなみに、ファイル操作は"VB Open ファイル"などで検索すると
詳しい解説がいっぱい見つかるはず。


黒頭巾  2007-02-27 23:44:21  No: 135529

すみません。訂正です。

×  fileData = fileData + i
○  fileData = fileData & i


orz  2007-02-28 01:59:08  No: 135530

コメントありがとうございます。
で、実際にやってみたのですがうまく動作しません
ソースは下記のとおりです。
Private Sub Command2_Click()
Picture1.Cls
Select Case Combo2
Case Combo2.Text = "パターン1"

Dim iFileNo As Integer
iFileNo = FileSystem.FreeFile()
Open "C:\座標.txt" For Input As #iFileNo

Dim stPrompt As String
Do While (Not FileSystem.EOF(iFileNo))

Dim stBuffer As String
Line Input #iFileNo, stBuffer
stPrompt = stPrompt & stBuffer & vbNewLine
Loop
Close #iFileNo
Picture1.Print (stPrompt)

End Select

End Sub

他に数パターンの座標を指定しようとしているのですが、
ピクチャボックスには表示されないのです。
どこが間違っているのかわからないので助言お願いします。


LESIA  2007-02-28 14:24:27  No: 135531

> ソースで座標を記述し表示することはできました。
と、ありますが、

> Picture1.Print (stPrompt)
表示する部分はこれだけで、どこにも座標を指定している部分がありませんが?


orz  2007-02-28 18:10:18  No: 135532

Cドライブの座標.txtの中に座標を記述しているのです。
なので、メモ帳の中に記述した座標をピクチャボックスに
表示したいのですが。


我龍院  2007-02-28 18:24:08  No: 135533

メモ帳、メモ帳と言っていますが、実際はファイルから
読み込んでいるだけのようですが?


orz  2007-02-28 19:04:57  No: 135534

そこがわからないのです。どのように記述すれば読み込み
が可能になるのでしょうか?


大吉末吉  2007-02-28 19:30:59  No: 135535

こんにちは。

基本的な考え方は、
(1)線1本分のデータを取得
(2)取得したデータで線を引く
(3)データがなくなるまで(1)(2)を繰り返す。
ですが・・・

テキストファイル(既に指摘あるように「メモ帳」言う表現は不適切です)に、
どういう形式(フォーマット)で、座標を記述しているんですか?

#それによって、実際の処理(プログラム)が全然違ったものになります、

例えば・・・

フォーマット:複数行で記述し、1行に線1本分の座標を下記の形式で記述。
開始点のX座標,開始点のY座標,終了点のX座標,終了点のY座標
データの例:
0,0,1000,0
1000,0,1000,1000
1000,1000,0,1000
0,1000,0,0

とかでしょうか?


orz  2007-02-28 19:38:27  No: 135536

座標という表現は不適切でした。
描画ですね。
今記述しようと思っているのは
For Y = 250 To 250 Step 250
Picture1.Line (10, Y)-(250, Y)
Next Y
For X = 250 To 500 Step 500
Picture1.Line (X, 10)-(X, 250)
Next X
For Y = 10 To 250 Step 250
Picture1.Line (250, Y)-(500, Y)
Next Y
For X = 500 To 750 Step 750
Picture1.Line (X, 10)-(X, 250)
Next X
という線の描画です。


大吉末吉  2007-02-28 19:58:56  No: 135537

・・・まさか、テキストファイルに、
-------------------------------------
For Y = 250 To 250 Step 250
Picture1.Line (10, Y)-(250, Y)
Next Y
For X = 250 To 500 Step 500
Picture1.Line (X, 10)-(X, 250)
Next X
For Y = 10 To 250 Step 250
Picture1.Line (250, Y)-(500, Y)
Next Y
For X = 500 To 750 Step 750
Picture1.Line (X, 10)-(X, 250)
Next X
-----------------------------------
このまま記述しているんじゃないですよね・・・
もしそうだとすると「(基本的に)不可能」です。

どうしてもやりたいなら、構文解析プログラムを作らないと・・・
#多分、プログラムの作成に何ヶ月も掛かるでしょうね・・・

せめて、データをパターン化してください。
上記の例だと・・・
フォーマット:複数行で記述し、1行に1ループ分を記述。ループはX方向か
方向のいづれか。
フォーマット:ループ方向(X/Y),ループの初期値、ループの終了値,ステップ値、固定座標X,固定座標Y
例:
Y,250,250,250,10,250
X,250,500,500,10,250
Y,10,250,250,250,500
X,500,750,750,10,250
とか・・・

コレなら、1行づつ「Line Input 」で読み込んで、「Split関数」で、分割、
X方向ループのプログラムとY方向ループのプログラムを用意しておいて、いづれかを使って描画。
とかできますけど・・・
#ループの種類や、描画方法を増やしたいなら、最初のデータの種類を増やす。


orz  2007-02-28 22:05:26  No: 135538

コメントありがとうございます。
座標は大吉末吉さんの書かれたとおりに
Y,250,250,250,10,250
X,250,500,500,10,250
Y,10,250,250,250,500
X,500,750,750,10,250
''''''''''''''''''''''''''
にしてみました。
ただX方向とY方向のループをどのように記述したらいいのかわかりません。
助言おねがいします。


そがっち  2007-02-28 22:37:22  No: 135539

以下は、Line Input → Split関数で param() as string の配列に
テキストデータを取り込んだとした場合の記述です。

    Select Case param(0)
        Case "X"
            For X = CInt(param(1)) To CInt(param(2)) Step CInt(param(3))
                picture1.Line (X, CInt(param(4)))-(X, CInt(param(5)))
            Next
        Case "Y"
            For X = CInt(param(1)) To CInt(param(2)) Step CInt(param(3))
                picture1.Line (CInt(param(4)), Y)-(CInt(param(5)), Y)
            Next
    End Select

…これをテキストの行数分、繰り返します。

要は、あのテキストは
「あなたが書いたFor〜Next文と同じ動きをプログラム内で行わせる事が
  出来るように、For〜Next文のパラメータとなる部分を外に出しただけのもの」
です。そこは理解できていますか?
そこが大丈夫なら、あとは逆にそれを使って同じFor〜Nextの動作が可能なように
For〜Next文の中身を書き換えてやるだけです。
"X"、"Y" の部分は、多少機転が必要な部分かもしれませんが、上のコードを
見れば理解出来るかと思います。

(しかし、このパラメータを見る限りではFor〜Next文の意味が無いな…)


大吉末吉  2007-02-28 22:39:52  No: 135540

> 方向とY方向のループをどのように記述したらいいのかわかりません。

貴方が、テキストファイルに書くつもりだったプログラムを実際にコード中に書けばよいだけです。
但し、数字を直書きしている箇所を変数にして、テキストファイルから読み込んだデータ(値)を代入するようにします。

例えば・・・
-----------------------------------------------------------------
' -- 1行読み込む
Line Input #iFileNo, stBuffer
' -- データを分割
par = Split(stBuffer, ",")
Select Case par(0)
Case "X"
 ' -- X方向ループ
 For X = par(1) To par(2) Step par(3)
 Picture1.Line (X, par(4))-(X, par(5))
 Next X
Case "Y"
 ' -- Y方向ループも同様に作成する。
End Select
-----------------------------------------------------------------

って・・・何か見たような図形になりますね・・・

投稿者名が違いますが、ひょっとして
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200702/07020016.txt
ですか?

#この時も気になっていたんですが、「解決」したって事で書きませんでしたが・・
#ループする必要なんか、全然無いですよね?
#わざと自分でハードルあげて、(不必要に)難しくしているだけの様な・・・
#今回だって、単に「線を1本づつ引く」というだけで済むはずなのに・・・


orz  2007-02-28 23:16:09  No: 135541

似たようなものですね。
フォームに書いていくと書ききれないんです。
利用者が自由に線を変えることが可能ということを
前提につくってるんですが…。


そがっち  2007-02-28 23:23:55  No: 135542

1本ずつ線を引くので済むのであれば、
テキストからLine Input → Splitで取得する部分は変えないとして、
Lineメソッドの引数を単純にパラメータとして
テキストに書くようにしてみればいいのでは?
例えば、

Picture1.Line(0,0)-(100,200)
Picture1.Line(100,200)-(300,400)

という事をしたいのであれば、テキストの中身は

0,0,100,200
100,200,300,400

と するとか。
ともあれ必要なのは、「本当に必要な情報は何なのか」絞り込むことです。


黒頭巾  2007-03-01 02:53:37  No: 135543

http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200702/07020016.txt
こちらの方と同じ質問者という判断でお答えいたします。
まぁ、間違いないとは思いますが…。

【線を引く】という処理が曖昧な以上、いくらファイルをいじっても意味はありません。
なぜなら、最終的には【線を引く】必要があるからです。
「とりあえず中身は分からないが動いた」では次のステップに進めません。むしろ、問題が複雑化していきます。

Picture1.Cls
X = 10: Y = 10    '描画開始位置
For i = 0 To 2
    Select Case Text(i).Text
    Case "H"
        Picture1.Line (X, Y)-(X, 10)
        Picture1.Line (X, 10)-(X + 250, 10)
        X = X + 250
        Y = 10
    Case "L"
        Picture1.Line (X, Y)-(X, 260)
        Picture1.Line (X, 260)-(X + 250, 260)
        X = X + 250
        Y = 260
    End Select
Next

もし動きが"H"と"L"の2パターンのみであれば、
単純に「HHHLLHLHLLHLLL...」という感じの文字列をファイルに保存しておき、
左から一文字づつ切り分けて処理していけばいいですよね。
まぁ、一例ですが…。

繰り返しになりますが、「とりあえず中身は分からないが動いた」←これが一番の問題かと。
一行一行解析して、分からない命令文があれば調べましょう。


通ってみた  2007-03-02 01:09:45  No: 135544

>For Y = 250 To 250 Step 250

てっきりこの辺りは前回解決したと思ったのですが


大吉末吉  2007-03-02 04:14:59  No: 135545

> 似たようなものですね。

って事は、別人てことなんですかね・・・
でも、IPアドレスが同じ?

って事は同じ学校の生徒さんなんでしょうか?
だととすると・・・この学校では、

> For Y = 250 To 250 Step 250

こういうコードを教えてるってことなんでしょうかね・・・

#一般的な(常識的な?とまでは言いませんが・・・)コードの書き方を見につけた方が良いかも、
#(趣味ならともかく)こんなコード、仕事で書いたら叱られますよ。


そがっち  2007-03-02 06:10:28  No: 135546

うーん…
なんか他人事ながらチョット心配になってきたので、以前のスレと
同じ内容と仮定した上で、基本的な考え方を。
(「そんな事わかっとるわ!」な話も出てくるかもですが、そこはご容赦を。
  逆に、どう頑張っても、どう調べても内容が理解できなければ、正直
  たぶんプログラマとしての素養的にヤバイと思います。私が説明下手な
  可能性もありますが)

まず、この前から出ている話ですが、
> For Y = 250 To 250 Step 250
の書き方が宜しくないところから。
ここでは、まず、話の都合で、
> For Y = 50 To 150 Step 100
>     (処理)
> Next
だと考えて下さい。
1回目のループでは、Y = 50 ですよね。
Nextまで辿り着いて、次のループに入った(Forの次の行に戻った)際に
Yがいくつになるかは、理解できますか?
答えは、150 です。
もし、ここで躓いたなら、ヘルプ等で、もう一度For〜Nextループについて
勉強して下さい。
で、話を少し戻します。
> For Y = 250 To 250 Step 250
の場合。
1回目は250ですよね。
2回目は、ループしようとしてYを更新しようとしたら500になるので
「To 250」の条件から外れるので、そもそも2回目のループ処理を
行う前に、For〜Nextから抜けてしまいます。
だから「For〜Nextの意味が無い」んです。
どうせ1回しか処理しないのに、ややこしく書いても混乱するだけですよね?
(私がもし、後輩がこういう書き方してるのを見たら、問答無用で
  「書き直せ!」って言います)

話を、「本来やりたい事」に戻しましょう。
ここでは話を簡単にするために、例えば「HLHHL」と表現できる線を
(横線のみ)引くとしましょう。
一般的には、この情報で、以前のスレで挙がったような線を引くとなれば、
多くのプログラマが真っ先に考えるのは「5本の線を引く」という事象です。
いきなり「線を引く座標の範囲が云々」という事が真っ先に浮かぶ人は、
あまりいないと思います。(たぶんそうですよね…?>ALL)
で、この「5回線を引く」というのをベースに、ループを考えていくんです。
> For MojiCount = 1 To 5      '注:Step 1 の場合はStep記述不要
0 To 4 の方が処理を記述しやすいかもしれないですが、とりあえず
これ(1 To 5)で行きましょう。
線の長さは、とりあえず 100 とでも しておきましょう。
で、1本目の線は、X座標が 0〜100 の間に、2本目はX座標が 100〜200 の間に
引くとしましょう。以下省略。
この数値を、どう表現して線を引きますか?
1なら0〜100、2なら100〜200、3なら200〜300…
左の数値(仮にX1という変数を使うとしましょう)だけ抜き出すと、0、100、200、300、400
右の数値(こっちはX2)だけ抜き出すと、100、200、300、400、500
100ずつ(線の長さずつ)増える事が理解できますか?
この、「100ずつ増える値」を、MojiCountを使って表現するんです。
X2の方が解りやすいですよね。X2 = MojiCount * 100になってます。
X1は、それより100小さい。X1 = MojiCount * 100 - 100 (即ち、(MojiCount - 1) * 100)
これで、Lineメソッドの一部が見えてきたはずです。

> Picture1.Line ((MojiCount - 1) * 100, ?)-(MojiCount * 100, ?) 
または
> X1 = (MojiCount - 1) * 100
> X2 = MojiCount * 100
> Picture1.Line (X1, ?)-(X2, ?)
さて、上のLineメソッドの「?」の部分(Y座標)ですが、横線なので始点と終点のY座標は
同じですよね。従って、両方同じものが入ります。
で、これを どう表現するか? 何でY座標が決まるのか?
読めてきましたか?
「HLHHL」ですよ。
ここでは、もう、そのHLのデータは取り込んでいるものとして、とりあえず
> Dim HLData(1 To 5) As String
> HLData(1) = "H"
> HLData(2) = "L"
> HLData(3) = "H"
> HLData(4) = "H"
> HLData(5) = "L"
の状態だと思ってください。
で、HならY座標が0、Lなら100のところに線を引くとしましょう。
「Hなら」「Lなら」と来ましたね? これはプログラム用語で言うと、どんな処理でしょう?
そうです。「条件分岐」です。
条件分岐の書き方は色々ありますが、ここでは仮にIf文を使うとしましょう。
(仮に、と書いたのには意味があるんですが、それを細かく書くと、きっと脱線するので割愛)

> If HLData(?) = "H" Then    'もし「H」ならば
>     Y = 0
> Else               '上記でなければ
>     Y = 100
> End If
この内容は大丈夫ですか?
あとは、? の中身ですが、それについては、あえて伏せておきましょう。

ここまで来れば、少しは見えてきましたかね?
②の内容を①の内容に統合して、
> For MojiCount = 1 To 5
>    (線を引く処理)
> Next
の、線を引く処理の部分に入れるだけです。

…さすがに疲れてきた(汗)
縦の線は、出来れば自力で考えてみてもらいたいですが、
どうしても分からなければ、またここで質問されてもいいかと思います。
(誰が答えるか(私がその時答える余裕があるかどうか)は分かりませんが)
ヒントだけ言うと…
「HLHHL」というパラメータの時、どういう条件で線を引くのか、
実際に線でも引いてみて考えてみましょう。
この例の場合、縦線を引かない部分が1箇所ありますよね?
そこの左右の横線は、どういう状態ですか?

あと、ここでは簡単にした例を挙げただけですので、実際のプログラムは
もうちょっと難しいものになります。
「パラメータの数は決まっていない」ですよね?


通ってみた  2007-03-02 08:12:14  No: 135547

1.テキストファイルのことを「メモ帳」と繰り返し言ってる
→メモ帳はアプリケーションです

2.テキストファイルの読み込みができない
→Open文程度なら調べればすぐにわかります

3.意味のないFor文を何の疑問も持たず使っている
→教えられた、提示されたプログラムがどういう意味なのか、考えられない人はプログラムできません
普通なら貴方が提示したプログラムを見て、
「何故横に線を引くのに縦座標のループをしているの?意味がない」
「何故縦に線を引くのに横座標のループを(以下略)」
と疑問を持つものです

以上のことから、基本的なことができていなさすぎると判断できます
学生だということは、ちゃんとマニュアルなりがあるはずです

>大吉末吉さん
>って事は、別人てことなんですかね・・・

質問時に
>ソースで座標を記述し表示することはできました。
と言っているので、同一人物だと思っています
いくらなんでもこんなコードを生徒全員が書いていたら、卒業生の就職先から苦情が来るでしょう


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加