DOBON.NET DOBON.NETプログラミング掲示板過去ログ

いろいろわからないこと

環境/言語:[OS:WindowsXP, CPU:Celeron766MHz, HDD:40GB, RAM:192MB, .NET Framework1.1, VB.NET]
分類:[.NET]

はじめましてNezumiと申します。初めての投稿ですがよろしくお願いします
.NETプログラミングを始めてからこのページを色々参考にさせていただきました。ありがとうございます

ところで質問なのですが、このページの.NET Tipsのファイル操作を参考にしてファイルの一覧を呼び出そうとして、ドライぶのルートを選択すると、なぜかEXEファイルのある場所のファイルが出てしまいます。それ以外の場所だと正常に表示されるのですが、これはどうしたら直るでしょうか?

もうひとつ、2つのForm間でひとつのFormからもうひとつのForm内のイベントを発生させることはできないのでしょうか?
Dim frm as New Form1
frm.Button1_Click()
などのようにするとエラーは出ないのですが実効されませんでした
またcall frm.Button1_Click()でも無理でした。何か良い方法があれば教えてください。

それと.NETでつくったアプリをなんとか軽くすることはできないのでしょうか?
私の環境ではメモリを45MBも使ってしまい、メモリ不足でIEのメニューの表示が変になったりしてしまいます(RAM192Mはキツイですねぇ(笑))



以上 どなたかわかる方いましたらぜひ教えてください。
よろしくお願いします。
こんばんは、Nezumiさん。ピラルクです。

> なぜかEXEファイルのある場所のファイルが出てしまいます。
> それ以外の場所だと正常に表示されるのですが、これはどう
> したら直るでしょうか?

.NET Tipsというのはコレでしょうか?

▼「ファイルを開く」ダイアログボックスを表示する
http://dobon.net/vb/dotnet/form/openfiledialog.html

私の方ではちゃんとルートが出ますが。。。
ofd.InitialDirectory = "C"
とかしてません?

> もうひとつ、2つのForm間でひとつのFormからもうひとつの
> Form内のイベントを発生させることはできないのでしょうか?

VB6以前では、Form1は(暗黙の)インスタンスでもあり、
かつクラスでもあるという特殊な識別子だったので、
この辺の経験が逆に災いし、VB.NETではForm間連携に
まつわる疑問を投げかける方が多いように感じています。

基本的には.NETで開発するならオブジェクト指向言語と
いうものを理解するように努めるのが必修ですが、手軽
なGUIツールをサクッと作るのが目的なので、とりあえず
今はそこを避けて通りたいというような場合には、以下
のような手法が効果的ではないかと思います。

Public Class Form1
    Inherits System.Windows.Forms.Form

  'VB6ライクな暗黙のインスタンスへのアクセッサを作る
  '(Sub Main()から起動の場合はApplication.Run(Form1.GetInstance))
  Private Shared s_Me As Form1 = Nothing
  Friend Shared ReadOnly Property GetInstance()
    Get
      If s_Me Is Nothing Then
        Return New Form1()
      Else
        Return s_Me
      End If
    End Get
  End Property

  'NewをPrivateにして一応シングルトンにする
  Private Sub New()
    ……

    '暗黙のインスタンスに設定
    Form1.s_Me = Me
  End Sub

  Private Sub Form1_Closed( _
    ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles MyBase.Closed
    '暗黙のインスタンスを開放
    Form1.s_Me = Nothing
  End Sub

  'Button1_ClickのアクセシビリティをPublicにする
  Public Sub Button1_Click( _
    ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles Button1.Click
    MessageBox.Show("Form1.Button1_Click called !!")
  End Sub

これで、Form2からは、

  Private Sub Button1_Click( _
    ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles Button1.Click
    Form1.GetInstance.Button1_Click(sender, e)
  End Sub

というように呼び出せます。

> Dim frm as New Form1
> frm.Button1_Click()

このようなForm連携は、Formの既存のインスタンス或いは
デリゲートを何らかの手段で相手側に渡す必要があります。
上記コードでは、新たな別のインスタンスを生成している
のでNGです。

> それと.NETでつくったアプリをなんとか軽くすることは
> できないのでしょうか?

XPで196Mなら仕方ないかも。
▼ネイティブ イメージ ジェネレータ (Ngen.exe)
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cptools/html/cpgrfnativeimagegeneratorngenexe.asp
は、起動時間短縮を狙った(あまり期待できない)ツール(^^;
ですが、ロースペックならメモリリソース面でも効果が
あるかもしれないので、一度試されてみては?
早速のレスありがとうございます

> .NET Tipsというのはコレでしょうか?
>
> ▼「ファイルを開く」ダイアログボックスを表示する
> http://dobon.net/vb/dotnet/form/openfiledialog.html
ごめんなさい 書き方が悪かったようです
http://dobon.net/vb/dotnet/file/getfiles.html
これです


> VB6以前では、Form1は(暗黙の)インスタンスでもあり、
> かつクラスでもあるという特殊な識別子だったので、
> この辺の経験が逆に災いし、VB.NETではForm間連携に
> まつわる疑問を投げかける方が多いように感じています。
>
> 基本的には.NETで開発するならオブジェクト指向言語と
> いうものを理解するように努めるのが必修ですが、手軽
> なGUIツールをサクッと作るのが目的なので、とりあえず
> 今はそこを避けて通りたいというような場合には、以下
> のような手法が効果的ではないかと思います。
>
> Public Class Form1
> Inherits System.Windows.Forms.Form
>
> 'VB6ライクな暗黙のインスタンスへのアクセッサを作る
> '(Sub Main()から起動の場合はApplication.Run(Form1.GetInstance))
> Private Shared s_Me As Form1 = Nothing
> Friend Shared ReadOnly Property GetInstance()
> Get
> If s_Me Is Nothing Then
> Return New Form1()
> Else
> Return s_Me
> End If
> End Get
> End Property
>
> 'NewをPrivateにして一応シングルトンにする
> Private Sub New()
> ……
>
> '暗黙のインスタンスに設定
> Form1.s_Me = Me
> End Sub
>
> Private Sub Form1_Closed( _
> ByVal sender As Object, ByVal e As System.EventArgs) _
> Handles MyBase.Closed
> '暗黙のインスタンスを開放
> Form1.s_Me = Nothing
> End Sub
>
> 'Button1_ClickのアクセシビリティをPublicにする
> Public Sub Button1_Click( _
> ByVal sender As System.Object, ByVal e As System.EventArgs) _
> Handles Button1.Click
> MessageBox.Show("Form1.Button1_Click called !!")
> End Sub
>
> これで、Form2からは、
>
> Private Sub Button1_Click( _
> ByVal sender As System.Object, ByVal e As System.EventArgs) _
> Handles Button1.Click
> Form1.GetInstance.Button1_Click(sender, e)
> End Sub
>
> というように呼び出せます。
>
>>Dim frm as New Form1
>>frm.Button1_Click()
>
> このようなForm連携は、Formの既存のインスタンス或いは
> デリゲートを何らかの手段で相手側に渡す必要があります。
> 上記コードでは、新たな別のインスタンスを生成している
> のでNGです。
ありがとうございました。なんとかできました


> XPで196Mなら仕方ないかも。
> ▼ネイティブ イメージ ジェネレータ (Ngen.exe)
> http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cptools/html/cpgrfnativeimagegeneratorngenexe.asp
> は、起動時間短縮を狙った(あまり期待できない)ツール(^^;
> ですが、ロースペックならメモリリソース面でも効果が
> あるかもしれないので、一度試されてみては?
試してみたのですが、コンパイルエラーが出てコンパイルできませんでした。少しこのことについて勉強してから配布するときにやってみます
こんばんは、Nezumiさん。ピラルクです。

> http://dobon.net/vb/dotnet/file/getfiles.html
> これです

んー、ちゃんと取れましたが。
(Framework1.0ですが、1.1でもこんな基本的なとこがデグってる
とは思えないし)
どういうコードなんでしょうか?


訂正:
>> Friend Shared ReadOnly Property GetInstance()

プロパティだからGetは余計でした。
せっかく教えていただいたところごめんなさい
先日メインPCのただでも少ないメモリが逝ってしまい、.NETをうごかすどころかOSの起動に20分以上かかる状態になってしまいました。(128+64=192MBだったのですが128Mのメモリが逝ってしまいました(泣))
いまはなんとか秋葉で¥1000で買ったジャンクノートパソコンで書き込んでいます。(OS:Windows98, CPU:? 75MHz, RAM:20MB)←あたりまえですが.NET動きません

ほんご後迷惑おかけしてすみませんでした

DOBON.NET | プログラミング道 | プログラミング掲示板