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

C♯相談室 Part17

■ このスレッドは過去ログ倉庫に格納されています
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
0153130NGNG
>>131
>>139-140
ありがとうございました。
教えて頂いたことを参考にもう一度やってみます。
0154デフォルトの名無しさんNGNG
>>152
一般論だけど、自分で作ったものじゃないものを勝手に Dispose しちゃダメ。
キミが作った Graphics を、誰かのコードに「ここに描いてね」ってことで渡したら、
勝手に Dispose されたりしたら嫌でしょ。
0155デフォルトの名無しさんNGNG
Winnanpみたいにスキンを使いたいんですが、どうしたらいいでしょうか?
0156デフォルトの名無しさんNGNG
>154
アメリカならドキュメントに消しちゃ駄目と書いてなかったといってMSを訴えられるかもしれないがここは日本です.
0157デフォルトの名無しさんNGNG
>>155
SetRegion
0158デフォルトの名無しさんNGNG
HSPとC#で同じフォントサイズで文字を描画させたら違うのはなぜですか?
ちなみにHSPではフォントの大きさをドット数に比例した論理サイズで指定してあります。
0159デフォルトの名無しさんNGNG
突然なんですが……
他人の漢字で関数を書くという奴を見て激しく憤慨していたのですが、
こんどは自分が、最近数学的なライブラリーを作っていて激しくギリシャ文字を使いたい衝動に駆られます
使ってもいいですか(汗

世界中がマルチバイト対応の時代がこないかな……
そんなことを思った人挙手(^^)/
0160デフォルトの名無しさんNGNG
>>159
他人を激しく憤慨させるつもりがあるなら書けば?
0161デフォルトの名無しさんNGNG
点を描画する関数はないのでしょうか?
0162デフォルトの名無しさんNGNG
unmanaged コードで作成した DLL を C# から呼びたいとおもっています.
通常の関数であれば問題なく呼べているのですが,コールバックを受け取る方法
がわかりません.

コールバックはどのように受けとればよいんでしょうか?
0163デフォルトの名無しさんNGNG
>>161
Graphics.FillRectangleで代用?

>>162
そのコールバック関数と返値・仮引数を同じにしたデリゲート。
0164デフォルトの名無しさんNGNG
>>163
今はDrawRectangleでwidthとheightを1にして代用していますが、
かなり大量に描画する予定なので出来ればもっと簡単に処理出来るものはないかと思ったのですが・・・
0165最凶VB厨房NGNG
BitmapクラスにはSetPixelというのもあるが、だめか?
0166デフォルトの名無しさんNGNG
>>164
Win32APIのSetPixel関数かな。
どのみちあんまり「簡単に」とは行かないような気がするけど。

Bitmapオブジェクトが取得できるならBitmap.SetPixelがベストだけれど。
0167デフォルトの名無しさんNGNG
C++のようなローカル変数のconstはどう書けばよいのでしょうか?

private void timer1_Tick(object sender, System.EventArgs e)
{
   string s = text1.text; // <- constにしたい。
// これ以降sを変更したくない。

おねがいします。
0168デフォルトの名無しさんNGNG
C# で
PathAddBackslash()
PathRemoveBackslash()
に相当するものはありますか?
0169デフォルトの名無しさんNGNG
>>168
たぶん無いと思うけど、それくらいすぐ実装できそうだな。
0170168NGNG
>>169
そうですか。ありがとう。
0171デフォルトの名無しさんNGNG
>>167
readonlyじゃね?

…と思ったらローカル変数に使えなかったスマン。
0172デフォルトの名無しさんNGNG
>>167
private void timer1_Tick(object sender, System.EventArgs e)
{
   string s = text1.text; // <- constにしたい。
// これ以降sを変更したくない。

   if(s != text1.text){
    MessageBox.Show("変更するなつってんだろゴルァ!!!!!!!!");
   }
}
0173デフォルトの名無しさんNGNG
>>172
text1.textを変更しただけなのに文句言うなよ。
0174デフォルトの名無しさんNGNG
Monitorを使ってて不思議に思ったのですが

private void button1_Click(object sender, System.EventArgs e)
{
Monitor.Enter(bitmap);
//テキトーなビットマップをロック
textBox1.Text = "適当に";
}

のイベントを起こした後、
Monitor.Exitを実行していないのに

private button2_Click(object sender, System.EventArgs e)
{
Monitor.Enter(bitmap);
//同じビットマップでロックを取得
textBox1.Text = "これは表示されないはずなのに";
}

↑これが実行されてしまいます。
スレッドとイベントなら同期が取れるのですが・・・。
0175デフォルトの名無しさんNGNG
>>174
同一スレッドでEnterしてるからじゃない?
0176デフォルトの名無しさんNGNG
>>175
ありがとうございます。
MSDN読んでもピンとこなかったで助かりました。
0177デフォルトの名無しさんNGNG
>>174
Monitor も良いけど、
っていうか過去に Monitor つかえみたいなこと書いた気がするけど、C# なら
Monitor.Enter(obj)
try { ... }
finally { Monitor.Exit(obj); }
の簡易文法であるところの
lock(obj) { ... } も便利ですよ。
0178デフォルトの名無しさんNGNG
まあ、>>174みたいにブロックじゃない形で使いたい場合は仕方ないでしょ。
ブロックにできるのであれば普通lock使うけどね。

しかし一番の問題は、>>174がMonitorの用途を誤解しているようだと言う事…
まあ理解したんならいいんだけどね。
0179デフォルトの名無しさんNGNG
>>168
この流れで質問だけど、単純に『パス』って言った場合、最後に \ は付くの付かないの?
0180デフォルトの名無しさんNGNG
FontDialog にヒラギノ系フォントを表示させたいのですが
何かよい方法はないでしょうか

FontDialog
Show何タラプロパティ
Allow何タラプロパティ

すべて試してみたのですがだめでした。
0181デフォルトの名無しさんNGNG
>>179
質問の意味はよくわからんが、とりあえずPathクラスの各メソッドが返す文字列にバックスラッシュはつかんな。
0182デフォルトの名無しさんNGNG
>>158
GDIとGDI+では表示が異なるので仕様
0183デフォルトの名無しさんNGNG
while(true){
try{}
catch{}
finally{}
}

とリリースモードで実行するとfinally節が実行されません。
しかし
int i= 0;
while(i < 1)
とやると(iの値は変化しないので事実上無限ループ)
リリースモードでも問題なくfinally節が実行されます。
なぜwhile(true)だとfinallyが実行されないんでしょうか?
0184デフォルトの名無しさんNGNG
>183

optimizer が『while の中には実行しなければならないものは無い』と判断して
丸ごと消してしまったのでは?
0185デフォルトの名無しさんNGNG
>>183
finally節が実行されないことをどうやって確かめたの?
0186デフォルトの名無しさんNGNG
>>184
それはVisualStudioの設定なんでしょうか?

>>185
実際にはfinally節にMessageBoxを仕掛けて確かめました。

SharpDevelopだと同様のことをやってもちゃんとfinallyが実行されるので
やはりVisualStudioのリリースモードが何かをやってれるのだと思うのですが
0187デフォルトの名無しさんNGNG
>186

MessageBox 仕掛けてるのに無視ってのは optimize されたにしてもマズいよなぁ。

# もしかして optimizer の bug ?
0188デフォルトの名無しさんNGNG
>186
VC++6.0のときだけれど、同じようなのありますよ.
アセンブラで見てもコードがない.
デバッグだとある。最適化全部消して解決しました.
Optimiseなんて信用してません.
0189デフォルトの名無しさんNGNG
ループを抜ける条件が無い時点でそんなコードを書いたり実行する機会は無いし、
どうでもいい。
0190デフォルトの名無しさんNGNG
>>188
やっぱり仕様なんですかね・・・
割り切ることにします。
情報ありがとうございました。
0191デフォルトの名無しさんNGNG
>>186
具体的にどんなコードなの?
ILDASMで見てもやっぱりfinally句はなくなってる?
0192デフォルトの名無しさんNGNG
VisualStudioとSharpDevelopで違うってのが釈然としないなあ。
コンパイルってどっちも結局CSCでやってんでしょ?
0193デフォルトの名無しさんNGNG
.GetHashCode()で得られる値というのは
何に活用するものなのでしょうか?
0194デフォルトの名無しさんNGNG
…
Object.GetHashCodeのヘルプをみれ。
0195デフォルトの名無しさんNGNG
>>192
くっついてるコンパイルオプションの問題じゃね?
0196デフォルトの名無しさんNGNG
うーんでも最適化関連で生成コードが変わるようなオプションて
一つしかないような気がするしね…
例えばSharpDevelopがリリースビルドでも最適化を有効にしてないとかなら
分かるけど、そんなことはないような気がするし…
0197デフォルトの名無しさんNGNG
参照設定したDLLをEXEに埋め込む方法ってあるの?
0198デフォルトの名無しさんNGNG
>>197
基本的にない。
0199デフォルトの名無しさんNGNG
>>197
自己解凍実行形式の圧縮ファイルを作れば
0200デフォルトの名無しさんNGNG
そ、それは…いいのかそれで?
0201デフォルトの名無しさんNGNG
これで、いいのだ!!!
0202デフォルトの名無しさんNGNG
EXEと一緒に配布するDLLを
他のプログラムからは参照させないようにしたいんだけど、できますか??
0203デフォルトの名無しさんNGNG
DLLファイルを分割して配布し実行時に結合してDLLとして使用する.
できるかしらんが駄目?
0204デフォルトの名無しさんNGNG
別に分割せんでも暗号化しておいて実行時に複号とかのほうが。
まあ分割だろうが圧縮だろうが暗号化だろうが技術的には可能だけど、
C#でやることじゃあない気がするな。
0205デフォルトの名無しさんNGNG
頭の中でもぼんやりとしているので曖昧にしか書けないのですが,

全く同じ関数名の関数を持つ,2つのクラスがあります.

これらを利用するコードはある条件をみて,
その2つのクラスのどちらの関数を利用できるかを判断したいと思っています.

例えば ClassTestNo1, ClassTestNo2 とあり,
それらの中でそれぞれ MethodTest という関数が定義されている時に,

それを呼び出すコード は

ClassTest.MethodTest();

のように呼び出したいのです.で,なんらかの条件による判断で,
ClassTest が ClassTestNo1 なのか ClassTestNo2 なのかは
動的に決定したい,という事が行ないたいです.ただし,
ClassTestNo1, ClassTestNo2 は Static で定義されているので,
利用する前に条件を見て,new すればいい,という事はできません.

なにかアドバイスを頂けないでしょうか?
0206デフォルトの名無しさんNGNG
>>205
設計をやり直す。


てのはともかくとして、動的に判断する以上利用者側が判断用のboolをもってるんだろう?
ClassTest.MethodTest(bool)
にすればいいんでないの?
0207デフォルトの名無しさんNGNG
>>205
僕も最近それに近い事をしているので、どぞ
こんな雰囲気のコードでいけると思います。
object hoge = new ... ;
if( hoge.GetType().GetMethod( "MethodTest" ) == null )
{
ClassTestNo1();
}
else
{
ClassTestNo2();
}
とか、こんな感じ
GetMethod の戻り値オブジェクトにイカしたメソッドがいっぱいあります。
0208デフォルトの名無しさんNGNG
>>207の続き

ん、205の用件とちょっとズレてる気がする
これは MethodTsetがあるかどうかで、呼び出す関数を決めてますが、
適当に変えてください、肝はGetMethod()なので、これでも十分と思ので。
0209デフォルトの名無しさんNGNG
>>208
うーん、うーむむGetMethodが肝なのか…?
0210デフォルトの名無しさんNGNG
>>205
これでOK?

if (ClassTest is ClassTestNo1)
{
}

マーカーインターフェースを利用する際によくやる手だけれども。
0211デフォルトの名無しさんNGNG
てか、呼び出す静的メソッドを切換えたいだけだろ?
ClassTestからアクセスできる形で条件に合わせてデリゲートでも作っとくか、
呼び出された時点で条件判断して呼び出すメソッド変えたらいいんじゃないの?

2種類しかないなら、まあ後者のやり方でもいいかな。
デリゲート使う方が柔軟ではあるけど。
0212デフォルトの名無しさんNGNG
デザインパターン的には大体こんな感じかな?

interface IClassTest { void MethodTest(); }
class ClassTestNo1 : IClassTest { 略 }
class ClassTestNo2 : IClassTest { 略 }

class ClassTest{
 public static IClassTest classTest;
 public static void MethodTest(){
  classTest.MethodTest();
 }
}


//呼び出し側
ClassTest.classTest = new ClassTestNo1();
ClassTest.MethodTest();
ClassTest.classTest = new ClassTestNo2();
ClassTest.MethodTest();
0213デフォルトの名無しさんNGNG
Cだと、入力された文字がアルファベットかどうか調べる場合

char c;
if ( (c <= 'a' & c >= 'z') == (c <= 'A' && c >= 'Z') )
{
  処理;
}

みたいな感じで切り分けられましたが、C#の場合はどうすればいいんでしょうか?
正規表現を使うしかないんでしょうか。。
0214デフォルトの名無しさんNGNG
>>213
charにキャストしてやるとか。
0215213NGNG
>>214
stringの中だけで考えていたんですが、charを見てみると
IsLetter()のような便利な関数を発見しました。
ありがとうございます。
0216デフォルトの名無しさんNGNG
>>213
お前はヘルプというものを読んだことがあるか?
char.IsLetter(c);
0217デフォルトの名無しさんNGNG
うーん回答がずれてる希ガス
てかcharにキャストって出来ないと思うが…

charでは取得できてるんじゃないの?
その場合は、char.IsLetterとかでできんかいな?

あとどうでもいいが、>>213の条件はいったいなんだ?
ちなみにCでも普通は文字コードを直接条件に書くようなことはしない。
0218デフォルトの名無しさんNGNG
>>215
.NETはUnicodeだということを忘れずに。
Char.IsLetterは、例えばギリシャ文字のアルファベットもtrueを返す。
0219デフォルトの名無しさんNGNG
すまん>>217は>>214に対してね。
書いてるうちに進んでた…
0220デフォルトの名無しさんNGNG
つーかお前らがこの条件見てなんとも思わないのが不思議だ

> if ( (c <= 'a' & c >= 'z') == (c <= 'A' && c >= 'Z') )

これどういう意味よ?
0221デフォルトの名無しさんNGNG
>>217が突っ込み済み
0222デフォルトの名無しさんNGNG
>>221
ごめん、確かに
俺一生懸命この条件の真の意図を考えてたよ
0223デフォルトの名無しさんNGNG
プログラムが実行されているディレクトリを調べるにはどうしたらいいですか?
0224デフォルトの名無しさんNGNG
実行されているディレクトリとは、
カレントディレクトリ、EXEのあるフォルダ
どっち?
それともアプリケーションベース?
0225デフォルトの名無しさんNGNG
>EXEのあるフォルダ
です。
0226デフォルトの名無しさんNGNG
>>222
おれも、実はすっごいひねくれてる条件で、
正しく動くのかと検証しかけたんだが…
> (c <= 'a' & c >= 'z')
&は誤植としてもこの時点でありえね〜って結論になった…
0227デフォルトの名無しさんNGNG
System.WIndows.Forms.Application.ExecutablePathだったかそんなの。
0228デフォルトの名無しさんNGNG
あ、フォルダだったか、それなら、System.IO.Pathだったか使って加工してくれ。
加工せんでも直接取れるプロパティもあったかも、ちょっと失念。
0229デフォルトの名無しさんNGNG
Application.StartupPathだね。
0230デフォルトの名無しさんNGNG
見つかりました。
有難うございます。
0231過去の自分NGNG
過ちを繰り返す未来の自分へ

.NET Frameworkがインストールできなくなったら
MSサポート技術情報英語版824643
http://support.microsoft.com/default.aspx?scid=kb;EN-US;824643
0232デフォルトの名無しさんNGNG
.NET2003のC#のフォームエディタでフォームをデザインしたけど
それがどのようなプログラミングで再現されているのか知りたいのですが方法はありますか?

たとえばJavaでいえば
jPanel1.addComponent(jTextField1);
jTextField1.setText("abcdef");
こんな感じの奴です。
おそらくInitializeComponent();あたりが怪しいと思うのですが・・・
0233デフォルトの名無しさんNGNG
>>232
InitializeComponent() のなかにある。
何が分からない?
0234デフォルトの名無しさんNGNG
>>233
.NET2003のソースエディタでは非表示になっていたから分かりませんでした。
今、別のテキストエディタで見たらちゃんと記載されてました。
0235デフォルトの名無しさんNGNG
天然モノでつか?
0236デフォルトの名無しさんNGNG
本物のバカ再来だな。
0237デフォルトの名無しさんNGNG
>>236
自己紹介板のリンク張った方が良いですか?
0238デフォルトの名無しさんNGNG
> それがどのようなプログラミングで再現されているのか

天然丸出しの文章だね、プッ
0239デフォルトの名無しさんNGNG
結局Genericsを正式につかえるようになるのはいつ頃になりそうなんでしょう?
Whidbeyは2005年半ばになるらしいけれど、それまでは待ちたくない...
どこかのサイトで.NET1.1でもC#用としてだけならGenerics使えるコンパイラがあるとかいてあったようなきもしましたが.
0240デフォルトの名無しさんNGNG
複数行可能・初期状態まっさらの TextBox に行を追加するのって
TextBox.AppendText( text + "\n") で良いんだよな?

何で表示されないんだろ?
0241デフォルトの名無しさんNGNG
\nだけでよかったっけ?
\r\nにしたらどうなる?
0242240NGNG
>>241
Line にはちゃんと別の行として反映されてる
けど表示がサパーリ
追加しても何も表示されないか、同じ行に書かれる

TextBox って、BeginUpdate みたいな機能ないよなぁ
なんでだろ
0243デフォルトの名無しさんNGNG
単にtextBox.ScrollBarsがScrollBars.Noneになってて見えないだけとか言わないよな?
0244240NGNG
>>243
Both で作ったし、そもそもデバッグ時に画面いっぱいに広げていたから多分違う
0245デフォルトの名無しさんNGNG
ちゃんと複数行になってる?
0246デフォルトの名無しさんNGNG
>>245
MultiLine は true
false でも変わらなかったが
0247デフォルトの名無しさんNGNG
TextBoxの大きさがないと見た
0248デフォルトの名無しさんNGNG
textBox1.AppendText("\r\n");
でできたんだけど
0249デフォルトの名無しさんNGNG
Environment.NewLine 使え。
0250デフォルトの名無しさんNGNG
まったくだ。
0251240NGNG
一旦削除して作り直したら同じコードでも上手くいった
なんだったんだ一体?
0252デフォルトの名無しさんNGNG
>>251
バグの犠牲者
■ このスレッドは過去ログ倉庫に格納されています