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

C♯相談室 Part18

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん♯NGNG

(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。


過去スレは>>2-5あたり。


関連リンク
http://onigiri.s3.xrea.com:8080/csharp/index.php?%5B%5B%A5%EA%A5%F3%A5%AF%5D%5D

ソース置き場.NET
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1003826049&rm=10
0153デフォルトの名無しさんNGNG
>>151
内部クラスのことか?

class MyClass {
    class MyItem {
    }
}

みたいに MyClass の中で MyItem を宣言すれば OK よん
0154153NGNG
152 完全に無視してたスマソ
0155デフォルトの名無しさんNGNG
>>152
MyClass
{
  public MyClass()
  {
  }

  public MyItem items=new MyItem();//これでいけました

  public void Add()
  {
  }
}

こういう風にメソッドの外でクラスを作ることをなんていうんでしょうか?
0156デフォルトの名無しさんNGNG
>>155
>>152
まず基礎から一つずつ積んでけ。
0157デフォルトの名無しさんNGNG
何をしたいのかというと

ListViewにPictureBoxの機能を連動するようなMyClassを作りたかったんですが
PictureBox継承にしてしまうと、MyClassを使う場合、pictureboxの機能も使えてしまって
ごちゃまぜでややこしいので、できればMyClass使う場合、pictureBoxを意識しないで
使えるような設計をしたかったんです

MyClass.items //ListView
MyClass.View  //ListViewで選択されてるitemをPictureBoxに表示するメソッド
0158デフォルトの名無しさんNGNG
基礎から出直してきます
どうもでした
0159153NGNG
俺、完全に無視されたヨカン
0160151NGNG
ここIDでないんですね・・

>>159

>>153で書かれてることは>>155こういうことなのでしょうか?
このことを内部クラスっていうんですね
ありがとうございます
0161デフォルトの名無しさんNGNG
いやそれは違うから
0162デフォルトの名無しさんNGNG
フィールドについて調べてみよう。
0163153NGNG
そういうことか。何となく流れが混乱している意味がやっとわかった。


�@ 『内部クラス』は『クラスの中で宣言されたクラス』を指す。
>>153 では MyItem がコレ

�A 内部クラスといっても、普通のクラスとの本質的な違いは殆どない。
>>155 はスコープの問題。

�B 『クラスの宣言』と『インスタンスの作成』は全く違うことに注意。
下手すると両方とも「クラスの作成」になっちまうからな


>>160 は、内部クラスを『メソッドの外で宣言する物と思い込んでいる』
ような気がする。(合ってなくはないが微妙にニュアンスが……)
0164デフォルトの名無しさんNGNG
C# ver2.0で追加される
クラスのライブラリってどこか参照できるところがあれば
教えてください。
0165デフォルトの名無しさんNGNG
Itemって名前のプロパティ作って怒られたよ俺
0166151NGNG
>>163
んーなかなかむずかしいすねー
内部クラスっていうのは作ったことないです

クラスっていうのは実体がない設計図みたいなもので
インスタンスはその設計図を元に具現化したもの・・・

実際MyClassを使うメインのクラスでは
public Form1:
{
  private MyClass[] mc=new MyClass();//>>155のMyClass

  public Form1()
  {
  }

  private void View()
  {
    //mc.AddでMyClassのListViewにファイル名追加してさらに
    //MyClassの中のprivateなPictureBoxでform1に画像を
    //表示する
    mc[0].Add("filename");
  }
}
結局、Form1でインスタンス化するんだから、MyClass内でMyItemsをインスタンス化
するのは無駄なことなのかも?
内部クラスとスコープこの二つの単語をもう少し勉強してきます
0167デフォルトの名無しさんNGNG
( д) ゜ ゜
0168デフォルトの名無しさんNGNG
その前にオブジェクト指向の基礎を勉強してこいよ
0169151NGNG
やっと、自分の考えていること表現する方法がわかった↓
こんな構造作りたいんだけど・・

MyClass.View.PictureBox
MyClass.ListView

>>166のやり方でさっきからやってるけど
MyClassのメソッドでPictureBoxに画像表示してるけど
Form1に表示されない・・・・
んー、素直にPictureBoxを継承すればすんなり行くんだけど・・
pictureBoxの機能はすべてMyClass内で自動でやってほしんだよね・・
0170151NGNG
あ、違う
MyClass.View.PictureBox
これじゃなかった
pictureBoxはMyClassのプロパティ?として使いたいんだった
あーやっぱ出直してくる
0171デフォルトの名無しさんNGNG
まず、この話に内部クラス(ネストクラス)は一切関係ない。スコープも取りあえず関係ない。
アクセシビリティもおいとこう。

根本的にFormに表示できるのは、
・祖先がControlであるクラスで、
・FormのControlsプロパティに追加された上記クラスのインスタンス
のみだ。
お前さんのMyClassとやらは条件を満たしてるのかね?

//しかしフィールドも知らない人がよくこんなことしようと考えるなぁ。
//Hello worldから始める人って少なくなったのかなぁ。
0172151NGNG
>>171
PictureBoxを継承した自作クラスでFormに描画できるのはそういうことだったんですね

MyClassは継承もしてないし、Controlでもないと思います
Controlもよく意味がわかってないですが^^;

フィールドというのは、クラスの先頭で宣言するpublic int a;などのように
データを保存するだけのもののことをいうんですよね?

FormにListViewなどを配置すると、Formクラスの先頭に
private ListView listView1;
ていうのができますが、これはプロパティ?それともフィールド?
0173デフォルトの名無しさんNGNG
少しはその足りない頭で考えようとしてみろ
お前の聞いてることはC#とか言語以前の問題だ
0174デフォルトの名無しさんNGNG
>>172
・・・・・。
0175デフォルトの名無しさんNGNG
もうどうしようもねえな
0176デフォルトの名無しさんNGNG
>>172
まずは入門書を読み飛ばさず一冊読んでおおまかな概要や用語をつかむことだ。
用語がわからないのでは、まさに文字通り、話にならないから。

ttp://pc5.2ch.net/test/read.cgi/tech/1065196964/
0177デフォルトの名無しさんNGNG
すげぇ…。
0178デフォルトの名無しさんNGNG
RADの弊害だな
しかしここまでひどいのは初めて見た
0179176NGNG
>おおまかな概要
「白い白馬」やっちまった。
0180デフォルトの名無しさんNGNG
>>178
ほんとそうだよな。
こういう書き込み見てると頭の頭痛が痛いよ。
0181デフォルトの名無しさんNGNG
>>180
なんかそのせりふ頭痛に寄生されてるみたいでキモイ
0182151NGNG
>>176
一応C#と独習C#は基礎的な部分は繰り返し呼んでたんだけど
勉強の仕方が悪いのか頭に入ってないですね
説明文自体が専門用語ばかりで・・
0183デフォルトの名無しさんNGNG
悪いのは勉強の仕方ではなくおまいの頭・・・
0184デフォルトの名無しさんNGNG
151は神だと思うw
0185デフォルトの名無しさんNGNG
頭に入ってなければそれは勉強したとは言わない
眺めただけという
0186デフォルトの名無しさんNGNG
>>185
座布団一枚!
0187151NGNG
プログラムできないとバカ扱いされるんですか?
ちゃんと仕事して家族養ってるし年収も1000万もらってるんですけど
ちょっと興味湧いたのでプログラム始めたんです
プログラム初めてからまだ1週間です
わたしはバカって言われたことありません
0188デフォルトの名無しさんNGNG
よかったな、初体験だ。
0189デフォルトの名無しさんNGNG
>>187

本物のネ申が降臨しました
0190在日外国人参政権反対NGNG
>187
馬鹿かどうかはわかりませんが、貴方のここで書いていることはほとんどが釣りと疑わせるようなものであることはまちがいないです.
私も釣られてるんでしょうか?
0191デフォルトの名無しさんNGNG
さすがに 187 は別人の釣りだと思う。
0192デフォルトの名無しさんNGNG
雰囲気悪くなるからそんなにいじめるなよ
0193デフォルトの名無しさんNGNG
すべてのプログラマの基底クラス、その名は151
0194デフォルトの名無しさんNGNG
>193
そんなもん継承させないでくれ...
0195151NGNG
いろいろ調べててわかったんですが
自作コントロールというのはいわゆるDLLのことだったんですね
0196デフォルトの名無しさんNGNG
なんかおかしいぞ。
0197デフォルトの名無しさんNGNG
相変わらず斜め上だな……。
0198151NGNG
Controlクラスや、その派生クラスから継承して作ったGUIクラス = コントロールでよいのでしょうか。
それを /target:library オプションを付けてコンパイルしたものがDLLなんですね。

そこで質問なんですが、自動車免許(大型)の更新には、焼きそばは必要なんでしょうか?
0199デフォルトの名無しさんNGNG
まだ続ける気があるなら151はトリップつけろ、やりかたはクラスの継承と同じだ。
0200デフォルトの名無しさんNGNG
>>198
だから、コントロール=DLLじゃないって。
0201デフォルトの名無しさんNGNG
モッコリはにゃ〜ん
0202デフォルトの名無しさんNGNG
モッコリはにゃ〜ん
0203デフォルトの名無しさんNGNG
モッコリはにゃ〜ん
0204151 ◆0XlGlYK4pE NGNG
どういうクラスを作りたいのかというと
ファイルが送られてきたら、リストビューにファイル名追加して
さらに画像をピクチャーボックスに表示する
こういう動作をするクラスを作りたいんです
ListViewの機能にPictureBoxの機能を加えたようなもの

このクラスの名前を例えばMyClassします
MyClassにPictureBoxを継承してしまうと
MyClassを利用する側はPicturBoxのメソッドにもアクセスできることになる
利用する側は直接PictureBoxのメソッドを利用することはないのに
利用できるようになるのは無駄というかわかりにくいですよね?
利用する側からはPictureBoxのメソッドの存在を隠蔽したいんです
そこで、継承ではなくMyClassの内部にPictureBoxをオブジェクトとして扱おうとしたけど
今度は利用する側(Form1)に表示されない・・

そこで自作コントロールを作ればいいと考えたんですけど
DLL作ってるんですけど、結構面倒ですね、うまく動作してるか
デバッグしながら確認出来ないから
一旦DLL作って、それをフォームに貼り付けてやらないと
チェックできないし・・

じゃあ、どうすればいいのか・・・コントロールを作りながらそのコントロールを
利用する側も一緒に作っていく方法がわからなくて困ってます
0205151 ◆0XlGlYK4pE NGNG
自作コントロールはDLL化しないと、Form1などで
利用するこはできないですよね?
もしできるなら、この問題は解決するんですけど
0206デフォルトの名無しさんNGNG
>>151
こっちのスレに行け。
http://pc5.2ch.net/test/read.cgi/tech/1065196964/l50
0207デフォルトの名無しさんNGNG
>>205
Form1はDLLにしないとMainメソッドから呼べないとでも?
0208デフォルトの名無しさんNGNG
>>204
どっから送られてくるのか知らんがw

とりあえず、大量の画像のファイル名をListViewに羅列して、
マウスがListViewのアイテム(画像ファイル名)上に来たら、該当する画像を表示する。

こんな感じでいいの?
0209デフォルトの名無しさんNGNG
PictureBoxとListViewをぶっこんだユーザーコントロール作ればいいだけちゃうんかと
0210151 ◆0XlGlYK4pE NGNG
>>208
今画像の振り分けソフトを作っているんです
起動時にlistView1に画像のアドレスが一覧されていて
Form1上のMyClass.PictureBoxをクリックすると、listView1で選択されている画像ファイルが表示されるとともに
そのファイルがMyClass.ListViewに追加されるというものです

この処理をすべてForm1のメソッドでやればいいんですけど、MyClassを何十個も増やせるようにしたいので
そうなってくると非情に面倒な結果になります

あと、今適当にやってたら、プロジェクト右クリックでユーザーコントロール追加できるんですね
これで簡単にユーザーコントロールをグラフィカルに作ることができました。これ便利ですね
クラスの説明とかはいろいろあるのに、VC#自体の説明書がないので、まだ、このソフト使い慣れてない・・

で、ユーザーコントロールは簡単に作ることができて、フォームに追加することはできたんだけど
いざ、デガッグしようとすろと、ユーザーコントロールはビルドされていなければいけませんと出て
やっぱり、いちいちビルドしてからでないと使えないみたいです
0211デフォルトの名無しさんNGNG
グダグダになってまいりました。
0212デフォルトの名無しさんNGNG
おまえらもう151にはかまうなよ。
151は自分の分をわきまえろ。
んな高度なもん作る前にやることがあるだろ。
0213151 ◆0XlGlYK4pE NGNG
>>209
ええ、そうなんですよ。その作り方もわからなかったし、存在すら知らなかった・・

でもIDEでGUIで作れたので便利です。IDEの説明がもっと充実していればなぁ
0214199NGNG
本当にトリップつけて続けるとは思わなかった。
とりあえず151は入門書を256回読んでから首吊れ。
0215デフォルトの名無しさんNGNG
おまいらせっかくトリップ付けてくれたのは、あぼーん設定しろって意味なの分らんの?
それはともかくとして、このスレもう4年も経つんだな。
0216デフォルトの名無しさんNGNG
最初のスレの>>3
↓

     〆 ̄TTTTTTTTTTTTTTT7
     | =|  ̄ ̄ ̄┴┴┴ ̄ ̄ ∨
    |=|  ̄ ̄――― ̄    |
     | =| 巛lllllllllllllllii ̄ ̄iillllllllllllll|
     | =|  ___llll  lll___|
    |=\人   o > /   o フ<
    |i⌒i| へ ̄ ̄,  \ ̄ ̄ , .|
    ||  |.|     ̄    \ ̄ |
    ||  ‖  //  (      | ヽ |
    | \| イ_   ^  ̄ ̄   |
     | ≡ ./|  \王I王I王I王I王フ|
    /| =/ |           |
   /  |/ 人    =≡≡=  ノ
― ̄|  \ へ _      イ
   |    \     ̄ ̄ ̄
0217デフォルトの名無しさんNGNG
トリップ月の151は187なのか?
0218デフォルトの名無しさんNGNG
MSDNにはコントロールを継承したクラスの内部のメソッドは作成元スレッド以外から呼んではいけない、
という風に載っていたのですが、この場合の内部というのはどこまでを指すのでしょうか?

public class Form1 : Form
{
/*独自のメソッド*/
public void MyMethod()
{
}
}

この場合、MyMethod()は別スレッドから直接呼び出しても問題ないでしょうか?
0219デフォルトの名無しさんNGNG
>>218
それはクラスの外部のメソッドなのか?

違うだろ?
0220151 ◆0XlGlYK4pE NGNG
>>218
パブリックなら普通に読めるでしょ
てか、オブジェクトについてもうちょっと勉強したほうがいいよ
0221デフォルトの名無しさんNGNG
ごめんちょっとワラタw
0222デフォルトの名無しさんNGNG
>>218
あなたが実装しなかったメソッド(つまり .NET Framework に含まれているメソッド)。
自分が実装したメソッドなら、他スレッドから安全に呼べるかどうかは自分でわかるはず。

たとえばその void MyMethod() は何もしないので当然他スレッドからも安全に呼べる。
0223151 ◆0XlGlYK4pE NGNG
外野は黙ってろ
0224デフォルトの名無しさんNGNG
>>217
本物の 151 はアドバイスに従って「ふらっとC♯(Part5)」へ移動、
187=偽151が面白がってあらしている状態だと思う。
読んでないけど。
0225デフォルトの名無しさんNGNG
あの・・すいません・・
下のコードを実行すると、

public Form()
{
Init();
MessageBox.Show("form","");
}

private void Init()
{
MessageBox.Show("init","");
}

public void Form_Load(object s, EventArgs e)
{
MessageBox.Show("load","");
}

なぜか、
MessageBox.Show("form","");
MessageBox.Show("init","");
MessageBox.Show("load","");
の順番で実行(MessageBoxが表示)されます。
"form"と"init"の順番が逆な気がするんですが、なんでこうなるんでしょう(;´Д`)
プチパニック状態なんですが。
0226225NGNG
Application.Run(new Form())で、Formのインスタンスを作る指令(?)が出されて、
まずコンストラクタ(Form())が実行されて、
その中でInitが呼び出されて、
最後に、Loadイベントが発生するんですよね。

なんか勘違いしてるんでしょうか・・・
0227デフォルトの名無しさんNGNG
ん?おれは init->formの順で呼ばれたけど?
0228デフォルトの名無しさんNGNG
やってみたがちゃんと
init→form→loadの順でメッセージボックスでるぞ
0229デフォルトの名無しさんNGNG
問題なくバージョンにかかわらずinit->formだな。
0230225NGNG
すいません。
Form()の中でMessageBox.Show("init","");
Init()の中でMessageBox.Show("form","");
を呼び出してました。 orz
0231デフォルトの名無しさんNGNG
というか>>225の結果が不思議でならない
0232151 ◆0XlGlYK4pE NGNG
>>230
( ゚д゚)ポカーン
0233デフォルトの名無しさんNGNG
ここはひどいインターネッツですね。
0234デフォルトの名無しさんNGNG
気を取り直して次の質問
↓
0235デフォルトの名無しさんNGNG
c#stdを使っているのですが
ユーザーコントロールを配置して
デバッグしようとすると、ユーザーコントロールはビルドされていないとダメって
コンパイル時に起こられるのですが、みなさんはどうしてますか?
VS.NETproとかだとこういうエラーはでないんですか?
0236デフォルトの名無しさんNGNG
VS.NETだとソースにバグがあるとそのエラーで全部のコンパイルに失敗して
ユーザコントロールはビルドされていませんというエラーが出るけど、
バグを潰すとそんなエラーはでなくなって普通に動くよ。
0237デフォルトの名無しさんNGNG
プラグインで機能を拡張可能なアプリを作りたいです。
Win32ではDLLすら扱ったことないのですが、
.netでプラグインを実現するにはどういった方法がありますか?

構想としては、
例えばある基底型をアプリ側で用意しておいて、
プラグイン側ではそれから派生して新しい型を作ってDLLにして、
アプリ側でそのDLLを動的に読み込んでその型のインスタンスを作る、
なんて流れが出来ればなあと思っているのですが、。、。
0238 ◆FIcNi4f8js NGNG
SetWndClassEX
0239デフォルトの名無しさんNGNG
すまん、Genericsでなんだが
class hoge<T>
{
int num = 0;
T typ;

public hoge()
{
typ += num;
}
}
で、Tがint以外の時はエラーになるもんなん?

ボクシングが動くんだか動かないんだかよくわからんのですが・・・・。
0240151ホンモノ ◆Ibpv.GcsrQ NGNG
>>235はふらっとC#に私がカキコしたもので
誰かがこのスレにコピペしました。

でもレスしてくれたので返答します
>>236
ソース自体にはなんらバグはありません。
どうやら、C#stdではDLL化していないユーザーコントロールは
一緒にコンパイルしてくれない仕様みたいですね。
もともと、私のC#std2002はクラスライブラリ作れない仕様ですし・・・

結局現在は、Formでインスタンス化してユーザーコントロールを使ってます
また、ここで質問していたことすべて実現しました。
どうもお騒がせしました。そして結果的に荒れた原因も作ってしまい
申し訳ありませんでした。
0241デフォルトの名無しさんNGNG
>>239
なんでボクシングの話になるんだ?

operator + (T, int)
が定義されていないTだったら、どうやってもコンパイルできないだろ。
0242デフォルトの名無しさんNGNG
operator+=ではなくて?
0243デフォルトの名無しさんNGNG
>>237
ttp://vision.kuee.kyoto-u.ac.jp/~nob/doc/csharp/csharp.html
この辺が参考になるかな。

>>238
ttp://d.hatena.ne.jp/akiramei/searchdiary?word=%2a%5bC%23%5d
の下の方が参考になるかな?
Tが解決されるのはあくまで実行時。
Tに対して+なんて使うと問答無用でコンパイルエラーがでてしまう。
operatorはインターフェイスベースではないからwhereでの制限も不能なのだ。
0244デフォルトの名無しさんNGNG
>>242
はい、C++と勘違いしてる厨房がいますよ
0245237NGNG
>>243
貴重なページの紹介、ありがとうございます。

さっき書いた構想を、そのまま実装すればいいんですね。
0246デフォルトの名無しさんNGNG
public Class A()
{
  private ListView lv1=new ListView();
  private B b=new B();

  private Add()
  {
    lv1.Items.Add("test");
    b.Add(lv1.Items[0]);
  }
}
public Class B()
{
  private ListView lv2=new ListView();

  private Add(ListViewItem item)
  {
    lv2.Items.Add(item) //実行時にここで複数の場所に追加できませんとエラーでます
  }
}

なぜエラーが出るのでしょうか?
0247デフォルトの名無しさんNGNG
×private Add(ListViewItem item)
○public Add(ListViewItem item)
書き間違え
0248デフォルトの名無しさんNGNG
>>246
ListViewItem は、複数の箇所(複数の ListViewや、一つのListViewに複数回)に追加できないからです。
Clone でコピーを作るか、新しく new で作るかして追加してください。
0249デフォルトの名無しさんNGNG
>>248

b.Add((ListViewItem)lv1.Items[0].Clone);
か
b.Add(new lv1.Items[0]);

ということですか?
0250デフォルトの名無しさんNGNG
リストボックスがForm1と2にあって、form1のlistboxからform2のlistboxへ
ドラッグ&ドロップにてデータの受け渡しをするにはどうしたらいいのですか?
0251デフォルトの名無しさんNGNG
どのレベルでの解説を期待するのかな。
まずform2のListBoxのAllowDropをtrueにして、から?
0252デフォルトの名無しさんNGNG
>>250
ttp://dobon.net/vb/dotnet/control/draganddrop.html
■ このスレッドは過去ログ倉庫に格納されています