テキストボックスに入力した数字を小さい順に並べてラベルに表示するには?


やむあむ  2011-12-15 10:54:16  No: 103167  IP: [192.*.*.*]

visual basic6.0のため、情報がなくて困っています。ノルマなので早く仕上げてしまいたいですが、これだけが妙に難しくて進めません。ちなみに私はフォームにオブジェクトを配置する技能までは持っています。

編集 削除
やむあむ  2011-12-15 10:58:36  No: 103168  IP: [192.*.*.*]

テキストボックスに整数を4つ入力して、

ボタンを押すとその4つの数字を昇順にソートして
ラベルに1<2<3<4のように表示します。

1つでも整数じゃなかったときは、メッセージボックスを表示してソートが始まりません。

編集 削除
ミッキー  2011-12-17 10:44:21  No: 103169  IP: [192.*.*.*]

> 私はフォームにオブジェクトを配置する技能までは持っています。

ということは「プログラムは何も書けない素人です」と
言っていることと同じになりますが・・・

それとも、オブジェクトをコードで書いて
ソフト起動後に描写する技能を持っているということですか?
ただ、もしそうであれば、質問された内容なんて
お茶の子さいさいだと思うのです。

編集 削除
やむあむ  2011-12-19 11:44:49  No: 103170  IP: [192.*.*.*]

何も書けない素人です・・・
どうしたら数字をデータに変換できるのか、visual basicの入門書を読んでもまったくたどりつけないので・・・どうしてもわかりたくてお願いします。

編集 削除
やむあむ  2011-12-19 12:03:37  No: 103171  IP: [192.*.*.*]

すみません・・・簡単すぎるでしょうか・・・
VB6の文法がわからず・・・勉強不足でしたでしょうか。また出なおします。

編集 削除
くだん  2011-12-20 13:37:32  No: 103172  IP: [192.*.*.*]

相手にされていないだけです。
http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=29494&rev=&no=0

http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=10517
これなんか2ヶ月前の日付ですし。
勉強する気が無いようにしか見えませんし、
発言は信用できません。回答をもらった対応
も悪いです。

わざわざ無駄になる事が分かっている助言を
時間をかけてやろうと思う人がいるとでも?

編集 削除
魔界の仮面弁士  2011-12-20 21:50:34  No: 103173  IP: [192.*.*.*]

> ノルマなので早く仕上げてしまいたいですが

Recordset を利用したサンプル。

' 参照設定で[Microsoft ActiveX Data Objects]を追加して、
' フォーム上には Label をひとつ貼っておき、さらに
' TextBox のコントロール配列を任意の数だけ配置しておきます。
Option Explicit

Private Sub Text1_Change(Index As Integer)
    Label1.Caption = GetValues()
End Sub

Private Sub Form_Load()
    Dim txt As TextBox
    For Each txt In Text1
        txt.Text = ""
    Next
End Sub

Private Function GetValues() As String
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    rs.Fields.Append "F", adInteger
    rs.Open
    
Try:
    On Error GoTo Finally
    Dim txt As TextBox
    For Each txt In Text1
        rs.AddNew "F", CLng(txt.Text)
    Next
    rs.Sort = "F"
    rs.MoveFirst
    GetValues = rs.GetString()
Finally:
    rs.Close
End Function

編集 削除
くだん  2011-12-21 14:07:24  No: 103174  IP: [192.*.*.*]

> Recordset を利用したサンプル。
wwソートのプログラムなんて初心者に自分の頭でアルゴリズムを
考えさせる定番の課題だと思うんですが、Recordset 使っちゃうとか、
ある意味虐めですね。
その機能を実装したオブジェクトが存在しないとプログラムできない
偽プログラマになってしまえって事か、魔界の仮面弁士 さんも案外
Sだなぁ。

編集 削除
魔界の仮面弁士  2011-12-22 16:50:33  No: 103175  IP: [192.*.*.*]

> ソートのプログラムなんて初心者に自分の頭でアルゴリズムを
> 考えさせる定番の課題だと思うんですが、
課題の定番かどうかの判断は保留しますが、学習目的の投稿については
マルチポスト先にて回答しているので、こちらは別の切り口で書いています。(^^;

是非は別として、「早く仕上げること」が主目的なのであれば、
既知のライブラリやサンプルを流用して仕上げるのも選択肢かな、と。

なお私のサンプルは、要件に挙げられている非整数が含まれた場合の
メッセージボックス出力が盛り込まれていないので、実際には
そのものズバリな回答ではなかったりします。


> 偽プログラマ
私自身、素で組めるソートアルゴリズムは泥臭いバブルソート程度なんですよね。
二分木ソート、ノームソート、イントロソートなどといった、より高度な
ソートアルゴリズムでの実装となると、資料なしには組めません。


> Recordset 使っちゃうとか、
今回のケースはともかくとして、複数の項目で並び替える場合などには
便利なので、しばしば利用していたりします。(^^;)

----------------------
さて別案。
今度は、JScript の Array.sort メソッドを利用してソートしています。
(こちらも、メッセージの表示機能は省いています)

Option Explicit

Private Sub Text1_Change(Index As Integer)
    Label1.Caption = Replace(GetValues(), ",", vbNewLine)
End Sub

Private Sub Form_Load()
    Dim txt As TextBox
    For Each txt In Text1
        txt.Text = ""
    Next
End Sub

Private Function GetValues() As String
    Dim sc As Object
    Set sc = CreateObject("ScriptControl")
    '「Set sc = CreateObject("MSScriptControl.ScriptControl")」でも OK 。
    sc.Language = "jscript"

    Dim objArray As Object
    Set objArray = sc.Eval("a=new Array()")
    sc.ExecuteStatement "function Push(s){if(!isNaN(parseInt(s)))a.push(s)}"

    Dim txt As TextBox
    For Each txt In Text1
        sc.Run "Push", txt.Text
    Next
    sc.ExecuteStatement "a.sort(function(x,y){return x-y})"

    GetValues = CallByName(objArray, "toString", VbMethod)
    '「GetValues = objArray.toString()」でも OK 。
    '「GetValues = objArray.ToString()」だと NG 。
End Function

編集 削除
魔界の仮面弁士  2011-12-22 19:39:26  No: 103176  IP: [192.*.*.*]

さらに別案。ListBox のソート機能を使う手法です。

'--------------------------------
' 画面上に ListBox を貼っておき、そのプロパティを
' Sorted = True、Visible = False にしておきます。
'
' そのほか、結果表示用の Label を一つと、数値入力用に
' TextBox コントロール配列を複数貼っておきます。
' 画面上に ListBox を貼っておき、そのプロパティを
' Sorted = True、Visible = False にしておきます。
'
' そのほか、結果表示用の Label を一つと、数値入力用に
' TextBox コントロール配列を複数貼っておきます。
Option Explicit

Private Sub Form_Load()
    Dim txt As TextBox
    For Each txt In Text1
        txt.Text = ""
    Next
End Sub

Private Sub Text1_Change(Index As Integer)
    Dim txt As TextBox
    List1.Clear

    ' 数値順に並び変わるよう、先頭に"0"を付与した固定長文字列として登録する。
    On Error Resume Next
    For Each txt In Text1
        ' マイナスの値にも対応させるため、+10000000000 の補正を加えている。
        List1.AddItem Format(10000000000@ + CLng(txt.Text), "00000000000")
    Next
    On Error GoTo 0

    Dim s As String
    Dim i As Integer
    For i = 0 To List1.ListCount - 1
        s = s & vbCrLf & CStr(CCur(List1.List(i)) - 10000000000@)
    Next
    Label1.Caption = Mid(s, 3)
End Sub
'--------------------------------

かつて(VB2〜VB4 頃?)は、この ListBox によるソート手法も時折見かけましたが、
最近ではあまり見かけませんね。照合順序が OS 依存だったりして使いにくいからかな…?

編集 削除