visual basic6.0のため、情報がなくて困っています。ノルマなので早く仕上げてしまいたいですが、これだけが妙に難しくて進めません。ちなみに私はフォームにオブジェクトを配置する技能までは持っています。
編集 削除テキストボックスに整数を4つ入力して、
ボタンを押すとその4つの数字を昇順にソートして
ラベルに1<2<3<4のように表示します。
1つでも整数じゃなかったときは、メッセージボックスを表示してソートが始まりません。
> 私はフォームにオブジェクトを配置する技能までは持っています。
ということは「プログラムは何も書けない素人です」と
言っていることと同じになりますが・・・
それとも、オブジェクトをコードで書いて
ソフト起動後に描写する技能を持っているということですか?
ただ、もしそうであれば、質問された内容なんて
お茶の子さいさいだと思うのです。
何も書けない素人です・・・
どうしたら数字をデータに変換できるのか、visual basicの入門書を読んでもまったくたどりつけないので・・・どうしてもわかりたくてお願いします。
すみません・・・簡単すぎるでしょうか・・・
VB6の文法がわからず・・・勉強不足でしたでしょうか。また出なおします。
相手にされていないだけです。
http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=29494&rev=&no=0
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=10517
これなんか2ヶ月前の日付ですし。
勉強する気が無いようにしか見えませんし、
発言は信用できません。回答をもらった対応
も悪いです。
わざわざ無駄になる事が分かっている助言を
時間をかけてやろうと思う人がいるとでも?
> ノルマなので早く仕上げてしまいたいですが
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
> Recordset を利用したサンプル。
wwソートのプログラムなんて初心者に自分の頭でアルゴリズムを
考えさせる定番の課題だと思うんですが、Recordset 使っちゃうとか、
ある意味虐めですね。
その機能を実装したオブジェクトが存在しないとプログラムできない
偽プログラマになってしまえって事か、魔界の仮面弁士 さんも案外
Sだなぁ。
> ソートのプログラムなんて初心者に自分の頭でアルゴリズムを
> 考えさせる定番の課題だと思うんですが、
課題の定番かどうかの判断は保留しますが、学習目的の投稿については
マルチポスト先にて回答しているので、こちらは別の切り口で書いています。(^^;
是非は別として、「早く仕上げること」が主目的なのであれば、
既知のライブラリやサンプルを流用して仕上げるのも選択肢かな、と。
なお私のサンプルは、要件に挙げられている非整数が含まれた場合の
メッセージボックス出力が盛り込まれていないので、実際には
そのものズバリな回答ではなかったりします。
> 偽プログラマ
私自身、素で組めるソートアルゴリズムは泥臭いバブルソート程度なんですよね。
二分木ソート、ノームソート、イントロソートなどといった、より高度な
ソートアルゴリズムでの実装となると、資料なしには組めません。
> 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
さらに別案。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 依存だったりして使いにくいからかな…?