C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: DLL内の変数を全てのフォームで使いたい


(過去ログ 87 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■51910 / inTopicNo.1)  DLL内の変数を全てのフォームで使いたい
  
□投稿者/ 田中さん (1回)-(2010/07/26(Mon) 12:01:24)

分類:[C#] 

VisauStudio2008のC#でプログラムをしています。

帳票処理のデータベース関連の部分を、C#のDLL化して使うプログラムを作っています。

namespace DataAcc
{
    public class dbfunc
    {
        public MYSTRUCT dbdata;
        public bool Initializ();
    }
}
DLLは以上のように実装しました。
Initializ()を実行すれば、指定したデータからデータを取ってきて、dbdataに格納します。

これをFormで使用するのですが、
複数のフォームで、値取得後のdbdataを使いたいのですが、その方法が分からず困っています。

フォームでの実装は以下のようにしました。
using DataAcc;
namespace Test1
{
    public partial class Form1 : Form
    {
        dbfunc mydll = new dbfunc();
        public Form1()
        {
            InitializeComponent();
            mydll.Initializ();
        }
    }
}

この方法ではForm1ではdbdataは使えますが、他のフォームからアクセスできません。

C++での、グローバルでクラスファイルを実体化するように使いたいのですが
どのようにしたら良いのでしょうか?

引用返信 編集キー/
■51913 / inTopicNo.2)  Re[1]: DLL内の変数を全てのフォームで使いたい
□投稿者/ おのでら (16回)-(2010/07/26(Mon) 12:19:46)
おのでら さんの Web サイト
田中さんこんにちは、おのでらです。

他のフォームからもアクセスしたいということであれば、Form1 に dbfunc を持たせる乗せはなく、アプリケーション全体からアクセスできるクラスをひとつ作り、そこに持たせた方がいいと思います。

クラスは static なりシングルトンなりで実装でしょうか。
引用返信 編集キー/
■51929 / inTopicNo.3)  Re[2]: DLL内の変数を全てのフォームで使いたい
□投稿者/ 田中さん (2回)-(2010/07/26(Mon) 18:52:58)
2010/07/26(Mon) 19:03:42 編集(投稿者)
2010/07/26(Mon) 19:03:28 編集(投稿者)

<pre><pre>おのでらさん、こんちわ。
シングルトンを検索して、参考コードを見ながら修正しました。

//DLL部分は変更無し

//どこからでも見えるシングルトンクラスの実装
using DataAcc;
namespace Test
{
  public class Singleton
  {
    private static Singleton singletn = new Singlton(); 
    public static dbfunc dbdll;

    private Singleton()
    {
      dbdll = new dbfunc();
    }
  }
}

//フォーム部分
namespace Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Singleton.dbdll.Initialize();
        }
    }
}


確かに上記の記述でエラーは無くなりましたが、自分でもちょっと自信が無いので
このような記述で大丈夫でしょうか?</pre></pre>

引用返信 編集キー/
■51940 / inTopicNo.4)  Re[3]: DLL内の変数を全てのフォームで使いたい
□投稿者/ すなふきぬ (19回)-(2010/07/27(Tue) 00:24:09)
2010/07/27(Tue) 00:25:10 編集(投稿者)
No51929 (田中さん さん) に返信
> 2010/07/26(Mon) 19:03:42 編集(投稿者)
> 2010/07/26(Mon) 19:03:28 編集(投稿者)
> 
> <pre><pre>おのでらさん、こんちわ。
> シングルトンを検索して、参考コードを見ながら修正しました。
 
> 確かに上記の記述でエラーは無くなりましたが、自分でもちょっと自信が無いので
> このような記述で大丈夫でしょうか?

Singletonの実装は個人で違うと思いますが、私の場合はこんな感じで実装しています。
dbfuncのインスタンスはpublicでも良いとは思いますが、外部から代入されたりは嫌なのでこんな感じですかね。


[DefaultProperty("GetInstance")]
public class Singleton
{
    private static Singleton _instance = new Singleton();

    /// <summary>コンストラクタ(生成不可)</summary>
    private Singleton()
    {
        _dbdll = new dbfunc();
    }

    /// <summary>インスタンス生成</summary>
    public static Singleton GetInstance
    {
        get
        {
            if (_instance == null) _instance = new Singleton();
                return _instance;
        }
    }

    private static dbfunc _dbdll;

    public static dbfunc dbdll
    {
        get { return _dbdll; }
    }
}

あと、dbdll.Initialize()の処理がインスタンスに対して、1度だけならコンストラクタ内に記述します。

#図表モードに修正

引用返信 編集キー/
■51942 / inTopicNo.5)  Re[4]: DLL内の変数を全てのフォームで使いたい
□投稿者/ 田中さん (3回)-(2010/07/27(Tue) 06:05:25)
すなふきぬさん こんちわ。

返事ありがとうございます。
コードを参考にさせてもらいました。

GetInstanceの関数は、参考にしてたサイトでも作ってたので、必要みたいですね。
そのあたりを付け加えて修正します。

解決済み
引用返信 編集キー/
■51953 / inTopicNo.6)  Re[4]: DLL内の変数を全てのフォームで使いたい
□投稿者/ 魔界の仮面弁士 (1720回)-(2010/07/27(Tue) 10:28:51)
No51910 (田中さん さん) に返信
> public bool Initializ();
本来のスペルは、Initialize メソッドですよね。末尾 e が抜けています。


No51940 (すなふきぬ さん) に返信
> Singletonの実装は個人で違うと思いますが、

私の場合は、sealed な「static class とする」パターンか、もしくは
http://www.microsoft.com/japan/msdn/practices/type/Patterns/enterprise/ImpSingletonInCsharp.aspx
の最後のパターン(マルチスレッド シングルトンの項)で実装する事が多いです。

# VB の場合は volatile も static class も無いので、微妙に実装方法が異なりますが。


> 私の場合はこんな感じで実装しています。

その実装だと、GetInstance の出番が無いと思います。
(Singleton インスタンスには、public なインスタンスメンバーがありませんから)

恐らくは、外部から dbfunc を扱う場合に、
 dbfunc foo = Singleton.GetInstance.dbdll;
という利用方法を想定されたものだと思いますが、提示されたコードでは
 dbfunc foo = Singleton.dbdll;
としか記述できませんよね。


> [DefaultProperty("GetInstance")]
プロパティ名に動詞句を付ける事はお奨めしません。
GetInstance という名前付けの場合、一般的にはメソッドが連想されると思います。

# Singleton というクラス名への突っ込みは、本題では無いので保留。
引用返信 編集キー/
■51978 / inTopicNo.7)  Re[5]: DLL内の変数を全てのフォームで使いたい
□投稿者/ すなふきぬ (21回)-(2010/07/27(Tue) 21:07:31)
No51953 (魔界の仮面弁士 さん) に返信
> ■No51940 (すなふきぬ さん) に返信
> 私の場合は、sealed な「static class とする」パターンか、もしくは
> http://www.microsoft.com/japan/msdn/practices/type/Patterns/enterprise/ImpSingletonInCsharp.aspx
> の最後のパターン(マルチスレッド シングルトンの項)で実装する事が多いです。

確かに、sealedなstaticが良いですね。上記の資料はまだ見ていなかったのでとても参考になりました。


> その実装だと、GetInstance の出番が無いと思います。
> (Singleton インスタンスには、public なインスタンスメンバーがありませんから)
>
> 恐らくは、外部から dbfunc を扱う場合に、
>  dbfunc foo = Singleton.GetInstance.dbdll;
> という利用方法を想定されたものだと思いますが、提示されたコードでは
>  dbfunc foo = Singleton.dbdll;
> としか記述できませんよね。
>
>>[DefaultProperty("GetInstance")]
> プロパティ名に動詞句を付ける事はお奨めしません。
> GetInstance という名前付けの場合、一般的にはメソッドが連想されると思います。

これも名前に不備がありました。名詞の方が適切ですね。
GetInstanceはDefaultPropertyで指定しているので、このような書き方にしていました。
少人数で開発する機会が多いので、この辺の作りは惰性で使いまわしていました。

スレ主が解決済みのチェックをされていたので、チェックさせて頂きます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -