C♯, C#相談室 Part35
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/11/03(金) 03:07:45前スレ
C♯, C#相談室 Part34
http://pc8.2ch.net/test/read.cgi/tech/1157549657/
過去スレは>>2-5あたり。
※スレタイに「#」を入れても消えちゃうので新スレ立てる人は要注意だ。
0669デフォルトの名無しさん
2006/11/29(水) 15:51:22サルベージする
0670デフォルトの名無しさん
2006/11/29(水) 15:53:34http://dobon.net/vb/dotnet/programing/storeappsettings.html
上のサイトで紹介されているアプリケーションの設定を保持するクラスを、”俺”ライブラリに追加しようとして難儀しています。
各々の静的メソッドとシングルトンであることを基本クラスで定義しておき、これを継承するクラスでシリアライズするプロパティを追加したいのです。
試行錯誤してみましたが、「静的メソッドとシングルトンであること」を基本クラスでうまく定義できなくて行き詰っています。
最近ようやくOOPを意識しはじめたので的外れな質問かもしれませんが、指針についてアドバイス頂ければと思います。
0671デフォルトの名無しさん
2006/11/29(水) 16:37:53その時点で破綻してないか?
0672デフォルトの名無しさん
2006/11/29(水) 17:07:36Orz
恥の書き捨てで伺いますが、それなら継承後のクラスをシングルトンにするのは如何なものなのでしょうか。
でも、それだと当初の目論見から外れてめんどうになりそうだなぁ。
0673デフォルトの名無しさん
2006/11/29(水) 17:14:28その程度のシングルトンなら
class MyClass {
static MyClass _cur = new MyClass();
static public MyClass Current {
get { return _cur; }
}
}
でいいんじゃないか?
何のためにがやりたいのか日本語で普通に説明してみて。
0674デフォルトの名無しさん
2006/11/29(水) 17:27:33>>670のURLを参考に、「アプリの設定を保持するためのクラス」を作りました。
シリアライズしたいオブジェクトをプロパティに持たせて使います。
シングルトンなのは「設定が複数できるとマズいから」です。
それを使ってみて便利だったので、シリアライズ用のメソッドと、保存する値を書き込むプロパティを別個のクラスにしたいなと思いました。
ここまで書いておもったのだけど、シリアライズ用のメソッドがstaticである必要は特に無いのかもしれません。
派生したオブジェクトについてはインスタンスが複数できるとマズいけど、>>673で頂いたような手法で良いのかも…。
検討してみまふ。どうもありがとうございました。
0675デフォルトの名無しさん
2006/11/29(水) 17:42:300676デフォルトの名無しさん
2006/11/29(水) 18:53:41VSってRTFでコピーできるんだね。
色がついてて驚いた。
0677664
2006/11/29(水) 20:46:21今まで俺Setting的 Singleton 使ってたけど、
.NET Framework 2.0 での System.Configuration.ApplicationSetting が用意されてるから
わざわざ自分でつくるのは、すでに「車輪の再発明」的かな、と思ったです。
Settings.cs のコンストラクタに、this.Upgrade() 入れておけば
バージョンアップの際、結構自動で管理してくれるみたいだし。
ただ、デフォルトの LocalFileSettingsProvider がタコだなーと
バージョンアップした時の、以前の user.config の扱い次第では
自分で Provider 実装か、LocalFileSettingProvider か、
そこまではよくわかってません。
ttp://msdn2.microsoft.com/ja-jp/library/ms181001(vs.80).aspx
# Mono を意識するなら、現時点では
# 俺Setting になるから、これがベストかどうかはわからない
0679645
2006/11/29(水) 21:17:51レスが遅れて申し訳ありません。補完して頂き大変参考になりました。m(_ _)m
自分は2003なので、多少修正したのと返すクラスがシングルトンでもOKなように
改造しました。一応載せますです。
public interface IHoge
{
void ShowMessage(string str);
}
public interface IHogeFactory
{
IHoge CreateInstance();
}
public sealed class HogeCatalog
{
private static Hashtable catalog = new Hashtable();
public static IHoge CreateInstance( string key )
{
return ((IHogeFactory)catalog[key]).CreateInstance();
}
public static void Register( string key, IHogeFactory factory )
{
catalog[key] = factory;
}
private HogeCatalog(){}
}
0680645(続き)
2006/11/29(水) 21:18:15{
public static void Register() { HogeCatalog.Register( "A", new HogeFactoryA()); }
public IHoge CreateInstance() { return HogeA.CreateInstance(); }
private HogeFactoryA(){}
}
sealed class HogeA: IHoge
{
private static HogeA myclass = new HogeA();
public void ShowMessage(string str)
{
Console.WriteLine(str);
}
public static HogeA CreateInstance()
{
return myclass;
}
private HogeA(){}
}
[STAThread]
static void Main()
{
HogeFactoryA.Register();
IHoge hoge = HogeCatalog.CreateInstance("A");
hoge.ShowMessage("ぬるぽ");
}
0681デフォルトの名無しさん
2006/11/30(木) 00:37:44これってEclipseのような自動インポート機能ってないのでしょうか?
いちいち
using
を自分で書いていかなきゃだめっすか?
0682デフォルトの名無しさん
2006/11/30(木) 00:54:320683デフォルトの名無しさん
2006/11/30(木) 00:54:540684デフォルトの名無しさん
2006/11/30(木) 01:18:32Ctrl+スペース
0685デフォルトの名無しさん
2006/11/30(木) 01:23:01それだと
using
追加知れくれませんでした。
eclipseなら追加してくれるんだけど・・。
0686デフォルトの名無しさん
2006/11/30(木) 01:34:430687デフォルトの名無しさん
2006/11/30(木) 02:00:34最初に使うときに型名を明示的に書かせてusingに追加させるスタイルなんだね
0688デフォルトの名無しさん
2006/11/30(木) 08:44:20パスから鋭角を丸める→パスグラディエントブラシ?
0689デフォルトの名無しさん
2006/11/30(木) 10:28:28ReSharperっつーアドオンいれるとQuickFixでusingの追加できる。
けど、アドオンってことでVS2005 Expressだと無理で、ReShaperも有料だ。
ReSharperいれると、リファクタリングもeclipseレベルにまで拡張される。
0690デフォルトの名無しさん
2006/11/30(木) 17:37:21なんつーか( ゚Д゚)<氏ね!
0691デフォルトの名無しさん
2006/11/30(木) 17:53:21印刷と表示と色の設定で別々になってるよ
0692デフォルトの名無しさん
2006/11/30(木) 18:10:16それ設計思想が間違ってるだろう。
0693デフォルトの名無しさん
2006/11/30(木) 18:14:05画面でみるときには黒背景にしてるやつってたまにいるぞ。
うちの会社にも1人いる。
0694デフォルトの名無しさん
2006/11/30(木) 18:37:14テキストエディタの設定をコピーする機能があるから問題なし
0695デフォルトの名無しさん
2006/11/30(木) 19:21:430696デフォルトの名無しさん
2006/11/30(木) 19:24:480697デフォルトの名無しさん
2006/11/30(木) 19:31:29無効にしてどうしたいんだ?
0698デフォルトの名無しさん
2006/11/30(木) 19:33:560699デフォルトの名無しさん
2006/11/30(木) 20:01:29蛍光灯凝視しているようなもの。
黒地に白がベター
印刷は別設定できるほうが絶対優れていると思うが、>>692みたいに
ねじ曲がった奴もいるんだな。
0700デフォルトの名無しさん
2006/11/30(木) 22:07:30薄緑地に黒が良い
0701デフォルトの名無しさん
2006/11/30(木) 23:53:490702デフォルトの名無しさん
2006/12/01(金) 09:38:10当方 CRT で背景 rgb(215,215,215)
結構見易い
0703デフォルトの名無しさん
2006/12/01(金) 16:05:00ユーザIDとパスワードを入力して、ログオンする機能をつけたいのですが、作り方の定石があれば教えてください。ID/Passは両方ともサーバ側で認証を行います。
ちなみに前身のAccessアプリではID/Passテーブルというものが設けられていました。
0704デフォルトの名無しさん
2006/12/01(金) 19:32:11ODBC接続の接続文字列変えるだけでいいのかも。
0705デフォルトの名無しさん
2006/12/01(金) 22:01:25PropertyGridで、項目を展開できるようにしたはいいのですが、その数値変化した時にイベント取得が出来ません。
基本的に、位置は関係なく起こりさえすればいいのですが、ABCの値変化はMyClassChangedが発生しません。
結果、ABC変化は取得できない状況です。この取得は難しいでしょうか?
ソースはこんな感じです。
0706デフォルトの名無しさん
2006/12/01(金) 22:04:05public Class Class1
{private CustomClass myClass;
public event EventHandler MyClassChanged;
public Class1()
{ myClass.DataChanged += new EventHandler(Triggar);}
[DefaultValue(0,0,0)]
public CustomClass MyClass
{get{return myClass;} set{ myClass = value; Triggar(); }}
public void Triggar()
{if(MyClassChanged != null) MyClassChanged(this,EventArgs.Empty);}}
public Class CustomClass
{private int a,b,c;
public event EventHandler DataChanged;
public CustomClass(){a = 0; b = 0; c = 0;}
public int A
{ get{return a;} set{a = value; Triggar(); }
public int B
{ get{return b;} set{b = value; Triggar();}}
public int C
{ get{return c;} set{c = value; Triggar(); }}
public void Triggar()
{if(DataChanged != null) DataChanged(this,EventArgs.Empty);} }
0707デフォルトの名無しさん
2006/12/01(金) 22:12:010708デフォルトの名無しさん
2006/12/01(金) 22:12:190709デフォルトの名無しさん
2006/12/01(金) 22:13:14public class Class1{
private CustomClass myClass;
public event EventHandler MyClassChanged;
public Class1(){
myClass.DataChanged += new EventHandler(Triggar);
}
[DefaultValue(0,0,0)]
public CustomClass MyClass{
get{return myClass;} set{myClass = value; Triggar();}
}
public void Triggar(){
if(MyClassChanged != null) MyClassChanged(this,EventArgs.Empty);
}
}
public class CustomClass{
private int a,b,c;
public event EventHandler DataChanged;
public CustomClass(){ a = 0; b = 0; c = 0; }
public int A{
get{return a;} set{a = value; Triggar();
}
public int B{
get{return b;} set{b = value; Triggar();}
}
public int C{
get{return c;} set{c = value; Triggar();}
}
public void Triggar(){
if(DataChanged != null) DataChanged(this,EventArgs.Empty);
}
}
0710酔いちくれ ◆J0rwikii8c
2006/12/01(金) 22:14:210711デフォルトの名無しさん
2006/12/01(金) 22:16:240712705
2006/12/01(金) 22:17:51スミマセン、携帯手打ちな上に改行規制でかなり削りました。
>>708
申し訳ないですが、Class1()内でnewを脳内補完していただけますよう。
0713デフォルトの名無しさん
2006/12/01(金) 22:21:55とりあえずここでやるには長すぎる。
0714デフォルトの名無しさん
2006/12/01(金) 22:21:570715デフォルトの名無しさん
2006/12/01(金) 22:28:360716デフォルトの名無しさん
2006/12/01(金) 22:35:290717デフォルトの名無しさん
2006/12/01(金) 22:47:23とりあえずこちらではコンパイル通っているので、基本的なエラーは目を瞑って下さい。
CustomClassでA、B、Cという値が設定できる状態で、
それをまとめたものとして"0,0,0"というstringをCustomClassのABCに代入出来るように、
ExpandableObjectConverterを継承したCustomClassConverterで変換してます。
CustomClassの各ABCset{}の時にイベントを発生させる形で、
それをさらにClass1で受け取って発生させるつもりでした。
しかしながら、一度Class1のプロパティとしてMyClassの値を変化させると、
DataChangedイベントは取得されなくなります。
どうやらMyClassで設定した後はDataChanged==nullとなってしまうようで、
これがなぜだか分かりません。
何をすれば再びABCの変化を取得出来るのでしょうか?
0718デフォルトの名無しさん
2006/12/01(金) 22:52:22イベント登録しなおせ
0719デフォルトの名無しさん
2006/12/01(金) 23:36:58また、親や子に名前以外のデータ(構造体やクラス)をもたせることって出来ますか?
0720デフォルトの名無しさん
2006/12/01(金) 23:42:190721酔いちくれ ◆J0rwikii8c
2006/12/01(金) 23:43:210722デフォルトの名無しさん
2006/12/01(金) 23:43:420723デフォルトの名無しさん
2006/12/01(金) 23:43:55Tag は .NET 2.0 以降だっけ?
それ以前なら TreeNode の派生クラス作るなり外部で Hashtable/Dictionary<TreeNode, Hoge>使うなり
0724デフォルトの名無しさん
2006/12/01(金) 23:50:570725デフォルトの名無しさん
2006/12/02(土) 00:40:200726デフォルトの名無しさん
2006/12/02(土) 00:43:270727デフォルトの名無しさん
2006/12/02(土) 00:45:490728デフォルトの名無しさん
2006/12/02(土) 00:46:24つかなんでserialPostの受信ハンドラから同じクラス内の
コントロールハンドラを呼べないんだろ
0729デフォルトの名無しさん
2006/12/02(土) 00:58:45おっさん乙
0730デフォルトの名無しさん
2006/12/02(土) 01:02:15意味なら「委譲」。
.NETの機能のことなら、「型」の一種(delegate型)。
その型のインスタンスは、オブジェクト、または静的な「メソッド」へ
の参照を保持して呼び出すことが可能な実体。
型の一種として定義されるのでタイプセーフ。ポインタではなく
呼び出しのための実体として抽象化されているので、オブジェクトのメソッド、
静的なメソッド区別なく呼び出し可能。
別の機能である「イベント」と関連性が深い。
さらに言語機能として、C# 2.0で匿名メソッドが追加。これにより、「手続き」を
持ち運びできるように「見せ掛ける」機能にもなるように。BCLのコレクションク
ラスにもこの機能の使用を前提とした設計が見受けられるように。
3.0になるとさらに(ry
0731デフォルトの名無しさん
2006/12/02(土) 01:03:24脳内補完で充分通るソースだと思うのですが・・
スペルが変、名前おかしい(インスタンスとクラスの区別ができていない?etc)、デリゲートの型があわない。
DefaultValueAttributeの使い方があわない、Frameworkの初期化ルールがわかっていないかも?
インスタンスとイベント(デリゲート)の関係が怪しいところ。くらい?
myClassオブジェクトに関するあらゆる変更を監視して、イベントMyClassChangedを呼び出すようにしたいはずなので
フィールドが変更されたときもイベントを購読(subscribe)するようにするとよいと思われ。
public CustomClass MyClass
{get{return myClass;}
set{
if(myClass==value){return;}
if(myClass!=null){ myClass -= new EventHandler(value_OnDataChanged);}
value += new EventHandler(value_OnDataChanged);//value_OnDataChangedはEventHandler型メソッド
myClass = value;
Triggar();
}
public Class1(){ this.MyClass = new CustomClass();}
}
こんなのでよい?
0732デフォルトの名無しさん
2006/12/02(土) 01:08:24GenericsのList<T>クラスを使ってみると分かるかも
delegateを引数に取る奴、FindとかForEachとか
0733デフォルトの名無しさん
2006/12/02(土) 01:09:50それじゃコンパイル通らないよ
0734デフォルトの名無しさん
2006/12/02(土) 01:12:04スレッドが違うから。別のスレッドにアクセスするならInvokeしないと。
0735デフォルトの名無しさん
2006/12/02(土) 01:14:41TypeConverterがなんでClass1についてるのとか、
TypeConverterの中身はどうやねん(InstanceDescriptorの実装とか)とか、
DataChangedにするよりINotifyProertyChanged使えとか、
そもそもCustomClassはstructでいいやんとか、
class使うならDesignerSerializationVisibilityはContentのにしろよとか、
あーもうきりがない。
だからただ一言問題外と。
0736デフォルトの名無しさん
2006/12/02(土) 01:20:29回答者の負荷が増えるじゃん
関数ポインタ知らない人にデリゲート教えるのメンドイよね。
Javaスクールの危険 - The Joel on Software Translation Project
http://local.joelonsoftware.com/mediawiki/index.php/Java%E3%82%B9%E3%82%AF%E3%83%BC%E3%83%AB%E3%81%AE%E5%8D%B1%E9%99%BA
じゃないけど、C#が便利すぎて逆に怖い。
0737デフォルトの名無しさん
2006/12/02(土) 01:27:18{
Point p = new Point();
p.X = e.X;
p.Y = e.Y;
ContextMenu1.Show(this,p);
}
ツリービューを右クリックした時にメニューを表示したいのですが
これは間違ってますか?表示されないんですが
0738デフォルトの名無しさん
2006/12/02(土) 01:34:30{
ContextMenu1.Show( this.TreeView1, e.Location );
}
あるいは
this.TreeView1.ContextMenu = this.ContextMenu1;
としておくだけ。
0739デフォルトの名無しさん
2006/12/02(土) 01:34:58TypeConverter(typeof(ExpandableObjectConverter))はプロパティグリッドで展開して編集できるようにするためでは
プロパティグリッドにバインディングした奴は
DesignerSerializationVisibilityを特に設定しなくても実オブジェクトのプロパティは変更されると思われ
この場合は特に要らないかと。
structは特性を熟知している人が少ないから使わ(せ)ない派なんですが、あまりよくないのかな?
どうでもいいけど、INotifyProertyChangedを知ったときはちょっとショックだった。
後からこんなクラスあったんだって・・
Frameworkだだっぴろいよね。
0740デフォルトの名無しさん
2006/12/02(土) 01:49:28TypeConverterつけるべきはこの場合CustomClassのほうだと思うのだが?
それにCustomClass型のプロパティを使用するとして、これを代入させるのなら
TypeConverterにInstanceDescriptorの変換を定義しないとデザイナがプロパティ
代入時シリアライゼーションできない。直接ExtendableObjectConverterだけでは不可。
方法論としてはDesignerSerializationVisibilityがContentにして、その場合は
プロパティとしてgetのみにする(というかsetがあったら明示指定しないとContentと
デシリアライゼーション&代入とデザイナは区別できないはず、どっちが優先されるか
知らんが)。
または、この実装のように代入も許可するなら、この辺のシリアライゼーションを
きちんと実装した上でさっき誰かが書いたコードのようにイベント登録、解除の処理も
きちんと入れてやる。INotifyPropertyChangedにしたほうがいいが。あるいは代入クラスを
Componentにしてしまうのもありだろう。
ほかには動的なのでDefaultValueの代わりにShouldSerializePropertyの実装に切り替えるとか
ぐらいか。
つーかこの辺まじめに解説するとこのように長くなるっつーの。これでも省きまくっているのだが。
基礎知識ぐらいはつけてから聞いてほしいよ。
0741デフォルトの名無しさん
2006/12/02(土) 02:00:43ありがとうございます
しかしe.Locationの定義がありませんと出てしまいました
0742740
2006/12/02(土) 02:04:11CustomClassをstructに変更。CustomClass用のTypeConverterを実装(
stringの双方向変換、InstanceDescriptorへの変換、サブプロパティの許可等)して、
CustomClassに結びつける。InstanceDescriptorの関係から、組み込み型のみ使用
したコンストラクタor静的メソッドの実装あたりも。
ちなみに、これが最も標準的な方法で、使い方も楽。参照型のプロパティで
かつImmutableでない型をプロパティに使用し、代入許可するのはかなり異端な方法。
整合性を取るのが大変だからね。
0743デフォルトの名無しさん
2006/12/02(土) 02:11:110744デフォルトの名無しさん
2006/12/02(土) 02:12:140745デフォルトの名無しさん
2006/12/02(土) 02:27:19ありがとうございます
0746デフォルトの名無しさん
2006/12/02(土) 04:25:20TreeViewの親や子に名前以外のデータ(構造体やクラス)をもたせることって出来ますか?
0747デフォルトの名無しさん
2006/12/02(土) 08:30:36>>723
0748デフォルトの名無しさん
2006/12/02(土) 09:20:50ああ、ありどとうございます!
もう一つ質問ですがハッシュテーブルをそのままファイルに書き出すことってできますか?
もちろん見ることではなく、次の起動の時読み込むのが目的です
0749デフォルトの名無しさん
2006/12/02(土) 09:27:340750デフォルトの名無しさん
2006/12/02(土) 15:40:14変数にメソッド代入して実行できるなんて適当に言ってみようか…
0751デフォルトの名無しさん
2006/12/02(土) 15:47:330752デフォルトの名無しさん
2006/12/02(土) 15:51:360753デフォルトの名無しさん
2006/12/02(土) 16:28:56をつけたいと思うのですが、どのように実装すればいいでしょうか?
0754デフォルトの名無しさん
2006/12/02(土) 17:25:29C#でかかれたテキストエディタって、どこかにないのかな?
かなりP/Invokeを自分でラップすることになると思うんだけど・・
0755デフォルトの名無しさん
2006/12/02(土) 17:46:11SelectionModeにFullRowSelect
を設定してるとき、選択されるのは行単位で、SelectedCellsも
その行のセルすべてになってるけど、これを本当にクリックして選択してる
1セル(点々で囲まれてるセル)を知るにはどーすればいいでしょう?
0756デフォルトの名無しさん
2006/12/02(土) 18:04:590757デフォルトの名無しさん
2006/12/02(土) 18:14:03C/C++でいうところのの関数ポインタだよというとか。
1メソッドInvokeだけを含むインターフェースだよというとか。
0758デフォルトの名無しさん
2006/12/02(土) 18:20:24>これを本当にクリックして選択してる
間違いじゃないかな。
アクティブ≠選択している
DataGridView.CurrentCellAddress あたりじゃないかなと勘で答える。
0759デフォルトの名無しさん
2006/12/02(土) 18:26:08関数ポインタ知らない奴結構いるよ…
俺も使ってないし。
0760デフォルトの名無しさん
2006/12/02(土) 18:37:23これのこと!!
どうもありがとう!
0762デフォルトの名無しさん
2006/12/02(土) 18:41:13そりゃよかった。
適当に答えたけどあたってて良かった。
俺は知識無かったけどMSDN探せば簡単に見つかったよ。
0763デフォルトの名無しさん
2006/12/02(土) 18:45:050764デフォルトの名無しさん
2006/12/02(土) 18:49:360765デフォルトの名無しさん
2006/12/02(土) 18:56:24そうですか
XmからTreeViewへのサンプルコードはたくさんあるんですが
逆は全く無いので難しいのかと思ってました、もうちょっと探してみます
ありがとうございました
0766デフォルトの名無しさん
2006/12/02(土) 19:10:390767デフォルトの名無しさん
2006/12/02(土) 19:20:05まんまコピーして使っているので仕組みを理解してません
ちょっと改造すればできるんですか?
0768デフォルトの名無しさん
2006/12/02(土) 19:29:07xmlの保存だけで事は済むってことだろ。
■ このスレッドは過去ログ倉庫に格納されています