指定の場所の文字列を読み取るには?

解決


S_M_H  2005-06-16 06:53:43  No: 15656

お世話になっています、DELPHI の入門者です。
Delphi7 のデモのファイル
    C:\Program Files\Borland\Delphi7\Demos\RichEdit
を元に作っていて、ファイルを読み込み表示することは出来たのですが、
指定の場所の文字列を変数に代入するのがわかりません。
ファイルはテキストファイルで、各行は「,」で9ブロック有り、各行の
終端は「&H0A」です。
1行から100行まで左端に番号が付いています。

========読み込むファイルの中身=======
1,1,1,124,1,0.000000,0.000000,0.000000,10978144
2,1,2,124,1,0.000000,0.000000,0.000000,10978271
〜〜〜〜〜〜〜〜〜〜〜〜省略〜〜〜〜〜〜〜〜〜〜〜〜
99,26,1,124,2,0.000000,0.000000,0.000000,10981534
100,26,2,124,2,0.000000,0.000000,0.000000,10981616
==========================

例えば、上記のファイルの49行目の右端のブロックの文字を読むには
どうすれば良いのでしょうか?

やさしく解説をして頂ければ嬉しいです。
よろしくお願いいたします。


Javaもう嫌  2005-06-16 07:22:36  No: 15657

RichEditにはLinesというTStringsクラスのプロパティを持っています。
TStringsクラスは文字列リストの基本クラス(抽象クラス)です。
このクラスの変数に添え字を付けると、その添え字+1の行目の文字列が
取得できます。(0で1行目なので)

次にブロック単位で区切るためにTStringListクラスを使用します。
このクラスには CommaText というプロパティがあり、
このプロパティに カンマ(,)を含む文字列を代入するとカンマで自動的に
区切られ、個別に代入されます。TStringListはTStringsクラスを実装した
クラスなので、同じように添え字でブロック数を指定することにより
そのブロックの文字列を取得することが出来ます。

ex)

procedure TForm1.FormCreate(Sender: TObject);
var
  TSL : TStringList;
begin
  TSL := TStringList.Create;
  try
    RichEdit1.Lines.LoadFromFile('file.txt');

    //49行目をCommaTextプロパティにセット
    TSL.CommaText := RichEdit1.Lines[48];

    //9ブロック目を取得
    Caption := TSL[8];

  finally
    TSL.Free;
  end;

end;

※エラー処理は省略


Javaもう嫌  2005-06-16 07:32:22  No: 15658

書き忘れと修正です。

RichEdit以外にもEditでも出来ますし、もう一つTStringListを使って代用することも出来ますよ。

9ブロックというか右端のブロックですね。
TStringListのCountでブロック数を取得して、その値-1で取得してやれば良さそうです。

//9ブロック目を取得
Caption := TSL[ TSL.Count - 1];


Javaもう嫌  2005-06-16 07:35:19  No: 15659

あぁ、さらにもう一つミスが。
Editではなく、TMemoの間違いです。


S_M_H  2005-06-16 08:28:55  No: 15660

お世話になっています、DELPHI の入門者です。

早速試してみました。
下記がリストです、問題があればご指摘ください。

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜省略
type
  Tact_49: Tedit;
  Tact_97: Tedit;
  Tact_All: TRichEdit;
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜省略
var
  TSL : TStringList;
begin
  TSL := TStringList.Create;
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜省略
  TSL.CommaText := Tact_All.Lines[48];
  Tact_49.Text := TSL[8];
  TSL.CommaText := Tact_All.Lines[96];
  Tact_97.Text := TSL[8];
  TSL.Free;
end;
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜省略

以上のようにしたら、うまく動きました。

「Javaもう嫌」様、大変ありがとうございました。

*「TMainForm」や「TRichEdit」や「TObject」の「T」は
  何の省略文字なのでしょうか?

色々とやり方があるようなので、他でも試してみます。


Javaもう嫌  2005-06-16 09:15:18  No: 15661

私が載せたサンプル自体に問題があるのですが、
今のままでは空白行などが入ると値が変わってしまいます。
必ずしも1番のデータが1行目とは限らないのですので。
行数を指定するより、番号を取得して判断させた方がいいかもしれません。

# *「TMainForm」や「TRichEdit」や「TObject」の「T」は
#   何の省略文字なのでしょうか?
確実ではないのですが、Typeの略ではないのでしょうか。
他にDelphiの慣習として、エラークラスのクラス名の先頭にはE、
インターフェースには先頭にIを付ける、と言ったものがあります。


S_M_H  2005-06-16 09:39:22  No: 15662

お世話になっています、DELPHI の入門者です。

*空白行などが入ると・・・・
  わかりました、左端の文字で判別するように直します。

*クラス名の先頭文字・・・
  わかりました。(・・・クラスなどの概念がまだ理解していませんが)

色々と有り難うございました、また勉強してきます。


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

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






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