いつもお世話になっております。環境は6のパーソナル、XPです。
テキストファイルに4行入力されており、4つ用意した
RichEdit1〜4に上から1行ずつ表示させようと思っております。
まず1つ目のRichEditにテキストの1行目を表示させようとしたのですが、
ヘルプを見ても過去ログを見ても思うように行かず行き詰まっています。
procedure TForm2.Button1Click(Sender: TObject);
var
fn:string;
begin
fn:='c:\試作\tenpo.txt';
richedit1.Lines.LoadFromFile(fn);
end;
上記だと4行全てが表示されるので、Linesがあやしいと思い、
色々試しましたがコンパイルではじかれてしまいました。
Lines[行数]で取り出し、書き換えができると参考書にあったのですが..
RichEditにしたのは表示と入力をしたい部分だからです。
ご存知でしたらご指導ください。宜しくお願い申し上げます。
1行ずつ表示するには、
・1行ずつ読み込む(LoadFromFileは使わずに)
・LinesでないTStringsのオブジェクトを用意して、先に読み出し、1行ずつLinesに入れる
のどちらかでしょう。
サンプルを書いてみました。
procedure?TForm2.Button1Click(Sender:?TObject);
var
????fn:string;
FileList:TStringList;
begin
FileList := TStringList.Create;
try
????fn:='c:\試作\tenpo.txt';
??? ?FileList.LoadFromFile(fn);
RichEdit1.Lines.Add(FileList[0]);
RichEdit2.Lines.Add(FileList[1]);
RichEdit3.Lines.Add(FileList[2]);
RichEdit4.Lines.Add(FileList[3]);
finally
FileList.Free;
end;
end;
これでいいのでは?
ちなみに行数が変化したり、RichEditの個数が変化するときはちょっと工夫が必要になります。
にしのさん、LupinⅢさんこんにちは。どうもありがとうございます。
にしのさんのご指導に沿ってヘルプを見ながら色々書いてみましたが
結局分からず、書き方を質問しようとした矢先にLupinⅢさんからサ
ンプルをいただきました。
実行した所うまく表示できました。が、私の質問が悪かったのかも知
れないのですが、RichEdit内で改行できてしまう事に気づいてしまい
ました。(1行のみの表示or入力ができない)
表示(もしくは数値の入力し直し)されたRichEdit1〜4の数値を計算
させ他のEditに表示させたい事と、入力中にエンターすると下の行に
いってしまい次のRichEditはカーソルを合わせないと選択できない事
が問題となってしまいましたがこれはRichEditのプロパティのどこか
を変更すると事により解決できますでしょうか?
すみません。宜しくお願い申し上げます。
うーん、これならばRichEditを使う必要がないのでは?
結局は1行しか必要ではないということなので、
Editを使ってやればOKだと思いますがいかがでしょう?
LupinⅢさんありがとうございます。
何故かLinesにこだわってしまいRichEditを使っておりました。
var
fn:string;
FileList:TStringList;
begin
FileList := TStringList.Create;
try
fn:='c:\試作\tenpo.txt';
FileList.LoadFromFile(fn);
edit1.Text:=FileList[0];
edit2.Text:=FileList[1];
edit3.Text:=FileList[2];
edit4.Text:=FileList[3];
finally
FileList.Free;
end;
end;
上記で表示できました。もう少しで満足できそうなのですが、後はForを
使って構文を短くする事とEdit内をエンターしたら次のEditに移動する
ようにしたいと思っています。当初の質問とずれてしまいすみません。
Forに関しては下のようなイメージなのですがコンパイルに失敗します。
var
fn:string;
FileList:TStringList;
i:integer;
edit:string;
begin
FileList := TStringList.Create;
try
fn:='c:\試作\tenpo.txt';
FileList.LoadFromFile(fn);
for i:=1 to 4 do
edit + inttostr(i).Text:=FileList[i-1];//←ここで警告が出ます
finally
FileList.Free;
end;
end;
次にエンターキーで次に移動はプロパティのどれかを変更することになる
のでしょうか?
長々とすみません。大変恐縮ですが後少しだけご指導いただきたくお願い
申し上げます。
過去ログ検索では大文字小文字を区別しているみたいなので、inttostrでなく、IntToStrで検索すれば、
edit + inttostr(i).Text:=FileList[i-1];
と同じ質問がいくつか出てきますよ。
Enterキーで移動するには、OnKeyDownイベントでEnterが押されたら(Key=13)、次のEditにSetFocusするだけです。
edit?+?inttostr(i).Text:=FileList[i-1];//←ここで警告が出ます
↓以下のようにすればいいかと。。。
TEdit(FindComponent('Edit' + IntToStr(i))).Text := FileList[i-1];
FindComponentがミソです。。
エンターキーによるフォーカスの移動は
EditのKeyPressイベントとSetFocusメソッドを駆使すると出来ると思いますよ。
LupinⅢさん、にしのさんこんばんは。
Forの件、できました。
フォーカスの移動の件、今やっとこできました。
イベントのKeyPressをWクリックしてそこにEdit[次の番号].SetFocusと
入れるんですね。
長い間お二方に付き合っていただき解決できました。
どうもありがとうございました。感謝申し上げます。
度々申し訳ありません。
先程のコードはform2にあるボタンをクリックするとform2にあるedit1〜4を表示するようにしていました。
しかし実際にはform1にあるボタンをクリックするとform2を表示した瞬間に動作させたいのです。
先程のコードをform2を表示するコードに移動させるとform1にある
edit1〜4が表示されてしまいました。
begin
form2.show;//←これ以外を移動してきました。
FileList := TStringList.Create;
try
fn:='c:\試作\tenpo.txt';
FileList.LoadFromFile(fn);
for i:=1 to 4 do
TEdit(FindComponent('Edit' + IntToStr(i))).Text := FileList[i-1];
finally
FileList.Free;
end;
end;
form2.show;を行うとform2はアクティブ状態になっているような気がした
ので下段にactivateを持ってきても変わりません。
構文自体が悪いのでしょうか?
度々すみません。宜しくお願いいたします。
Form2.TEdit(FindComponent('Edit'?+?IntToStr(i))).Text
これでいいのでは?ちなみに[Form2.]っていうのがForm2のコンポーネントっていう意味です。
LupinⅢさんこんにちは。お手数かけます。
ご指摘通り
Form2.TEdit(FindComponent('Edit' + IntToStr(i))).Text;
でやっても
Form2.TEdit(FindComponent('Edit' + IntToStr(i))).Text := FileList[i-1];
でやってもコンパイル時に下記の警告が出てしまいました。
[エラー] db.pas(387): 未定義の識別子 : 'TEdit'
[エラー] db.pas(387): 演算子またはセミコロン (';') が必要です
[致命的エラー] project1.dpr(6): 'db.pas' ユニットはコンパイルできませんでした
途方に暮れながらForm2のOnActivateイベント部分をWクリックしたら
procedure TForm2.FormActivate(Sender: TObject);が出てきて
そこに前回移動したコードを全部移動し実行した所動きました。
Form2の表示→アクティブになった時にコードを実行する。
こういう流れで動くものなんですね。
本当にどうもありがとうございました。
form2.show;の位置を下に移動しても同じ結果でした。
>form2.show;の位置を下に移動しても同じ結果でした。
消し忘れでした。気にしないで下さい。ごめんなさい。
解決しているようですが
Form1.ButtonClick内で
TEdit(Form2.FindComponent('Edit' + IntToStr(i))).Text := FileList[i-1];
でもいけると思います。
maxwellさんこんにちは。今日書き込みしていただいたのを発見した
ため返事が送れてすみません。
教えていただいたコードでバッチリ動きました。
Form2のOnActivateイベントに記述があるとなんとなく分かりにくいな
と思っていたので大変助かりました。
どうもありがとうございました。