いつも勉強させてもらっています。
FormにEdit1、Edit2があります。
また、iniファイルには、
123,abc
234,defg
312,opqrstu
987,ohayou
のように設定しています。
Edit1に123と入力したら、Edit2にabc
Edit1に987と入力したら、Edit2にohayou
というふうに、自動入力したいのですが。
簡単な質問かもしれませんが、どうぞ宜しくお願いします。
Edit1の OnChange イベントで、Edit1のTextプロパティ に関して
・テキストファイル(CSVファイル)を読み込み、該当する行(1列目と一致するデータ)を検索
・見つかった場合、その行の2列目の内容をEdit2のTextプロパティに格納
するのはどうですか?
こういう質問はどちらかというと、Delphiというより、
プログラミング(アルゴリズム?HowTo?)寄りですよね。
こういうのもアリですか?
(今まで、この手のものは遠慮してきたもので・・・)
TStringListにはValuesを使った連想配列機能がある。
それを使う。に一票
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q127378997
ここに、まんまの解があったゾ。
Manbonさんへ
僕はDelphiを使えばなんでもOKだと解釈しています。
もちろん、人によりけりですがね。
もちろん、ソースはDelphi言語になりますが。
いつもさんへ
こんな感じでどうですか?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Edit1Change(Sender: TObject);
private
{ Private 宣言 }
IniList:TStringList;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//部分一致の場合
function FindStringA(SearchStr:String; var aList:TStringList):String;
var i:Integer;
begin
Result:='';
for i:=0 to aList.Count-1 do
begin
if AnsiPos(SearchStr,aList.Strings[i])=1 then
begin
Result:= Copy(aList.Strings[i],
AnsiPos(',',aList.Strings[i])+1,
Length(aList.Strings[i])
);
exit;
end;
end;
end;
//完全一致
function FindStringB(SearchStr:String; var aList:TStringList):String;
var
i,p:Integer;
strA,strB:String;
begin
Result:='';
for i:=0 to aList.Count-1 do
begin
p:= AnsiPos(',',aList.Strings[i]);
strA := Copy(aList.Strings[i],1,p-1);
strB := Copy(aList.Strings[i],p+1,Length(aList.Strings[i]));
if strA=SearchStr then
begin
Result:= strB;
exit;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
IniList:=TStringList.Create;
//iniファイルをTStringListに読み込む
IniList.LoadFromFile(ExtractFilePath(Application.ExeName)+'data.ini');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
//解放
IniList.Free;
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
//左方検索の場合
Edit2.Text:=FindStringA(Edit1.Text,iniList);
//完全一致の場合
//Edit2.Text:=FindStringB(Edit1.Text,iniList);
end;
end.
ツイート | ![]() |