特定の条件でCSVファイルが開かなくなるのを防ぐには?

解決


ゆきお  2004-08-10 03:35:28  No: 10304

お世話になります。バージョンはパーソナルの6です。

form4にcsv形式ファイルをTMemo経由でTStringGridに読み込み、TComboBoxで選択したレコードをform3にあるEditに表示しております。

流れとしてはform3にあるボタンを押すとform4が開き、ComboBoxのonchangeイベントでform3にあるEditに表示するようになっています。

普通に動かすには全く問題なく動くのですが、テキストファイルを読み込んで同じEditに表示させるボタンがform3にあるのですが、このボタン(機能)を一度でも使うと、form4が開く前に「***.csvが開きません」とのメッセージが表示されます。メッセージ内のOKボタンを押すとform4が開き、動かすことができます。ただし、一番最初にテキストファイルを読み込むボタンを押すと同様のメッセージでOKを押すとComboBoxが空欄になってしまいます。

本当はソースを載せると見ていただきやすいと思うのですが長すぎますので省略いたしました。説明が抽象的で大変申し訳ないのですが、この説明で悪い所は分かりますでしょうか。
宜しくお願い申し上げます。


にしの  2004-08-10 03:53:32  No: 10305

確かに抽象的ですね^^;
例えば、「メッセージ内のOKボタン」は、おそらく「メッセージボックス内のOKボックス」だと思いますが、もう少し具体的に書かれるとよろしいかと。
また、ファイルの読み込みにも方法はたくさんあります。

それはさておき。
おそらく、CSVファイルが開いていて、TStringsクラスのLoadFromFileに失敗する、ということでしょう。
FileStreamで読み込めば、回避できるかもしれません。
こんな感じ。

var
  fs: TFileStream;
begin
  fs := nil;
  try
    fs := TFileStream.Create(ファイル名, fmOpenRead or fmShareDenyNone); // fmShareDenyNoneが肝
    Memo1.Lines.LoadFromStream(fs);
  finally
    if Assigned(fs) then fs.Free;
  end;
end;


ゆきお  2004-08-10 04:33:20  No: 10306

にしの様、早速のご指導どうもありがとうございます。
教えていただいたサンプルソースを自分なりに追加して走らせてましたが
同じ結果になってしまいました。
下記が実際の2つのソースとなっております。
見にくくてすみません。上がテキストファイルの読込&表示機能で下がCSVファイルの読込機能です。

procedure TForm3.Button8Click(Sender: TObject); //入力情報の呼び出し
var
  fstr:string;
  filelist:tstringlist;
  i:integer;
begin
  try
  if OpenDialog1.Execute then
    begin
      filelist:=tstringlist.create;
      fstr:=OpenDialog1.FileName;
      filelist.LoadFromFile(fstr);
      for i:=1 to 58 do
      tedit(form3.FindComponent('edit' + inttostr(i))).text:=filelist[i-1];
      labelededit1.text:=filelist[58];
      labelededit2.text:=filelist[59];
      labelededit4.text:=filelist[60];
      labelededit5.text:=filelist[61];
      labelededit8.text:=filelist[62];
      labelededit10.text:=filelist[63];
      labelededit12.text:=filelist[64];
      labelededit13.text:=filelist[65];
      labelededit17.text:=filelist[66];
      labelededit18.text:=filelist[67];
      labelededit14.text:=filelist[68];
      labelededit15.text:=filelist[69];
      form6.LabeledEdit1.text:=filelist[70];
      form6.LabeledEdit2.text:=filelist[71];
      form6.LabeledEdit3.text:=filelist[72];
      form6.LabeledEdit4.text:=filelist[73];
      filelist.savetofile(fstr);
      filelist.Free;
    end;
  except
    showmessage('呼び出しできませんでした。');
  end;
end;

procedure TForm4.FormShow(Sender: TObject);
var
  i:integer;
begin
  //memo1.Visible:=false;
  //stringgrid1.Visible:=false;
  combobox1.Style:=csdropdownlist;
  memo1.Lines.LoadFromFile('GPDB.csv');
  for i:=0 to memo1.lines.count-1 do
    stringgrid1.rows[i].commatext:=memo1.lines[i];
  combobox1.Items:=stringgrid1.Cols[0];
  combobox1.ItemIndex:=0;
end;

お手数ですがアドバイスいただきたくお願い申し上げます。
宜しくお願いします。


ふぐちゃん  2004-08-10 04:47:50  No: 10307

> memo1.Lines.LoadFromFile('GPDB.csv');
絶対パスで指定されるとよいです。


にしの  2004-08-10 19:10:30  No: 10308

> > memo1.Lines.LoadFromFile('GPDB.csv');
> 絶対パスで指定されるとよいです。

そうですね。
TOpenDialogを使用すると、カレントディレクトリが変更されることがあります。


ゆきお  2004-08-10 19:41:05  No: 10309

ふぐちゃん様、にしの様おはようございます。どうもありがとうございます。
絶対パス、初めて聞きました。色々調べてみて
 > memo1.Lines.LoadFromFile('GPDB.csv');

memo1.Lines.LoadFromFile(ExpandFileName('GPDB.csv'));
のようにして実行したら、今までのエラーメッセージ
「GPDB.csvが開けません」から「(テキストファイルのパス)GPDB.csvが開けません」というメッセージになってしまいました。
更に調べてみようと思っております。取り急ぎ報告申し上げます。


jok  2004-08-10 19:50:26  No: 10310

>絶対パス、初めて聞きました。色々調べてみて

> > memo1.Lines.LoadFromFile('GPDB.csv');

これを

Memo1.Lines.LoadFromFile(ExtractFilePath(ParamStr(0))+'GPDB.csv');

にする、ということだと思います。


ゆきお  2004-08-10 20:01:19  No: 10311

jok様、おはようございます。
>Memo1.Lines.LoadFromFile(ExtractFilePath(ParamStr(0))+'GPDB.csv');
に変えてみたら動きました。
これからこのコードを調べてみようと思います。
にしの様、ふぐちゃん様、jok様本当にどうもありがとうございました。
心より感謝申し上げます。


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

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






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