ファイルから指定した文字列を検索して、
別ウインドウのListBoxに表示するプログラムを作っています。
下記のプログラム(一部)を作ったのですが、ListBoxに全く表示されません。
どこが間違っているのでしょうか?
// Form2 のインスタンスが存在するかどうか
if not Assigned(Form2) then
begin
Form2 := TForm2.Create(Application);
end;
OutPutText3 := TStringList.Create;
OutPutText3.Clear;
StatusBar1.Panels.Items[1].Text := '';
Form2.Show; // モードレスで表示
Form2.StatusBar1.Panels.Items[0].Text := '検索中です';
ListBox1.Clear;
Form2.ListBox1.Items.Add('xxx');
DispTerm(Edit2.Text);//検索し、OutPutText3に追加
Form2.StatusBar1.Panels.Items[0].Text := '検索完了';
Form2.ListBox1.Items.Assign(OutPutText3);
// OutPutText3.Free;
DispTermとやらがまちがってるんじゃないの?
OutPutText3はこのプロシジャーの中で作っているようなので、
>OutPutText3に追加
となっていますが
他の関数内で使えるのか?不思議です。
>>OutPutText3に追加
>となっていますが
>他の関数内で使えるのか?不思議です。
> DispTerm(Edit2.Text);//検索し、OutPutText3に追加
もし、このDispTermが関数内関数であるか、OutPutText3がローカル変数で
ないのならエラーにならずに使えるけど...、
実行してエラーが出たとは書いていないので、そうじゃないのかな?
(※表示されない原因は本人のみぞ知る、他人が知るよしもなし)
OutPutText3にはちゃんとデータが入っていますか?
?さん、HOtaさん、う〜むさん、その前にさん、回答ありがとうございます。
>他の関数内で使えるのか?不思議です。
一応、OutPutText3はグローバル変数にしています。
コンパイル時、実行時のエラーも出ていません。
>OutPutText3にはちゃんとデータが入っていますか?
これから確認してみます。
関数内の他の変数の値は、確認してOKだったのですが、
OutPutText3の値は確認していませんでした。
Form2のListBoxに表示する手順が間違っているのかとばかり考えていたものですから。
確認のため以下のようにDispTermを修正して動かしてみました。
ListBoxには最初の行が表示されません。
確認のためRefText4のデータを2行づつ表示させるようにしたのですが、
それでも、最初のデータは1行のみです。
どこか間違っているのでしょうか?
もちろん、エラーは出ずに動いています。
//************************************
procedure TForm1.ButCodeSearchClick(Sender: TObject);
begin
// Form2 のインスタンスが存在するかどうか
if not Assigned(Form2) then
begin
Form2 := TForm2.Create(Application);
end;
StatusBar1.Panels.Items[1].Text := '';
Form2.Show; // モードレスで表示
Form2.StatusBar1.Panels.Items[0].Text := '検索中です';
ListBox1.Clear;
DispTerm(Edit2.Text);
Form2.ListBox1.Items.Assign(OutPutText3);
Form2.ListBox1.Items.Add('ZZZ');
// OutPutText3.Free;
end;
procedure TForm1.DispTerm(term_code: String);
var
i:Integer;
term:String;
begin
for i := 0 to RefText4.Count - 1 do
begin
term := RefText4.Strings[i];//デバッグ表示用
OutPutText3.Add(RefText4.Strings[i]);
OutPutText3.Add(RefText4.Strings[i]);//2行表示
end;
> for i := 0 to RefText4.Count - 1 do
RefText4 には、データが格納されていますか?
格納されている場合、具体的には何が格納されていますか?
>ListBoxには最初の行が表示されません。
具体的には、ListBoxには何が格納されていますか?
>それでも、最初のデータは1行のみです。
具体的には、何が格納されていますか?
最初の発言では、ListBoxに全く表示されないと言うことでしたが、
いつから最初の行だけが表示されないになったのでしょうか?
DispTerm手続きで、RefText4が突然出てきますが、これは何でしょうか?
もう少し判りやすく書いていただかないと、判りかねます。
最初の行は、2行のうちの一行が表示されないのでしょうか?それとも二行とも表示されないのでしょうか?
igyさん、HOtaさん、回答ありがとうございます。
>RefText4 には、データが格納されていますか?
RefText4は、テキストファイルでプログラム起動時にロードしています。
具体的なデータは、
用語1\t(タブコード)123,456,789\n(CR)
用語2\t(タブコード)223,556,789\n(CR)
...
といったデータです。
>格納されている場合、具体的には何が格納されていますか?
ListBoxに表示されているデータ=ListBoxに格納されているデータではないのでしょうか?
>最初の発言では、ListBoxに全く表示されないと言うことでしたが、
>いつから最初の行だけが表示されないになったのでしょうか?
プログラムを作ったのですが、ListBoxに表示されるべきデータが表示されないので、確認用にソフト、データ(RefTextに読み込むデータ)を変えて、チェックしていました。
それで、ListBoxにまったくなにも表示されないので、最初の投稿をさせていただきました。
そのとき、「その前に」さんから
>OutPutText3にはちゃんとデータが入っていますか?
という質問があったので、問題箇所をはっきりさせるために
(ButCodeSearchClickというプログラムに問題がないことを確認するために)
読み込んだデータをそのまま2行づつListBoxに表示させるように修正したところ、最初の行だけが表示されませんでした。
>DispTerm手続きで、RefText4が突然出てきますが、これは何でしょうか?
外部テキストファイル(上記を参照してください)をStringListに読み込んだものです。
>最初の行は、2行のうちの一行が表示されないのでしょうか?
>それとも二行とも表示されないのでしょうか?
2行のうち1行が表示されません。
最初の確認プログラム(RefTextをそのまま、ListBoxに表示する)では、最初の行が表示されないので、最初の行データに問題があるのかもと思って、2行づつ表示させようとしたわけです。
>用語1\t(タブコード)123,456,789\n(CR)
この制御コード「\n(CR)」は 「CR」だけ?
それとも 「CRLF」?
ListBoxにおける末尾の制御コードの扱いは、OSによって違うみたいだけど、
>OutPutText3.Add(RefText4.Strings[i]);
これを
OutPutText3.Add(Trim(RefText4.Strings[i]));
として、改行を取り除いたらどうなる?
>この制御コード「\n(CR)」は 「CR」だけ?
>それとも 「CRLF」?
>ListBoxにおける末尾の制御コードの扱いは、OSによって違うみたいだけど、
あ、ごめんなさい。
CRLFになってます。OSは、XPですけど。
>OutPutText3.Add(Trim(RefText4.Strings[i]));
>として、改行を取り除いたらどうなる?
まったく同じで、最初の行が表示されません。
>ListBoxに表示されているデータ=ListBoxに格納されているデータではないのでしょうか?
>最初の行が表示されません。
ListBoxには何が表示されているのですか?
>ListBoxには何が表示されているのですか?
用語1\t(タブコード)123,456,789\n(CRLF)
用語2\t(タブコード)223,556,789\n(CRLF)
用語2\t(タブコード)223,556,789\n(CRLF)
用語3\t(タブコード)223,556,789\n(CRLF)
用語3\t(タブコード)223,556,789\n(CRLF)
.
.
.
です。
最初の 用語1\t(タブコード)123,456,789\n(CRLF) が
1行しか(各行1行づつ表示しようとした場合は、
用語1\t(タブコード)123,456,789\n(CRLF)が表示されず、
用語2\t(タブコード)123,456,789\n(CRLF)から表示されます。
これだけだったら、文字列AAAAAは表示される?
Form2.ListBox1.Clear;
Form2.ListBox1.Items.Add('AAAAA');
Form2.ListBox1.Items.Add('BBBBB');
> Form2.ListBox1.Items.Assign(OutPutText3);
の前後に
ShowMessage('RefText4:' + IntToStr(RefText4.Count));
ShowMessage('OutPutText3:' + IntToStr(OutPutText3.Count));
Form2.ListBox1.Items.Assign(OutPutText3);
ShowMessage('ListBox1.Items:' + IntToStr(Form2.ListBox1.Items.Count));
のように行数を確認した場合、どうなりますか?
各行1行ずつ格納した場合、すべて同じ数になり、
2行ずつ格納した場合、OutPutText3とListBox1.Itemsは RefText4.Count の倍
になるかと思いますが。
# Form2.ListBox1.Items.Delete(0); のように削除しているってことはないですよね。
procedure TForm1.ButCodeSearchClick(Sender: TObject);
begin
Form2.Show;
Form2.ListBox1.Clear;
Form2.ListBox1.Items.Add('AAAAA');
Form2.ListBox1.Items.Add('BBBBB');
end
上のプログラムでもBBBBBしか表示されません。
> Form2.ListBox1.Clear;
> Form2.ListBox1.Items.Add('AAAAA');
> Form2.ListBox1.Items.Add('BBBBB');
>
>上のプログラムでもBBBBBしか表示されません。
新規プロジェクトでListBoxを追加し、同様の処理をした場合、どうなりますか?
また、Delphiのバージョンは何ですか?(また、最新のアップデートを適用してますか?)
igyさんありがとうございます。
新規プロジェクトで下のプログラムを作って動作させてみたら正常に表示されました。
ちなみにバージョンはTurbo DelphiのVer 10.0.2288.42451 で、アップデートは2になっています。
もう一度、プログラムを見直して見ます。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
RefText:TStringList;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
i:Integer;
begin
i := 0;
while i < RefText.Count -1 do
begin
ListBox1.Items.Add(RefText.Strings[i]);
i := i + 1;
end;
// ListBox1.Items.Assign(RefText);
Form2.Show;
// Form2.ListBox1.Items.Assign(RefText); これでもOK
i := 0;
while i < RefText.Count -1 do
begin
Form2.ListBox1.Items.Add(RefText.Strings[i]); //これでもOK
i := i + 1;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
RefText := TStringList.Create;
RefText.LoadFromFile('D:\ファイル7.txt');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
RefText.Free;
end;
end.
とりあえず、最初の行だけが表示されない原因がわかりました。
ごめんなさい。m(_ _;)m
Form2のListBoxの配置が1行分上にずれていて、
Form2からはみ出し、
ListBoxにはデータが入っているけれど、
表示されない状態でした。
お騒がせしてすみませんでした。
?さん、HOtaさん、う〜むさん、その前にさん、igyさん、★は制御コードさん、単にさんありがとうございます。
すべて正常に表示されるようになりました。
関数にもミスがあって、それを直したらうまく行きました。
みなさんありがとうございます。
ツイート | ![]() |