リストボックスからデータを呼び出すには?

解決


初心者  2003-11-06 22:28:43  No: 109723

初めての質問です。
とりあえず過去ログを検索してみると似たような質問があったのですが、
私の疑問とは少し違うような気がして・・・。

なにがしたいかというと、

①リストボックスから選択

②同フォーム上に、選択したデータについての入力項目の表示

③引数の入力

④挿入

ということにしたいのですが、②についてどういう考え方で作成していけばいいのかわかりません。
というより可能なんでしょうか?
もしどなたかご教授いただける方がいましたら幸いです。


red-fish  2003-11-07 21:29:49  No: 109724

んー、難しいです。(あなたの疑問を理解することは)
具体例を添えるべきでしょう。

[リスト]
住所:東京都中央区……
氏名:山田太郎
電話:

[テキスト]

[登録ボタン]

とあって、
リストで編集対象項目名を1つ選択すると、
もしその項目が":"以降の値を持っていればそれをテキストに表示する。
なければ空白を表示する。
テキストに入力されたものは、
登録ボタンを押すことによりリストに反映される。
登録ボタンを押さずにリストの項目を選択した場合は、
テキストの内容は破棄される。

というような処理をイメージしましたが、こういう話なんでしょうか?

"初心者"というようなハンドル名は"通りすがり"とかと同様、
掲示板に真面目に参加する意思のない者という印象を与えます。
回答を得る機会を自ら減らすだけなので、次回からはRename
されることを、おすすめします。


  2003-11-09 10:43:47  No: 109725

リネームしました。  元初心者です。

red-fishさん、私の説明不足でした。申し訳ありません。
えぇと、red-fishさんがイメージしたようなことではないんです。

具体例としてはテキストエディタと言ったらいいんでしょうか。

テキストエディタから呼び出したフォームにリストボックスがあって、そこからある項目を選択すると、同じフォーム上にその項目についての引数の入力項目や、ヘルプ、テキストが表示される。それらを選択、または入力してOKボタンを押すと、テキストエディタ(Rich Text Box部分)に反映される。必須入力項目が入力されていなければエラーメッセージ、ということなんですが。

こんな説明でわかっていただけたでしょうか?


red-fish  2003-11-09 20:50:20  No: 109726

> こんな説明でわかっていただけたでしょうか?

大筋はわかりました。
肝心の環境(VB6 or .net)とかが不明ですが、
雰囲気からVB6(or earlier)と予想します。
(↑普通は質問者が初回質問時に明記すべき事項です)

<デザイン時>
"ある項目"に対応する1セットの入出力項目を1つのFrameに載
せます。List項目数と同数貼り付けられたFrameのVisibleを、
全てFalseにしておきます。

<Form_Load時>
最初に先頭が選ばれている状態にするなら
List1.Selected(0) = True
を記述。

<リストボックスのClickイベント>
項目数分用意されたFrameの中から、以前表示されていたFrameの
VisibleをFalseにし、対応するFrameのVisibleをTrueにします。
(=同フォーム上に、選択したデータについての入力項目の表示)
※項目数が非常に多い場合や、外部の設定ファイルに基づいて
  動的に組む場合は「コントロール配列」を用いると有効です。

<引数の入力>
これはオペレータがすることなので特に問題なし。
※"引数"というと通常はプロシージャのパラメータを意味します。
  (ニュアンス的には判らなくもないですが、この用法は混乱の
   もとです)

<必須入力項目が入力されていなければエラーメッセージ>
これは記す必要はないかも知れませんが、OKボタンの
Clickイベントで行えばOK。

<RichTextBox部分に反映される>
どういう処理になるかは項目次第ですので、疑問があればそれに
的を絞った別質問としてあげましょう。
"RichTextBox"で検索すると色々出ますので、それも参考に。

ということで、結論としては、

> (2)についてどういう考え方で作成していけばいいのかわかりません。

他のコントロールを載せる"コンテナ"という部品があります。
標準コントロールの中では、FrameやPictureBoxがそれです。
コントールをグループ化して、表示・非表示を切り替える場合
は、これらを利用することで開発者は最大の生産性を獲得する
ことができます。(by MS日本語風(^^;)


  2003-11-11 11:01:27  No: 109727

大変勉強になります。

考え方についてはほぼわかりましたが、
まだひとつ疑問の残るところがあるので質問させていただきます。

私の作成しているプログラムは、リストボックスの項目数が
50以上になる予定なのですが
この場合、各Frame内の情報(入力項目や説明文、又はヘルプ)は
直接プログラムに組み込んでしまってもいいんでしょうか?
それとも外部のファイルから各Frame内の情報を
読み込むような仕様にしたほうがいいんでしょうか?(好みの問題?)
後者の場合だとその方法がわかりません・・・

あ、開発環境はXPでVisual Basic6.0です。
申し訳ないです。


SKY  2003-11-11 19:33:46  No: 109728

初カキコになりますまだまだ初心者ですがRESさせていただきますm(_ _)m
>私の作成しているプログラムは、リストボックスの項目数が
>50以上になる予定なのですが

項目が多いのなら思い切ってコンボボックスに変えてみてはいかがでしょう?  項目が増えるとリストボックスでは幅を取ってしまって使いづらくなると思います^^;コンボボックスもリストボックスの機能を持っているはずですし(どうしてもリストボックス使いたいというなら別ですけど^^;

回答にそぐわなかったらすみません^^;


  2003-11-11 22:05:31  No: 109729

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

確かにコンボボックスでもいいとは思うんですけど、コンボボックスの場合
いったんボックスをクリックしてから二行目以降が表示されますから
少々操作がわずらわしいかなとも思うんです。

よく使う機能(の予定)なので、とりあえずはリストボックスで作ってみます^^


red-fish  2003-11-12 09:36:39  No: 109730

むむ、リストで50ですか。Controlにすると平均5個としても
250個+Frame50個……。Formのデザイン時においても、イベント
のコーディングにおいても、実行時の処理性能においても問題
が多そうな状況ですね。

どうすべきかは、かなりそのシステムの細かい要件にからんで
きますので、こうすればよいとは一概に言えません。
ただ、一般的に言える考え方として、

(A)テキストBox,コンボBoxの同時に登場する最大数だけをデザイン
   時に配置する。パターンによりControlの表示・非表示および
   配置(Left,Top)を操作することで、同じControlを使いまわす。

(B)必要なControlを都度、Load,Unloadして動的に画面を作る。
   FormにCommandを1つ貼り「Indexを0」にします。そして
   以下のコードを実行させてみて下さい。
   (何か見えてくるものがあるはず)

    Private Sub Command1_Click(Index As Integer)
      Dim i As Integer
      For i = 1 To 10
        Load Command1(i)
        With Command1(i)
          .Caption = "Loaded " & CStr(i)
          .Top = Command1(i - 1).Top + Command1(i - 1).Height
          .Visible = True
        End With
      Next
    End Sub

(C)50のパターンといえど中には共通部分も多い(はず)。
   50のパターンを分類し、せいぜい8個位の共通ベースFrame
   (或いはユーザーControl)に分ける。残る僅かな差異だけ
   (A)or(B)案的手法でやりくりする。

というような手法で、50パターンをやっつけるなどが考えられます。

> それとも外部のファイルから各Frame内の情報を
> 読み込むような仕様にしたほうがいいんでしょうか?(好みの問題?)

50のパターンがいつか60になりそうだったり、入力項目の内容に変更
が多発しそうなら、外部のファイルかな。

私だったら50のパターンがあるというだけで、間違いなく設定ファイル
と(B)案でやります。
でも抽象的なプログラミングになるので、VBに慣れていないなら(A)案
の方がスキル的には取り組み易いでしょう。
(C)案はパターン化が有効ならSourceの可読性もよく、いけてるかも。

あとは、がんばって下さい。(^^;


  2003-11-16 09:47:10  No: 109731

返事が遅くなりました。
とりあえずパターン化してみて、どれほどのものか試してみます。

やり方としてはなんとなくわかりましたので、後は自分でやってみますね^^
変な質問に付き合っていただきありがとうございました。


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

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






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