ListBox に表示できません

解決


なんで?  2008-12-05 02:09:26  No: 32800

ファイルから指定した文字列を検索して、
別ウインドウの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;


  2008-12-05 06:08:07  No: 32801

DispTermとやらがまちがってるんじゃないの?


HOta  2008-12-05 19:24:10  No: 32802

OutPutText3はこのプロシジャーの中で作っているようなので、

>OutPutText3に追加

となっていますが
他の関数内で使えるのか?不思議です。


う〜む  2008-12-05 19:40:50  No: 32803

>>OutPutText3に追加

>となっていますが
>他の関数内で使えるのか?不思議です。

> DispTerm(Edit2.Text);//検索し、OutPutText3に追加
もし、このDispTermが関数内関数であるか、OutPutText3がローカル変数で
ないのならエラーにならずに使えるけど...、
実行してエラーが出たとは書いていないので、そうじゃないのかな?

(※表示されない原因は本人のみぞ知る、他人が知るよしもなし)


その前に  2008-12-05 19:55:30  No: 32804

OutPutText3にはちゃんとデータが入っていますか?


なんで?  2008-12-05 20:35:05  No: 32805

?さん、HOtaさん、う〜むさん、その前にさん、回答ありがとうございます。
>他の関数内で使えるのか?不思議です。
一応、OutPutText3はグローバル変数にしています。
コンパイル時、実行時のエラーも出ていません。

>OutPutText3にはちゃんとデータが入っていますか?
これから確認してみます。
関数内の他の変数の値は、確認してOKだったのですが、
OutPutText3の値は確認していませんでした。
Form2のListBoxに表示する手順が間違っているのかとばかり考えていたものですから。


なんで?  2008-12-06 06:23:36  No: 32806

確認のため以下のように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;


igy  2008-12-06 06:50:06  No: 32807

>  for i := 0 to RefText4.Count - 1 do

RefText4 には、データが格納されていますか?
格納されている場合、具体的には何が格納されていますか?

>ListBoxには最初の行が表示されません。

具体的には、ListBoxには何が格納されていますか?

>それでも、最初のデータは1行のみです。

具体的には、何が格納されていますか?


HOta  2008-12-06 06:59:22  No: 32808

最初の発言では、ListBoxに全く表示されないと言うことでしたが、
いつから最初の行だけが表示されないになったのでしょうか?

DispTerm手続きで、RefText4が突然出てきますが、これは何でしょうか?
もう少し判りやすく書いていただかないと、判りかねます。
最初の行は、2行のうちの一行が表示されないのでしょうか?それとも二行とも表示されないのでしょうか?


なんで?  2008-12-06 17:18:44  No: 32809

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行づつ表示させようとしたわけです。


★は制御コード?  2008-12-06 17:54:57  No: 32810

>用語1\t(タブコード)123,456,789\n(CR)
この制御コード「\n(CR)」は 「CR」だけ?
それとも 「CRLF」?
ListBoxにおける末尾の制御コードの扱いは、OSによって違うみたいだけど、

>OutPutText3.Add(RefText4.Strings[i]);
これを
OutPutText3.Add(Trim(RefText4.Strings[i]));
として、改行を取り除いたらどうなる?


なんで?  2008-12-06 22:48:31  No: 32811

>この制御コード「\n(CR)」は 「CR」だけ?
>それとも 「CRLF」?
>ListBoxにおける末尾の制御コードの扱いは、OSによって違うみたいだけど、
あ、ごめんなさい。
CRLFになってます。OSは、XPですけど。

>OutPutText3.Add(Trim(RefText4.Strings[i]));
>として、改行を取り除いたらどうなる?
まったく同じで、最初の行が表示されません。


igy  2008-12-06 22:52:04  No: 32812

>ListBoxに表示されているデータ=ListBoxに格納されているデータではないのでしょうか?
>最初の行が表示されません。

ListBoxには何が表示されているのですか?


なんで?  2008-12-07 00:18:20  No: 32813

>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)から表示されます。


単に...  2008-12-07 00:31:33  No: 32814

これだけだったら、文字列AAAAAは表示される?
Form2.ListBox1.Clear;
Form2.ListBox1.Items.Add('AAAAA');
Form2.ListBox1.Items.Add('BBBBB');


igy  2008-12-07 01:04:30  No: 32815

>  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); のように削除しているってことはないですよね。


なんで?  2008-12-07 01:46:15  No: 32816

procedure TForm1.ButCodeSearchClick(Sender: TObject);
begin
  Form2.Show;
  Form2.ListBox1.Clear;
  Form2.ListBox1.Items.Add('AAAAA');
  Form2.ListBox1.Items.Add('BBBBB');
end

上のプログラムでもBBBBBしか表示されません。


igy  2008-12-07 07:34:53  No: 32817

>  Form2.ListBox1.Clear;
>  Form2.ListBox1.Items.Add('AAAAA');
>  Form2.ListBox1.Items.Add('BBBBB');
>
>上のプログラムでもBBBBBしか表示されません。

新規プロジェクトでListBoxを追加し、同様の処理をした場合、どうなりますか?

また、Delphiのバージョンは何ですか?(また、最新のアップデートを適用してますか?)


なんで?  2008-12-07 19:31:41  No: 32818

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.


なんで?  2008-12-09 06:31:19  No: 32819

とりあえず、最初の行だけが表示されない原因がわかりました。
ごめんなさい。m(_ _;)m
Form2のListBoxの配置が1行分上にずれていて、
Form2からはみ出し、
ListBoxにはデータが入っているけれど、
表示されない状態でした。
お騒がせしてすみませんでした。


なんで?  2008-12-09 23:14:58  No: 32820

?さん、HOtaさん、う〜むさん、その前にさん、igyさん、★は制御コードさん、単にさんありがとうございます。
すべて正常に表示されるようになりました。
関数にもミスがあって、それを直したらうまく行きました。
みなさんありがとうございます。


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

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






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