トップページ⇒tech
1001コメント367KB

VB.NET質問スレ(Part30)

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/05/17(日) 10:00:19
前スレ

VB.NET質問スレ(Part29)
http://pc12.2ch.net/test/read.cgi/tech/1235206416/l50

テンプレは>>2〜
0322デフォルトの名無しさん2009/07/03(金) 21:19:41
>>321
フォームから DLL にコントロールの参照を渡してやれば OK
0323デフォルトの名無しさん2009/07/03(金) 22:15:41
VS2005です

ユーザーコントロールにDataGridViewを貼り付けてColumnを2つ追加しました
これにイベントハンドラを記述するとユーザーコントロールのコンパイルは通りますが
コントロールの読み込み時にエラーが発生します

'RowsAddedイベントハンドラ
Private Sub DataGridView1_RowsAdded(ByVal sender As Object, _
ByVal e As DataGridViewRowsAddedEventArgs) _
Handles DataGridView1.RowsAdded
DataGridView1.Sort(DataGridView1.Columns(1), ListSortDirection.Descending)
End Sub

列のSortModeがNotSortableに設定されているとき
列ヘッダーのSortGlyphDirectionをDesendingに設定することはできません
というエラーが出てるようですが、プロパティではSortModeはAutomaticになってます

ほわい?
0324デフォルトの名無しさん2009/07/03(金) 22:28:19
なってます、ってどうやって確認したの?
0325デフォルトの名無しさん2009/07/03(金) 22:34:02
>>324
ありがとうございます。
DataGridviewの設定はすべてデザイナでやってますので
0326デフォルトの名無しさん2009/07/03(金) 22:37:02
改行したら送信してしまいました
つづきです

デザイナでやってて、Columnもデザイナであらかじめ追加してます
デザイナ上でのプロパティではAutomaticになっております
0327デフォルトの名無しさん2009/07/03(金) 22:47:38
とりあえず、デザイナで設定したプロパティは忘れて、

'RowsAddedイベントハンドラ
Private Sub DataGridView1_RowsAdded(ByVal sender As Object, _
ByVal e As DataGridViewRowsAddedEventArgs) _
Handles DataGridView1.RowsAdded
If ...SortMode <> NotSortable Then
 DataGridView1.Sort(DataGridView1.Columns(1), ListSortDirection.Descending)
End If
End Sub

みたいにしてみるとか、エラーが出たときにウォッチしてみるとか、
その辺で確認してみたら?
0328デフォルトの名無しさん2009/07/03(金) 23:07:50
了解っす
0329デフォルトの名無しさん2009/07/04(土) 00:02:23
うまく行きました!
データがない状態の時NotSortableになってんのかな?
ありがとうございました
0330デフォルトの名無しさん2009/07/04(土) 00:19:06
>>320
そんなに大きくないならStringWriterで文字列に書き出して置換すれば
0331デフォルトの名無しさん2009/07/05(日) 14:28:39
DataGridViewにdataset内部でリレーションシップを設定したTableA TableBのフィールドを表示したいんです

TableAとTableBは1対多結合になります
フィールドは同一のDataGridViewで表示したい
TaleBを連結したDataGridViewに非連結列を追加してTableAのフィールドを検索して貼り付けることはできそうですが
なんかデザイングリッド上でぱぱっとやれそうな気がしておたずねしました

何とぞよろしくお願いいたします
0332デフォルトの名無しさん2009/07/05(日) 15:31:23
ググっても見つからないので質問させてください。
Textboxに入力されたデータから特定の行(ex:15行目から20行目)だけを取り出したいのですが、何か方法はないでしょうか?
よろしくお願いします。
0333デフォルトの名無しさん2009/07/05(日) 15:36:17
>>332
どう検索したのか興味がある

Linesから適当に取得すればいいっしょ
0334デフォルトの名無しさん2009/07/05(日) 15:50:04
>>333
初心者故に文字列の取得方法が分かりません。
申し訳ないです。
0335デフォルトの名無しさん2009/07/05(日) 16:16:51
答え出てるじゃんw
0336デフォルトの名無しさん2009/07/05(日) 16:18:49
DataGridViewをほぼ同じような表な形で印刷したいのですが、自分でライン書いて表の中のデータを書くというっ事をしなければならないんでしょうか?
DataGridviewをそっくりそのままの形のレイアウトで印刷してくれるようなもっと簡単なのがあってもよさそうなのですが・・・
0337デフォルトの名無しさん2009/07/05(日) 16:22:09
>>335
すいません、Linesはどのように扱えばいいのでしょうか
0338デフォルトの名無しさん2009/07/05(日) 16:24:10
表形式で出力できるレポートツールを使う、ってのが一般的かね。

おれはグリッドそのまま出せてもなんもうれしくないから、必要性を感じないな。
0339デフォルトの名無しさん2009/07/05(日) 16:28:42
>>337
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.textboxbase.lines.aspx

↑を見て、何がわからないのかきちんと説明しろ。
0340デフォルトの名無しさん2009/07/05(日) 16:54:21
>>339
ごめんなさい
これを別のTextboxに出力させる方法が分かりません。

Dim counter as Integer
'Create a string array and store the contents of the Lines property.
Dim tempArray() as String
tempArray = textBox1.Lines

'Loop through the array and send the contents of the array to debug window.
For counter = 0 to tempArray.GetUpperBound(0)
System.Diagnostics.Debug.WriteLine( tempArray(counter) )
Next
0341デフォルトの名無しさん2009/07/05(日) 16:54:58
Form右上の×ボタン押したときに終了するか確認メッセージ出して、
終了の場合は閉じるようにしたいんですが、closingイベント以外で実装
はできませんか?
今やりたい事は、フォームA→フォームBを呼び出してそこから終了
した場合、上記の確認メッセージを表示して両方のフォームが落ちるようにしたいです。
フォームBを×ボタンで閉じる動作を行うとフォームAをcloseという処理を走らせたい
のですが、フォームAにも上記のclosingイベントを実装する為
フォームB終了確認メッセージ後に、フォームAの終了確認メッセージが表示されてしまいます。
closingイベント内でフラグ立てて回避出来るかなと思ったら、無限ループに陥ってしまい無理でした。
どのような解決方法があるか教えていただけると幸いです。
よろしくお願いいたします。
0342デフォルトの名無しさん2009/07/05(日) 17:19:49
FormB : FormClosingでキャンセルかどうか決める
FormA : FormBのFormClosedで自分をCloseする
    FormClosingでFormBが閉じられたときに呼び出された場合確認ダイアログを出さない
0343デフォルトの名無しさん2009/07/05(日) 17:20:14
>>341
> Form右上の×ボタン押したときに終了するか確認メッセージ出して、
> 終了の場合は閉じるようにしたいんですが、closingイベント以外で実装
> はできませんか?

できない。

> 今やりたい事は、フォームA→フォームBを呼び出してそこから終了
> した場合、上記の確認メッセージを表示して両方のフォームが落ちるようにしたいです。
> フォームBを×ボタンで閉じる動作を行うとフォームAをcloseという処理を走らせたい

Closing イベントで閉じられる理由を確認すればいいんじゃね?
0344デフォルトの名無しさん2009/07/05(日) 17:21:03
>>340
ってことは、取得する方法はわかったわけだ。

設定したいなら、「別のTextBox.Text = 取得した値」でOK。
0345デフォルトの名無しさん2009/07/05(日) 17:27:40
>>331ですけど
ソースコードでテーブルをもう一つ作ってマージするって方法は見つけました

それが正解でしょうか?

コーディングなしで2つのDataGridViewで親子テーブルを作る例はいっぱいありましたが
それを単一のDataGridViewで表示するのって逆に難しいんですね
0346デフォルトの名無しさん2009/07/05(日) 17:37:31
>>344
Dim counter As Integer
Dim tempArray() As String
  tempArray = textBox1.Lines

For counter = 0 To tempArray.GetUpperBound(0)
TextBox2.Text = tempArray(counter)
Next

こういうことでしょうか?
行数はFor counter = 0 To tempArray.GetUpperBound(0)の数値をいじればいいのですよね?
03473412009/07/05(日) 17:58:28
FormBの処理
FormB Closingイベントで確認ダイアログ表示
NOを返す→e.cancel=true (これでキャンセル)
YESを返す→FlgをtrueにしてFormA.close

FormA
上記のFormA.closeによって、FormAのClosingイベントが呼び出される。
FlgがTrueの場合、Closingイベント内の確認ダイアログはスルー。

私としては、上記の内容でいけると思ってたんですが、
FormA.Closeを実施のところで、何度も確認ダイアログが表示され
無限ループに陥っているようでした。

また、FormBのclosingイベント内に確認ダイアログをもうけないで
FormA.closeのみおいてみると何故か無限ループでエラーが出てしまいます。
その際、FormAにはClosingイベントはおいてません。
どなたか理由がわかる方いませんか?
03483362009/07/05(日) 18:18:31
>>338
>表形式で出力できるレポートツール
とは、どういうものなのでしょうか?

クリスタルレポートとかそういうものですか?
私は今、Vb2008を使ってるんですが、コントロールの一覧の中にCrystalreportがないのですが、なにか設定がいるんですかね
0349デフォルトの名無しさん2009/07/05(日) 18:44:20
>>346
取得する行が決まってるなら、ループで回す必要はない

>>347
わかりづらいから、きちっとコード出してみ?

>>348
おまえさんの言うとおり、クリスタルレポートとか。
Edition によっては含まれてないんじゃない?
0350デフォルトの名無しさん2009/07/05(日) 19:45:30
>>349
できました
ありがとうございます。
0351デフォルトの名無しさん2009/07/05(日) 20:33:55
初期画面をログイン画面にしたいのですが、ログイン成功時にログイン画面をクローズして別フォームを表示したらフォームが全て落ちます。助けて下さい。
0352デフォルトの名無しさん2009/07/05(日) 20:48:35
別フォームを表示してからログイン画面をクローズする
sub mainからログイン画面を表示する
03533362009/07/05(日) 23:12:53
>>349
Express Editionなんですが、クリスタルレポートは追加できないんでしょうか?
03543512009/07/05(日) 23:20:33
>>352
メイン画面をログイン画面に設定したらログイン画面落とした時点で
ほかのフォームも全て落ちちゃうんですよね。
0355デフォルトの名無しさん2009/07/05(日) 23:22:20
>>353
http://www.microsoft.com/japan/msdn/vstudio/products/compare/default.aspx

ダメだね。
0356デフォルトの名無しさん2009/07/05(日) 23:36:56
>>354
ログインをメインにするから不味い、ってことだろ。
0357デフォルトの名無しさん2009/07/06(月) 01:28:08
>>331ですが、データソースを見るとリレーションが効いて
親テーブルの下に子テーブルが見えてるんですが

こいつをDataGridViewの単一テーブル上に展開できません

tableA
fieldID
fieldA
tableB
fieldID
fieldB

fieldID fieldA fieldB のような表現をしたいのですが・・・やはり無理でしょうか?
0358デフォルトの名無しさん2009/07/06(月) 02:13:56
表示用に列一つ追加してExpression使うのが一番楽かな
0359デフォルトの名無しさん2009/07/06(月) 02:24:49
あ、DataColumn.Expressionな
0360デフォルトの名無しさん2009/07/06(月) 10:10:53
>>358
やっぱりそうですか
誰かに言って貰わないと楽ちんな方法を知らずに回り道してるんじゃないかと心配で
先に進めないもので・・・

ありがとうございました
0361デフォルトの名無しさん2009/07/06(月) 11:56:20
>>331
たびたびすみません。

datasetのデザイナで子テーブルにフィールドを追加しフィールドプロパティのExpressionに
TableA.FieldAを設定すると
リレーションシップ0が見あたりません
そこで
parent(リレーションシップ名).FiedlAを設定すると
リレーションシップ名が見あたりません

となります。datasetデザイナ上では確かにリレーションシップを設定してその名前をコピペしてるので間違いないと思うのですが

もしかしてコード上で設定しないといけないのでしょうか?
0362デフォルトの名無しさん2009/07/06(月) 12:14:49
Expression設定してるところでブレークポイント設定して確認すれ
0363デフォルトの名無しさん2009/07/06(月) 13:05:59
>>362
datasetデザイナ上でプロパティを設定してるだけなので・・・・

よっぽどまぬけなことをやってるのかググっても該当するものは出てこず・・・

orz
0364デフォルトの名無しさん2009/07/06(月) 13:19:17
現在のプロジェクトをExpressionで検索してみろよ
0365デフォルトの名無しさん2009/07/06(月) 13:25:32
>>364
やっと意味がわかりました。なるほど・・・

で、やっと設定できました

原因は不明ですが、ビルドしたら親テーブルのフィールドを認識するようになりました

お騒がせしました
0366デフォルトの名無しさん2009/07/06(月) 19:24:59
すみません
VBからTwitterに文字列を投稿する方法はAPI以外にないでしょうか?
0367デフォルトの名無しさん2009/07/06(月) 21:54:39
これがWin32APIの事を指していたら、それはそれで面白いかもしれんね。
0368デフォルトの名無しさん2009/07/06(月) 21:55:30
>>367
TwitterAPIの方です
0369デフォルトの名無しさん2009/07/06(月) 22:15:26
SerialPortにて0.1Sec毎に送受の通信を行っているプログラムなんですが
フォームに配置しているボタンを連打したり、データグリッドを更新させたりしてプログラムに一次的に負荷をかけると、その間だけ送受の通信が止まってしまいます。
ためしにForm2を作ってその別のフォームで単独で通信させていてもForm1にあるボタン等を連打して負荷をかけると同じような結果でした。

こういう問題はどういう風に解決したらよろしいのでしょうか?
どうかご助言のほうをよろしくお願いします。
0370デフォルトの名無しさん2009/07/06(月) 22:35:11
負荷とか関係なく、UIスレッドで通信しているのが原因の予感。
スレッドを分ければ一瞬で解決すると見た。
0371デフォルトの名無しさん2009/07/06(月) 22:35:23
別のスレッドで通信を処理すればいいんじゃね?
0372デフォルトの名無しさん2009/07/06(月) 22:42:11
UIスレッド?ですか
VB2008を使っているのですが、スレッドとはどういう事なのでしょうか?
0373デフォルトの名無しさん2009/07/06(月) 22:50:21
マルチスレッドプログラミングってやつ
原則的に時間のかかる処理は別のスレッドを作ってそっちで動かさないとUIが固まります
特別な技術や注意が必要なのでしっかり勉強しましょう
0374デフォルトの名無しさん2009/07/06(月) 22:51:31
「ワーカースレッド」でMSDN を検索してこい。
0375デフォルトの名無しさん2009/07/06(月) 22:58:14

『.NETマルチスレッドプログラミング 1:スレッドの実行と同期』
http://codezine.jp/article/detail/144?p=1

『.NETマルチスレッドプログラミング 2:非同期デリゲートとスレッドプール』
http://codezine.jp/article/detail/139?p=1
0376デフォルトの名無しさん2009/07/07(火) 04:24:03
ありがとうございます
参考にさせていただきます

なんとなくマルチスレッドの動きは分かったんですが
このプログラムは送信はタイマーイベントで行っていて、受信はCOMのDataRecivedイベントで行っているのですが
この場合、>>369のように停止させたくはないので両メソッドともマルチスレッド化したほうがよろしいんでしょうか?
なかなか複雑そうですね・・。
0377デフォルトの名無しさん2009/07/07(火) 07:47:52
どうせDataReceivedはSerialPortが用意したスレッド上になるのだから、
データを格納した上でControl.BeginInvokeしておけば、
UIスレッドが原因で邪魔されることは無いんじゃないかな。
03783762009/07/07(火) 19:14:09
>>377
>データを格納した上でControl.BeginInvokeしておけば、
>UIスレッドが原因で邪魔されることは無いんじゃないかな。
すみません・・・もう少し詳しく説明していただけませんでしょうか?

それと思ったのですが
現状のプログラムがDaraRecivedイベントが発生してデータを受け取ったら、そのデータのヘッダ等を確認するためにDaraRecivedイベント内で処理関数(*1)を呼び出して、最終的に変数にデータを格納する処理にしています
そしてフォームに配置したタイマーイベントで、その格納した変数にアクセスしデータを読み取るようにしています。
DaraRecivedイベントから呼び出した上記の(*1)の処理関数もDataRecivedイベントと同じスレッド、つまりフォームが実行されているスレッドとは別で実行されているということなんですよね?

ということは、既に受信処理は別のスレッドで処理されていたということなんですよね
この場合、フォームに配置したタイマーイベントで行っている送信処理のみがフォームと同スレッドな為にフォーム操作時に停止していると判断して
結果的には送信処理のみを別スレッドにすれば問題は解決しそうですね

マルチスレッドについては教わった解説サイトを見て調べるとして
・・・タイマーイベント内の、送信処理を別スレッドにするべきなんでしょうか
それともこのタイマーイベント自体を別スレッドにしないといけないんでしょうか?
タイマーイベントはフォームを操作したとして途切れることはないのかな
0379デフォルトの名無しさん2009/07/07(火) 19:34:19
送信処理を別スレッドにしてみて、改善されるか試してみなよ。
今後のことを考えれば、スレッド使えないと自分が大変なんだからさ。
0380デフォルトの名無しさん2009/07/07(火) 19:46:17
System.Timers.Timerの方を使えば、
勝手に手持ちのスレッドプールからイベントを起こしてくれるから、
スレッドを一から作る必要は無いんじゃないかな。
UIスレッドとは無関係にイベントは発生するから、止まる事も無いはず。
0381デフォルトの名無しさん2009/07/07(火) 22:00:04
Oracleと繋ぐときにOracle Clientを使わない方法って無いんですか?
0382デフォルトの名無しさん2009/07/07(火) 22:02:18
ODP.NETでもODBCでも
0383デフォルトの名無しさん2009/07/07(火) 22:19:17
>>382
ODP.NETやODBCだと、exeの配布先のマシンに
オラクルのクライアントがインストールされていなくても
SQLの実行などができますか?
0384デフォルトの名無しさん2009/07/07(火) 22:25:49
まさか

質問はちゃんと要件をまとめてからしてくれよ
0385デフォルトの名無しさん2009/07/07(火) 22:31:15
>>384
じゃ、exeの配布先のマシンには
Oracleのクライアントソフト(.Net)は必須なんですね?
0386デフォルトの名無しさん2009/07/07(火) 22:34:17
そもそも今現在受信処理と送信処理はちゃんと(うまく)同期とって動いてるの?
0387デフォルトの名無しさん2009/07/07(火) 22:36:04
Oracleのインストールは必須
.NETからOracleへのアクセスはSystem.Data.OracleClientやSystem.Data.Odbcなら標準ライブラリに用意されてる
> Oracleのクライアントソフト(.Net)
って何指してるの?
0388デフォルトの名無しさん2009/07/07(火) 22:36:30
Oracleのクライアントソフト(.Net)ってなんだよ。
Oracleのネイティブなクライアント(OCIとか)と
.NETのプロバイダは別物だぞ。

さらにDataDirectなどの、Oracleのネイティブなクライアントが
不要なプロバイダもあることはある。
0389デフォルトの名無しさん2009/07/07(火) 22:39:23
ありがとうございます。
納得しました。
0390デフォルトの名無しさん2009/07/08(水) 16:42:49
VB2005でアプリを開発しています。
あるファイルが他のなんらかのアプリケーションで既に開かれているかどうかを調べるにはどうすれば良いでしょうか?
ファイル名から、そのファイルを開いているアプリケーションが何なのかを知りたいのです。

開発しているアプリからデータを既存のファイルに上書きでエクスポートしようとした時、
他のアプリでそのファイルが開かれていればエラーになってしまうので、どのアプリがその
ファイルを開いているかをユーザに通知したいのです。

どうぞよろしくお願いいたします。
0391デフォルトの名無しさん2009/07/08(水) 16:49:29
無理じゃないかな、ハンドルの継承とかあるし
0392デフォルトの名無しさん2009/07/08(水) 17:01:02
なんかAPIができたときいたことがある
03933902009/07/08(水) 17:28:25
>>391
>>392
レスありがとうございます。

とりあえず現時点では「ファイルが他のアプリケーションで使用されていないことを確認してください。」と
メッセージボックスを表示しています。

たとえば、開発しているアプリから xls ファイルでエクスポートしてそのファイルが Excel で開かれていれば
ユーザは Excel というアプリを自分で確認してくれるのですが、別のアプリでその xls ファイルを読み込んで
いる場合、ユーザはその xls ファイルが開かれているということに気づきにくいみたいですので、どのアプリが
その xls ファイルを開いているのか通知したいんです...

openfiles というコマンドがあるみたいですが、これは非公開APIを使用しているかも...みたいな記述は
見かけました。
ただこのコマンドを使用するにはシステムのパフォーマンスが低下する可能性があるとの事(openfiles.exe が
ファイルのトレースを行うのでオーバーヘッドが発生)で、このコマンドを使用するには抵抗があります。
ttp://www.atmarkit.co.jp/fwin2ktips/306openfiles/openfiles.html

何か妙案はないかな...
0394デフォルトの名無しさん2009/07/08(水) 19:55:41
使い終わったらOFFにすればいいんだろ
0395デフォルトの名無しさん2009/07/08(水) 20:47:51
>>393
http://technet.microsoft.com/ja-jp/sysinternals/bb896656(en-us).aspx

これはだめ?
0396デフォルトの名無しさん2009/07/08(水) 20:51:10
VB2008を使用しています。
Form1とForm2を作成し、Form1からForm2を以下のようにして表示させました。

[Class Main]
Public Sub Main()
Application.Run(New Form1)
End Sub

[Class Form1]
Private Sub Form1_Load( 略 )
Form2.Show()
End Sub

Public Sub SetTextBox( str )
TextBox1.Text = str
End Sub

[Class Form2]
Private Sub Button1_Click( 略 )
Form1.SetTextBox("test")
End Sub

このとき、Form2のボタンからForm1のTextBoxに文字列をセットできないのは
Application.RunでNewしているForm1にアクセス出来ていないからでしょうか?
0397デフォルトの名無しさん2009/07/08(水) 20:56:46
>>393
自分が開いてるかどうかなら
COM経由で開いてる文書一覧が取得できなかったっけ?

他PCが開いているかどうかなら
開かれていたらどうしたいのかによるんじゃね?
そもそもExcelが排他かけないんだし…
0398デフォルトの名無しさん2009/07/08(水) 22:05:21
>>396
よくわからんけど
Form1.TextBox.Text = "test"
は、ダメなの?
0399デフォルトの名無しさん2009/07/08(水) 22:09:43
>>396
VBは過去のしがらみにより、フォームのインスタンスを生成しなくても
フォームにアクセスできる。
この場合のフォームのインスタンスは、既定のインスタンスとか呼ばれてる
>Application.RunでNewしているForm1にアクセス出来ていないからでしょうか
その通り。Newすると、既定のインスタンスじゃないインスタンスが生成されてる
Form2が呼んでるForm1はインスタンス指定がないから既定のインスタンスのForm1
Application.Run(Form1)で既定のインスタンスのForm1を表示させれば思った通りの動作

0400デフォルトの名無しさん2009/07/08(水) 22:18:24
過去のしがらみというか、オブジェクト指向がわからない人のためにVB2005になってわざわざ導入されたんだよ
VBユーザーは怒るべき
0401デフォルトの名無しさん2009/07/09(木) 00:07:02
>>396
2008は持っていないのですが、VB2005で実験してみたところ、普通に書き込みされました。

Public Class Main
  Public Form1 as new Form1
  Public Sub Main()
    Application.Run(Form1)
  End Sub
End Class
ってやってもダメだろうか。

実験その1
Public Class Main
  Public MyForm1 as new Form1
  Public Sub Main()
    Application.Run(MyForm1)
  End Sub
End Class

Public Class Form2
  Private Sub Button1_Click(略
    Form1.SetTextBox("test")
  End Sub
End Class

Form1は一緒ね。結果は、正常に?書き込み動作された。
MyForm1っていうForm1のインスタンスが、Form1って名前でアクセスできるみたい。
仕様としては嫌だなぁ。
続きます・・・


04024012009/07/09(木) 00:15:44
実験その2
Public Class Main
  Public MyForm1 as new Form1
  Public Sub Main()
    Application.Run(MyForm1)
  End Sub
End Class

Public Class Form2
  Public MyForm1_2 as new Form1
  Private Sub Button1_Click(略
    MyForm1_2.SetTextBox("test")
  End Sub
End Class

Form1は例によって一緒。
結果は、書き込みされず。
見えないMyForm2にアクセスしている模様。
ちなみにこの後
MyForm2.Show
とすると、書き込み済みで表示される。
これはまぁ普通。
もう少し続きます・・・
04034012009/07/09(木) 00:25:50
実験その2
Public Class Main
  Public MyForm1 as new Form1
  Public Sub Main()
    Application.Run(MyForm1)
  End Sub
End Class

Public Class Form2
  Public MyForm1_2 as new Form1
  Private Sub Button1_Click(略
    MyForm1_2.Show
    Form1.SetTextBox("test")
  End Sub
End Class

Form1は例によって一緒。
結果は、MyForm1のフォームに書き込みされました。
MyForm1とMyForm1_2という二つのForm1がインスタンス化されていて、
Form1という名前ではどちらか判断できないのですが、結果はそういうことで。
最初インスタンス化したClassの別名になっている?
実際の内部挙動はわかりません。

これもイケてないなぁ。
以上、長文スマソ
0404デフォルトの名無しさん2009/07/09(木) 01:01:51
↑
横槍を入れることで疑問を解消させてもらう新しい形で
質問させて頂きます。

2つめの実験(>>402)で、
どうして書き込みされたフォームが見えないのかわかりません。
MyForm2 というのは、MyForm1_2 のことですよね?

3つめの実験(>>403)は、
結局、MyForm1にはアクセスしていない、ということではないですか?

Formというクラスは、インスタンスを作らなくてもアクセスできる
Shared(静的)な要素を持っているのでしょうか。
(>>399)さんが言っていることは、
デザイナで作成するForm1には、自分自身のインスタンスをあらわす「Form1」という
要素がSharedか何かで自動的に定義される、ということなのでしょうか。
0405デフォルトの名無しさん2009/07/09(木) 02:52:21
>>400
既定のインスタンスってのは、VB6にはあった
.NETになっていったん廃止されて2005で復活らしい

>>401
>VB2005で実験してみたところ、普通に書き込みされました
手元に2005ないんで試せないが、そうだとすると、2005と2008で動作が違うといことに

実験の内容から考察するに、2005でフォームをnewすると、
1個目のインスタンスは既定のインスタンス戻してるっぽいな
2008なら1回目のnewから既定のインスタンスと別のインスタンス作ってるっぽい

>>404
二つ目の実験でMyForm1_2は、Form2の中でnewされた(Form1の)インスタンス
Application.Runされている(=表示されている)のはMainでnewされた(Form1の)インスタンス
これは明らかに別物だから>401が言うとおりまあ普通

三つ目の実験だが、
Form1.SetTextBox("test") でForm1って変数はないから、
これは既定のインスタンスに書き込みにいってる
MyForm1が書き込まれたってことは、MyForm1のnewで既定のインスタンス取得してると思われ

2008で実験その3やると、どっちのフォームにも書きこまれない
これはMyForm1もMyForm1_2も既定のインスタンスとは別のインスタンスだってことだと
04064042009/07/09(木) 05:13:06
なるほど、既定のインスタンスがどういうものなのか、よくわかった。

で、2005ではMain クラスの Main メソッドで new されて、かつ
Application.Run で使用されたフォームは、
そのフォームクラスの既定のインスタンスになるのか。
つまりこれは既定のインスタンスになるための十分条件なわけだけど、
最低限必要な条件って、上記のうちどれだろ。。。

ま、とりあえず横槍質問はこのくらいにしときます。
04073962009/07/09(木) 09:23:18
>>398-406
レスありがとうございます。

>>399
詳しい説明をありがとうございます。
Application.Run(Form1) で期待通りの動作が出来ました。

>>401
実験をありがとうございます。
VB2005 と VB2008 で動作が異なっている事が分りました。
0408デフォルトの名無しさん2009/07/09(木) 09:34:02
VB.NETはBasicの後継言語と聞いたので質問なのだが、
N88Basic にあった、Play 文はどこにいったんですか?
昔、Play文で作曲しまくっていたので、
VB.NETでもどうしてもPlay文を使いたいのです。
どうか、お願いします。
0409デフォルトの名無しさん2009/07/09(木) 09:41:35
後継言語ではありません
全くの別物です
だいたい、そういう組み込みの「〜文」などというのはVB.NETにはほとんど存在しません
.NETのライブラリにも無いのでWin32API使いましょう
04103902009/07/09(木) 09:52:38
>>394
ON/OFFを切り替える度にPCの再起動が必要になります。
これは実運用上、非現実的です。

>>395
プロセスが利用しているDLLを表示するためのコマンドラインツールですよね?
ちょっと目的とは異なるかと思うんです...

>>397
COM経由で開いているファイルの一覧を取得することができるんですか!?
ちょっと調べてみます。

環境的にはスタンドアロンの場合が多いです。
私が開発しているアプリから xls 形式でエクスポート上書き保存できない場合、
スタンドアロン環境でかつ Excel は起動していない時、ユーザは「なんで?」と
なってしまうんです。他アプリが該当の xls ファイルを掴んでいるケースが
あったりするので、ユーザに「xxx.exe でその xls が開かれていますよ。」と
通知したいんです。
0411デフォルトの名無しさん2009/07/09(木) 11:18:53
>>406
なんかちょっと勘違いしてるっぽいが
フォームの「既定のインスタンス」ってのは、そのインスタンスを保持する変数がなくても
明示的に(newで)作成しなくても存在する特殊なインスタンスのこと
普通のオブジェクトだと、保持する変数がないインスタンスはGCで回収される

明示的にnewされた普通のインスタンスが「規定」になるわけではないよ
0412デフォルトの名無しさん2009/07/09(木) 12:02:40
>>397
取得できるのは自プロセスが開いた一覧だね
0413デフォルトの名無しさん2009/07/09(木) 13:31:24
>>410
http://technet.microsoft.com/ja-jp/sysinternals/bb896653.aspx
こいつでファイル指定して開いてるプロセス検索できる

こいつがどうやってるかわからんが、同じことやれば可能なはずだ
0414デフォルトの名無しさん2009/07/09(木) 15:47:11
>>413
openfiles.exeと同じことだろ
>>410
ttp://oshiete1.goo.ne.jp/qa1652898.html
0415デフォルトの名無しさん2009/07/09(木) 16:13:00
>>414
Process Explorerは、openfiles.exeみたいに(設定変えて)再起動しなくても使えるみたいだが?
04163902009/07/09(木) 17:09:04
>>412-415
レスありがとうございます。

>>413のご指摘のようなことを自前で実装したいのですが仕組みがわからないです。

せめて Process Explorer にファイル名をパラメータで渡して結果を受け取る、みたいな
ことができれば嬉しいんですが。

エンドユーザはコンピュータに不慣れな人が多いので、なるべく必要な機能を自前で
実装してあげたいのです。

というか、このような機能の需要て少ないんでしょうかね。
.NetFramework4.0あたりで機能を実装してくれたら...ないか。


ひとまず>>414氏が提示してくれたリンクを見ながら闘ってみます。
0417デフォルトの名無しさん2009/07/09(木) 19:35:11
Dim StartQuery As New EventQuery( _
"SELECT * FROM" & _
" __InstanceCreationEvent WITHIN 1 " & _
"WHERE TargetInstance isa ""Win32_Process""")
StartWatcher = New ManagementEventWatcher(StartQuery)

AddHandler StartWatcher.EventArrived, AddressOf Me.ProcessArrived

Private Sub ProcessArrived(ByVal sender As Object, ByVal e As EventArrivedEventArgs)
msgbox("Arrived")
Me.RefreshList()
End Sub

プロセスの一覧を表示していて新規で何かが起動したら更新するというようにやってるんだけど
"Arrived"メッセージは出るけどRefreshListが呼ばれない
特にエラーも何も出ない
たぶんMeの参照先が違ってるんだろうけどこれはどうすればいいの?
0418デフォルトの名無しさん2009/07/09(木) 19:44:12
RefreshListが呼ばれないとどうやって判断したのさ
取り敢えずMsgBoxはDebug.Print辺りに置き換えてステップ実行
多分別スレッドでイベントハンドラが呼び出されてるから
0419デフォルトの名無しさん2009/07/09(木) 19:47:28
>>418
RefreshListの中にmsgboxとconsole.write両方を入れてみたけど反応なし
エラーも何も出ない
別スレッドで呼び出されてるのは分かってるwその回避方法を聞いてるのw
0420デフォルトの名無しさん2009/07/09(木) 19:52:29
だからまずステップ実行して確認しろよ
0421デフォルトの名無しさん2009/07/09(木) 19:52:53
そこまでわかってるなら
MeにContol.Invoke使ってUIスレッドでRefreshList()呼べばいいじゃん
■ このスレッドは過去ログ倉庫に格納されています