Buttonが化けてしまうのですが・・・

解決


HMMA  2008-03-19 19:12:32  No: 30211

お世話になります。
CSV形式ファイルの、特定の項目だけ抜き出し、番号を付けて、Memo1に表示しようとしています。
これで、読めては、いるのですが、押したボタンButton1が化けてしまいます。
読み込み後は、綺麗な姿に戻るのですが、何が原因なのかわかりません。

次のように書いたのですが、何か問題が、ありますでしょうか?
よろしくお願ねがいします。(Delphi6pro+Windows XP)
 
なお、Mr.XRAYのplButtonを使わせてみたところ問題なく見えます。

procedure TForm1.Button1Click(Sender: TObject);
var
  A,F_name: String;
  SL1, SL2 : TStringList;
  I:Integer;
begin
  if OpenDialog1.Execute then
    begin
      SL1 := TStringList.Create;
      SL2 := TStringList.Create;
      F_name := OpenDialog1.Filename;
    try
     SL1.LoadFromFile( OpenDialog1.FileName );
   for I := 0 to SL1.Count-1 do
    begin
     SL2.CommaText := SL1[I];
     A:=IntToStr(I+1)+', '+SL2[3]+', '+SL2[5]+', '+SL2[6]+', '+SL2[7]+',';
     Memo1.Lines.Add(A);
     end;
   finally
    SL2.Free;
    SL1.Free;
   end;
  end;
   end;


nyr  2008-03-19 21:05:35  No: 30212

>Memo1.Lines.Add(A);
この表示処理が詰まってるんですね。
なのでいったんバッファに詰め込んで、最後にTMemoに送ればいいと思います。
処理時間を気にしないなら、

for I := 0 to SL1.Count-1 do
    begin
     SL2.CommaText := SL1[I];
     A:=IntToStr(I+1)+', '+SL2[3]+', '+SL2[5]+', '+SL2[6]+', '+SL2[7]+',';
     Memo1.Lines.Add(A);
     if (i mod 10 = 0) then applicatin.processmessages; 
     end;

これでもいいとは思いますが。


nyr  2008-03-19 21:08:13  No: 30213

失礼
     if (i mod 10 = 0) then application.processmessages; 
ですね。
10は任意の整数でいいです。


pekesuke  2008-03-19 21:52:06  No: 30214

HMMAさん、こんにちわ。

OpenDialog1が消えた後すぐにファイル読み込みに入っているので、画面
表示が出来ないのだと思います。
if OpenDialog1.Execute then
begin
のあとに
  Application.ProcessMessage;
を追加してみてください。


HMMA  2008-03-19 22:22:34  No: 30215

こんにちは、nyrさん 、pekesukeさん、
早速ありがとうございます。助かります。

nyrさんの方法では、一瞬化けますが、注意していないと分らないくらいに成りました。

pekesukeさんから教えていただいた方法は、
[エラー] Unit1.pas(37): 未定義の識別子 : 'ProcessMessage'
・・・でした。何か付け足しが必要でしょうか?

ヘルプもみて、検証してみたのですが、もう少しアドバイスいただけると助かります。
よろしくお願いします。


pekesuke  2008-03-19 22:32:37  No: 30216

HMMAさん、こんにちわ。

すみません。
Application.ProcessMessages;
でした。


HMMA  2008-03-19 23:53:10  No: 30217

pekesukeさん、
Application.ProcessMessages;で動きました。

nyrさんのif (i mod 10 = 0) then application.processmessages; と、
老眼鏡をかけて比べて見ていたのですが、最後の「s」を見落としていましたね(^^ゞ

ありがとうございました。

でも、こんどは、保存で、 Memo1.Lines.SaveToFile(SaveDialog1.FileName);とすると
数千行が、「保存ボタンを押さなかったかな?」と思うくらい、一瞬で保存されますが、
似たような理由で、データが壊れやしないかと、心配になりました。(不安・・・)


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

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






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