痔になりやすい生活習慣とは?

開発、コンパイル環境
VB.net 2008
ターゲットCPU:x86
Framework2.0
OS:Windows7

上記で作成したアプリで、
1、自作フォーム(Form1)をスタートアップオブジェクトに指定
2、参照設定に他社作成DLL(FormTest1含)を追加
3、Form1からFormTest1を起動

    ボタンクリックイベント
    Dim frm As New FormTest1
    frm.TopMost = True
    frm.Show()

おおむね上記のようなことを行っています。
問題は、自作アプリの起動後1回目の「FormTest1」起動だけ「Form1」の後ろに立ち上がります。
2回目以降は「Form1」の前面に立ち上がります。←これが希望しているの動作です。
実行PCはWindows7です。

散々調べたのですが解決策が見つかりませんでした。
この問題に解決策はあるのでしょうか?
どなたかご存じでしたらご教授願います。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

> Dim frm As New FormTest1


をボタンクリックイベント内でなくパブリックにしておいてメイン等で定義し、イベントの中で
frm.TopMost = True
frm.Show()
を行うではどうでしょうか。
Newが完了する前にTopMostが指定されていて最初は間に合わないような気もします。

あるいは
frm.Show(Me)
ではどうなるでしょうか。
    • good
    • 0
この回答へのお礼

>frm.Show(Me)
オーナーフォーム指定の場合はたまにうまくいかない時があります。再現性はありません。わけがわかりませんが実際そうなのでなんともトホホです。

>Newが完了する前に・・・
これは初耳ですのでこちらで調べていこうと思います。

ありがとうございました。

お礼日時:2013/07/11 08:58

FormTest1が外部DLLであることが気になっております。

おそらくこちらはいじれないと推測して回答する必要があるのでしょうね…。

---
(1)frm.TopMost = True
(2)frm.Show()

(1)(2)を逆にするとどうなりますか?

(2)frm.Show()
(1)frm.TopMost = True

---

この回答への補足

ありがとうございます。

そうです「FormTest1」はいじれません。


>(1)(2)を逆にするとどうなりますか?

同じですね。

2回目は正常にうごきます。

補足日時:2013/07/10 12:13
    • good
    • 0

解決策になるかどうか判りませんが。


FormTest1のLoadに
Me.TopMost = true
を入れる。
あるいは下記が参考になるかも。
http://dobon.net/vb/dotnet/form/ownedform.html
モードレスのフォームが、あるフォームの背後に隠れないようにする
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

QエクセルVBAのフォームを最前面にする方法を教えてください。

エクセルVBAなのですが、UserForm1を最前面に表示して、
他のどのウインドウをアクティブにしても消えない状態にしたいのですが、
どのようなコードを書けばできるでしょうか。
VB.NETで表すとMe.TopMost = Trueとなると思うのですが、
エクセルVBAだとそのような書き方はないようです。

もうしわけございませんがご教示頂きたく、お願いいたします。m(__)m

Aベストアンサー

あらかじめ、フォームのプロパティの[ShowModal]をFalseにしておいて、以下のような方法ではダメでしょうか?
画面のアクティブイベントを利用するのは、個人的に嫌いなのですが。。。


Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const HWND_TOPMOST As Long = -1
Private Const SWP_NOSIZE As Long = &H1&
Private Const SWP_NOMOVE As Long = &H2&


Private Sub UserForm_Activate()
Call SetWindowPos(GetForegroundWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Sub

あらかじめ、フォームのプロパティの[ShowModal]をFalseにしておいて、以下のような方法ではダメでしょうか?
画面のアクティブイベントを利用するのは、個人的に嫌いなのですが。。。


Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const HWND_TOPMOS...続きを読む

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。

Q【C#】 あるイベントから別イベントを呼び出す。

タイトルの通り、あるイベント内から別イベントの処理を呼び出したいと
考えています。ですが、方法がわかりません。

【質問投稿に至った経緯】
現状は、検索から一覧を表示し1つを選択、選択した内容の更新を行なうプログラムを作成しています。選択した内容を更新するところまではできました。ただ、更新内容を確認できるよう一覧画面に前回検索した内容を一覧表示させたいと考えています。この時、検索イベントを呼び出し、一覧を再表示させようと思っています。

Aベストアンサー

「検索イベント」とは、[検索]ボタンをクリックした時の
イベント処理の事でしょうか?
それならば、一覧表示処理を別ルーチンに分けて、[検索]
ボタンClickイベントと同じルーチンをCallする様にすれば
良いと思いますが?

QVB.NETで他のEXEを実行させる

VB.NETで他のEXEを実行させる以下の2つの方法が知りたいです。

1)perlのsystemのように実行完了後に制御が戻る

2)perlのexecのように実行完了後に制御が戻らない

あと、この2つの使い分けのコツ(用途)が知りたいです。

Aベストアンサー

http://jeanne.wankuma.com/tips/vb.net/process/
こちらの8番と9番をどうぞ。

使い分けですが、
実行完了を待って次の処理をする必要がある場合は、制御が戻るまで待つ、そうでないものはキックして終わり、です。

QイベントにAddHandlerされているか判断

現在VB2010にてコントロールを作成しているのですが、
外部公開しているイベントに
(コントロール利用側プログラムで)AddHandlerが
行われているかどうか判断する必要がでてしまいました。
どのようにすれば実装可能でしょうか?
よろしくお願いします。

Aベストアンサー

> Custom Eventを用いた場合、DLL呼び元側で用意するなどの処置が
> 必要になると思いますが、
> そうでは無く、コントロール側だけの実装で対応したいのですが無理でしょうか?

イベントハンドラを登録する側のコードに変化はありません。
イベントに対してAddHandlerする場合,
対象イベントがCustom Eventであろうがなかろうが同一コードになります。
# というか,おそらくMSILレベルで同一。


そして,イベントにハンドラが登録されているかどうかを調べる方法は,
イベントを実装する側で登録の有無を記録することが唯一の方法になります。
# No.2さんのリフレクションによる方法は,内部実装の変化に追従できない。

イベントへの登録の有無が必要になるのは
a. イベントを持つクラス
b. イベントハンドラを登録するクラス
c. 上記以外のクラス
のどれでしょうか。

aであればCustom Eventにして事が足ります。
 修正するのはイベントを持つクラスになります。
bであればAddHandlerのタイミングでフラグを立てれば事が足ります。
 修正するのはイベントハンドラを登録するクラスになります。
cであればCustom Eventにしてさらにプロパティで外部に登録されているかを公開することになります。
 修正するのはイベントを持つクラスとそのクラスを使うクラスになります。

ただし,最初に構成を見直すことをやはりお薦めします。
ハンドラの有無の確認は,C#でイベントを書いている場合くらいしか必要になるとは思えないので。
# C#ではRaiseEvent相当がないので,if (Event != null) Event(this, e);みたいに書かざるをえない。

> Custom Eventを用いた場合、DLL呼び元側で用意するなどの処置が
> 必要になると思いますが、
> そうでは無く、コントロール側だけの実装で対応したいのですが無理でしょうか?

イベントハンドラを登録する側のコードに変化はありません。
イベントに対してAddHandlerする場合,
対象イベントがCustom Eventであろうがなかろうが同一コードになります。
# というか,おそらくMSILレベルで同一。


そして,イベントにハンドラが登録されているかどうかを調べる方法は,
イベントを実装する側で登録の有無を記録...続きを読む

Q日付型のフィールドに空白を入れる方法を教えてください

ASP(VBScript)でSQLサーバにINSET INTO文を使ってデータを格納しているのですが、日付の部分がNULLの時、「1900/1/1」が入ってしまいます。
そのまま、空白を入れる方法はどうやったらよろしいのでしょうか?

TABLE1の内容は
番号|内容|日付です。

INSERT INTO TABLE1 VALUES ( 1, 'あいう', '')

結果
1|あいう|1900/1/1

Aベストアンサー

あとは、プログラムの書き方次第ですね、、、


If hensu=Null Or hensu="" Then
dt = "NULL"
Else
dt = "'" & hensu & "'"
End IF

E_SQL = "INSERT INTO TABLE1 VALUES & _
"( 1,'あいう', " & dt& ")"
の様に書きます。

Q上下の位置揃えについて

オブジェクトの TEXTやLABELで文字を左揃え、中央揃え、右揃えはALIGNMENTプロパティを指定しますが、上下の位置指定はどのようにすれば良いか教えてください。
いつも上揃えになってしまいます。
よろしくお願いします。

Aベストアンサー

色つきのラベルなのに文字位置が上詰で気になる!っていうときは
姑息な手段ですが、背景を透明に設定したラベルを
上に重ねると好きな位置に文字を表示できます。
テキストボックスの場合は下のテキストボックスを
Enable = Falseにしておき、上に重ねる方を
フラットにして実線を消しておくとそれらしくなります。
でもオブジェクトがたくさんあるとめんどくさいですよね…

QVBからBATファイルを起動して戻り値の取得方法

VBからBATファイルを起動して戻り値(エラーコード)を
もらうにはどうすれば良いのでしょうか?
WshShellという関数を使用することは、何となく分かるのですが
宜しければサンプルを教えていただけないでしょうか?

Aベストアンサー

>WScript.CreateObjectの
>ところで"オブジェクトが必要です"となってしまいます。

VBのときは、CreateObjectですね。

Qディスプレイ解像度より大きなフォームをデザインしたいのですが

Visual Studio.NET 2003のVB.NETでWindowsアプリケーションの開発を行っています(OSはWindowsXP Pro SP2)。

解像度が1280x1024や1024x768の液晶ディスプレイで開発をする際に、ディスプレイの解像度より大きなサイズのフォームを作ろうとしても、強制的に解像度付近のサイズにSizeプロパティが変更されてしまいます。

たとえば、1280x1024の17インチ液晶で、1600x1200のフォームを作ろうとしてデザイン画面からSizeプロパティのWidth、Heightを変更しても、プロパティ記入欄からフォーカスが移動したとたんに、幅と高さが1292x1036に変更されてしまいます。

ディスプレイを買えばすむ話なんですが、できれば買い換え無しで対処したいところです。どなたか回避策(小さいディスプレイでも大きなフォームをデザインできるようにする方法)をご存じないでしょうか?

Aベストアンサー

サブクラス化

WM_GETMINMAXINFOを認識

lParamをMINMAXINFO構造体の変数に収めptMaxTrackSizeを変更する

http://www.vbvbvb.com/jp/gtips/0801/gSetWindowLongGwlWndProcWmGetMinMaxInfoPtMaxTrackSize.html


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング