C♯相談室 Part16

このエントリーをはてなブックマークに追加
814812:04/07/26 12:25
原因はキャストか
MSIL だとチェックが入ってたような気がするけど、それが遅いのかな?

回避策……「BinaryReader で ReadByte、末尾は例外待ち」しか考え付かない

バイナリじゃなかったら StreamWriter.ReadToEnd とか使えるけど (確かそっちの方が速かった)
流されるデータがバイナリの場合があるので、Stream じゃないと変な変換入りそうで
こうするんだよ。
const int buffer_size = 1024*1024; // 1Mバイト
byte [] buffer = new byte [buffer_size];
int got;
do {
 got = iStream.Read(buffer, 0, buffer_size);
 oStream.Write(buffer, 0, got);
} while (got != 0);
>>815
ごめん、最後まで Stream.Write の 3 番目の引数に気づかなかった
普段 Stream なんて使わないから_| ̄|○
817デフォルトの名無しさん:04/07/26 23:52
1Mものバッファを使わないでくれ…
ちなみに2〜8Kくらいが速度的にベストなバッファサイズ。
大きすぎると逆に遅くなる。
819 ◆FLAlLDIW4w :04/07/27 00:35
> 一行で素敵な人生を送れます。
>
> MyLife.Idle += new EventHandler(TieUpLooseEnds);
>>818
C# だとそうなんだ。
C++ で大きい(数M〜2G程度)ファイルのコピーのときにはハードディスクの
内部バッファ(512K程度が多い?)あたりを指定するのが一番速かったけど。
メニューに CTRL-ALT-A のような、Ctrl キーと ALT キーを同時に押すことを
あらわすショートカットキーを指定するにはどうすればよいのでしょうか?

System.Windows.Forms.Shortcut 列挙体に定義がない。ということは WinForm アプリでは
Ctrl-Alt-A とかいうショートカットキーは定義できない?
Alt 単独の場合も数字(ALT-0 から ALT-9 まで)しかなく ALT-X とかを定義できないようなのですが..

C# というか WinForm の話なので、スレ違いならご指摘ください。
>>821
Altを含む、またはF10を含むキーの場合(はShortcutでいいか)、
ProcessCmdKeyをオーバーライドしてWM_SYSKEYDOWNを受け取ったときに動作を実装。
メニュー項目には\tの後にショートカット文字を手書き。
>>822
Alt-X は自分で実装ということですね。
Ctrl-Alt は SYSKEYDOWN にならないので、そちらは WM_KEYDOWN を使う。と。

なんでこんな中途半端なんだろう。

で、ctrl-alt はヨーロッパではアクセント付文字の入力にも使うので、RigthAlt と
Ctrl-LeftALt を別処理しなきゃいけないのだが、このへんの情報をもしお持ちなら..

Win32/MFC だとアクセラレータがこの処理をやってくれるんだけど、WinForm のメッセージ
ポンプに TranslateAccelarator を押し込むことってできましたっけ?
>>823
そっち方面には全く詳しくないので何とも言えないけど、
.NET Frameworkと簡単なP/Invokeで済ますなら
メッセージ/イベントを捕まえたときにGetKeyState関数でチェックするとか?
825デフォルトの名無しさん:04/07/27 15:51
C# + .NET Framework で作成するアプリケーションで作成する
アプリケーションで,そのアプリケーションを
タスクマネージャや,その他のランチャソフトから終了しようと
した場合に,それを感知する事はできますか?

自分のアプリケーションの中からの終了の時の処理と
外から終了させられる時の処理を変更させたいのですが….
for(int i=0; i< array.Length; i++) array[i] = i;
みたいなことをforeachで書き換えられますか?
Formの上にPanelを上下に2つおいてSplitterでサイズ変更
できるようにしたいんだけどうまくいかない・・・
上のPanelのDockをFillにしたいんだけど、どうすればいい?
>>827
そんなあなたにSplitContainer。

てのはおいといて、何がどううまくいかないのかさっぱり分からないのだけれど?
>>828
サイズ変更が出来ない。
DockがFillでサイズ変更・・・?
>>830
>  DockがFillでサイズ変更・・・?
それは問題ない。

>>829
その説明でどう理解しろと言うのだろう……?
とりあえずまっとうに動くサンプルコード。
Splitterの大抵の問題はControlにAddする順番か。
下のコードもAddRangeの配列の順番を変えると……。

public class Hoge : Form {
   public static void Main() {Application.Run(new Hoge());}
   public Hoge() {
      Panel p = new Panel();
      Panel q = new Panel();
      Splitter s = new Splitter();
      p.BackgroundImage = Image.FromFile("a.bmp");
      q.BackgroundImage = Image.FromFile("b.bmp");
      p.Dock = DockStyle.Fill;
      q.Dock = DockStyle.Top;
      s.Dock = DockStyle.Top;
      s.BorderStyle = BorderStyle.Fixed3D;
      Controls.AddRange(new Control[]{s, q, p});
   }
}
あー、DockStyleはご要望だとBottomになるか。
>>827
1. Panelを下に配置。DockをBottom
2. Splitterを配置。 DockをBottom
3. Panelを上に配置。DockをFill

順番が肝心。後でもできるがややこしくなったりしてしまう。
>>831-833
うまく動きますた。サンクス!
835 ◆FLAlLDIW4w :04/07/27 21:50
コントロールの位置関係は、Controlsの末尾から先頭に向かって順番に描画される
イメージさえ持っておけば全てが分かる。

領域が重なったコントロール同士は、
より先頭に近いほうがより手前に見える。

同じDockプロパティを持つコントロール同士は、
より末尾に近いほうがより外側に配置される。

DockStyle.Fillスタイルを持つコントロールより先頭側には、
DockStyle.None以外のスタイルを持つコントロールを置いてはいけない。
836デフォルトの名無しさん:04/07/27 22:09
自らのインスタンスをコピーする機能を実装する場合に
ICloneableインターフェイスをもつ形で明示的にclone()
を実装すると戻り値の型がObject型になり、使用する側で
キャストをかける必要があったりするわけだけど、なんか
他に良い方法は無いんでしょうかね。

VBなら別名としてICloneableのclone()をもちつつ、これを
別のclone()メソッドから呼ぶ方法があるみたいだけど、
C#でスマートな方法が無いものでしょうかね。
>>836
えーと、明示的なインターフェースの実装っていうと
public class A : ICloneable {
   object ICloneable.Clone() {...}
   public A Clone() {...}
}
みたいのを指すと思うんだけどそういうことじゃないの?
838デフォルトの名無しさん:04/07/27 22:27
普通にCloneメソッドも書けばいいだけ。
C#の明示実装はクラスのパブリックなインターフェイスからは消えるから、
名前を変えたりする必要なし。
StringCollectionなんかは最大限に使ってるね。
IListやらの返値・パラメータがobjectのを全部stringにしたメソッド・インデクサ。
840836:04/07/27 23:25
>>837,838
明示実装すれば同名のメソッドが共存できるのを
すっかり見落としていました。

どうもありがd
>>835
>>831のソースと思いっきり矛盾しているように見えるんだが。
>>841
どこが?
Controls.AddRange(new Control[]{s, q, p});
DockがFillのpを最後に置いてるから矛盾はしてないと思うが
> DockStyle.Fillスタイルを持つコントロールより先頭側には、
> DockStyle.None以外のスタイルを持つコントロールを置いてはいけない。



> DockがFillのpを最後に置いてるから矛盾はしてないと思うが

は明らかに矛盾しているように見えるんだが。
試してないんだが>>831のコードは本当に期待した通りに動くのか?
844843:04/07/28 00:31
ごめん勘違いスマソ逝ってきます
画面のプロパティで、画面のデザインのフォントをデフォルトのやつから変えているのですが、
作ったアプリケーションの中にあるTreeViewやListviewのフォントは
ちゃんとそのフォントで表示されるのですが、
途中で出すダイアログの中にあるラベルやComboBoxの文字だけは
デフォルト?のフォントのままで指定したフォントになりません。

指定したフォントにするには、どうすればよいのでしょうか?
>>845
ComboBox.Fontプロパティは?
>>846
ComboBoxを直接フォームに貼り付けたときは、
ちゃんと指定したフォントになるのですが、
ダイアログとか、ツールバーに乗せたComboBoxではだめなのです。

何かの設定をすると、いちいち全てのFontプロパティを設定しなくても、
指定したフォントになるんじゃないかと思うんですが・・・
848821:04/07/28 02:53
>>824
ご協力ありがとうございました。
そのあと調べましたが、MS としてはショートカットキーの組み合わせを絞る方針みたい。
ctrl-alt が Right-ALT にぶつかる問題が大きいのと、Ctrl や ALt とかが特定の
キーボード実装を前提にしているから。らしい。Java はどうやっているんだっけ。

こんなところ「だけ」抽象化されてもなぁ。
折角 TranslateAccelarator の内部で処理しているんだから、その機構を公開して
もらわないと。

VS, Office など MS 製品も ctrl-alt の組み合わせは多用しているのだが、MFC から
.NET に移行する際にどのように変更するのだろうか。
849821:04/07/28 02:57
>>824 に追伸
>メッセージ/イベントを捕まえたときにGetKeyState関数でチェックするとか?

それだけでは判断できないんです。
現在のキーレイアウトが Right-ALT をサポートしているかどうかの情報を
入手しないと判定できない。
公開 API には存在せず、TranslateAccelarator の内部で処理している。
あのー >>825 はスルーなんでしょうか?
851デフォルトの名無しさん:04/07/28 06:17
Processとかで外部アプリ起動させたりする場合、ファイルパスとかに全角の特殊記号(【】)とかが入ってる場合に
エラーとか出ませんか?俺は出てるんですが、これはどうすれば回避できるんでしょうか?
852851:04/07/28 06:29
ちがった。特殊記号じゃなくて、空白スペースでした。
「"」で囲めば?
>>851
そんなことは全くないが。

そもそもなんてエラーなのさ。
どんなコードなのさ。
>>850
「自分のアプリケーションの中からの終了処理」って自分で書いてるんだから、
その場合だけフラグでも立ててやればいいんじゃない?

具体的には、「閉じる」「終了」等のメニューやボタンで自分で終了するとき、
および WndProc で WM_SYSCOMMAND 捕まえて SC_CLOSE で閉じられるとき、
とか。
856デフォルトの名無しさん:04/07/28 12:11
if ($hoge =~ /[^a-zA-Z0-9.]/)
# Perlで「hogeにa-zA-Z0-9.以外の文字が含まれていたら」の意味

これをC#で書くにはどうしたらいいですか?
正規表現クラスを見ても複雑すぎてよく分からない。
if (Regex.IsMatch(hoge, "[^a-zA-Z0-9.]"))

言うほど複雑でもないけどね。
RegexIsMatchに該当するページが見つかりませんでした。
"regexismatch"を含むページは見つかりませんでした。

検索のヒント
- キーワードに誤字・脱字がないか確かめてください。
- 違うキーワードを使ってみてください。
- より一般的な言葉を使ってみてください。
859デフォルトの名無しさん:04/07/28 12:25
モーダルダイアログを表示し、textBoxになにかを入力させて、OKを押すと閉じるように成っています。
OKボタンを押した時に、textBoxの内容が正しいかどうかを検証する処理を入れました。
でも、OKボタンには DialogResultが設定されているので、
OKボタンのClickされたときの関数を通ると、フォームが閉じられてしまいます。
エラーのあるときは、フォームを閉じないようにするにはどうしたらいいんですか?
>>858 「.」が抜けているぞ。
>>858
○ Regex.IsMatch
× RegexIsMatch
目が悪くて文字が読みにくいなら、コピペしたほうがいいよ。
>>858
>  RegexIsMatchに該当するページが見つかりませんでした。
いつのまにC#は素性の知れない関数を扱えるようになったんだ?
ttp://www.google.co.jp/search?num=100&lr=lang_ja&oe=utf8&ie=shift_jis&q=Regex.IsMatch

>>859
正しくなかったときはDialogResultを設定しなけりゃ良いんじゃ?
859
DialogResult を None にしておいて、
Click のハンドラでエラーが無いときだけ this.DialogResult = DialogResult.OK; とでもしてみては?