トップページ⇒tech
1001コメント308KB

C♯, C#相談室 Part35

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/03(金) 03:07:45
(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。

前スレ
C♯, C#相談室 Part34
http://pc8.2ch.net/test/read.cgi/tech/1157549657/

過去スレは>>2-5あたり。
※スレタイに「#」を入れても消えちゃうので新スレ立てる人は要注意だ。
0693デフォルトの名無しさん2006/11/30(木) 18:14:05
>>692
画面でみるときには黒背景にしてるやつってたまにいるぞ。
うちの会社にも1人いる。
0694デフォルトの名無しさん2006/11/30(木) 18:37:14
>>692
テキストエディタの設定をコピーする機能があるから問題なし
0695デフォルトの名無しさん2006/11/30(木) 19:21:43
ガベレージコレクションは無効にできないの?
0696デフォルトの名無しさん2006/11/30(木) 19:24:48
仮に無効にできたとしたらメモリ開放できないぞ。
0697デフォルトの名無しさん2006/11/30(木) 19:31:29
>>695
無効にしてどうしたいんだ?
0698デフォルトの名無しさん2006/11/30(木) 19:33:56
ガベレージじゃなくてガベージだぞ。
0699デフォルトの名無しさん2006/11/30(木) 20:01:29
白地の液晶画面だと目が悪くなるよ…
蛍光灯凝視しているようなもの。
黒地に白がベター

印刷は別設定できるほうが絶対優れていると思うが、>>692みたいに
ねじ曲がった奴もいるんだな。
0700デフォルトの名無しさん2006/11/30(木) 22:07:30
黒地に白は見辛くて困る
薄緑地に黒が良い
0701デフォルトの名無しさん2006/11/30(木) 23:53:49
えくりぷちゅは色そのままだお・・・あほかと
0702デフォルトの名無しさん2006/12/01(金) 09:38:10
スレ違いではあるが
当方 CRT で背景 rgb(215,215,215)
結構見易い
0703デフォルトの名無しさん2006/12/01(金) 16:05:00
データベース(PostgreSQL)を参照するデスクトップアプリを作っています。
ユーザIDとパスワードを入力して、ログオンする機能をつけたいのですが、作り方の定石があれば教えてください。ID/Passは両方ともサーバ側で認証を行います。
ちなみに前身のAccessアプリではID/Passテーブルというものが設けられていました。
0704デフォルトの名無しさん2006/12/01(金) 19:32:11
sql serverのだったら本があるんだがな。
ODBC接続の接続文字列変えるだけでいいのかも。
0705デフォルトの名無しさん2006/12/01(金) 22:01:25
以前にPropertyGridの件で書き込んだ者です。
PropertyGridで、項目を展開できるようにしたはいいのですが、その数値変化した時にイベント取得が出来ません。

基本的に、位置は関係なく起こりさえすればいいのですが、ABCの値変化はMyClassChangedが発生しません。
結果、ABC変化は取得できない状況です。この取得は難しいでしょうか?

ソースはこんな感じです。
0706デフォルトの名無しさん2006/12/01(金) 22:04:05
[TypeConverter(typeof(CustomClassConverter))]
public 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:01
こんなに汚いソースは久しぶりだ
0708デフォルトの名無しさん2006/12/01(金) 22:12:19
Class1 のコンストラクタを呼んだらヌルリの予感
0709デフォルトの名無しさん2006/12/01(金) 22:13:14
[TypeConverter(typeof(CustomClassConverter))]
public 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:21
もう、一体何がしたいんだと子一時間(ry
0711デフォルトの名無しさん2006/12/01(金) 22:16:24
せめてコンパイル通るコードを貼ってくれよ。もう嫌がらせのレベルだろ
07127052006/12/01(金) 22:17:51
>>707
スミマセン、携帯手打ちな上に改行規制でかなり削りました。
>>708
申し訳ないですが、Class1()内でnewを脳内補完していただけますよう。
0713デフォルトの名無しさん2006/12/01(金) 22:21:55
ぱっと見問題外のコードだな。どこから突っ込めばいいのか。
とりあえずここでやるには長すぎる。
0714デフォルトの名無しさん2006/12/01(金) 22:21:57
さっさとパケ死しろ
0715デフォルトの名無しさん2006/12/01(金) 22:28:36
エラー1デリゲート 'System.EventHandler' に一致する 'Triggar' のオーバーロードはありません。
0716デフォルトの名無しさん2006/12/01(金) 22:35:29
最大の問題はtrigg'a'rかな
0717デフォルトの名無しさん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
MyClass { set; } で別インスタンスにしてるからだろ
イベント登録しなおせ
0719デフォルトの名無しさん2006/12/01(金) 23:36:58
TreeViewに動的に親や子を追加するにはどうすればいいですか?
また、親や子に名前以外のデータ(構造体やクラス)をもたせることって出来ますか?
0720デフォルトの名無しさん2006/12/01(金) 23:42:19
できません
0721酔いちくれ ◆J0rwikii8c 2006/12/01(金) 23:43:21
できるにきまってるだろwwww
0722デフォルトの名無しさん2006/12/01(金) 23:43:42
両方できないのですか?
0723デフォルトの名無しさん2006/12/01(金) 23:43:55
TreeNodeCollection.Add
Tag は .NET 2.0 以降だっけ?
それ以前なら TreeNode の派生クラス作るなり外部で Hashtable/Dictionary<TreeNode, Hoge>使うなり
0724デフォルトの名無しさん2006/12/01(金) 23:50:57
ふつう黒に緑じゃないか?
0725デフォルトの名無しさん2006/12/02(土) 00:40:20
デリゲートの意味がわからん・・・・
0726デフォルトの名無しさん2006/12/02(土) 00:43:27
関数ポインタのようなもの
0727デフォルトの名無しさん2006/12/02(土) 00:45:49
デリゲートに好きして
0728デフォルトの名無しさん2006/12/02(土) 00:46:24
使ったことないからピンとこないです。
つかなんでserialPostの受信ハンドラから同じクラス内の
コントロールハンドラを呼べないんだろ
0729デフォルトの名無しさん2006/12/02(土) 00:58:45
>>727
おっさん乙
0730デフォルトの名無しさん2006/12/02(土) 01:02:15
>>725
意味なら「委譲」。

.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:24
>>725
GenericsのList<T>クラスを使ってみると分かるかも
delegateを引数に取る奴、FindとかForEachとか
0733デフォルトの名無しさん2006/12/02(土) 01:09:50
>>731
それじゃコンパイル通らないよ
0734デフォルトの名無しさん2006/12/02(土) 01:12:04
>>728
スレッドが違うから。別のスレッドにアクセスするならInvokeしないと。
0735デフォルトの名無しさん2006/12/02(土) 01:14:41
>>731
TypeConverterがなんで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
private void TreeView1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
Point p = new Point();
p.X = e.X;
p.Y = e.Y;
ContextMenu1.Show(this,p);

}
ツリービューを右クリックした時にメニューを表示したいのですが
これは間違ってますか?表示されないんですが

0738デフォルトの名無しさん2006/12/02(土) 01:34:30
if( e.Button == MouseButtons.Right )
{
 ContextMenu1.Show( this.TreeView1, e.Location );
}


あるいは
this.TreeView1.ContextMenu = this.ContextMenu1;
としておくだけ。
0739デフォルトの名無しさん2006/12/02(土) 01:34:58
>>735
TypeConverter(typeof(ExpandableObjectConverter))はプロパティグリッドで展開して編集できるようにするためでは
プロパティグリッドにバインディングした奴は
DesignerSerializationVisibilityを特に設定しなくても実オブジェクトのプロパティは変更されると思われ
この場合は特に要らないかと。
structは特性を熟知している人が少ないから使わ(せ)ない派なんですが、あまりよくないのかな?

どうでもいいけど、INotifyProertyChangedを知ったときはちょっとショックだった。
後からこんなクラスあったんだって・・
Frameworkだだっぴろいよね。
0740デフォルトの名無しさん2006/12/02(土) 01:49:28
>>735
TypeConverterつけるべきはこの場合CustomClassのほうだと思うのだが?
それにCustomClass型のプロパティを使用するとして、これを代入させるのなら
TypeConverterにInstanceDescriptorの変換を定義しないとデザイナがプロパティ
代入時シリアライゼーションできない。直接ExtendableObjectConverterだけでは不可。

方法論としてはDesignerSerializationVisibilityがContentにして、その場合は
プロパティとしてgetのみにする(というかsetがあったら明示指定しないとContentと
デシリアライゼーション&代入とデザイナは区別できないはず、どっちが優先されるか
知らんが)。

または、この実装のように代入も許可するなら、この辺のシリアライゼーションを
きちんと実装した上でさっき誰かが書いたコードのようにイベント登録、解除の処理も
きちんと入れてやる。INotifyPropertyChangedにしたほうがいいが。あるいは代入クラスを
Componentにしてしまうのもありだろう。

ほかには動的なのでDefaultValueの代わりにShouldSerializePropertyの実装に切り替えるとか
ぐらいか。

つーかこの辺まじめに解説するとこのように長くなるっつーの。これでも省きまくっているのだが。
基礎知識ぐらいはつけてから聞いてほしいよ。
0741デフォルトの名無しさん2006/12/02(土) 02:00:43
>>738
ありがとうございます
しかしe.Locationの定義がありませんと出てしまいました
07427402006/12/02(土) 02:04:11
失礼。もう一つ方法追加。

CustomClassをstructに変更。CustomClass用のTypeConverterを実装(
stringの双方向変換、InstanceDescriptorへの変換、サブプロパティの許可等)して、
CustomClassに結びつける。InstanceDescriptorの関係から、組み込み型のみ使用
したコンストラクタor静的メソッドの実装あたりも。

ちなみに、これが最も標準的な方法で、使い方も楽。参照型のプロパティで
かつImmutableでない型をプロパティに使用し、代入許可するのはかなり異端な方法。
整合性を取るのが大変だからね。
0743デフォルトの名無しさん2006/12/02(土) 02:11:11
文字列がひとつ入力できるメッセージボックスって標準でありますか?
0744デフォルトの名無しさん2006/12/02(土) 02:12:14
VB用のInputBox
0745デフォルトの名無しさん2006/12/02(土) 02:27:19
>>744
ありがとうございます
0746デフォルトの名無しさん2006/12/02(土) 04:25:20
>>719です、まだ解らないので質問します
TreeViewの親や子に名前以外のデータ(構造体やクラス)をもたせることって出来ますか?
0747デフォルトの名無しさん2006/12/02(土) 08:30:36
>>746
>>723
0748デフォルトの名無しさん2006/12/02(土) 09:20:50
>>747
ああ、ありどとうございます!
もう一つ質問ですがハッシュテーブルをそのままファイルに書き出すことってできますか?
もちろん見ることではなく、次の起動の時読み込むのが目的です
0749デフォルトの名無しさん2006/12/02(土) 09:27:34
SoapFormatter やら BinaryFormatter やらなら
0750デフォルトの名無しさん2006/12/02(土) 15:40:14
デリゲートの正確な説明面倒だよな。

変数にメソッド代入して実行できるなんて適当に言ってみようか…
0751デフォルトの名無しさん2006/12/02(土) 15:47:33
デリゲートはデリケートな説明が必要だからな
0752デフォルトの名無しさん2006/12/02(土) 15:51:36
いい加減そのだじゃれ飽きたYO
0753デフォルトの名無しさん2006/12/02(土) 16:28:56
エディタを作っていて、TeraPadのように、行番号と桁数を表すルーラー
をつけたいと思うのですが、どのように実装すればいいでしょうか?
0754デフォルトの名無しさん2006/12/02(土) 17:25:29
Controlを継承して、ひたすら描画する。
C#でかかれたテキストエディタって、どこかにないのかな?
かなりP/Invokeを自分でラップすることになると思うんだけど・・
0755デフォルトの名無しさん2006/12/02(土) 17:46:11
DataGridViewで、
SelectionModeにFullRowSelect
を設定してるとき、選択されるのは行単位で、SelectedCellsも
その行のセルすべてになってるけど、これを本当にクリックして選択してる
1セル(点々で囲まれてるセル)を知るにはどーすればいいでしょう?

0756デフォルトの名無しさん2006/12/02(土) 18:04:59
全て選択されているが答えじゃないのか?
0757デフォルトの名無しさん2006/12/02(土) 18:14:03
>>750
C/C++でいうところのの関数ポインタだよというとか。
1メソッドInvokeだけを含むインターフェースだよというとか。
0758デフォルトの名無しさん2006/12/02(土) 18:20:24
>>755
>これを本当にクリックして選択してる
間違いじゃないかな。

アクティブ≠選択している

DataGridView.CurrentCellAddress あたりじゃないかなと勘で答える。
0759デフォルトの名無しさん2006/12/02(土) 18:26:08
>>757
関数ポインタ知らない奴結構いるよ…
俺も使ってないし。
0760デフォルトの名無しさん2006/12/02(土) 18:37:23
>>758
これのこと!!
どうもありがとう!
07617532006/12/02(土) 18:40:31
>>754
ありがとうございます。でも意味が全然分かりません・・・
どこかにソースが転がってないか探してみます。
0762デフォルトの名無しさん2006/12/02(土) 18:41:13
>>760
そりゃよかった。
適当に答えたけどあたってて良かった。
俺は知識無かったけどMSDN探せば簡単に見つかったよ。
0763デフォルトの名無しさん2006/12/02(土) 18:45:05
TreeViewをそのままxmlに書き出すのって簡単に出来ますか?
0764デフォルトの名無しさん2006/12/02(土) 18:49:36
そんなに手間ではない
0765デフォルトの名無しさん2006/12/02(土) 18:56:24
>>764
そうですか

XmからTreeViewへのサンプルコードはたくさんあるんですが
逆は全く無いので難しいのかと思ってました、もうちょっと探してみます

ありがとうございました
0766デフォルトの名無しさん2006/12/02(土) 19:10:39
それがわかるんならxml.saveをすればいいものを最初から作るのか。ご苦労な話だな。
0767デフォルトの名無しさん2006/12/02(土) 19:20:05
>>766
まんまコピーして使っているので仕組みを理解してません
ちょっと改造すればできるんですか?
0768デフォルトの名無しさん2006/12/02(土) 19:29:07
改造?なんの話だよ。xmlとTreeViewの同期がとれてるんなら
xmlの保存だけで事は済むってことだろ。
0769デフォルトの名無しさん2006/12/02(土) 19:55:51
C#で実用的なテキストエディタを作成することは不可能です。
0770デフォルトの名無しさん2006/12/02(土) 19:56:16
そんなことはない。
0771デフォルトの名無しさん2006/12/02(土) 20:07:36
絶対に不可能です。
0772デフォルトの名無しさん2006/12/02(土) 20:16:24
確かに実用的なものは作れないでしょうね
0773デフォルトの名無しさん2006/12/02(土) 20:23:57
>>768
xmlに元々あるデータは保存できるのですが
新しいノードを作ると反映されないのです
0774デフォルトの名無しさん2006/12/02(土) 20:24:12
粘着はかえれ☆
0775デフォルトの名無しさん2006/12/02(土) 20:47:27
一言で表すと、メソッド用インターフェースかな?>デリゲート
0776デフォルトの名無しさん2006/12/02(土) 20:49:30
どちらかというとメソッドそのもののほうに近いだろ。
0777デフォルトの名無しさん2006/12/02(土) 20:54:24
>>772
不可能化可能かでいったら十中八九可能だと思うよ。
意味がないだけで。
0778デフォルトの名無しさん2006/12/02(土) 20:58:23
粘着野郎へ

俺は見つけたぞ!!
しかもソースまである。

ググレカス!
0779デフォルトの名無しさん2006/12/02(土) 20:59:16
需要あると思うよ。
テキストエディタ単体としてではなく、テキストエディタコンポーネントとして。
0780デフォルトの名無しさん2006/12/02(土) 21:03:18
>>779
死ぬほどメソッドがあるコンポーネントだろうけどな。
0781デフォルトの名無しさん2006/12/02(土) 21:04:58
次はC#でieコンポーネント使わないインターネットブラウザが作れないって言うだろうね
0782デフォルトの名無しさん2006/12/02(土) 21:24:01
テキストエディタのソースの
目的の場所までたどり着く自信がない。orz
0783デフォルトの名無しさん2006/12/02(土) 21:42:33
>>778
今まで検索してましたけどありませんでしたから
多分試したやつだと思います
0784デフォルトの名無しさん2006/12/02(土) 21:54:48
>>779
コンポーネントとして使えればいいんなら C++(/CLI) で作るよ。
だから「意味がない」なんて言い回しになるわけで
0785デフォルトの名無しさん2006/12/02(土) 21:55:01
粘着野郎 = >>769
0786デフォルトの名無しさん2006/12/02(土) 22:04:02
キモイやつだな
0787デフォルトの名無しさん2006/12/02(土) 23:05:14
テキストエディタのソース見てるが思ったよりあっさりしてる。

これで行番号とかアイコンとか出せるんだな…
07887532006/12/02(土) 23:17:07
>>787
よかったらURL教えてください。

http://sharpdevelop-jp.sourceforge.jp/index.php?SDJEditor
↑見つけたのですが行番号とルーラーのソースどれか分かりません・・
0789デフォルトの名無しさん2006/12/02(土) 23:17:34
ソース見る限りでは自前ドローも簡単そうに見える…
tipsゲット!!

でも自分でいちから書くにはしっかりした設計が必要だな
0790デフォルトの名無しさん2006/12/02(土) 23:22:31
ソースの読み方研究しようね。
OnPaint で検索しろ。

GutterMargin.cs
HRuler.cs
0791デフォルトの名無しさん2006/12/02(土) 23:34:37
ソースおもろかった。
いろいろ勉強になった。
データ構造も面白かった。
昔Cオンリーで書いてたころと大違いだな。

実装の参考になる。
テキストもキャレットも選択部分も自前で書く参考になる。


おもしろい。
0792デフォルトの名無しさん2006/12/02(土) 23:47:24
アプリケーション起動時に最初に呼ばれるフォームを
外部の設定ファイルに応じて自由に変える機能を作りたいのですが
方法はないでしょうか?
■ このスレッドは過去ログ倉庫に格納されています