VB.NET質問スレ (Part12)

このエントリーをはてなブックマークに追加
928デフォルトの名無しさん:2005/11/08(火) 21:28:55
C#でいうところの using() {} のように 自動でIDisposable させる為の
構文はVB.NETにありますか?
929デフォルトの名無しさん:2005/11/08(火) 21:30:07
enabled=false
つーかラベルをどういじるの?
930デフォルトの名無しさん:2005/11/08(火) 21:32:31
なんつうか、グレー表示にならんかな
931デフォルトの名無しさん:2005/11/08(火) 21:33:09
>>929
えーと、これチェックしたらコレ使えるで、みたいな雰囲気を出しときたい
932デフォルトの名無しさん:2005/11/08(火) 21:37:23
自分でコントロール作ればいいんだよ。
ラベルなりなんなり継承して。
そんなの三分もあれば出来るよマジで。
933デフォルトの名無しさん:2005/11/08(火) 21:47:14
windows.formsなアプリで、起動直後に設定ファイルの有無の判断を行ない、
設定ファイルがある場合フォーム(A)を表示、なければ設定用のフォーム(B)
を表示といったアプリケーションを作りたいと思っています。

この時、A.exeを起動して設定ファイルのチェックをし A.exe のフォームを
表示せずにB.DLLを表示させられなくてつまづいています。
A.exeのフォームが必ずでてしまいます。

A.exe を起動しつつ、A.exeのフォームを表示したくない場合には
どのようにすべきでしょう?
934デフォルトの名無しさん:2005/11/08(火) 21:51:38
>>928
現在無し。2005から。
935デフォルトの名無しさん:2005/11/08(火) 22:02:53
モジュール作ってプログラムのプロパティのスタートアップの設定で
そのモジュールにする
で、そのモジュール(のmain)でApplication.Run(_form1)の前にForm2.Showdialogかな?
936デフォルトの名無しさん:2005/11/08(火) 22:03:34
>>933
適当なクラスにMainって共有メソッドを作って
そいつをプロジェクトのスタートアップにすべし。
っていうか、こんなのドトネトのTips紹介してるサイトをちょっと巡れば
調べがつくでしょ。
937933:2005/11/08(火) 22:06:53
ありがとうございます。
自分で Main メソッドを作ればいけるんですね。
助かりました。
938デフォルトの名無しさん:2005/11/08(火) 23:16:16
オプション画面を作る時、左側のツリー選択で右側の画面を切り替える場合は、新しいフォームのインスタンスを作って右側だけに呼び出すという形でいいのでしょうか?
それとも、もっと一般的な形があるんでしょうか?
939デフォルトの名無しさん:2005/11/09(水) 00:08:57
>>938
Formを普通のコントロールにして右にLoad

TopLevelだっけかな?
940デフォルトの名無しさん:2005/11/09(水) 00:10:23
ナンノコチャw
941デフォルトの名無しさん:2005/11/09(水) 00:15:10
TopLevel = FalseにしないとForm内にFormを追加できねぇ
942904:2005/11/09(水) 12:10:31
1つのソースで完結する(ビルドできる)ソースファイル2つを
1つの実行ファイルにまとめたい(ソース1でソース2に記述したクラスを
呼び出す?)のですがMSDN見てもやり方がまったくわかりません

実際こういうことは不可能でソース2を解体してソース1に組み込まないとだめなのでしょうか?
943904:2005/11/09(水) 14:10:58
>>942は解決できました
ありがとうございました
944デフォルトの名無しさん:2005/11/09(水) 16:21:38
今日VB.NET始めたばっかですが質問させてください
テキストボックスに入力した値を変数xに入れて
別の変数nを10のx乗させて変数yに格納したいんですが
Dim y As Double = n * E(x)
これだとだめでした
どうしたらいいんでしょうか^^;
945デフォルトの名無しさん:2005/11/09(水) 17:03:23
べき乗するなら
^
を使う
10^2 は 10の2乗^^
946デフォルトの名無しさん:2005/11/09(水) 17:15:50
E(x)って書くと、「xを引数として関数Eをコールする」か「配列Eのインデックスx番の値」って意味になっちゃう。

階乗演算子は ^
10のx乗は 10^x

変数nを10のx乗するってのは意味がわからんけど、察するに以下のようにすればいいと思う。
Dim y As Double = n * (10^x)
947944:2005/11/09(水) 17:44:30
>>945-946
できました!
ありがとうございます^^
948デフォルトの名無しさん:2005/11/09(水) 19:56:38
ファイル→新規作成→プロジェクト→新しいプロジェクト→OK
とすると「オブジェクトでサポートされていないプロパティまたはメソッドです。」
と出て、新しく始める事ができません。
どうか、解決策を教えてください。
949デフォルトの名無しさん:2005/11/09(水) 20:16:06
開発環境を入れ直せ。
950デフォルトの名無しさん:2005/11/09(水) 20:37:23
>>949
ありがとうございます。さっそく、やってみます。
951デフォルトの名無しさん:2005/11/09(水) 20:47:01
>>938
PanelかUserControlを派生させて、そこにそれぞれの画面を作る。
Formにそれぞれを重なるように配置して、表示するのを変えるにはそのコントロールをBringToFrontする。
952948:2005/11/09(水) 21:23:14
探したのですが、どこで開発環境の変更をするかわかりません。
誰か、教えてください。
953デフォルトの名無しさん:2005/11/09(水) 21:26:12
変更って何?
954948:2005/11/09(水) 21:28:43
間違えました。入れ直す、でした。
955デフォルトの名無しさん:2005/11/09(水) 22:33:41
vb.net で作成した DLL(Windows.Forms) を、参照設定する事なく、
インスタンスの生成を行ないたいのですが(フォームの表示をさせたい)
実現させる方法はありますか?

956デフォルトの名無しさん:2005/11/09(水) 22:38:20
System.Reflection.Assembly.LoadFromでアセンブリをロードして、
そのAssemblyでGetTypeして型情報を取得、
System.Activator.CreateInstanceでその型のインスタンスを作成。
957デフォルトの名無しさん:2005/11/09(水) 23:02:51
ありがとうございます。

GetType する時にクラス名がわかっていないといけないようですが、
クラス名がわからなくてもアセンブリのインスタンスを生成する
なんて事はできないでしょうか?

958デフォルトの名無しさん:2005/11/09(水) 23:11:48
型名も分からないのにインスタンスを作るってのもなかなか有り得ないと思うが……。
Assembly.GetTypesでType配列を取得して、それぞれBaseTypeを遡っていって調べてみるとか。

> アセンブリのインスタンスを生成する
これは意味不明だ。
959デフォルトの名無しさん:2005/11/10(木) 07:48:54
>>952
VisualStudioをアンインストールして
もう一度インストールする
960デフォルトの名無しさん:2005/11/10(木) 09:38:57
あるDBのマスタテーブルからデータを読み込む(書き込む機能は不要)クラスを作るとした時。
このデータの読み込むタイミングは以下のどちらが一般的でしょうか?

・コンストラクタでマスタのCodeを渡して読み込む
・コンストラクタでは何もせず、DataRead(Code)のようなメソッドを持ちそこで読み込む

上司に「コンストラクタは初期化なんだから何もせず、読み込むメソッドを持った方がいい」と指摘をうけたのですがどうなんでしょう。
なんか「初期化」の意味を取り違えてるような気がしないでもないのですが・・・
作る側としては読み込むメソッドを持つと、使う側で呼び忘れてエラーの元になってしまうと思ったので
コンストラクタで読み込んでしまうような作り方をしていました。
961デフォルトの名無しさん:2005/11/10(木) 09:45:39
一般的にはその上司の言が正しい。
特に処理が重くなる場合はコンストラクタに実装するのは避けるべき。
962デフォルトの名無しさん:2005/11/10(木) 12:27:53
ケースバイケースだろうけど俺は>>960の設計の方をむしろ推すね。
要するに読み込みを非同期にすりゃいいだけでしょ?
客から注文もらってから問屋に注文だすような店なら最初からイラネ。
963デフォルトの名無しさん:2005/11/10(木) 12:58:49
コンストラクタではまず重い処理はやるべきではない。
次に、どっちにも対応すればいいんだから・・・。

上司コンストラクタ − インスタンス生成だけ
>>960コンストラクタ − 生成して検索関数呼ぶ
検索ぱぶりっく関数 − 検索実行

面子潰さず、自分の意見通しつつ。
964デフォルトの名無しさん:2005/11/10(木) 16:32:06
textboxコントロールがフォーカスを受け取った時にコントロールの
背景色を変えようと思っているのですが、
フォーカスを受け取ったイベントとして、
Enter を使うべきか、GotFocus を使うべきか、どちらを
使うべきでしょうか?
965デフォルトの名無しさん:2005/11/10(木) 16:39:18
Enterを使うべきだとあちこちに書かれてると思うんだが。
GotFocus使ったらフォームをアクティブにしたときも発生したりするぞ。
966デフォルトの名無しさん:2005/11/10(木) 17:09:41
VB.NETのIF文で最初の条件がFALSEの場合2番目以降の比較は行なわないように
記述する方法はありますか?
dim x as boolean = false
dim y as boolean = true
if(x and y = nothing) then
の場合、xがFALSEなのでyの値が何であっても条件に該当しないので
このように最初の条件がFALSEになった場合、それ以降の条件判断を
して欲しくないのですが。IF文を2つにわけるしかないでしょうか?
よろしくお願いします。
967デフォルトの名無しさん:2005/11/10(木) 17:15:09
AndAlso
ちょっとはリファレンス見ようぜ
968960:2005/11/10(木) 17:48:52
>>961
>>962
>>963
レス感謝です。

「コンストラクタには重い処理を書くべきではない」ってのを今日まで知りませんでした。
1万件のレコードを、960に書いた2通りの方法でそれぞれ試してみましたが時間的な差は無かったです。
なにか実感できるようなサンプルってありますか?
969デフォルトの名無しさん:2005/11/10(木) 18:02:03
厳密にはデバッグできなくなるって理由でないの?>コンストラクタに書かない
970デフォルトの名無しさん:2005/11/10(木) 18:29:26
>>968
>「コンストラクタには重い処理を書くべきではない」ってのを今日まで知りませんでした
単に961の俺様ルールだと思うよそれ。
だってそんなルールに何の合理性のないじゃん。
すくなくとも無条件にいつでも合理的とはいえないよ。

というか、重いなら単に非同期で処理すればいいだけの話で
どうせ必須の引数なら最初から受け取っておく、必須の処理なら最初からやっておく
これが普通の考え方でしょう。
もちろん「特に理由がない限りにおいては」ね。
971デフォルトの名無しさん:2005/11/10(木) 18:35:08
つ コンストラクタの使用方法のガイドライン
972デフォルトの名無しさん:2005/11/11(金) 01:03:50
Cで作った xxx.dll 中の

typedef struct {
  int a;
  int b[50];
} X;
int test(X *z) {}

な関数を、VBで、

Structure X
  Dim a As Integer
  Dim b(50) As Integer
End Structure
Declare Function test Lib "xxx.dll" (ByRef z As X) As Integer

として使おうとしたのですが、VBでは構造体に固定長配列が使えないらしく、
エラーが出てしまいます。
構造体の中では b() だけ宣言して後でReDim b(50) しても、
アドレス的に a に連続しないのか、test を呼び出したときに落ちます。
どうしたらいいでしょうか。
973デフォルトの名無しさん:2005/11/11(金) 03:50:01
C#.NETでは書けて、VB.NETで書けないものってありますか?
974デフォルトの名無しさん:2005/11/11(金) 04:40:09
>>972
Imports System.Runtime.InteropServices 'コードの先頭で宣言

<MarshalAs(UnmanagedType.ByValArray, SizeConst:=50)> _
Dim b() As Integer

>>973
VB2005で可能になるけど、カスタムイベント、演算子のオーバーロード、XMLドキュメントあたり。
975デフォルトの名無しさん:2005/11/11(金) 09:27:36
つうか、コンストラクタで非同期処理なんてしてほしくないよな。
976デフォルトの名無しさん:2005/11/11(金) 12:58:19
>>973
unsafe コード
977デフォルトの名無しさん
質問です。

データグリッドで、1つのセルに文字を打ったとき、
打たれた文字を判別することはできますか?

データベースと連携させていて、aと打たれたらaから始まるコード(商品コードなど)を
そのセルの部分でコンボボックスで表示させたいのですが。