はじめまして。
Delphi初心者のおぐたんです。
今日の質問は、コンボボックスについてです。
やりたいことは、Form1で選択したNOを元に、
Form2のコンボボックスに
NOに対応したNAMEを表示。
NOとNAMEは、Queryから取得みたいな感じで
やりたいと考えています。
できれば、NOは非表示にしたいと思っています。
いろいろと調べてたんですけど、
Tlistとか使ったりすれば大丈夫じゃないか、みたいなことが
書いてあったんですけど、Tlistがよくわかりません。
Tlistに、多元配列は可能なのでしょうか?
識者のかたよろしくお願いいたします。
対応するのはNOとNAMEだけですか?
それならば、多元配列は必要ないですよね。2つの配列があれば十分です。
NOとNAMEならば、TStringListだけでも可能です。
objStringList[strNO] := strNAME;
などとできます。
# strNO, strNAMEは文字列
TStringListは、具体的にはどうすれば、よろしいのでしょうか?
質問の具体的な内容がわからないので、具体的にどうするかと聞かれても答えようがありません。
たとえば、Form1のprivateにTStringListの変数を用意し、
private
strlist: TStringList;
OnCreateで、オブジェクトを作成、
strlist := TStringList.Create;
OnDestroyで削除、
strlist.Free;
します。
後は、使いたいときに使えばOKです。
値を入れるのであれば、
var
NO, NAME: String;
begin
....
strlist[NO] := NAME;
でstrlistに、NO=NAMEという値が入ります。
NOに対応するNAMEを使いたいときは、
NAME := strlist[NO];
とすれば、NAMEに入ります。
NOに対応する文字列がない場合は、NAME:='';と等価です。
To: にしの さん
>var
> NO, NAME: String;
>begin
> ....
> strlist[NO] := NAME;
>
>でstrlistに、NO=NAMEという値が入ります。
strlist.Values[NO] := NAME
>NOに対応するNAMEを使いたいときは、
>
>NAME := strlist[NO];
NAME := strlist.Values[NO]
が正解ですね。(^_^;)
To: おぐたん さん
NO と NAME の型はなんでしょうか。
もう少し具体的にやりたいことを書かれた方が、
的確なアドバイスが得られると思いますよ。
にしのさん。Hatenaさんありがとうございます。
NoはInteger
NameはStringです
今は型変換で落ちてしまいます。
どうすればよいのでしょうか?
コンボボックスに表示したいということなら、
TComboBox.Items をそのまま使えばいいのでは
ないでしょうか。
Items は、TStrings型ですので、Objectsプロパティを
持っています。これは、TObject型のリストですので、
TList と同じ使い方ができます。
今回は、NO が Integer ということなので、ちょっと
裏技的ですが、absolute指令でTObject型として宣言
し直して、Objectsに格納しました。
var
NO, Idx: integer;
TNO: TObject absolute NO;
NAME: String;
begin
//ComboBox1.Items にデータを追加
NO := 10;
NAME := 'aaa';
ComboBox1.Items.AddObject(Name, TNO);
NO := 18;
NAME := 'bbb';
ComboBox1.Items.AddObject(Name, TNO);
NO := 15;
NAME := 'ccc';
ComboBox1.Items.AddObject(Name, TNO);
//NO=18 に対応するNAMEを表示
NO := 18;
Idx := ComboBox1.Items.IndexOfObject(TNO);
if Idx = -1 then
ShowMessage('NO=' + IntToStr(NO) + 'は見つかりませんでした。')
else
begin
ComboBox1.ItemIndex := Idx;
ShowMessage('NO=' + IntToStr(NO) + 'に対応したNAMEは'
+ ComboBox1.Items[IDX]);
end;
Hatenaさん。ありがとうございます。
なぜ、Tlistにしたかったかというと
ここで入れてるNoは全てで使うキー項目で、
つねに、これを使ってQueryとかをやりたいからなのです。
もちろん、Form2から、Form3へ移ったりもします。
そういったわけで、Tlistでやるほうが良いのでは?
と勝手に思ってました。
それと、Tlistを覚えたいというのもありますし。。。
まことに勝手言って申し訳ないですが、Tlistでサンプルを
お願いできないでしょうか?
宜しくお願いいたします。
了解しました。
異なった型をもつデータは、レコード型でまとめます。
TList は、ポインタのリストですので、レコード型を
ポインタに変換したものを格納します。
type
PSData = ^TSData;
TSData = record
NO: Integer;
NAME: String;
end;
var
SDataList: TList;
AData: PSData;
i: integer;
BFind: Boolean;
begin
SDataList := TList.Create;
try
//データ追加
New(AData);
AData^.NO := 100;
AData^.NAME := 'aaa';
SDataList.Add(AData);
New(AData);
AData^.NO := 200;
AData^.NAME := 'bbb';
SDataList.Add(AData);
//NO = 200 のデータ検索
BFind := False;
for i := 0 to (SDataList.Count - 1) do
begin
AData := SDataList.Items[i];
if AData^.NO = 101 then
begin
ShowMessage('NO=200のNAMEは' + AData^.NAME);
BFind := True;
Break;
end;
end;
if Not BFind then ShowMessage('NO=200は見つかりませんでした。');
//データ解放
for i := 0 to (SDataList.Count - 1) do
begin
AData := SDataList.Items[i];
Dispose(AData);
end;
finally
SDataList.Free;
end;
end;
にしのさん。hatenaさん。
ほんとにありがとうございました。
お二人のおかげで、無事解決しました。
ほんとにありがとうございました。
これから、何度か質問することがあるかもしれませんが、
今後とも宜しくお願いいたします。
にしのさん。hatenaさん。
ほんとにありがとうございました。
お二人のおかげで、無事解決しました。
ほんとにありがとうございました。
これから、何度か質問することがあるかもしれませんが、
今後とも宜しくお願いいたします。
ツイート | ![]() |