コンボボックス

解決


おぐたん  2002-11-29 09:47:13  No: 2244

はじめまして。

Delphi初心者のおぐたんです。
今日の質問は、コンボボックスについてです。

やりたいことは、Form1で選択したNOを元に、
Form2のコンボボックスに
NOに対応したNAMEを表示。
NOとNAMEは、Queryから取得みたいな感じで
やりたいと考えています。

できれば、NOは非表示にしたいと思っています。

いろいろと調べてたんですけど、
Tlistとか使ったりすれば大丈夫じゃないか、みたいなことが
書いてあったんですけど、Tlistがよくわかりません。

Tlistに、多元配列は可能なのでしょうか?

識者のかたよろしくお願いいたします。


にしの  2002-11-29 18:24:07  No: 2245

対応するのはNOとNAMEだけですか?
それならば、多元配列は必要ないですよね。2つの配列があれば十分です。
NOとNAMEならば、TStringListだけでも可能です。

objStringList[strNO] := strNAME;
などとできます。
# strNO, strNAMEは文字列


おぐたん  2002-11-29 23:57:35  No: 2246

TStringListは、具体的にはどうすれば、よろしいのでしょうか?


にしの  2002-11-30 01:40:41  No: 2247

質問の具体的な内容がわからないので、具体的にどうするかと聞かれても答えようがありません。

たとえば、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:='';と等価です。


hatena  2002-11-30 23:15:02  No: 2248

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 の型はなんでしょうか。
もう少し具体的にやりたいことを書かれた方が、
的確なアドバイスが得られると思いますよ。


おぐたん  2002-12-02 00:12:08  No: 2249

にしのさん。Hatenaさんありがとうございます。

NoはInteger
NameはStringです

今は型変換で落ちてしまいます。

どうすればよいのでしょうか?


hatena  2002-12-02 09:20:55  No: 2250

コンボボックスに表示したいということなら、
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;


おぐたん  2002-12-02 22:59:33  No: 2251

Hatenaさん。ありがとうございます。

なぜ、Tlistにしたかったかというと
ここで入れてるNoは全てで使うキー項目で、
つねに、これを使ってQueryとかをやりたいからなのです。

もちろん、Form2から、Form3へ移ったりもします。

そういったわけで、Tlistでやるほうが良いのでは?
と勝手に思ってました。
それと、Tlistを覚えたいというのもありますし。。。

まことに勝手言って申し訳ないですが、Tlistでサンプルを
お願いできないでしょうか?

宜しくお願いいたします。


hatena  2002-12-03 00:43:11  No: 2252

了解しました。

異なった型をもつデータは、レコード型でまとめます。
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;


おぐたん  2002-12-03 20:16:49  No: 2253

にしのさん。hatenaさん。
ほんとにありがとうございました。

お二人のおかげで、無事解決しました。

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

これから、何度か質問することがあるかもしれませんが、
今後とも宜しくお願いいたします。


おぐたん  2002-12-03 20:16:51  No: 2254

にしのさん。hatenaさん。
ほんとにありがとうございました。

お二人のおかげで、無事解決しました。

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

これから、何度か質問することがあるかもしれませんが、
今後とも宜しくお願いいたします。


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








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