お世話になります。バージョンはパーソナルの6です。
form4にcsv形式ファイルをTMemo経由でTStringGridに読み込み、TComboBoxで選択したレコードをform3にあるEditに表示しております。
流れとしてはform3にあるボタンを押すとform4が開き、ComboBoxのonchangeイベントでform3にあるEditに表示するようになっています。
普通に動かすには全く問題なく動くのですが、テキストファイルを読み込んで同じEditに表示させるボタンがform3にあるのですが、このボタン(機能)を一度でも使うと、form4が開く前に「***.csvが開きません」とのメッセージが表示されます。メッセージ内のOKボタンを押すとform4が開き、動かすことができます。ただし、一番最初にテキストファイルを読み込むボタンを押すと同様のメッセージでOKを押すとComboBoxが空欄になってしまいます。
本当はソースを載せると見ていただきやすいと思うのですが長すぎますので省略いたしました。説明が抽象的で大変申し訳ないのですが、この説明で悪い所は分かりますでしょうか。
宜しくお願い申し上げます。
確かに抽象的ですね^^;
例えば、「メッセージ内の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;
にしの様、早速のご指導どうもありがとうございます。
教えていただいたサンプルソースを自分なりに追加して走らせてましたが
同じ結果になってしまいました。
下記が実際の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;
お手数ですがアドバイスいただきたくお願い申し上げます。
宜しくお願いします。
> memo1.Lines.LoadFromFile('GPDB.csv');
絶対パスで指定されるとよいです。
> > memo1.Lines.LoadFromFile('GPDB.csv');
> 絶対パスで指定されるとよいです。
そうですね。
TOpenDialogを使用すると、カレントディレクトリが変更されることがあります。
ふぐちゃん様、にしの様おはようございます。どうもありがとうございます。
絶対パス、初めて聞きました。色々調べてみて
> memo1.Lines.LoadFromFile('GPDB.csv');
を
memo1.Lines.LoadFromFile(ExpandFileName('GPDB.csv'));
のようにして実行したら、今までのエラーメッセージ
「GPDB.csvが開けません」から「(テキストファイルのパス)GPDB.csvが開けません」というメッセージになってしまいました。
更に調べてみようと思っております。取り急ぎ報告申し上げます。
>絶対パス、初めて聞きました。色々調べてみて
> > memo1.Lines.LoadFromFile('GPDB.csv');
これを
Memo1.Lines.LoadFromFile(ExtractFilePath(ParamStr(0))+'GPDB.csv');
にする、ということだと思います。
jok様、おはようございます。
>Memo1.Lines.LoadFromFile(ExtractFilePath(ParamStr(0))+'GPDB.csv');
に変えてみたら動きました。
これからこのコードを調べてみようと思います。
にしの様、ふぐちゃん様、jok様本当にどうもありがとうございました。
心より感謝申し上げます。
ツイート | ![]() |