1 名前:d mailto:age [2008/03/30(日) 09:01:59 ] このスレッドはVBについて、 他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 VB使いが優しくコメントを返しますが、 お礼はVBの布教はしなくてよいので、初心者の救済をお願いします 前スレ くだすれVB6.0以前(超初心者向け) pc11.2ch.net/test/read.cgi/tech/1165574205/
892 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 22:02:37 ] あ〜、さらに訂正 可能性としては、Combo1.Text を実行したときに Combo1_Change() が呼ばれている方が 濃厚だね。 解決法は、要求してないイベントを起こさないようにするか、Combo1_Click() から Combo1_Change() を呼び出したときは、何もしないようにする。(なんか変数を用意する) はずれてたら、ごめん。
893 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 23:15:32 ] もう一回全部作りなおすとどうなるのかな? 保持ってるやつを先頭に入れて他の項目挿入中に保持ってるやつを判定して再挿入を防ぐとか
894 名前:889 mailto:sage [2009/05/24(日) 05:21:25 ] >>890-892 Combo1_Changeイベントは有りません。 当初、あるアプリを制作中にこの問題に行き当たり、確認のため新規プロジェクト(標準EXE)の Form1にCombo1のみを配置して、コードも>>889 に書いたForm_LoadとCombo1_Clickのみで 確認した上で問題が再現したので質問させて頂きました。 >>889 で書いた他にコードが無い状況で発生しているということを書き忘れていたため、 余計な考察をさせてしまい申し訳有りません。 あと、Excel2003のユーザーフォームで確認しましたが、確かにExcelでは問題が再現しませんでした。 >>893 一度Clearして選択項目を先頭にAddItemしたあと、他の項目をAddItemしていくということですか? Listを配列変数に保持して、再挿入されないようにAddItemしてみましたが結果は変わらずで、 項目の入れ替えは正常に行われますがコンボボックスの内容表示は空になってしまいます。 もちろん、選択項目をAddItemしたときに.Textも設定して、ステップ実行でその時点では表示されています。 他の項目をAddItemしている間も表示は消えず、End Subで表示が消えてしまいます。 上にも書いたとおり、他にイベントはありませんし、仮に合ってもブレイクポイントではなくステップ実行なら 影響を与えているイベントがあれば、その部分にステップするはずですが。
895 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 09:07:53 ] VB6 インストールした。ためしに、Win7RC にしてみた。動くみたい。 Private blnRecursive As Boolean Private Sub Combo1_Click() Dim buf As String If blnRecursive = True Then Exit Sub End If '1 選択項目の文字列を保持 buf = Combo1.Text '2 選択項目を削除 Combo1.RemoveItem Combo1.ListIndex 'ここで一端コンボボックスの内容表示は空になる '3 一番上に追加 Combo1.AddItem buf, 0 'インデックスを指定するようにするので、コメントにした '4 選択項目の文字列を表示 'Combo1.Text = buf ' ステップ実行ではここでちゃんと表示される blnRecursive = True '再帰的に呼ばれるのを回避 Combo1.ListIndex = 0 'これをすると、Combo1_Click() が再帰的に呼ばれてしまう blnRecursive = False End Sub ' 何故かここで再度表示が消える
896 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 09:09:03 ] Private Sub Form_Load() blnRecursive = False '初期化 Combo1.AddItem "aaa": Combo1.AddItem "bbb": Combo1.AddItem "ccc" End Sub とりあえず、動くようにしたよ。 でも、原因はなんだろね。確かに、元プログラムでは、 End Sub するときに消えるね。 時間あったら調べとくよ。 # Excel 2003 では、再現しないんだねぇ。 # ちなみに >>890 でした。
897 名前:890 mailto:sage [2009/05/24(日) 21:24:07 ] ってか、これだけでも Hello が表示されない Private Sub Combo1_Click() Combo1.Text = "Hello" End Sub Private Sub Form_Load() Combo1.AddItem "aaa": Combo1.AddItem "bbb": Combo1.AddItem "ccc" End Sub ってことは、Click イベントではクリックして選んだんだから、選んだもの以外に変更するんじゃーねーよ って事らしい。 もうすでに解決してるかな?
898 名前:デフォルトの名無しさん [2009/05/25(月) 01:10:55 ] >>889 何で消えるのかはCombo2の動きで感じ取れ Private Sub Combo1_Click() Static flg As Boolean If flg Then Exit Sub Else flg = True If Combo1.ListIndex > 0 Then Combo1.AddItem Combo1.List(Combo1.ListIndex), 0 Combo1.RemoveItem Combo1.ListIndex Combo1.ListIndex = 0 End If flg = False End Sub Private Sub Combo2_Click() Debug.Print "テキスト変更前" Debug.Print "ListIndex:" & Combo2.ListIndex Combo2.Text = "ccc" Debug.Print "テキスト変更後" Debug.Print "ListIndex:" & Combo2.ListIndex Debug.Print End Sub Private Sub Form_Load() Combo1.AddItem "aaa": Combo1.AddItem "bbb": Combo1.AddItem "ccc" Combo2.AddItem "aaa": Combo2.AddItem "bbb": Combo2.AddItem "ccc" End Sub
899 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 00:45:51 ] 質問です。 コマンドプロンプトでの入出力を逐次行いたいと思っています。 以下のようなサンプルを書いてみたのですが、うまくいきませんでした。 ipconfigの結果の最後の行を取得したのち、 もう1行読みに行ってしまいそのまま処理戻り待ちになってしまいます。 この時コマンドプロンプトを手動で閉じると制御が戻り処理が再開されました。 何がいけないのでしょうか? Dim objWShell As Object Dim objExec As Object Set objWShell = CreateObject("WScript.Shell") Set objExec = objWShell.Exec("%ComSpec%") objExec.StdIn.WriteLine "ipconfig" Do Until objExec.StdOut.AtEndOfStream Debug.Print objExec.StdOut.ReadLine Loop objExec.StdIn.WriteLine "Exit" Set objExec = Nothing Set objWShell = Nothing
900 名前:デフォルトの名無しさん [2009/05/29(金) 01:36:03 ] >>899 手動で閉じたときにエラー発生しなかった? 何でエラーになったか考えればこんな感じにたどり着くと思うよ。 objExec.StdIn.WriteLine "ipconfig" + vbCrLf + "Exit"
901 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 01:59:45 ] >>900 助言ありがとうございます その通りでした。 ですが、実のところ途中でExitしたくないのです コマンドプロンプトを複数回呼び出すたびにウインドウが出てしまうためこれをさせたくないのです 元はといえば自由に操作可能なコマンドプロンプトを非表示で呼び出せれば良いのですが・・・ そのために考えたコードが上記のものでした
902 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 07:53:09 ] パイプのようなものを使えばいいのでは
903 名前:デフォルトの名無しさん [2009/05/29(金) 12:24:36 ] コンソールアプリケーションには疎いのですが、 パイプのようなものとは記号「>」でファイル出力するという意味でしょうか? 中間に入力などがあり分岐したい場合に対処できないと思ったのと ファイルへの入出力を伴うのは処理速度がストレージ性能に依存するため避けたのですがどうでしょうか?
904 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 12:54:06 ] VB パイプ などでぐぐれば多少は出てくるでしょうに、それすらしないんですか
905 名前:デフォルトの名無しさん [2009/05/29(金) 13:07:49 ] 処理速度とか気にしてる割にはシェルの起動時間は気にならないんですね めんどくさいから素直に何がしたいのか書けよ
906 名前:899 mailto:sage [2009/05/29(金) 13:16:59 ] すいませんでした ググって来ました 私が言っていたのはリダイレクトだったのですね、失礼しました > 「標準入出力」というのは、ユーザーが何もしなくてもOSが「標準で」用意してくれる入力先・出力先のことです。 > 「リダイレクト」によって標準入出力をファイルに変更したり、 > 「パイプ」によってあるコンソールアプリの標準出力を別のコンソールアプリの標準入力につなげたり出来ます。 ・・・このパイプのようなものを実際どう組み込んだらよいのでしょうか? >>899 ソースでobjExec.StdOut.ReadLineの場所で止まってしまう理由が分かりません /cをつけて自動終了するようにして使うしかないのでしょうか? StdInやStdOutをどのように捕らえたら良いのかお教え願えませんでしょうか?
907 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 13:24:06 ] ぐぐれば一番最初に出てきただろうに、なんなのこいつ
908 名前:899 mailto:sage [2009/05/29(金) 13:34:33 ] >>905 シェルの起動時間とはなんでしょうか? CreateObjectの事でしょうか? これは一度作成したのちずっと保持する予定なので気にしていません コマンドプロンプトのExec呼び出しの事でしょうか? こちらも一度しか呼び出さないようにして再利用する事を考えていて、その結果このような質問に至りました。 >何がしたいのか いくつかのCUIアプリケーション(コンソールコマンドの結果)のGUI化です ExecメソッドではStdIn、StdOutというもので制御が可能と知ったので、 これを使ってコマンドプロンプトもどきを作れないかと考えました。 これができればいろんなもののGUI化が出来るだろうと思いテストソースを書きました。 >>907 すいません
909 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 13:36:41 ] ほぼそのもののソースがググると出てくるんだが まだ不満があるのか
910 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 13:37:10 ] ごめんなさい、それはどこですか?
911 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 13:40:52 ] >>909 お前うぜーよ URL貼る気ねーならくるな
912 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 13:46:28 ] MSDNライブラリのStdInプロパティの説明くらい読めばいいのに
913 名前:899 mailto:sage [2009/05/29(金) 14:04:21 ] >>912 ありがとうございます このあたりの事でしょうか? ttp://msdn.microsoft.com/ja-jp/library/cc364385.aspx 一応MSDNのこのあたりは関連するキーワードのものを含め何度か読み返してはいたのですが、 前述の無反応になる件の答えが見出せず困っています・・・ アホですいません Do Until objExec.StdOut.AtEndOfStream の判定ではポインタが最後に到達していないはずなのですが StdOut.ReadLineメソッドを呼び出すと処理が戻らず(エラーも出ず)待機してしまう理由がどうしてもわかりません
914 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 15:33:52 ] いちいち自分でググってそのページを見てるくせに、 ここではほのめかしの回答しかしない屑。
915 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 15:46:09 ] 先にexitを送らない限り一生終わらない(AtEndOfStreamはFalseのまま) Dim objWShell Dim objExec Set objWShell = CreateObject("WScript.Shell") Set objExec = objWShell.Exec("%ComSpec%") objExec.StdIn.WriteLine "ipconfig" objExec.StdIn.WriteLine "exit" Do Until objExec.StdOut.AtEndOfStream MsgBox objExec.StdOut.ReadLine Loop
916 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 16:07:08 ] ipconfigの出力に[[hoge]]があると誤判定で終了してしまうが Dim objWShell' As Object Dim objExec' As Object Set objWShell = CreateObject("WScript.Shell") Set objExec = objWShell.Exec("%ComSpec%") objExec.StdIn.WriteLine "ipconfig" objExec.StdIn.WriteLine "echo [[hoge]]" Do Until objExec.StdOut.AtEndOfStream Dim sLine' As String sLine = objExec.StdOut.ReadLine If sLine = "[[hoge]]" Then Exit Do MsgBox sLine Loop If Not objExec.StdOut.AtEndOfStream Then objExec.StdIn.WriteLine "exit"
917 名前:デフォルトの名無しさん mailto:sage [2009/05/29(金) 21:10:27 ] >>915 ありがとうございます 相手(コマンドプロンプト)が終了しない限り、そのTextStreamは「Endがない」動作をするのですね 私のサンプルで停止していたのは、この「現在まだない次の行」を取得中で待機している、という事でしょうか Exitを打たずともスマートな解決方法があるのではないかと思っていましたが、 簡単にはいかないようでその理由も大体把握できました 「Exec呼び出し先が動作中の時は、StdOutの最終行がAtEndOfStreamで検出できず、 またStdOut.Read系で現在の最終行を超えて読もうとしてもエラーも出ず新たな行が入るまで待機してしまう」 と言う事ですね。 サンプルまで付けて頂いて、アホでも理解しやすく配慮していただき助かりました >>916 回避策ありがとうございます なるほど、未知の最終行を読むこと自体を回避するのですね 番兵を置いているところで目から鱗でした! これならコマンドプロンプトをExitさせずに逐次StdOutを監視できそうです
918 名前:デフォルトの名無しさん [2009/06/07(日) 13:02:33 ] 誘導されてきました 何年か前の話です、バカでも使える簡単な言語を紹介してくれと知り合いに聞いたところ 「VBが良い、中学生でも扱える言語」といわれ家電量販店でVBを購入。 たしか「N88ベーシックと難易度は変わらない」とも言われました。N88ベーシックがなんなのか よくわかりませんが似たようなベーシック言語は触ったことがあるのでVBもそんなものだと思って買いました 購入してそのまますっかり忘れて押入れの中に放置していたのですが、今日引っ張り出してきてインストール しようとしたのです、するとIISとフロントベージと言うものがインストールされていないので インストールできないとの表示が・・・ IISはアパッチのようなものだとしてフロントページが何なのか良くわかりません、調べてみると ホームページビルダーのようなものらしいけどこれは買わないといけないのでしょうか?。 そもそも知り合いの説明がずいぶん間違っているようにしか思えないのですが。 昔のベーシックの難易度ってフォートランぐらいだったと思うのですが。 VBとやらはインストールの段階で知らない専門用語だらけです。 これはいったいどういうことなのでしょう?えらい人教えてください。
919 名前:デフォルトの名無しさん [2009/06/07(日) 13:04:28 ] ヴァージョンは2003 OSのバージョンはWindows2000です
920 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 13:04:32 ] 気にせずインストールを続ければOK
921 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 13:40:47 ] そのFrontPageはOfficeのFrontPageではなく、FrontPage 2000 Server Extensionsの方だな ASP.netをやらないなら入れる必要なし IISとFrontPage 2000 Server Extensionsを入れるなら コントロールパネル→プログラムの追加と削除→Windowsコンポーネントの追加と削除 から、インストールが出来る VB6スレだから、誘導が間違ってたんだろうけど 質問する場合は最初からバージョンは書いておいた方がいいよ
922 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:50:22 ] FrontPage 2000 Server Extensions てそもそも何のために導入しなきゃいけないんだ? いまいちよくわからずに入れていたんだが気になってきた
923 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:59:25 ] WebDAV ではないんだけど、あんな感じで Web サイト上の コンテンツを更新するのに必要なんじゃなかったかな。