ふらっとC#,C♯,C#(初心者用) Part27at TECH
ふらっとC#,C♯,C#(初心者用) Part27 - 暇つぶし2ch127:デフォルトの名無しさん
08/04/24 12:57:58
>>125
Recieveにはタイムアウト設定できたと思うが、Connectには無理だったと思う

128:デフォルトの名無しさん
08/04/24 13:46:50
>>127
はい、できません。
最近のWindowsなら、レジストリいじればシステムグローバルな
値は変更できると思うけど。
TCP周りのいろんな設定値はユーザーランドではいじれない実装の
OSがほとんどです。

129:88
08/04/24 18:30:05
>>126-128
ありがとうございます。


130:デフォルトの名無しさん
08/04/24 19:58:22
Equalsって何と発音するのでしょうか・・?

131:デフォルトの名無しさん
08/04/24 20:01:02
辞書引けよ

132:デフォルトの名無しさん
08/04/24 20:16:01
コンテキストメニューにショートカットを設定したいです。

メニューの数が可変であるためにVSに頼らず動的に作成しているのですが
生成番号に対応したショートカットを動的に与えるにはどのようにすればいいでしょうか
下記の様なイメージです。

Item1(&Alt + 1)
Item2(&Alt + 2)
Item3(&Alt + 3)

133:デフォルトの名無しさん
08/04/24 20:17:18
>>130
無理矢理日本語で言うなら「いーくぉーる」かな。
ちなみに日本語で言う「イコール」のことな

134:デフォルトの名無しさん
08/04/24 20:42:20
C#でWindowsUI付きのFTPクライアントを作っているのですが、
UI(WinForm)をロックさせないためにBackgroundWorkerを使用しています。
BackgroundWorkerからはFTPコマンドを扱うクラス(FTPClass)のメソッド(UploadMethod)を呼び出しています。
この時、UploadMethodの進捗をUI(WinForm)に表示させたいのですが、
この場合UploadMethodの中でWinFormのコントロールを操作する処理をさせるしか
ないのでしょうか?
(実際にはWinFormはSTAなのでBackgroundWorkerのメソッドを介してUI変更を行います)

というのも、その場合UploadMethod内のUI変更の処理は上位クラス(WinForm)の
実装を意識しないといけなくなるわけで、クラス間の結合が密になってしまうのは
好ましくないかなと感じまして。

135:デフォルトの名無しさん
08/04/24 20:43:02
>>130
いーくぁるず

>>132
ちょっと↑の方のレス見ろ

136:デフォルトの名無しさん
08/04/24 20:48:12
>>132
ショートカットを設定することは出来るが、Altは使えないんじゃないかな。
Altを押した時点でコンテキストメニューは消えると思う。

ショートカットの設定は、ToolStripMenuItemなら
.ShortcutKeys = (Keys)(Keys.D0 + i);
でできる。

137:デフォルトの名無しさん
08/04/24 20:49:45
>>135
レスありがとうございます。

>>84-87のところでしょうか?
私が行いたいのは(&Alt + 1)の数字の部分を要素にあわせてインクリメントする(イメージ)なので
コンテキストメニュー自体を動的生成している>>84-87とは問題が違ってしまいます。

説明不足申し訳ありません。

138:デフォルトの名無しさん
08/04/24 20:50:39
>>134
UploadMethodが進捗を返すのなら(返すか知らんけど)BackgroundWorker内で
PeportProcessイベントを発生させればフォームに進捗を伝えられる

139:デフォルトの名無しさん
08/04/24 20:55:59
>>132
なんか発想が変な気がするよw

別にコンテキストメニューである必要もないし、メニュの数を動的に変える
必要も必ずしもないんじゃないの?
ディセーブルにすれば十分に思うし、その方がユーザーにとっても明示的で
わかりやすいよ。

もしコンテキストメニュー「も」必要なら、ポップアップするタイミングで
メインメニューのメニューを丸ごと奪い取ればいいんだし。

140:デフォルトの名無しさん
08/04/24 21:00:15
>>137
括弧でアンダーラインが入ってるパターンのなら
ToolStripMenuItem.Text = "背景色に設定(&1)";
みたいに前に&つけるだけだよ

141:デフォルトの名無しさん
08/04/24 21:02:55
ショートカットキーのこと言ってるのかただのアクセレーターキーのこと言ってるのか
判然としないねw

いずれにせよちょっとピンボケした発想だと思う

142:デフォルトの名無しさん
08/04/24 21:08:29
>>136
レスありがとうございます。
ToolStripMenuItemでなくMenuItemで行ったのですが
.ShortcutKeys = (Keys)(Keys.D0 + i);でキャストエラー

.ShortcutKeys = (Shortcut)(Keys.D0 + i);でコンパイルは通りますが
実行時に「引数値'value'(50)は列挙型'Shortcut'に大して無効です。」とエラーになります。

>>139
ホットキーでコンテキストメニューを呼び出し全ての操作をメニュー上で行うという
かなり変則的なプログラムを作っております。
通常の操作であればディセーブルで十分なのはご指摘の通りだと思います。
レスありがとうございます。

>>140
レスありがとうございます。
えと、それはItem1(1)の1の下にアンダーバーが表示されるだけで
それだけでショートカットとして認識される訳ではありませんよね?


>>141
申し訳ありません。
ショートカットキーとアクセレーターキーの違いを知りませんでした。
アクセレーターキーを実装したいと考えています。

143:デフォルトの名無しさん
08/04/24 21:11:09
>>142
ねえ、だからそれメインメニューじゃいかんの?
なんでそんなウィンドウズの標準のお作法から外れたことをしたがるのか理解できんよ。

144:デフォルトの名無しさん
08/04/24 21:31:03
>>138
UploadMethod内では
1.アップロードファイルの確認
2.アップロードコマンドの発行
3.アップロードコマンドの終了
と3つのプロセスに分かれているのですが、それぞれのプロセスが終了するごとに
UIに通知したいと考えています。各プロセスをさらにメソッド単位に分解し、
それぞれの完了ごとにReportProgressを呼ぶことも考えましたが、何かスマートな方法
は無いかものかと。

例えばWinForm側にリスナのようなものを追加し、それぞれのプロセスが終了するごとに
イベントを発生させ、リスナからReportProgressを呼び出す。と言ったような事は
可能なものでしょうか?

145:デフォルトの名無しさん
08/04/24 21:34:26
>>142
デザイナで実際に設定してみればわかると思うけど、ショートカットにはCtrlかAltが必ず必要だったと思う。
それにデザイナで設定できることは、実際に設定してみてDesignet.csがどう生成されたか見るのが早い。

ToolStripMenuItem.ShortcutKeys = (Keys)(Keys.Alt | (Keys.D0+i));
試してないけどみたいな感じで出来るんじゃないかな。

146:デフォルトの名無しさん
08/04/25 05:48:07
>>143
必ずそういうこと言う人がいるけど質問者の条件を変えようとするレスは書かなくていいです。

147:デフォルトの名無しさん
08/04/25 07:32:18
>>144
可能
Javaの人?

148:デフォルトの名無しさん
08/04/25 08:21:57
>>146
君のような思考を「フェティシズム」って言うんだよ

149:デフォルトの名無しさん
08/04/25 09:45:18
フェチのこと?
なんで?

150:845
08/04/25 09:46:50
変な仕様を指摘すると「お前は言われたとおりに組んでればいいんだよ!」とかいう奴はいるなぁ
たいては後で直さなきゃいけなくなるんだけど

151:デフォルトの名無しさん
08/04/25 10:18:54
お前誰だよ↑
仕様にケチつけると話題がそっちに流れるだろ。
もうちょっと考えような。

152:デフォルトの名無しさん
08/04/25 10:38:38
奇妙な仕様を指摘して何が悪いんだか。

153:デフォルトの名無しさん
08/04/25 11:00:52
ファシズムって言いたかったとエスパーw

154:デフォルトの名無しさん
08/04/25 11:17:48
むしろ悩んでる原因は変な仕様だってことが多いからな

155:デフォルトの名無しさん
08/04/25 11:20:40
別にケチつけるわけじゃなく、スタンダードな方法を提示したレスをするならいいと思うけどね

156:デフォルトの名無しさん
08/04/25 11:21:45
まあ大体の初心者は変な思いつきと思い込みで阿呆な仕様にしてるよねw

157:デフォルトの名無しさん
08/04/25 12:11:42
>>155
それならいいよね。建設的だし。
でも批判するだけなら分かってない人でも出来ちゃうから厄介。

158:デフォルトの名無しさん
08/04/25 12:20:54
>>147
JavaとC#の二束の草鞋です。
C#の場合はリスナそのものに該当する仕組みは無く、
delegateを使用してリスナ相当を実装する必要があるのかなと考えているのですが


159:デフォルトの名無しさん
08/04/25 13:10:50
フォーム操作可能にしたいマルチスレッドならdelegate()が一番簡単と思うけど

160:デフォルトの名無しさん
08/04/25 13:21:20
>>158
①FtpClassにOwnerプロパティを実装

 public Form Owner{ get; set;}

②UploadMethodを呼ぶ前にOwnerにthis(つまりWinForm)をセット

 ftpClass.Owner = this;

③UploadMethod内のイベントを通知したいタイミングでOwner.Invoke()を呼ぶ

 if(Owner!=null && UploadFileCheckEventHandler != null)
  Owner.Invoke(UploadFileCheckEventHandler(FtpEventArgs))


これでどうだろうか
 

161:158
08/04/25 13:28:19
ちと変だな
訂正

public event FtpUpLoadEventHandler UpFileChecked;
public event FtpUpLoadEventHandler UpLoadStarted;
public event FtpUpLoadEventHandler UpLoadFinished;

こんなようなイベントを実装して、

if(Owner!=null && UpFileChecked != null)
  Owner.Invoke(UpFileChecked(FtpEventArgs))

とかで呼び出す

162:デフォルトの名無しさん
08/04/25 14:37:12
>>160
C#のイベント処理に疎いので、少し教えていただきたいのですが、
この場合Ownerで示されるFormクラスのインスタンスに、UpFileCheckedイベントが通達
されるという認識でよろしいでしょうか?

その場合、Owner.Invokeでイベントを発行している形なので、FTPClassがイベントを
通達できるのはFormクラスのインスタンスに限られてしまい、FTPClassはFormクラスと
依存関係になってしまうのではと考えているのですが。

163:デフォルトの名無しさん
08/04/25 14:49:02
C# (.NET) でコントロールを透明化したいんですけど、
obj.Parent 以外に対しても透明化というのは、無理なんでしょうか?
もしくはレイヤードパネルみたいなものはないですか?

やりたいのは
// A,B 両方表示(A,B は完全に重なっているコントロール)
A.Parent = parent;
B.Parent = parent;

// A だけ表示
A.Visible = true;
B.Visible = false;

// B だけ表示
A.Visible = false;
B.Visible = true;

みたいなことなんですが・・・

164:134
08/04/25 14:58:41
すいません今更ですが >>134
×(実際にはWinFormはSTAなのでBackgroundWorkerのメソッドを介してUI変更を行います)
○(実際にはWinFormはSTAなのでWinFormのInvokeメソッドを介してUI変更を行います)

165:デフォルトの名無しさん
08/04/25 15:12:27
>>164
FTP クラスが ProgressChanged みたいなイベント公開すればいい。
アップロード中に適当に状況が変わるなりすればイベントを起動する。
Form は その ProgressChanged イベントのイベントハンドラで Invoke して GUI に反映させる。
Owner はいらんな。SynchronzingObject ならあってもいいけど。

166:デフォルトの名無しさん
08/04/25 21:45:27
>>163
見た目を気にするなら諦めてWPFに乗り換えましょう

167:デフォルトの名無しさん
08/04/25 22:03:36
URLリンク(proxy.f3.ymdb.yahoofs.jp)
これを見た感想おしてください(しょぼすぎますがその辺はご了承ください)

168:デフォルトの名無しさん
08/04/25 22:06:55
>>158
二足のわらじって、君思いっきりJava脳じゃん?
まぁ>>161でもちらっと出てるけどeventを作ればいいよ
URLリンク(dobon.net)

169:デフォルトの名無しさん
08/04/25 22:10:55
>>167
たいへんよくできませんでした

170:167
08/04/25 22:12:08
それは自分でも自覚してる。
あとどんなものつけたら面白くなりますか?

171:デフォルトの名無しさん
08/04/25 22:28:51
はじめはこんなもんだとは思うけどとりあえずgotoは封印しましょう
同じような処理はメソッドにまとめましょう

どうでもいいけどhRandomっていう名前がキモい
参照型変数にhを付けることにしてるのか知らないけどそんなのあんまり意味無いし
付けるならslotにも付けないとおかしい

172:デフォルトの名無しさん
08/04/25 22:29:17
>>167
感想言っていいのか?本当にいいのか?

173:デフォルトの名無しさん
08/04/25 22:31:06
いいよ

174:167
08/04/25 22:36:02
この場合gotoつかわないとすれば何つかえばいいですか?

175:デフォルトの名無しさん
08/04/25 22:37:36
Hyoujiメソッドを呼び出せばいいんじゃないか?

176:デフォルトの名無しさん
08/04/25 22:40:27
>>160,165,168
教えていただいたことを参考にFTPClassにイベントを追加し
呼出元でイベントをハンドリングすることで希望通りの動作ができました。
ありがとうございました

177:デフォルトの名無しさん
08/04/25 23:08:55
>>167 とりあえずコメントは書こうな
using System;
class slot{
static void Main(){
Console.Write("コインのもち数を入力してください");
int coin = int.Parse(Console.ReadLine());
int bell = 10,suika = 6,replay = 3;
int[] slot = new int[9];
Random rand = new System.Random();
while (coin >= 3){
coin -= 3;
int koyaku = rand.Next(1, 101);
//スロットの値設定
for(int i = 0;i < slot.Length;i++){slot[i] = rand.Next(1,4);}
//約100回に一回当たるよく分からないなにか
if(koyaku == 1){
coin += 5;
Console.Write("○ ○ ○\n○ 5 ○\n○ ○ ○\ncoin={0}\n\n",coin);
}
//通常処理
for(int i = 0;i < slot.Length;i+=3){
if(slot[i] == slot[i+1] && slot[i] == slot[i+2]){
coin += (slot[0] == 1) ? bell : (slot[0] == 2) ? suika :replay;
}
}
//表示
for(int i = 0;i < slot.Length;i+=3){Console.Write("{0} {1} {2}\n",slot[i]+i, slot[i+1]+i, slot[i+2]+i);}
Console.WriteLine("ncoin=" + coin);
Console.ReadLine();
}
}
}

178:167
08/04/25 23:25:09
177さん手直しありがとうございます。
プログラム初心者なんでそんなfor文使うなんて考えてませんでした。
ありがとうございます。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch