ふらっとC#,C♯,C#(初心者用) Part30
1 :
デフォルトの名無しさん :
2008/08/20(水) 17:15:27 このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。
>>980 を踏んだ人は新スレを建てて下さい。
>>980 が無理な場合、話し合って新スレを建てる人を決めて下さい。
前スレ
ふらっとC#,C♯,C#(初心者用) Part29
http://pc11.2ch.net/test/read.cgi/tech/1216734995/
おっつ やっぱり立てたのね
C#と直接関係ないのですが、マニュアルを書くときにメニューの 展開時の画面をキャプチャーするにはどうすればよいでしょう? 展開時に別のキャプチャー用の画像取り込みソフトを操作すると 展開していたメニューが引っ込んでしまいます。これを取り込むため には通常はどのような方法で行うのでしょう。よろしくお願いします。
キーでトリガにするとか、時間で撮ってくれるソフトとかあるよ。 まあオレはWindows標準の機能(PrintScreenキー)使ってるけど
いちもつ
普通にAlt + PrintScreenだろ普通は。
ソフト使うにしても
>>6 の言うようにホットキー設定すればいいし。
つかそんなことも分からんやつがC#で開発なんかできるのか?
C#どころかWindows質問スレレベルだし
>>6 >>8 >Alt + PrintScreen
わかりました。ありがとうございました!
まあAltはメニュー出してるときは無理だけどなw マルチディスプレイでAlt無しで2画面分丸ごととって切り取る。
11 :
8 :2008/08/21(木) 14:40:41
>>10 あ、ほんとだ盲点だわw失礼。
まあ全画面キャプチャから欲しいところだけ切り取ればいいよね。
12 :
デフォルトの名無しさん :2008/08/21(木) 21:14:53
>>11 そんな面倒なことをしないための方法を聞いているのだろ。
そんなことも分からんやつがC#で開発なんかできるのか?してんのか?
C#どころかWindows質問スレレベルに答えられていない。
じゃあキミが答えてやれよ 質問者は満足して帰っちゃっただろうけど
面倒だからビデオにでも撮れ
ファイルにデータを追記しようと思うのですが、 ファイルの先頭に追記するのと末尾に追記するのではどちらが負荷がかかりますか? また、新規ファイルに書き込むのと比べてどちらの負荷が大きいでしょうか? よろしくお願い致します。
先頭に追加しようと思ったら、残りを全部後ろにずらさなきゃならない。 ってことだ。 分かるよな。
18 :
デフォルトの名無しさん :2008/08/22(金) 00:30:29
自分からテスト専門です、って宣言してる派遣テスターって何なの? 将来プログラマとかSEになりたい、とかならわかるけど。 向上心ないよね、頑固だし。 そういう派遣テスターって、仕様書は読めない、 テスト仕様書も作れない、テストプログラムも作れない やれることは「テキトーにプログラムを触る」ことだけ。 俺は派遣プだけどさ、こういう派遣テスターがいると 派遣全体がバカにされるんだよ。 テスト専門派遣なんて氏んで欲しいよ、まったく。 今日も正社員の人が派遣テスターに仕様書を読んで テスト仕様書を作ってください、って説教してたよ。 その派遣は頑固に「何故、仕様書が必要なんですか?」って 反論してたから、きっとテスト専門派遣テスターだな。 仕様書も読まず、テスト仕様書も作らず、ただテキトーに プログラム触るだけで給料もらおうなんて頭おかしいんじゃねーの? あ〜あ、あの派遣テスターが3ヵ月後に切られるまで、 仕様書も読まねーでテキトーにテストしたバグ票がまわってくんのかよ。 そんな糞なもん、読んで処理する派遣プの身にもなってくれよ。 うわ〜、しかもそいつが切られる3ヵ月以内に中間納品あるじゃねーか! テスト仕様書もなしにテキトーにテストして納品か。 中間納品後にソッコウクレームでデスマ必至だな。俺の休みも返上かよ。 派遣専門テスターさんよ、少しは向上心持てよ! 頑固な性格直して仕様書読めよ!テスト仕様書作れよ!
コピペ君が多いな
>>15 ファイルの大きさや
>末尾に追記する
の方法による。下手すりゃ
>新規ファイルに書き込むのと
と同じになる。
今あるファイル(■)がディスク上に ◆◆■■■■■◆◆ってあったら、ここに追記したら激しく断片化しない? それとも、◆◆■■■■■□◆◆の様に常に余裕をみて割り当ててるの? 多少空き領域は断片化するかもしれないが、ファイルは断片化しにくいと思って毎回新しいファイルとして作ってた(その方が楽だし) ◆◆□□□□□◆◆■■■■■■■■
結局全部読むならいっしょやん
>>21 ただ記録しておくだけのログみたいなものなら別に断片化してもかまわないし、
後から何度も読むにしても断片化した大きなファイルを読むのと、
バラバラに配置された複数のファイルを読むのとでは時間にそれほど差はないと思うよ。
読み出すのに少しでも速度が必要ならば、予めある程度の大きさの領域を確保しておく他ない。
>>21 お前さんがうだうだ考える程度のことはファイルシステムの設計者やWin32APIの設計者は考慮済みだと思うよ
>>21 [゚д゚] ・・・・。
/[_]ヽ
| |
◆◆□□□□□◆◆■■■■■■■■
>>21 どうせ新しく書き出すなら、一旦別の名前で書き出してから
(古いのを削除し)本来の名前に変えるようにしたほうがいい。
こうすると、もし書込み中に死んでしまっても、古いファイルが残っていて安心できる。
断片化を気にする男の人って・・・・
そんなことより、きっちりかっちりシンメトリーかどうかを気にしろよ
29 :
デフォルトの名無しさん :2008/08/22(金) 17:06:28
普通の男なら気になるだろw
30 :
デフォルトの名無しさん :2008/08/22(金) 17:07:30
ListBoxのオーナードローで、各項目に UserControlを貼り付けるようなことってできるのでしょうか?
>>31 WPFを使えば簡単にできるよ。オススメしたい。
オーナードローで多分できるとは思うけど、クリックイベントの処理とか面倒臭そう。
俺はオーナードロー使ったことないからあくまで想像だけど。
知らないなら黙っててください 他の方お願いします
>>33 何か面白いのか知らんが
うざいだけだからもうやめろ
36 :
デフォルトの名無しさん :2008/08/22(金) 20:39:32
想像でラクガキするのも同罪と思うな
俺様棚上げクンw
ほんと、知らなきゃ黙ってろって事、よくあるよね。 どんな神経してるんだろ。初心者スレで不確かな事言ってなんになるの?
39 :
デフォルトの名無しさん :2008/08/22(金) 20:54:20
猫でもわかるC#のホームページにC#フォーム編があるんですが、 これってVS2005の時にかかれたものみたいなんですが、VS2008でも フォームを作るデフォルトは代わってないですか?これより、VS2008 のフォームを作る勉強したほうがいいですか?
41 :
39 :2008/08/22(金) 21:06:47
>>40 ありがとうございます。このページは結構親切にのっていて、
本を1冊やると同じくらいいいので、得しました。
多謝です。2000円浮いた〜。
42 :
836 :2008/08/22(金) 21:51:13
前回の>858 返事がだいぶ遅くなってしまいました。 3行目だけほしいという処理で、ぜんぶを読めといわれたので、なんとかトライしてみました。 が、どうしてもぜんぶを読めずにいます。 ソースは次のとおり。iとsとsrの名前を変えただけです。 ご呈示いただいたところだけだと、読み込みファイル名がなかったりするので、それを足したりしました。 アドバイスよろしくお願いします。
43 :
836 :2008/08/22(金) 21:53:05
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Diagnostics; using System.Text.RegularExpressions; class ReadWrite{ [STAThread] public static void Main(string[] args) { string fileName = args[0]; //引数をファイル名とします。 string[] lines = ReadAllText(fileName); //ReadAllTextは現在のコンテキスト内に存在しないそうです。どう定義したらいいんでしょう? それともこの行は不要? using(StreamReader readContents = new StreamReader(fileName, System.Text.Encoding.Default)); { string line = null; int lineNumber = 0; do { line = readContents.ReadLine(); //readContentsは現在のコンテキスト内に存在しないそうです。定義の位置が問題でしょうか? if(lineNumber == 3) { Console.WriteLine(line); break; } lineNumber++; } while (line != null); }}}
ReadAllTextとreadContentsを定義しろよ
ワロタ、usingの最後に余計なものが…
>>43 1. ReadAllText を Google
2. 前スレ858をあと100回読む
デリゲートってオブジェクト志向的には有りなんですか? なんか積極的に使っていいのか分からんのだけど。
オブジェクト指向の暗黒面に囚われてないかい?
とりあえず「有り」か「無し」で。
とりあえず、『とりあえず「有り」か「無し」』かを迫るような 単細胞な質問は「なし」だな。
必要性があるから存在するにきまってるだろう
2択にしても難しい問題だったんだ・・・
使わないと実現できない処理がある以上「有り」としか言いようがないでしょ。 「オブジェクト指向だから,これは出来ません」って通らないよね?
どうして「無し」と思うのか述べてみろよ。
56 :
デフォルトの名無しさん :2008/08/23(土) 01:08:35
暗黒面ってなんだよw 手続きの方がよっぽどカオスじゃんw
>>50 この「無し」ってのは君が理解してないだけ
UMLであらわせるれるかどうかと基準ならプロパティやenumだってなしだな。
>>47 オブジェクト志向的に……
有りだとする。
→オブジェクト指向万歳ってことでどんどん使え。
無しだとする。
→C#はオブジェクト指向だけじゃないマルチパラダイム言語だから、
オブジェクト指向に捕らわれずどんどん使え。
プロパティの中身はメソッドの自動生成機能だし、 enumはクラスの自動生成機能でしょ? delegateもメソッド1つのインターフェース作ったりするのと 同じじゃない? ただの便利機能じゃないのか。
delegateは関数ポインタに近い機能と思えばよい、と何処かに書いてあった。 → ということは、過去の遺物を引きずっているのではないか? → 俺の知ってる最新鋭のオブジェクト指向言語に似合わない! ごめん、思考のトレースに失敗した。色々と無理があった。ごめん。
結局、全ては機械語の構文糖衣なんだよ。
オブジェクト指向の既存の機能を使って実現したものでも、 それがオブジェクト指向であるかどうかとは無関係。 例えシンタックスシュガーであっても概念的に違うものになりえる。
>>62 それはいいすぎ
機能を実現するかどうかか、ではなくて、
どれだけ生産性を向上するかどうかがオブジェクト指向を使う意義なんだから
つまり、delegateはオブジェクト指向の概念と合わない?
なんでそうなるんぞ
delegateは、関数ポインタをクラスでラップしたものだね。
女の子はデリケートだぞっ!
関数ポインタというより委譲モデルを簡略化したと考えれば オブジェクト指向から外れてないと思うけどね。 javaのlistener/adapter型の委譲モデルも意地悪を言えば、 内部クラスや匿名クラスはオブジェクト指向かどうか疑わしいよ。
そうそう、関数ポインタって説明はあまり良い方向ではないと思う。 「処理」をカプセル化してオブジェクトとして扱えるようにしたもの という方向の方が、今時の思想にマッチしてる。 もちろん単純に関数ポインタイメージで使うことはできるが。
デリゲートに好きして
デリゲートのスコープの外の変数もちゃんと見れて、そのまんまで、あちこち受け渡しできるんだもんな。 すげーよ。
クロージャということ、これはさすがにオブジェクト指向というより関数型。
レキシカルクロージャとかいうやつ? よくしらんけど
クロージャってオブジェクト的とも見ることができる 詳しくはSICP
オブジェクト指向とは・・・ただの言葉じゃ
オブジェクト指向=良いもの オブジェクト指向との合致度が高い言語=いい言語 そんな盲目的な思い込みが罠なんだ
79 :
デフォルトの名無しさん :2008/08/23(土) 16:19:42
関数ポインタに毛が生えて好き物ってのでいいよ。
オブジェクト指向もパフォーマンス悪いし、匙加減が重要
C#でMDI フォームアプリを作成しています。 子フォームを最大化すると親フォームのメインメニューにアイコンが 表示されるのですが、これを非表示にするにはどうすればよろしいでしょうか?
Dictionary<key,value>で、valueを指定してkeyを探すことはできますか?
.Firstとか.Selectとか あとはforeach
SelectじゃなくてWhereだった…
>>83 ありがとうございます。
FirstやSelectは初めて知りました。
しかし、なんでDictionaryにはFindやFindAllが無いんだろう
Key使わない検索じゃDictionaryの旨みが無いから?
まあ、検索スピード欲しけりゃ逆引きの方のDictionaryも用意すべきだし。
class 逆引きつきDictionary<TKey, TValue> : IDictionary<TKey, TValue>{ private Dictionary<TKey, TValue> 順引き辞書; private Dictionary<TValue, TKey> 逆引き辞書; void Add(TKey key, TValue value){ 順引き辞書.Add(key, value); 逆引き辞書.Add(value, key); } bool Remove(TKey key){ TValue v = 順引き辞書[key]; 逆引き辞書.Remove(v); return 順引き辞書.Remove(key); } TKey 逆引き(TValue value){ return 逆引き辞書[value]; } … } これはねーか
valueが重複したらアウトじゃねえかw
なるへそじゃあ void Add(TKey key, TValue value){ if(逆引き辞書.ContainsKey(value)) throw new valueが重複してますよExeption(); 順引き辞書.Add(key, value); 逆引き辞書.Add(value, key); } っていう風になるのか?
>>90 それか、逆引きの側は Dictionary<Value, HashSet<Key>>。
フォーム内にWebBrowserコントロールを追加しているのだが、 その中の任意のポイントにクリックを発生させるにはどうしたらよいのだろう? Cursor.Position = webBrowser1.PointToScreen(new Point(webBrowser1.Location.X + 50, webBrowser1.Location.Y + 50)); のような感じでマウスカーソルを希望するところに持っていくことはできたのだが、 そこにクリックを発生させる方法がわからない。 もしかしたらSendMessageでLEFTDOWN->LEFTUPでクリックを送ればいいのかと思ったけど、 今度はwebBrowser1のいわゆるhWndを取得する方法がわからない。 誰かお助け下さい。
SendInputが一番楽じゃね
Flashなどの組み込みオブジェクトではなく単にリンクやボタンなどのHTMLエレメントなどを 操作したいというのであればHTMLDOMつかってInvokeMember(マネージDOMの場合)で Clickメソッドを実行したほうが楽と思われるが。 まあ、わざわざマウスクリックをしたいといってるから組み込みオブジェクトの可能性が高いなw SendMessageではなく、mouse_eventというAPIを使ってみれば?こっちだとhWnd不要だから
private setの自動プロパティにreadonlyが付けられたらいいのに コンストラクタで初期化して以降変更しないものでも 自動プロパティが便利だからついreadonlyフィールド使わなくなっちゃうんだよね 独り言
aho
{0}をコンソールに表示する方法おしえてください
Console.Write("{0}");
エスケープの方法はヘルプの「複合書式設定」参照
public struct MyStruct { public MyStruct(long value) { this.TotalValue = value; } [FieldOffset(0)] public long Total; [FieldOffset(0)] public short Value1; [FieldOffset(2)] public short Value2; [FieldOffset(4)] public short Value3; [FieldOffset(6)] public short Value4; } //コンパイルエラー フィールド 'Value1~4' は、コントロールが呼び出し元に返される前に割り当てられている必要があります。 ちゃんと割り当てられてるじゃんね。意外とコンパイラもお馬鹿さんだな。 まーどーでもいいことなんだけど、過疎ってるからネタを投下してみた
struct MyStruct{ public MyStruct(long value){ this.TotalValue = value; } [FieldOffset(0)] public long TotalValue; [FieldOffset(0)] public short Value1; [FieldOffset(2)] public short Value2; [FieldOffset(4)] public short Value3; [FieldOffset(6)] public short Value4; } コードミスったのはご愛敬で
[StructLayout(LayoutKind.Explicit)] struct MyStruct{ public MyStruct(long value){ this.TotalValue = value; } [FieldOffset(0)] public long TotalValue; [FieldOffset(0)] public short Value1; [FieldOffset(2)] public short Value2; [FieldOffset(4)] public short Value3; [FieldOffset(6)] public short Value4; } 属性付け忘れもご愛敬で。。。 スレ汚しすまない
いや、コンストラクタで初期値セットせな
Console.Writeline("{{0}}", 10);
で
{10}
を期待したところ
ぶーぶー
言われました
>>100 さん、ありがとうございます
おかげさまで解決しました
>>99 さん、二度とくんな
98 :デフォルトの名無しさん [↓] :2008/08/28(木) 16:35:53
{0}をコンソールに表示する方法おしえてください
105 :デフォルトの名無しさん [↓] :2008/08/28(木) 17:04:39
>>99 さん、二度とくんな
wwwwwwwwwwwwww
>>99 はたしかに{0}が出力される。
引数無いとそのまま出るみたいよ。
よって、
>>98 の質問の答えにはなってる。
つーか最初から
>>105 の内容で質問すりゃいいのに。
100の先もエスケープには限界あるから分けて出力する必要があるかもよって書いてるしな
夏だねぇ
>>110 そのセリフはちょびっと遅いぞ。
言ってみたかったの?
来年またトライしてみよう!
112 :
デフォルトの名無しさん :2008/08/28(木) 19:24:54
一生懸命勉強して、大きなプログラマになるんだ!
・セキュリティ上好ましくない為、部分的に信頼されたアセンブリは、厳密な名前付きのアセンブリを呼び出す事ができない。 それだと不便なのでAllowPartiallyTrustedCallersAttributeが付いた物に限り、利用可能になっている。 詳しくはMSDN見て来い
115 :
デフォルトの名無しさん :2008/08/29(金) 02:06:09
public int hoge(ここでエンターキー) ↓ public int hoge { } 上のようにエンターキーでブロックが自動挿入されるように出来ないでしょうか? VBから移行してきたばかりなので入力に手間取ってしまいます。
一生VBやってればいいよ こっちくんな
117 :
115 :2008/08/29(金) 02:11:02
自己解決しました 自動で複数行ブロックが挿入されるようにすると全部複数行になってしまうんですね・・・
C#はいちいち面倒なことが多くて、やっぱりVBの方がいいですよ。
ID出してくれええ
誰だお前?死ねよ
言語に優劣をつける気はないが、VBの If a = b Then だけはどーーしても違和感&不安になる
自分の場合、ときどきIf a == b Thenって書いちゃうよ。
VBの場合
>>115 みたいな機能が無いとタイプ量が多すぎるからな
C#でもifとかforとか使うときにコードスニペットが使えるよ
125 :
デフォルトの名無しさん :2008/08/29(金) 10:08:03
c# から Windows のスタートメニューを開きたいのだけれど、どうやったらできますか? SendKeys.Send("^{ESC}"); としても開けませんでした。
>>125 [DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
const uint WM_SYSCOMMAND = 0x112, SC_TASKLIST = 0xf130;
private void button1_Click(object sender, EventArgs e) {
SendMessage(this.Handle, WM_SYSCOMMAND, new IntPtr(SC_TASKLIST), IntPtr.Zero);
}
127 :
デフォルトの名無しさん :2008/08/29(金) 10:40:16
>>126 早々にありがとうございますm(__)m
ばっちりです。
128 :
デフォルトの名無しさん :2008/08/29(金) 18:06:00
TcpClient の受信処理で1024Byteずつ受信してメモリストリームに書き出しています。
NetworkStreamのDataAvailableが続きのデータがあるにもかかわらず、
FALSEを返して受信が終了してしまいます。
下記サイトでも同じ問題が記載されています。
http://www.niseko.or.jp/BlogX2/categoryview.aspx/UPnP 現在do〜while間にSleep(50)を入れると正常に受信できるのですが、
他にも解決策はありませんか?
//クライアントとの間の通信につかうストリームを取得
NetworkStream ns = server2.GetStream(); //server2は、TcpClient
//クライアントから送られたデータを受信する
System.IO.MemoryStream ms = new System.IO.MemoryStream();
byte[] resBytes = new byte[1024];
int resSize;
do
{
//データの一部を受信する
resSize = ns.Read(resBytes, 0, resBytes.Length);
//受信したデータを蓄積する
ms.Write(resBytes, 0, resSize);
Thread.Sleep(50); //ここで50ミリ秒スリープさせると正常に受信できる
} while (ns.DataAvailable);
string responsStrings = enc.GetString(ms.ToArray());
Readの返値で判断するのが吉
リンク先見ずに書いたけどリンク先でもそう結論してんじゃんか 何が悲しいのかさっぱり理解できないが DataAvailableがtrue返すのは多分その時点でネットワークからは読み取り終わってるから Read前なのでバッファには残ってる
なんか適当なことを書いてしまった DataAvailableがtrueになるのはバッファにデータが溜まってるとき Read連続で呼び出すとネットワークからの読み取りが遅れた場合にfalseを返すのは当然
MSDNを正確に読めよ
133 :
128 :2008/08/29(金) 18:55:56
>>129 Readの返値で判断するのが吉
このReadの返り値は自分で用意したバッファサイズが返るだけのようですが・・
(resBytesのサイズ)
>>131 了解です。
100分の5秒遅れただけでfalseでは使えないと言うことですね。
MSDNのサンプルに騙されたか・・
1byteずつ読んでエンコードしてCONTENT_LENGTHを読んだ方が確実ですね。
もっぺんReadの解説読んでこい
Visual C# 2008 Expressを使ってるんですけども デバッグビルドとリリースビルドはどうやって切り替えるんでしょうか
136 :
デフォルトの名無しさん :2008/08/29(金) 19:13:05
MSDNはたまに意味不明なところもあるけど、それは君の技術力が足りなすぎていて理解できないだけ
>>135 FAQだね
Expressをインストールしたらまずやるべきこと
ツール→オプション→すべての設定を表示 にチェック
プロジェクトおよびソリューション
→ビルド構成の詳細を表示・常にソリューションを表示・作成時に新しいプロジェクトを保存
にチェック
NetworkStream..::.Read メソッド パラメータ buffer 型 : array< System..::.Byte >[]()[] Byte 型の配列。NetworkStream から読み取られたデータを格納するメモリ内の場所です。 offset 型 : System..::.Int32 データの格納を開始する buffer 内の場所。 size 型 : System..::.Int32 NetworkStream から読み取るバイト数。 戻り値 型 : System..::.Int32 NetworkStream から読み取るバイト数。
APIぐらいちゃんと読めよ
>>138 まだ続きがあるだろ。
解説
このメソッドは、データをbufferパラメータに読み込み、正常に読み込まれたバイト数を返します。
読み取ることができるデータが存在しない場合、Readメソッドは0を返します。
Read操作は、sizeパラメータで指定されたバイト数に達するまで、使用できるデータをすべて読み取ります。
リモート ホストが接続をシャットダウンし、使用できるデータがすべて受信されると、
Readメソッドはすぐに完了して、0バイトを返します。
141 :
128 :2008/08/29(金) 19:30:03
おわ!理解不足だったか MSDNからコピってきました。 なにがいけないんだろう? // Examples for CanRead, Read, and DataAvailable. // Check to see if this NetworkStream is readable. if(myNetworkStream.CanRead){ byte[] myReadBuffer = new byte[1024]; StringBuilder myCompleteMessage = new StringBuilder(); int numberOfBytesRead = 0; // Incoming message may be larger than the buffer size. do{ numberOfBytesRead = myNetworkStream.Read(myReadBuffer, 0, myReadBuffer.Length); myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead)); } while(myNetworkStream.DataAvailable); // Print out the received message to the console. Console.WriteLine("You received the following message : " + myCompleteMessage); } else { Console.WriteLine("Sorry. You cannot read from this NetworkStream."); }
142 :
128 :2008/08/29(金) 19:41:00
あ、Readの解説ありがとうございます。
resSize = ns.Read(resBytes, 0, resBytes.Length);
if (resSize == 0)
break;
とすればいいわけですね。
これは
>>131 さんが言っている、
Read連続で呼び出すとネットワークからの読み取りが遅れた場合にfalseを返す
に対応できますね。
みなさまありがとうございます。
50にもなって初めてのプログラミング、何もかもが分からないことだらけです。
年齢は関係ないだろ
うむ、年齢は関係ないな。学ぼうとする気持ちが大事。
新手の煽りか?
50歳からのプログラミング
VBから移動組だけどはコードがシンプルでいいなあ インテリセンスがもうちょっと使いやすかったらよいんだけど
VC++からの移行組としてはインテリセンスがちゃんと効くだけで満足です
JavaやらVBやらやってきたけど、Javaは言語の構造というかなんかすきになれなくて VBは簡単すぎて(;´д`)ってかんじがしてたんだけど、ようやく自分に最適な言語をみつけた。
そうですか。
>VBは簡単すぎて の意味がわからん。簡単な方がいいだろ
そのJavaは言語の構造ってのは何のこと? 謎が多い奴だ・・・
Javaは周辺技術を追いかけるのに疲れたってのはあるな。
C#も凄いけどな。それよか、VBは追いかける必要なく得て、いつも言語に組み込んじゃう。だからVBの追いかけなくていいし、面倒ないからいいかなと思うよ。
VBでなれちゃうと他に乗り換えるのがめんどくさくなってくる。
それはない
>>156 C#はMSだけ追いかけていればいいけど、JavaはSun以外からもいろいろ
出てくるのがしんどい。
もうDしかない!
161 :
デフォルトの名無しさん :2008/08/31(日) 07:06:41
private void 終了XToolStripMenuItem_Click(object sender, EventArgs e) { } ↑から↓を呼び出すにはどう書けばよいのでしょうか? private void Form1_FormClosing(object sender, FormClosingEventArgs e) { e.Cancel = true; }
フォームデザイナでイベントを定義してあれば、勝手に呼ばれるだろ。
163 :
デフォルトの名無しさん :2008/08/31(日) 07:30:39
Linq to xml の事で少し手ほどきしてください XmlSerializer 等を使うと、適当に作ったクラスを一発でシリアライズできますが 同様な感じで、適当に作ったクラスから XElement を作る方法で良い方法はありますでしょうか? またその逆も簡単にできそうであれば教えてください。 現状ではXmlSerializerをStringWriterを経由させているのですが、なんとなくバカっぽいので・・・
>>162 デザイナで終了XToolStripMenuItem_Clickのプロパティから
Clickイベントのドロップダウン一覧にForm1_FormClosingが出てこないので
定義できないのですが、ほかに方法があるでしょうか?
>>164 デザイナでフォームのイベントを見てみ
ここでイベントを割り当てれば、イベントハンドラ定義が追加される。
フォームデザイナでどういうことをすると、どういうコードが追加されるのか
確認してみるといいよ。
終了XToolStripMenuItem_Clickからフォームを閉じたいって言うこと? でもe.Cancel=true;って書いてるし何がしたいんだかよくわかんね
>>165 >>デザイナでフォームのイベントを見てみ
これはデザイナのプロパティウィンドウのイベントボタンを押したときの一覧ですよね?
>>161 はここからダブルクリックで追加したコードですが
終了XToolStripMenuItem_ClickもForm1_FormClosingもどちらにも
お互い出てこないのでイベントハンドラを共有できないのですがどうすれば良いですか?
>>164 ボタンからは普通にフォームを閉じるなりアプリを終了するなりすればいい。
>>165 ができていれば、フォームが閉じられる前にFormClosingを拾えるはず。
で、イベントがキャンセルされてフォームは閉じられない。
何がしたいんだ?
>>166 実際にはかなり複雑な分岐処理が書かれているので、ほとんど省略してます。
>>169 VBだと
Form1_FormClosing(sender,e)
で行けた様な気がしたので気になってDesigner.csでEventHandlerを直接いじっても
FormClosedも共有できないみたいだし、C#の仕様ということでしょうか?
ボタンから閉じないけど同じ処理をしたいのなら別な関数として書いてそれを両方から呼び出したほうがよくね?
片方が EventArgs もう片方が FormClosingEventArgs つまりそういうことだ
>>170 Form1_FormClosingにブレークポイントを設定したら、フォームを閉じるときに
ちゃんと呼ばれるか?
呼ばれるなら、終了メニューにApplication.Exit();とかthis.close();とか書けば
いいっしょ。
KeyedCollection使うときにGetKeyForItemをオーバーライドするためだけに それぞれ派生クラス作るのってアホらしくない? デリゲートでキーを返す派生クラスを一つだけ作るとか?
それでもいいと思うが ObjectModel 内のクラスの存在理由とかそんなの 勘違いしてないか?
日本語対応のフォントのみを取得する方法ってあります? FontFamilyでインストールされてるフォントを全部取得することはできたんですが そこから欧文フォントとかを除く方法がわかりません。
>>170 クラスとキャストの概念が分かってないみたいだねぇ。さすがVB。
Form1_FormClosing(sender,new FormClosingEventArgs())
やりたいのはこれかな?
178 :
170 :2008/09/01(月) 18:00:03
>>171 やっぱりそれが一番勝手が良いですね。
>>172 ようするに、キャストできない型なのでそのままだと呼び出せないということでしょうか。
>>173 なんか一番わかりやすいのでthis.close();を使ってます。
>>177 例えば
Form1_FormClosing(sender, new FormClosingEventArgs(CloseReason.None, true));
見たいにコンストラクタを初期化してやるとエラーにならないんですが
引数なしだとエラーになります。
型が違うイベントを呼び出すときは、毎回コンストラクタを初期化しないと
呼び出せないということでしょうか。
クラスとキャストの概念がわかってるかどうかは自信がありませんがキャストは出来ませんよね?
>>178 >>177 の言ってることもトンチキだから気にしない。
君が分かってないのは
>>177 の言ってるようなことじゃない。
君が分かってないのはイベントとイベントハンドラだよ。
イベントハンドラ(例えばForm1_FormClosing())というのは、
イベント(例えばフォームが閉じられた)時に「呼ばれる」ものであって、
それを呼び出すと何かが起こる(例えばフォームが閉じる)わけではないよ。
VBの人にありがちな倒錯だね。
原因と結果が逆立ちしてる。
180 :
170 :2008/09/01(月) 19:46:54
>>179 あー、そうか
一般論としてはイベントとイベントハンドラについて理解してるつもりだったけど
今回の件に関しては全く理解できてなかったということですね (^^;
ものすごく本末転倒なことを聞いてましたね、精進します
みなさん、有難うございました
VS2008sp1のインテリセンス日本語化はいつなんでしょうか?
>>178 とりあえず新規のWinFormプロジェクトを作る。
フォームデザイナでフォームを選択し、イベントハンドラの
FormClosingをダブルクリックする。
Form1_FormClosingにMessageBox.Show("FormClosing");
を書く。
実行する。
メニューを追加し、終了メニューにthis.close();と書く。
実行する。
これでイベントの流れの概略がわかるか?
FormClosingをダブルクリックする前後にForm1.Designer.csも
見てみるといい。
usingについての質問です ネットワークプログラミングをしているのですが、通信が終わったときにNetworkStreamを閉じようと思い、以下のようなコードを書きました。 using( NetworkStream Stream = new NetworkStream(socket, true) ) { … 事前の処理 … Thread newthread = new Thread(Func); newthread.Start(new object[] { Stream, newthread }); } このような場合、NetworkStreamはどのように扱われるのでしょうか? # threadの処理が終わるまで保持される? # newthread.Startが呼ばれたあとにDispose()されてStreamはnullになる?
スレッドを作り終わった瞬間に削除される。
>>183 どう考えてもすぐに破棄されるに決まってる。
まあnullになるは意味不明だけどな。
匿名デリゲートを使うと、nullにならない事が確認できるよ
>>187 usingに使う変数の宣言は()内じゃなくてもいいんだよ
ローカル変数でもフィールドでもおk
189 :
183 :2008/09/02(火) 15:24:14
皆様ありがとうございました。 # nullにならない、usingの使い方に関しては大変勉強になりました。 もう一つ質問させてください。 上のようなコードで、例えばFunc内で、 void Func(object obj) { NetworkStream newStream = (NetworkStream)((object[])obj)[0]; … byte[] abBuffer = new byte[256]; newStream.Read(abBuffer,0,256); … } などの操作を行った場合、NetworkStreamは既に破棄されており、利用できないのでしょうか。
そんなわけない
まあほとんどの場合Disposedだろうな
objが
ローカル変数が何時までも残ってたらローカルじゃないでしょ
196 :
189 :2008/09/02(火) 18:44:51
ありがとうございました。 thread内でNetworkStreamを閉じるなど、コードを書き換えて検討し直してみます。
適当なディレクトリ内のファイルを列挙して、キューにどんどん突っ込んでいきたいのですが、 Directory.GetFilesなどではそのディレクトリのファイルを全て列挙するまで結果を得ることが出来ません、、、 ファイルを1つずつキューに入れていくためには、WinAPIを呼ぶしかないのでしょうか。
どんなストレージ使ったら問題になるのか分からないがまあその通り フロッピーとかか
>>196 いや、ちゃんと調べたほうがいい、間違いが混ざってる。
200 :
デフォルトの名無しさん :2008/09/02(火) 19:51:37
質問です 1.findControlを使用して、コンテンツページからマスタページのDataListを取得 2.staticなメソッドに取得したDataListを渡して、DataListへの設定を行う。 3.画面表示 こうすると、DataListへの設定が反映されません。 staticなメソッドで行わずにコンテンツページ内でDataListへの設定を行った場合は 問題なく動くのですがなぜでしょうか。
若干怪しい部分はあるが、具体的なコードがないとわからない。 特にstaticメソッド辺り。
List<string,string> ls = new List<string,string>(); というような二次元の動的な配列を作りたいのですが どうすればいいのでしょうか。
List<List<string>> 要素にアクセスするときはls[r][c]
有り難うございます。試してみます。
すみません、質問いいですか? 複数端末から同一ファイルをFilesystemWatcherで監視します。 んでファイルが来たらファイルを読みたいんですが この場合、排他制御はどうしたらベストでしょうか? お願いします。
何いってんのかわからん
おまえうざいんですけど
208 :
デフォルトの名無しさん :2008/09/03(水) 22:10:33
正直俺にも何言ってんのかわからんよ。 ぼんやりとは伝えたい方向が推測できないわけではないが。 プログラミング勉強する前に日本語できちんと自分の意図を 伝える練習した方がいいんじゃないのか?
おいおい
>>205 の文章は普通に言ってることはわかるだろw
サーバサイドの話でしょ。
俺はそっち方面知らんから答えられんけど。
>>205 やりたいことの説明が足りないのは確かだな。
1) 書き込まれたファイルを複数の監視しているPCのうちどれか1台が処理する。
2) 全部で処理する。
3) 全部で処理するが並列では処理させない。
並列処理といってるから1か3の可能性が高いが、
ファイルを書き出すのが完了した状態を判断したいということかもしれない。
211 :
デフォルトの名無しさん :2008/09/03(水) 22:32:29
>>209 なんだよ 「サーバサイドの話」ってww
FileSystemWathcerクラスは確かにUNCパスも使えるけど、基本的に
IOの話であって、「ローカルサイド(嗤)」の話だがな。
第一、FileSystemWatherが監視するのはディレクトリであって、ファイルじゃ
ないし。
そもそも「複数端末から同一ファイルを」監視しているはずなのに、「ファイルがきたら」
「ファイルを読みたい」って全く意味不明。ファイルは存在しているの?存在している
なら「ファイルがくる」ってどういう意味? 存在していないなら「同一ファイルを監視する」
っていったいどういうこと?
あ、なんかだんだんわかってきたぞ!!
たとえば \\server\dir を複数マシンから監視して、hoge.txt ファイルが新しく
作られたら、それを読み込みたいんだけれど、複数マシンからアクセスするので
排他制御をなんとかしたいということなんだろうか????
Created イベントで新しいファイルの名前がhoge.txtだったら、単純にreadモードで
FileStreamに読み込めばいいだけだと思うんだが…。
かなり意地悪だけど、 複数の端末が接続されている計算機において、 それぞれの端末から起動したプロセスで あるファイルを監視(FileSystemWatcherを利用)。 ファイルが作成されたら、何らかの排他制御をしつつ そのファイルの読み取りを行う。 というマルチユーザ環境での話と解釈できなくもない
多分最初に処理を開始した一台だけが処理する制御ってことなんだろうな、多分だがな。
IPを変えるのってどうやればいいか教えてください!!
回線切って考えてみればいいと思うよ
だいたい皆さんのおっしゃる通りです。 言葉足らずすみませんでした。 \\server\のテキストファイルを複数の端末から監視し (生成タイミングはサーバー次第) 生成されたら読み込んでフォームに表示したいのですが 複数の端末が同時にファイルアクセスするので例外が出てしまいます (すべての端末で読み込みはしたい) こんな感じですが・・・
普通に読み取り共有で開けないんだっけ?
同時にファイルアクセスって聞いただけで冷や汗が出てくる
ファイルアクセスされているかどうか調べられるんですか?
リードオンリーなら、同時にアクセスしても、普通に読めそうな気がするけど。
ファイル管理するクラスなりなんなりを置いて、それに読んでもらう方がよくね リモートで呼び出しして
223 :
デフォルトの名無しさん :2008/09/04(木) 00:27:58
共有モードを指定する。 これでファイルをメモ帳で開いてる場合でもエラーにならない。 new FileStream("file", FileMode.Open, FileAccess.Read, FileShare.ReadWrite) write側とread側の間の排他はいろいろ方法はあるが、 別名で書き出して書き出しが終わったらrenameというのが一番無難。 rename後の名前で監視しておけば書き出し途中は見えない。
そのためにわざわざサービスあげるのかい
RichTextBoxの改行の幅って調節できますか? 改行すると、一文字分くらい空いてしまうんですが。
自演で回答に導くとはなかなかやるな
228 :
デフォルトの名無しさん :2008/09/04(木) 18:59:32
229 :
200 :2008/09/04(木) 19:26:48
>>201 レスありがとうございます
自己解決しました
別ページに遷移した場合、前ページのcsでセットしたものは
リセットされるという事を知らなかったのが理由でした
マスタページの初期処理で必ず処理を行うようにする事で解決しました
・・・が、遷移する度に毎回処理ってなんか無駄だよなぁ・・・
上のやり方以外で前ページでセットした内容を次ページに持ち越す事って出来ないのでしょうか
何をしようとしてるのかよく分からない… 単にページ間でのデータ引き渡し?
宣伝乙以外に感想がありません
なんかCodeZineってすっかり企業の宣伝記事ばっかりになっちゃったね。 翔泳社らしいというか、往時のVBマガジンを彷彿とさせるものがある。
private void button_Click( object sender, EventArgs e) { private Thread demoThread = null; this.demoThread = new Thread(new ThreadStart(this.ThreadProcSafe)); this.demoThread.Start(); } private void ThreadProcSafe() { this.TextBox.Text = null; } ”有効ではないスレッド間の操作 コントロールが作成されたスレッド以外のスレッドからコントロール アクセスされました” これが出たからmsdnで簡単そうだった対策をやったんだけど また出る なんで?あんまり意味はわかってない
GUIスレッド以外のスレッドからコントロールにちょっかい出しちゃいけません
じゃあプログラム中にテキストボックスの中身変えたいときはどうすりゃいいのよ?
GUIスレッドからやるかInvokeすればいいじゃない
invokeしろぼけ
>これが出たからmsdnで簡単そうだった対策をやったんだけど >また出る >なんで?あんまり意味はわかってない ちゃんとできてないんだろうとしか言いようがない。 どうやったのか書いてみそ。
ちょwwinvoke見たけどよくわかんね GUIスレッドって何かわからない、スレッドに分けてないと思うんだけどフォーム.csに全部書いてるし どうやったかって書いてるとおりだと思うんだけど・・・
Thread つくって Start してるのに分けてないとはお前はなにを 言っているんだ
スレッドの勉強あんまりしてないよ・・・ なんでテキストボックス2にnullを代入できないんだよ・・・ 多分2回目のループの時だと思うんだけど・・・
>>243 ありがとう。でも今見てた。
メソッドの呼び出しみたいな例なんだけど
俺は単純にヌルを代入したいだけなんだけど
それにフォーカスが関係あるの?
いちいちうるせえなあ。 ここで得られた回答が理解できないのは 偏に己の不勉強が原因なんだから精進しろよ
243のコードは別のスレッドからGUIのフォーカスを変更したい場合の例で、フォーカスは関係ない。
今ちょっとやってみたんだけど次はラベルで出た テキストとかラベルとか一個一個全部メソッド作ってデリゲートで呼び出さないといけないの?
つラムダ式
ラムダ式とかwww
より混乱を招くだろ
>>250 おやすみ
252 :
250 :2008/09/04(木) 23:42:04
>>251 ちょww何??
簡単な方法あるんだったら教えてよ
多分スレッドを作らなければいいだけだと思うけど
マルチスレッド禁止
スレッドとか消して ボタン1の最初でテキストボックスにヌルを代入 のがループ2週目でまた”コントロールが作成されたスレッド以外のスレッドからコントロール 'textBox2' がアクセスされました” なんで2週目なの?どうすりゃいいの?
うるちゃい
1周目と2周目で何が違うのか全くわからん デバック無しだとどうもならないのにデバック有りだと止まるし
スレッドは理解するんじゃない、感じるんだ
ちゃんと再コンパイルしてるか?
だめだやっぱりできない 再コンパイル?ビルドはしてる なんで順番どうりに代入してるはずなのに・・・2週目から・・・・
Control.CheckForIllegalCrossThreadCalls = false;
ソースさらせよ
プログラミングが下手な人って大抵説明や質問も下手だよね
君には向いてないとしか言い様がない
思考の整理ができないんだろ。 自分の頭の中がぐちゃぐちゃなのに、 コンピューターの中なんて理解できるはずがない。
初心者を煽る奴は死ぬべき
と初心者が申しております。
カッコつけてC#からやるからじゃね?やっぱ、基本はVBっしょ。
書き方違うだけで基本はほとんど同じだから。
いや、ポインタとか安易に使うと危ないよ
VBの話をする奴はスレを荒らしたいだけ
なんでそんなこまごまと別スレッドからコントロールにアクセスする必要があるんだ。 いろいろやるならひとまとめでメソッドにして、メソッド自体をInvokeで呼ぶとかできるだろ。 ま、いまだに何がしたいのか良く分からないんだけどな。
ん、C#コミュ作れと? それとも、なぜかJavaがDとC#を敵視してる所について突っ込むべきか? って、C,C++もないのか。
見て欲しかったらアカも置いてけ
Perl,Python,Java,Ruby,D言語があってC#がなかったら なんか負けた気になるじゃないか
277 :
デフォルトの名無しさん :2008/09/05(金) 10:56:16
教えてください。 カスタムボタンクラスで派生したカスタムボタンコントロールで CustButton.PerformClick(); を実行してもクリックイベントが発生しません。 どうしたらイベントが発生する様になるのでしょうか?m(_ _)m
OnClickオーバーライドしてるとか
279 :
デフォルトの名無しさん :2008/09/05(金) 11:02:25
OnClickはオーバライドしてません。 ボタンをマウスで直接クリックしている場合は問題ありません。 PerformClick();を実行してもイベントが発生しないのです。
変数名でも間違えてるんじゃねーの? CustButton1.PerformClick()とか
直接Buttonから派生してるんだったら変なことしてない限りは なにも変わらないはずだけど
Enabledがfalseだとか
283 :
デフォルトの名無しさん :2008/09/05(金) 11:13:58
原因みつけました。(はじめから見つけられないお馬鹿な私TT) public CustomButton() { // この呼び出しは、Windows.Forms フォーム デザイナで必要です。 InitializeComponent(); // TODO: InitComponent 呼び出しの後に初期化処理を追加してください。 //this.SetStyle(ControlStyles.Selectable, false); } こうしました。クラスを作った際、自動生成された様です。 this.SetStyle(ControlStyles.Selectable, true); ご迷惑おかけしました。ありがとうございました。
namespace Wbhbh { public partial class Form1 : Form { private static System.Timers.Timer timer; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { textBox1.Text = null; timer = new System.Timers.Timer(30000); timer.Enabled = false; Random rnd = new Random(); string a = rnd.Next(1, 5).ToString(); textBox1.Text = a; 昨日のなんだけど、これで2週目にtextBox1.Text = null;ここで 有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'textBox1' がアクセスされました。 ってなるんだけどどうして?どうしたら解決しますか?
System.Windows.Forms.Timerを使うか、 Control.invoke
ありがとう invokeの使い方が昨日からよくわからないんだよな button1_Click()にinvoke使えばいいの?
ぐぐれよ
つかタイマーでは何やってんの? いまいち有り得ない使い方をしてそうだが…
private void button1_Click(object sender, EventArgs e) { textBox1.Text = null; timer = new System.Timers.Timer(30000); timer.Enabled = false; Random rnd = new Random(); string a = rnd.Next(1, 5).ToString(); textBox1.Text = a; timer.Elapsed += new ElapsedEventHandler(button1_Click); timer.Interval = rnd.Next(1, 5) * 30000; timer.Enabled = true; // timer 上の最後の産業を飛ばしてた invokeとか全然わからんし・・・ なんでループでテキストを書き直すのができないんだ・・・
> timer.Elapsed += new ElapsedEventHandler(button1_Click); 一番重要なところで途切れてたのか……
はじめまして。 OpenCVを使って書いた関数をC#で使いたいのですが、 どのようにしたらよいのでしょうか? 開発環境は Visual Stadio 2005 Visual C# 2005 Open CV です。 またオススメの書籍などありましたら是非教えていただきたいです。
素直にWindows.Forms.Timer使えよ
>>289 ループじゃなくてタイマだろ?
取りあえずSystem.Timers.Timerの解説読めばスレッド使ってんのはすぐわかる。
で例外メッセージの一部「コントロールが作成されたスレッド以外のスレッド」辺りでググれば
Invokeの使い方とか見つかるだろ。
まあ素直にSystem.Windows.Forms.Timer使えよ。
ありがとう。 そうだ、Tickの使い方がわからなくてこっちでやったんだ Forms.timerとの違いとかわからないんで調べてやってみる
その前にタイマの使い方が異常
その場しのぎの独学だから全然わからないんだ みんなは何でこれがタイマの普通の使い方だとかわかるわけ?長い経験?
静的メンバにタイマセットしてイベントの度に作り直してセットし直しって、裏ですごい動きになってるぞ
でもほとんどコピーの羅列だよ?
別に経験長くなくても分かる と思うけど頭の悪さは人それぞれだからなケケケ まあTimerの機能、動きを普通に理解してりゃ明らか
コピーってなあに…?
C初めてから4ヶ月だぜ まさか遅いのか?
↑おまえの頭の悪さは異常w
コピーはmsdnの部分的なコピー 今form.timerでやったらエラー無くなったみたい。ありがとう
>>296 普通の使い方云々はわからんが、
同じことをやるTimerインスタンスを何度も作り直してるのが不自然なのはわかる。
あと、“button1_Click”の中で自身をイベントハンドラに設定してるコードとかどうなんだろうな
>>291 >OpenCVを使って書いた関数
というのが何をさすのか分からんが、C/C++でOpenCVの関数を呼び出しているコードを流用したいのならば
dll形式でコンパイルしてDLLImport。
C#でOpenCVの関数を扱いたいだけならManagedOpenCVかShaperCVでググれ
部分コピーが危険なことくらい理解できるだろう? いいから直したソース晒してみな。 高い確率でまだ異常だと思うから。 きっとみんなでよってたかって突っ込んで崖っぷちまで追い詰めてくれるぜ。
もしも自動車の部品を適当にぶった切って適当につなげてまともに走るのなら、そのプログラムは動くだろう
private System.Timers.Timer timer; private Random rnd; private void Form1_Load(object sender, EventArgs e) { timer = new System.Timers.Timer(30000); timer.Elapsed += OnTimedEvent; rnd = new Random(); } private void button1_Click(object sender, EventArgs e) { timer.Enabled = !timer.Enabled; } private void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e) { Invoke((Action)delegate { int num = rnd.Next(1, 5); textBox1.Text = num.ToString(); timer.Interval = num * 30000; }); } こんな感じなことがやりたいんだと俺は予想するぜ
309 :
デフォルトの名無しさん :2008/09/05(金) 17:03:07
>>224 このファイルの共有アクセスの制御に関して質問です。
FileStreamによる制御では読み込みや書き込みなどの自分のファイルアクセス中の
アクセス制御を行うということだと思いますが、これを「こちらがファイルを開いて読み込み、
データを変更して次に書き込むまでの間」、ずっと誰にも書き込みさせないようにしたい
場合は、
そのFileStreamでOpenした状態をそのまま維持(=開きっぱなしに)しておくということで
実現することになるかと思いますが、その場合は何か弊害が起こりうるものでしょうか?
その場合は弊害がない(開きっぱなしにしないような)方法があるでしょうか?ありましたら
その方法を教えてください。
なお編集中という情報をどこかの専用ファイルに書いておいてそれを読んで先客がいたら
書き込まない、というような方法ですと、他のソフトで編集された場合は制御できないため
そうした方法ではなく、目的のファイルに対して直接アクセス制御する方法であることが
望ましいのでした。よろしくお願いします。
public partial class Form1 : Form { static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { textBox1.Text = null; Random rnd = new Random(); myTimer.Tick += new EventHandler(button1_Click); string a = rnd.Next(1, 5).ToString(); textBox1.Text = a; myTimer.Interval = rnd.Next(1, 5) * 30000; myTimer.Start(); Application.DoEvents(); これ直したコードです もうエラーでてないけどおかしいところツッコミまくってください
>>310 どうもです!
FileStream.Lock メソッド
FileOpen 関数(VB用)
などあるようですが、いずれも読み取り中など、Openしている間の
アクセス制御のように思われるのですが、FileStream.Close() を
実行した後でもLockが効いている状態が実現できるでしょうか?
>>311 おかしすぎてワロタ
後で時間があったらつっこんでやるw
よくわからんがどうすりゃいいんだよ岩永さん
作っただけだから放置でもいいと思う。
>>311 とりあえず、ランダム使っちゃうと何が起こってるか把握できなくなるから、いったん除去って、
{
//textBox1.Text = null;
//Random rnd = new Random();
myTimer.Tick += new EventHandler(button1_Click);
// 変化がわかるように変更
textBox1.Text += "a";
myTimer.Interval = 10000;
myTimer.Start(); // Application.DoEvents();
}
くらいに変更してみると、おかしいところの一部が分かると思うんだ……
もし、この動作を狙ってたとしたら余計なお節介失礼。
Timer作り捨てするとメモリリークするんじゃなかったっけ
320 :
311 :2008/09/06(土) 07:07:18
>>317 俺は+=使ってないけど・・・内部ではそうなってるってこと?
要するにメモリ的に問題があると?
+=は脆弱性があるから使わないべき
322 :
311 :2008/09/06(土) 07:31:30
じゃあタイマのメモリが問題なの?
>>320 > textBox1.Text += "a";
のことを言ってる? これは何が起こるかわかりやすくするためかと……
イベントハンドラにイベント足し続けてるから、
発生してるイベントが指数関数的に増えてるよ、ってことを言いたいのだと思うのだけど、
実行してみた?
……
>>319 も言うように、
>>308 が綺麗なコードを書いてるので読んだらいいと思うよ、うん
326 :
311 :2008/09/06(土) 09:48:08
317やってみたら時間が経ったらバグった おんなじことがイベントハンドラで起こるってこと? イベントハンドラの意味とかよくわかってないけど
>>327 ボタン1実行中にボタン1が実行で・・・って事ですか?
タイマー時刻が来るたびに += してたらそりゃなぁ。
てことは+=じゃなくて=ならいいの・・・かな?
>>330 eventだから = はできない。delegateむき出しならできるのだけど。
・初期化の時 ・ボタンを押した時 ・タイマーで指定した時間が来た時 にそれぞれやることが混ざってるので、まずはそれを分けるべし。自分なりでいいから。
つまり、タイマーで時間が来た時 ×ボタンをくりかえす ○ボタンそのものでなく、ボタンの中のやりたいことをくりかえす ってことか
いや冷静にやりたいこと整理しなって。 毎回イベントハンドラに追加する必要がどこにある? じゃ追加はだめなら=ならいい?って発想がもうおかしい。 =でいったい何するつもりだ?
JavaScript しか使ったことないのかな? JSと違って、タイマーStart後は一定周期で毎回デリゲートが呼ばれる タイマーを設定するのは最初の1回(Loaded中)のみでOK ボタンの押下時にタイマー始めたいなら、+= を Loaded に、Start() を ButtonClick に あるいは、if(timer.Tick == null) timer.Tick += xxx
そもそもタイマーはデザイン画面で貼りつければすむ話。 そしたらどっちのタイマーでも問題ない。 まWindowsタイマーでいいけどな。 イベントハンドラもデザイン画面で作ったらそれでしまい。
もうVBAでいいよ。やるきあるならVBだな。
何が違うんだよw VBでも同じ結果になるのは目に見えてる。
341 :
デフォルトの名無しさん :2008/09/06(土) 11:49:13
JScriptもあるよw
VBならイベントを宣言的に作れる点?
343 :
311 :2008/09/06(土) 12:11:25
private void button1_Click(object sender, EventArgs e) { timer1.Start(); } private void timer1_Tick(object sender, EventArgs e) { textBox1.Text = "a"; } もしかしてツールからフォームだしてダブルクリックして これでいいの?
>>343 その状態で、Form1.Designer.csの
InitializeComponent()の中で何をやってくれているか観察してみ
>>343 意味はないけどそれであってるw
System.Windows.Forms.TimerはInvokeいらないよ
>>344 おおすげえwwこんなのがあったのかww
ちなみにこれの違いってなんなの?
this.button1 = new System.Windows.Forms.Button();
private System.Windows.Forms.Button button1;
上は式で下はメンバの宣言だから全く別種の要素だけど
>>343 そういうのがまあたいていの場合の普通のやり方。
ちょっといろいろデザイナ触ってみた方がいいんじゃないかな。
File.Move()って一つ一つファイルを移動しても まとめて移動するのに比べてオーバーヘッドありませんか?
r――――――‐ 、 |なにして遊ぶ?| `ー――v――― '' ∧,,∧ ∧,,∧ ∧,,∧ (´・ω・) (・ω・`). ∧,,∧ r――――――――‐ 、 ( ´・ω).(O┬O) (O┬O) (ω・´ ) < 公園でかくれんぼ!| ( O┬O ∧,,∧. ∧,,∧)┬O ) `─――――――─‐ ' ◎-J┴◎( ´・) (・` )┴し-◎ ( .__ l) (l __ ) `uロu'. `uロu' r―――.ヘ―────―‐ 、 |じゃあ公園まで競争だ! | `ー―――――────‐ '
351 :
デフォルトの名無しさん :2008/09/06(土) 21:43:31
Visual C# 2008 でアプリケーションを作ったんですが、 うちでは動くのに、友人のPCだと動きません。 .NET Frameworkのバージョンが、うちは3.5で、 友人のPCが2.0なのが原因じゃないかと思うんですが、 下位バージョンの.NET Fameworkでも動くアプリを作るには、 どうすればいいのでしょうか?
プロジェクト→プロパティ 対象のフレームワーク
それやっても向こうに2.0 SP1入れるかバージョンリダイレクトかけるかしないと動かなくないか?
素直にsetup作ればいいのに。 なんだか昔のVBerみたいな偏屈に見えるよ。 ちなみに、SP1の機能使ってなければSPなしの2.0環境でも動くんじゃないの? つーか2.0はWin2000や98用が今のところ用意されてないSP2とかもうグダグダだな。
355 :
デフォルトの名無しさん :2008/09/06(土) 23:24:16
C#でのASP関連の質問はどこで聞けばいいの?WebProg板にASP.NETスレあるけど、やたら過疎ってるみたいなんだけど。
C#でASP……できたっけ? てのはともかくここでもそこでも好きにすりゃ良いんじゃね
>>353 なんでやねん
まあSPでの変更点に引っかかる可能性はわずかにはあるが。
358 :
396 :2008/09/07(日) 08:59:27
エクスプローラの機能限定版(ドラッグ&ドロップが出来ないエクスプローラ) 的なファイル管理ツールを作ろうと思っています。 サンプルとなるものってどこかに無いでしょうか? 開発ツールはC#(VS2008)です。
C#とは直接関係ないですが、ユーザーコントロールの件。 VisualStudio のソース用のテキストエディタには左側にブレークポイントを 置くエリアがありますが、あれはPanelコントロールのようなものなんでしょうか? あのような機能のものを作ろうとした場合、ソーステキスト側のスクロール、 Fontのサイズ、行間距離、折り返しの有無とその変化などにすべて対応する 必要がありますが、簡単に実現する方法はないものでしょうか?
やった事無いけど、テキストボックスにSendMessageで EM_SETRECTで左に余白を作り EM_GETFIRSTVISIBLELINEで先頭行の番号を取得し EM_GETLINECOUNTで表示されてる行数を取得して・・とかやればいけるんじゃね?
>>359 煽るわけじゃないが、そんな調子でそんな高機能なユーザーコントロールを
作ろうと思ってるわけ?
ちょっと考えれば分かると思うが、たまたま君が実装したいと思っているに過ぎない機能を
都合よく「簡単に」実現してくれる既存のコントロールなんてあるわけないじゃん。
Fラン共うぜぇよ
↑Gラン
Bラン
学歴話が好きな奴の人物類型というのは (1) 学歴コンプレックスのある人間(秋葉原の事件の容疑者タイプ) (2) 学歴以外に縋るものがないタイプ(かなり古いが宮沢喜一系) (3) 学歴コンプの奴を煽って楽しむタイプ(マミーなんとか的な幼稚系) こんなところか。 どっちにしろ他人よりもむしろ「救いがない本人自身を語ってるだけ」、という 簡単で明白な事実に気づくだけの知能が欠けているのは全てのタイプに共通しているようだな。
>>359 >簡単に実現する方法はないものでしょうか?
ありません。
".NET エディタ コントロール"で検索してみると
みんな苦労してるのがわかると思う。
ごめんなさい、脳卒中です
374 :
351 :2008/09/07(日) 23:10:19
>>352 >>353 >>354 遅くなりましたがありがとうございます。
プロパティから対象フレームワークの設定はできました。
友人のPCで試してみます。
何この自演臭い酷い流れは
黙れ自演厨
早く前の流れに戻らないかしら。
>>373 ×ごめんなさい、脳卒中です
○ごめんなさい、中卒脳です
>>371 >ありません
やはりそうでしたか。
>".NET エディタ コントロール"で検索してみると
>みんな苦労してるのがわかると思う。
わかりました。どうもありがとうございました。ではまた。
380 :
デフォルトの名無しさん :2008/09/08(月) 15:38:29
C#2.0で質問です。 Winアプリを作成しようとしています。 WEBアプリであればSessionのコレクションに特定のKey名でシリアライズできるオブジェクトを入れて 各画面で遷移した後も使いまわせるようにできると思うのですが Winアプリで同じようなことを実現するにはどのようにすればよいでしょうか? エントリポイントの static void Main() { } この辺りでRunさせる前に作成して保持しておきたいのです。 何か良い方法があればご教授いただけませんか?
静的なHashtableにでも入れときゃいいんじゃない? 俺はやらんけど。
>>380 遷移実行は遷移を管理するObjectに依頼する。
画面は遷移引渡し用Method、遷移元取り込み用Methodを用意する。
>>381-382 レスありがとうございます。
>>381 その方法だとすごく簡易にできそうです。
>>382 画面で順々に渡していくわけですね。
遷移絡みで一元管理ができそうです。
今回は一寸時間もあるので
>>381 +
>>382 の手法を組み合わせて
勉強しながら進めてみようと思います。
ありがとうございました。
385 :
デフォルトの名無しさん :2008/09/08(月) 18:32:55
何この糞ップリww
一般に、大卒以上の学歴を有しながら、中卒以下の人間を指す
387 :
デフォルトの名無しさん :2008/09/08(月) 23:23:51
VC#2008Express SP1でプログラム書いてるんですが、PerformanceCounterが思ったとおりに動いてくれません。 CategoryName : Processor の CounterName : % Idle Time や CounterName : % Processor Time などの値を取得すると「0」しか返ってこない。 MemoryのAvailable MBytesや% Committed Bytes In Useなどは正しい値が返される。 正しい値とは、perfmon.exeで表示している値との比較。 Processorの% Idle Timeなどの常に「0」と表示される値は perfmon.exeでは全部0以外の値が表示されている。 という状況です。 ソースの該当部分は PerformanceCounter pc1; pc1 = new PerformanceCounter(); pc1.CategoryName = "Processor"; pc1.CounterName = "% Idle Time"; pc1.InstanceName = "_Total"; Console.WriteLine(pc1.NextValue()); です。 どこかの掲示板で同じ症状で悩んでる人がいたんですが、誰もレスつけてなくて解決できたのかもわからない状況… なにか間違っているところありますか?
while(true){ Console.WriteLine(pc1.NextValue()); System.Threading.Thread.Sleep(100); } ちょい試してみな
390 :
388 :2008/09/09(火) 00:01:03
>389 あぁぁぁぁorz わかりますた… % Idle Timeとかって初期値が必ず0なのね… はずかしぃぃぃ
System.Environment.CurrentDirectory; のような感じでファイル名も取得したいのですがどうしたらいいでしょうか? System.Environment.CurrentDirectory ディレクトリの情報しか取得してくれないんです
実行ファイルのパスなら、 Application.ExecutablePath
>>394 右クリックメニューからどのプログラムで開くように設定したの?
登録したプログラムが君の作ったプログラムだったらMain関数の引数がまさしくファイル名になるけど、
たとえばnotepad.exeで開くようにしたのだったら当然ファイル名を取得することはできないよ?
notepad.exeは君の作ったプログラムじゃないから当たり前なんだけどさ。
何がしたいのか全然想像できん。
相当初心者みたいだから、もっと具体的に説明してくれないと答えにくい質問だわ。
396 :
デフォルトの名無しさん :2008/09/09(火) 05:21:33
397 :
デフォルトの名無しさん :2008/09/09(火) 12:06:27
List<string> a = new List<string>(); a.add("aaa"); ・・・ ときて、aの要素すべてを"\\"で連結してひとつの文字列にしたい
String.Join
サンクス string.Join("\\", a.ToArray()); でできた
401 :
395 :2008/09/09(火) 15:08:47
>>400 当然読んだに決まってるじゃん。
リンク先のサンプルは右クリックメニューにオリジナルメニューを追加させるようなアプリのサンプルなんだから、
右クリックで開かれるファイル名を取得したいという質問自体が意味不明なんだよ。
あくまでレジストリにキーを追加するだけのアプリと、コマンドライン引数を取得することは全く結びつかない。
コマンドライン引数を取得したいのならばそう言えばいいだけで、リンク先の記事は何の意味もなさないんだよ。
政治板にあった的確なAAを紹介します!! ↓ 【選挙前】 郵政民営化に賛成か否か 国民投票です 自民党↓ 小泉 , - ,----、 (U( ) | |∨T∨ (__)_) 国民様、へへへーっ ↓ ↓ 【選挙後】 自民党↓ ガソリン暫定税率維持 後期高齢者制度制定 ∧_∧ 日雇い派遣 制限撤廃 ( ´∀`) 郵政造反組復党 ( /,⌒l & 天下り先独法の特別会計ジャジャ漏れは完全に温存 !! | /`(_)∧_0. & 二人の総理投げ出し他人事で辞任! (__)(´∀`; )⊃⌒⊃ ← ← ← (一般民間人) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
403 :
デフォルトの名無しさん :2008/09/09(火) 16:18:33
ageろよww
コピペ君って馬鹿だな、まで読んだ。
>>396 ありがとうございます。
期待していた動きをさせることができました。
406 :
デフォルトの名無しさん :2008/09/10(水) 11:30:15
メソッドの引数にプロパティがたくさんあるクラスを渡そうとしています。 引数を渡す時に ref をつけて渡した方が、実行速度上 ( 微々たるものかもしれませんが ) 有利になるのでしょうか。 ref を付けずに渡すと、メソッドに渡す時に引数がコピーされると、プログラミング c# に書かれていました。 どうなのでしょうか?
407 :
デフォルトの名無しさん :2008/09/10(水) 11:31:53
用途による としか言いようがない
されない。 そう書いてあったならその本が間違ってる。 もしくは値型についての話と混同してる。
厳密にはクラスでも引数はコピーされるが、今の話はそういう話ではないはず。
大きな値型なら速くなる クラスなら付けない方がたぶん速い
そうじゃなくて、そのメソッドをよく呼ぶときに実行速度が問題となるってこと。
412 :
デフォルトの名無しさん :2008/09/10(水) 11:42:57
>>407-411 お返事ありがとうございます。
なかなか難しいですね。
私の理解としては、メソッドの引数が、
クラスの場合→インスタンスのアドレスが渡される ( コピーされない )
値型の場合→ボックス化?され ( つまりコピーされ ) 渡される
という理解ですが、良いのでしょうか?
クラスの場合に、そのクラス中に値型のフィールドが含まれることもあるかと思いますが、そちらはよく分かってません。
413 :
デフォルトの名無しさん :2008/09/10(水) 11:43:13
refキーワードは速度じゃなく、メンバの使われ方が問題なんだが
414 :
デフォルトの名無しさん :2008/09/10(水) 11:44:14
よく考えなくても分かるけど、参照がコピーされたのに、参照に含まれる一部が実体とかおかしいだろ
意味が分かりませんw
416 :
デフォルトの名無しさん :2008/09/10(水) 11:47:47
>>414 なるほど。
では、まとめると、
クラスの場合→インスタンスのアドレスが渡される ( コピーされない )
クラスのメンバに値型が含まれる場合→インスタンスがコピーされアドレスが渡される
値型の場合→ボックス化?され ( つまりコピーされ ) 渡される
という理解ですが、良いのでしょうか?
とりあえずいろいろコード書いて試してみりゃいいよ
>>414 だいぶ混乱してる。
少なくとも今の話にはボックス化は無関係。
ただしコピーされるってのは間違ってない。
値型メンバはクラスのインスタンスにそのまま埋め込まれてる。
参照型メンバはクラスのインスタンスに、まあ君の理解で言うとアドレスが埋め込まれてる。
>>416 × クラスのメンバに値型が含まれる場合→インスタンスがコピーされアドレスが渡される
○ クラスのメンバに値型が含まれる場合→インスタンスを保持している変数のアドレスが渡される
// 例
class Hoge {
private string msg;
Hoge(string s) {
msg = s;
}
public override string ToString() {
return msg;
}
static void foo(ref Hoge fuga) {
// Main関数のhogeが指しているインスタンスが別のものになる。
fuga = new Hoge("Foo");
}
static void Main(string[] args) {
Hoge hoge = new Hoge("Hello");
Console.WriteLine(hoge.ToString());
foo(ref hoge);
Console.WriteLine(hoge.ToString());
}
}
値型は実体がコピーされる。 ただし、参照型に含まれる値型は値型の参照がコピーされる。 以上
422 :
デフォルトの名無しさん :2008/09/10(水) 12:15:53
もう難しすぎる!
>>413 XNA Frameworkとか覗いてみたらわかるよ
決して良い使い方だとは言えないんだけど
そういう人が書いた記事よりもMSDNを熟読するほうがいいよ。
そりゃC#のボキャブラリだけで考えていたら難しいだろう Cかアセンブラで関数のメカニズム(スタックフレーム)について 勉強してから戻ってくるといいよ そういえばMSILの逆アセンブラなんかもあったような
でたらめが入りまじってるから、 ちゃんとした書籍で調べることをお薦めする。 ああ、ひと目でわかるとか、あんなのは駄目だぜ。 こちらはVB版だが、確か同じ間違いの記述がある。
427 :
デフォルトの名無しさん :2008/09/10(水) 13:35:40
>>417-426 スタックやヒープなどからいろいろと勉強して理解してみます。
アドバイスありがとうございます。
逆に ref を使うときってどういう時に使ってますか?
たまにprivateメソッドで実装の都合で使うかも 外から見えるメンバには絶対使わないな outは稀に使うけど
確かにrefはめったにない。 outはたまに使う。
COMインターフェイス絡みだと[In] refなんてザラだけどこのスレ的にはあんまり関係ないな
C#2.0 Winアプリで超基本を教えてください。 DataTableをDataSourceプロパティにバインドしたときは ValueMemberとDisplayMemberを指定することでSelectedItemからTextとValueが別々に取得可能ですが 自分で コンボ.Items.Add メソドを使用して項目を追加する場合に SelectedItemからTextとValueを別々に取得できるようにするにはどのようにすればよいでしょうか? 自分でデータテーブルを作成するときに加工しておけばよいのでしょうが、 それはしない方向で実現する手段があればお教えください。 具体的には データベースにId Name のカラムがありそれぞれ int,string の型になっています。 この先頭に * 全て という項目を入れたいのですが DBから取得してきたDataTableのId列はint型なので先頭項目を挿入できないのです。 値を取得してきた際、*でなければ全て数値であることが保障されているという前提です。 よろしくお願いします。
DBNullでいいじゃん?とは思うけど stringのプロパティ二つ持ったクラス用意 DisplayMember/ValueMemberにそれぞれのプロパティ名設定 一つずつ用意したクラスに詰替え Items.AddよりDataSourceに配列として設定した方がよくね?
>>432 >Items.AddよりDataSourceに配列として設定した方がよくね?
確かに・・・
まず提案していただいた方法試してみます!
ありがとうございました。
DBの項目がIntならそのまま更新できないから「全て」が選ばれたときにどうやって更新するのかは気になるところ
ArgumentNullExceptionをスローするときに 引数名を文字列で直接指定するのって格好悪い気がするんだけどいい方法ある?
気のせいだ
>>435 ない。
リファクタリングと相性が悪いので、どうにかしようという話が出てたが
まだ実現していない。
internal static Exception ArgumentNull(Delegate method, int paramIndex) { ParameterInfo[] parameters = method.Method.GetParameters(); return new ArgumentNullException(parameters[paramIndex].Name); } void Hoge(object arg) { throw ArgumentNull(new Action<object>(Hoge), 0); } こういうのはどうだろう
今度は引数の数や順番の変更に弱くなるぞ
質問です。 WinXPにてadmin権限でログイン後 作成したアプリをインストーラからインストール。 アプリは、カレントディレクトリに対してフォルダを作成したり ファイルをダウンロードしたりします。 admin権限でログインしているときはうまく動作するのですが、 フォルダに、ユーザからのアクセス件が無いので動作しません。 以下のコードでアクセス権を付加しようとしていますがうまくいきません。 どこが間違っているでしょうか? System.Security.AccessControl.DirectorySecurity dSecurity = Directory.GetAccessControl(Application.StartupPath); dSecurity.AddAccessRule( new System.Security.AccessControl.FileSystemAccessRule( System.Environment.UserName, System.Security.AccessControl.FileSystemRights.FullControl, System.Security.AccessControl.AccessControlType.Allow )); Directory.SetAccessControl(Application.StartupPath, dSecurity);
441 :
440 :2008/09/10(水) 23:00:07
質問訂正です。 WinXPにてadmin権限でログイン後 作成したアプリをインストーラからインストール。 アプリは、カレントディレクトリに対してフォルダを作成したり ファイルをダウンロードしたりします。 admin権限でログインしているときはうまく動作するのですが、 権限無しのユーザでログインすると フォルダにユーザからのアクセス件が無いので動作しません。 以下のコードでアクセス権を付加しようとしていますがうまくいきません。 どこが間違っているでしょうか? System.Security.AccessControl.DirectorySecurity dSecurity = Directory.GetAccessControl(Application.StartupPath); dSecurity.AddAccessRule( new System.Security.AccessControl.FileSystemAccessRule( System.Environment.UserName, System.Security.AccessControl.FileSystemRights.FullControl, System.Security.AccessControl.AccessControlType.Allow )); Directory.SetAccessControl(Application.StartupPath, dSecurity);
>>441 フォルダのアクセス権がないユーザーが、そのフォルダのアクセス権を変更することはできない。
当たり前のことですな。
お前馬鹿かよ。 何やろうとしてるか冷静に考えてみろ。
C#もVBと同じ Optional 引数は使えますか?
いいえ
446 :
デフォルトの名無しさん :2008/09/11(木) 00:43:03
adminとuserがひとつのアプリを共有し ファイルディレクトリ操作を行う場合 どういう実装をすればいいのでしょうか?
userに権利が無い操作を、できなくすればいいのでない?
>447 自分がadminかそうじゃないかを知る方法ってあるのですか? 元々その辺から調べてたのですが全くわかりませんでした。
C# 2.0のアプリケーション構成ファイルで接続文字列を設定し DbProviderFactoriesクラスからGetFactoryメソッドを使用した上でDBへ接続を行いたいと思っています。 構成ファイルの方は設定しており <add name="プロジェクト名.Properties.Settings.ConnectionString" connectionString="Provider=HOGE-;Data Source=hogehoge" providerName="System.Data.?????" /> このような記述がされております。 このときPG側から接続文字列の設定を読み取ることは標準でできるのですが ProviderName の部分(System.Data.?????)を取得するにはどのようにすればいいのでしょうか? 設定ファイルの設定はC#の「プロジェクトの設定のエディタを使用しております。 よろしくお願いいたします。
451 :
441 :2008/09/11(木) 14:55:32
>449 ありがとうございました。ようやく前進できました。 もうひとつ質問ですが、 System.Net.WebClient でファイルのDLを行う場合、 拡張子exeのファイルは環境によっては弾かれるということはありえますか? 拡張子exeのファイルは拡張子を変えてDLしたあとリネームした方がいいのでしょうか? それとも、zipファイルとしてDLしたあと展開するのがベターでしょうか?
C#でWindowsの音量(マスターとか、WAVEとか、ラインインとか)を 直接操作できるような方法ってあるんでしょうか?
Win32API
C# api MIXIERCAPS あたりで検索して味噌
err s/MIXIERCAPS/MIXERCAPS/
>>450 これ以上ないくらい普通に取れるが、どこで引っかかってるの?
>>456 おはようございます。
Properties.Settings.Default.ConnectionString
で接続文字列は取得できるのですが
Properties.Settings.Default.ProviderName
というプロパティが存在せず取得できないということです。
コンテキストメニュー「1」又は「2」からフォーム「A」を 開くときに、フォーム「A」はどちらのコンテキストメニューから 開かれたのか知るためにはどうすればいいのでしょうか。
DataGridViewの表示がやたらと遅いんですが、 改善策はあるんでしょうか? フォームにDataGridViewを置いて起動→ 10行くらい適当に入力→ 最小化、最大化で、上から順にズラズラと再描画されています。 PCは最近のものなのでスペックは悪くありません。
>>458 フォームAにそういうプロパティを実装する。
あとは呼び出す前に設定するだけ。
461 :
デフォルトの名無しさん :2008/09/12(金) 15:30:53
Form1にシリアル通信をしてオープンしている状態で、別のフォーム(Form2)を呼び出して、 そのまま通信しようとするとエラーが起きてしまいます。 どうすればよいでしょうか?
エラー(笑)
エラーというかポートが閉じられているとでます。
何がでるって?
'System.InvalidOperationException' のハンドルされていない例外が System.dll で発生しました。 追加情報: ポートは閉じられています。 です
>そのまま通信しようとすると って具体的に何したの
データを送ろうとしてます。 Form1からは正常に動きます
ズコー
いいよいいよー
Form2はForm1からシリアルのインスタンスもらってそれを操作しようとしたの? スレッドは単一?
はい
メル欄ふざけてるの?
はい
>>473 違う
>>472 違う
非アクティブ状態でも、シリアルポートはOPENにしたいんだーーーーーーーーーーーーーーーーーー
メル欄真面目なの?
まじめです。 マジレス頼みます
VBのMSCommじゃないんだから(いやMSComm使ったってそうだが)Formの状態と SerialPortクラスの例外は普通は何の関係もないはずだが。 っていうかまずハンズオンか何かにあったサンプルコードを理解するところから はじめたらどう?
シリアルポートって1つしかOPEN出来ないとかそういう話じゃなくて?
は?
め?
は?
め?
学?
園?
Windows フォームアプリで、System.Threading.Timer で一定時間ごとにある操作をしてフォームに文字列を表示しています。(30ms 毎に Timer が起動) 文字列はちゃんと表示されているのですが、フォームの他のコントロールが描画されず真っ白のままです。 System.Windows.Forms だと正しく動作するのですが、どうしたらよいのでしょうか?
System.Windows.Forms を使う
>>485 できた。
this.Update();
Application.DoEvents();
を追加した。
DoEvents()が出てきたら何か考え方がおかしいと疑ったほうがよい
>>487 残念だが多分正しくは出来てない気がする。
デバッグ実行したら例外になったりしないか?
まあ見てないから分からんけども。
ずっと動かしてたら落ちるだろうなあ
>>488-490 確かに表示は更新することは出来ましたが、
フォームを終了させると例外が発生しています。
タイマの delegate でフォームを更新させるために呼んでいる Invoke メソッドで InvalidOperationException が発生しました。
30ms 毎に Timer を起動していますが、行っている処理の時間がかかりすぎて、次の30ms までに終了せず、タイマが ThreadPool にたまりすぎなのだろか?
どんな処理してるわけ?
毎回起動しなおしてんの?
ま、Invokeはハンドルが破棄された後に呼び出すと例外になるので、 とりあえずInvokeする前にハンドルがあるか確認するか、 確実を期するなら自前でフラグ管理と同期を行うか、 まあ少なくともどっちかは必要。 その上で他にも問題があるかはまた別の話。
495 :
デフォルトの名無しさん :2008/09/14(日) 12:20:56
30msごとにタイマー起動してフォームを更新っていったいどんな処理しているの? その設計自体を根本から見直す方が先決だと思うんだけれど。
色んな要求あるんだから、お前の小さい視点でレスするな
点に大きいも小さいもないよ。
ん?悔しかったの?w
デリゲートは標準でマルチキャストですが シングルキャストデリゲートってどう作るんですかね?
C#ってよりCLRじゃ無理
あれってデリゲートが今みたいに積極的にイベント以外に使われるようになることを 想定してなかったんだろうな 今作り直すならイベントハンドラは別扱いとかコンテナは別にするとかになりそう
>>501 なぜデフォでマルチキャストなのかって疑問は確かにあるけどそれはない。
だって関数ポインタの自然な発展形である以上、
その用途をイベントだけに見積もるなんてありえん。
また俺のわからない話をする
最初はシングルキャストと厳密に分けてたけどうざいだけでメリットがあんまなかったからやめたのさ。
関数ポインタを引数にとるアンマネージ関数にマルチキャストデリゲートを渡しても ちゃんと全部呼んでくれる。 神経質に使い分ける必要もないのかな。
506 :
499 :2008/09/16(火) 20:13:47
どうも class Program { //計算を委託できる public Func<double, double, double> Calc; private double a, b; public Program(double a, double b){ this.a = a; this.b = b; } private double DefaultCalc(double a, double b){ return a + b; } public void Action(){ double result; if (Calc != null) result = Calc(a, b); else result = DefaultCalc(a, b); Console.WriteLine("計算結果:{0}", result); } } class Test { static void Main(string[] args){ Program program = new Program(12, 42); program.Calc += ((a, b) => a * b); program.Calc += ((a, b) => a / b); program.Action(); } }
507 :
499 :2008/09/16(火) 20:14:33
↑みたいなプログラムだとマルチキャストの意味が全くないし 間違えて+=で委託先を追加したら気づかずに余計な処理をさせちゃうこともあり得るので どうせならシングルキャストを作れればいいのにと思いましたが private Func<double, double, double> calc; public Func<double, double, double> Calc { get { this.calc = value; } } みたいなプロパティを追加すればいいだけだと気づきました、すみません
508 :
499 :2008/09/16(火) 20:15:19
setだった
setオンリーのプロパティはガイドライン違反 SetCalcメソッドにしようね
>>509 そんなガイドラインあったっけ?
VBなんて普通にWriteOnlyなんていう組み込みのキーワードまであるんだけど。
<>で囲まれてる文字列を最小一致で全部取り出すにはどうしたらいいですか? <html><body></body></html>なら、 html body /body /htmlを取り出してリストに突っ込むようなことです 最小一致なのでhtml><body></body></htmlが取り出されると困ります よろしくおねがいします
>>509 >>511 そうでしたか、
わざわざどうもです
>>512 char[] separator = {'<', '>'};
string str = "<html><body></body></html>";
str.Split(separator, StringSplitOptions.RemoveEmptyEntries);
っていうのはどうでしょう
514 :
512 :2008/09/16(火) 21:17:12
>>513 うまくいきました
本当にありがとうございます。
>>512 ちなみに、.NET の正規表現的には \<.*?\> で行ける。
*? で最小一致。
>>515 ついでに先読み、戻り読みも入れて (?<=<).*?(?=>) で
>>513 >>514 Split使うなら、ゴミが入らないようにしないと
str.Split('<').Skip(1).Select(s => s.Split('>')[0])
因みに、以下の場合はおそらく構文エラーなので適当に
- 1回目のSplitで空文字列がある(ただし、#0は除く)
- 2回目のSplitで要素数が2でないか、#0が空
横やりだけどSkip()って初めて見るけど新しく追加されたメソッドか?
LINQまったく使ってないなぁ 最初は興味あったけど構文が異質すぎて使えない
クエリ式を使わないLinqもありだよ。C#のクエリ式ではSkipはサポートされていない。 VBではサポートされている。
ゴミって空文字かな? StringSplitOptions.RemoveEmptyEntries でおkのような気がす そういう感じで行くなら str.Split(new char[]{ '<' , '>' }).Where(s => s != "") の方が俺好みだば クエリ構文はまったくわからないなぁ まったく使わなそうな気がするのでそこだけ勉強すらしてないなぁ。。
>>521 いや、こういう事
<html><body>ゴミ</body></html>
ああなるほど把握
パブリックメンバにDictinaryを含むクラスをシリアライズしたいのだけど、 IDictionary実装クラスはシリアル化できないと怒られます。 KeyValuePair構造体の配列に変換してからシリアル化するのがいいのかと考えたんですが、 デシリアライズの時にどうすればいいのか・・・ どなたか助言いただけると助かります
配列にしたとしても、KeyValuePair(のプロパティ)が変更可能でないから駄目じゃないか 俺は変更可能なKeyValuePairとDictionaryのラッパー作って対処したが
Dictionaryでset可能なプロパティって気持ち悪いな IXmlSerializableの実装でも書くか?
C#でH8/3069の制御って出来ますか?
うん
返答ありがとうございます もう少し具体的な質問が出来るようになるまで自分で勉強しようと思います
530 :
524 :2008/09/17(水) 17:29:27
結局パブリックプロパティで、 Dictionaryのkeyとvalueの2次元配列を取得、 Setterでは2次元配列のループでDictionaryにkeyvaluepairを格納していくような設計にしました。 やはりDictionaryはカプセル化した方が良かったですね。 ただデシリアライズ時のパフォーマンスがどうなるかは?ですが。
>>528 え゙ ?H8向けのコンパイラ(実行環境)ってあるの?
↑アホ
いや、俺の方がもっとアホ
>>531 H8は(というか今時のマイコンはほとんどそうだと思うけど)実機とIDEで
デバッグができるはず。
まあでもマイコンの開発にデバッガなんて俺はいらないと思うけどね。
少なくとも俺は使ったことも必要性を感じたこともないよ。
タイマーで10ミリ秒毎にフォーム上のマウスカーソルの座標を取得し、 マウスに合わせて画像も一緒に移動させる。 更に、クリックした場所に画像を固定する。 ってなことをやってみたんですが、 移動時など、ものっすごい画像がチラついてしまいますorz やっぱこういうのはDirectXなどを使ったほうが良いのでしょうか?
本当にそれは10ミリ秒毎にする必要はあるのか?
>10ミリ秒毎 意味あると思ってんのか?
100fpsなんて格ゲでもやらんぜ
539 :
535 :2008/09/18(木) 00:39:58
3連発でダメ出しされるとは・・・orz 最初100ミリ秒でやったんですが、 マウスの動きに若干遅れるんで、10ミリ秒にしてみました。 意味は全然考えてませんでした。すいません。。 これは仕様から考え直したほうが良さげですね。 お騒がせしました&ありがとうございました。
タイマでやらんでもできるっしょ。 ボードゲームのソースでも拾ってくれば?
541 :
デフォルトの名無しさん :2008/09/18(木) 01:33:08
C#というわけではないのですが、ファイル管理ソフトでファイル内 文字列まで見て該当ファイルを見つけるという検索がありますが、 あれは文字列の形式やフォーマットあるいはエンコードなどをすべて のケースで調べているのでしょうか? たとえばExcelやワードなどのファイルの場合は、それをテキスト形式 で取り込んで調べるのでしょうか?
>>541 うぜえ、なんだこいつ
場違いなんだよ消えうせろクソ餓鬼
>>540 画像をマウスと一緒に動かすのは、とりあえず諦めました。
で、オセロとか見てたんですが、置く画像が正方形なら簡単だけど、
長方形も混在してると、途端に難しくなりますね。
ゲーム系のプログラムは全然やったこと無かったんで、
もっと単純な物も参考にしてやってみます。
>>543 PanelとかPictureBoxとかのMouseMove/MouseClickイベントで十分ぽい匂いがした。
struct Vect { public Point[] Points; } private void init() { Vect v = new Vect(); v.Points = new Point[] { new Point(2, 3), new Point(3, 4) };//これだといける v.Points = { new Point(2, 3), new Point(3, 4) };//これだとエラーが出る } なぜエラーがでるのでしょうか?どういう違いがあるのでしょうか?
Point[] Points = { new Point(2, 3), new Point(3, 4) }; こんな感じで記述するといけるんですが・・
>>545 new Point[] を省略していいのは変数宣言の時だけ。
省略できるのしらんかったw
menustripコントロールで出来て、toolstripコントロールだと出来ないことってありますか? toolstripならアイコンだけじゃなくて文字でも表示できるのでmenustripを使う意味はあるのかなと思いました。
C#Builderのプロジェクトファイル群をVC#対応へ移行するにはどのようにするのでしょうか?
551 :
デフォルトの名無しさん :2008/09/18(木) 21:06:14
エラー 1 型または名前空間名 'Drawing' は名前空間 'System' に存在しません。アセンブリ参照が不足しています。 どこいっちゃったのよ。
Drawingの前にSystemつけるかusing System.Drawing;じゃないか
スレタイに C井 が足りない
C丼は足りてる
.net1.0からの移植 using System.Drawing;でエラーが出た もう意味がわからない
※ C丼: コチュジャン丼。豚肉と温野菜をコチュジャンで甘辛くした物をご飯の上に載せた物
ソリューションエクスプローラーの参照設定にSystem.Drawing入ってるか?
「System」だけ参照設定に入ってるけど、一つ一つやらなきゃいけないの? なんか似たようなエラー30個もある
なるほど解決しました エラー減っていくのが楽しいです ありがとう
現金な奴だw
じゃあ、C丼について語ろうか
562 :
デフォルトの名無しさん :2008/09/18(木) 21:43:23
丼だけ〜 ?
563 :
デフォルトの名無しさん :2008/09/18(木) 23:42:56
C#で、Formに張り付いているTextBoxを、 マウスドラッグされた場所に移動する場合どの メソッドをしようすればいいでしょうか?
メソッドは使用しない。 プロパティなら使用する。
private bool clicked = false; Point beforeLocation; private void textBox1_MouseDown(object sender, MouseEventArgs e) { clicked = true; beforeLocation = textBox1.PointToScreen(e.Location); } private void textBox1_MouseMove(object sender, MouseEventArgs e) { if (clicked && (beforeLocation != null)) { Point afterLocation = textBox1.PointToScreen(e.Location); textBox1.Left += (afterLocation.X - beforeLocation.X); textBox1.Top += (afterLocation.Y - beforeLocation.Y); beforeLocation = afterLocation; } } private void textBox1_MouseUp(object sender, MouseEventArgs e) { clicked = false; } 超適当で作ってみたけど正しいかはわかんない
もうちょっとシンプルに int mx, my; bool mDown; private void textBox1_MouseDown(object sender, MouseEventArgs e) { mx = e.X; my = e.Y; mDown = true; } private void textBox1_MouseMove(object sender, MouseEventArgs e) { if (!mDown) return; this.textBox1.Left += e.X - mx; this.textBox1.Top += e.Y - my; } private void textBox1_MouseUp(object sender, MouseEventArgs e) { mDown = false; }
msdnドキュメントをオフラインで使用したいのですが どこでダウンロードできますか?
Download Centre
2005用のしかないんだけど、2008にも使えるの?
570 :
デフォルトの名無しさん :2008/09/19(金) 09:24:58
すみません、、、質問させていただきます。 for文を利用して、偶数表示をするWEB画面を作成する課題がでました。 解答例)2,4,6,8,10 結果は、10が表示されます。デバッグしたら、 2,4,6,8もif文の中をとっているのに表示されません、、、 提出期限は昨日の夜まででした、、、ほんとに どうしていいか分かりません。教えてください。 for (int i = 1; i <= 10; i++) { if (i % 2 == 0) { litShowAns.Text = Convert.ToString(i) + "、"; } } litShowAnsはliteralのIDです。 ヒントは文字列の結合らしいのですが。。。何で文字列の結合が必要なのか分かりません。
>>570 Aという変数に2から10まで入れたとして、最後に入ってるのは10だろ?
>>570 文字列の結合を調べましたか? 試しましたか?
i がそれぞれの値のとき、何が起こっているか自分なりに説明できますか?
>>570 litShowAns.Text += Convert.ToString(i) + "、";
>>570 for (int i = 2; i <= 10; i+=2)
{
string str += Convert.ToString(i) + "、";
}
litShowAns.Text=str;
間違えた string str =""; for (int i = 2; i <= 10; i+=2) { str += Convert.ToString(i) + "、"; } litShowAns.Text=str;
Convert.ToString(i)だと良いことあるの? ずっとi.ToString(i)を使ってたんだけどまずい?
文字列の連結を何回もやるときはStringBuilderとかそんな話もあるけどおいといて for文だと最後に","が入っちゃうでしょう どうしてもforを使わなきゃならんなら最後削るか、 string str ="2"; for (int i = 4; i <= 10; i+=2) { str += "," + i.ToString(); } litShowAns.Text=str; こうするか
> Convert.ToString メソッド (Int32) > 解説 > この実装は、Int32.ToString と同じです。
for (int i = 2; i <= 10; i++) litShowAns.Text += i % 2 == 1 ? "," : i.ToString();
litShowAns.Text = Enumerable.Range(1, 10) .Where(i => i % 2 == 0) .Select(i => i.ToString()) .Aggregate((s1, s2) => s1 + "," + s2);
581 :
デフォルトの名無しさん :2008/09/19(金) 15:08:54
>>577 List<string> strListにつっこんで
ループの外で String.Join(strList.ToArray(), ",")
でいいんじゃまいか。
>>582 ありがと
ほんとわかりにくいよねMSのページって
そんなに見つかりにくいのかと思ったら ダウンロードセンターのトップから3画面じゃねーか
VBスレよりはちょっと親切なスレ
MSのページはごちゃごちゃしててわかりにくいよ MSDNもそう
ダウンロードセンターって検索ボックスに文字入れて検索するだけの ページだよな?どこが?
589 :
デフォルトの名無しさん :2008/09/19(金) 22:00:30
CTIのシステムを自分のソフトにも組み込んでみたいんですが どんな感じで実現するんでしょう? 着信があってその番号から検索するのはわかるんですが、 どうやって電話を邪魔せずに番号だけ抜き出せばよいのか…・ 外からの着信→PCのモデム→TEL こんな感じでつなぎそうな気がするのですが・・・・
なんでこのスレで質問しようと思ったの?
>>589 ここはC丼について語り合うスレだぜw
>>591 七味の代りに山椒つかってみたら?
七味も山椒もテーブル調味料から派生してるし、Iふりかけableも実装されてるから置換できるはず
座薬のかわりに七味をつかったら癖になりました。今度は山椒もためしてみたいと思います。ありがとう。
>>590 あぁ・・スレ違いでしたか
逝ってきます
しかしVBのoptional引数は便利でした C#も導入してほすいです
C++から入った俺はデフォルト引数なくて絶望した なんでないんだろ
>>594 C++ のデフォルト引数みたいなのだっけ?
同じことしたければメソッドオーバーロード使うべきってことで削られたはず。
デフォルト値を変えたとき、利用側の再コンパイルが必要になるし。
VB の場合は、名前付き引数と組み合わせると結構面白そうに思うけど、
正直 C++ のデフォルト値はオーバーロードですればいいだけの話。
うまく説明できないのですが 1,2,3,4,5 というそれぞれの数字を 5,4,3,2,1 というように変換したいのですがどうすればいいんでしょうか? ソートの昇順降順とかではなくて、それぞれの数字(1なら5)に変換という漢字にしたいんだけど
598 :
597 :2008/09/20(土) 04:20:37
今はこんな感じでやってます int[] a=new int[]{5,4,3,2,1}; int x=1; a[x-1];
598が何を言ってるのかわからないが、 Array.Reverse( a ); で逆順にできるが、違うのか? 例が悪い。そんなソートが完了しているような数字の並びじゃ逆順としか答えられない。
Dictionay<int, int>
601 :
597 :2008/09/20(土) 05:58:38
>>600 これでいけました。ありがとう
連想配列というものなんですね
ただの配列で十分な件。 マッピングが連続数値じゃないなら別だけど。
603 :
597 :2008/09/20(土) 14:05:25
Dictionay使ってみたけど、値からキーが取り出せないんですね データの追加や削除もしないし 手軽に2つのデータをスワップしたいだけなので 自作関数作ったほうがいいみたい
そういう場合には2個使うんだよ
いやキーと値をひっくり返したペアも突っ込めばいいだけじゃん。 それに何の意味があるのか知らんが、自作するよりは手間もパフォーマンスも はるかに勝るだろ。
if文をずらーっと並べればokw
6から引けばいいだけなんじゃ…
608 :
597 :2008/09/20(土) 14:57:28
例えば、この文字列を上下で相互変換したい場合 a,b,c,d,e 1,2,3,4,5 5,4,3,2,1 Dictionary<string,int> dicStringToInt=new Dictionary<string,int>(); dicStringToInt["a"]=1; Dictionary<int,string> dicIntToString=new Dictionary<int,string>(); dicIntToString[1]="a"; こんな感じ? データ構造自体は変化することもないんだけど このswap処理を大量に何度も使用するので できるだけ、if文や演算処理をしないようにしたいんだけど
要素数はどのくらい? 文字列の長さは?散らばり具合は? 条件によって望ましい方法は変わるわな。
リターンキーをOKボタンに割り当てるにはどうすればいいですか?
AcceptButton のことかな?
デザイナで、ボタンのプロパティDialogResultをOKにする、 とかそういう話??
>>598 のやり方で出来ているんだったら、それでいいんじゃないの?何か問題有る?
ちなみに俺だったら、こうするな。
int[] a=new int[]{0,5,4,3,2,1};
int x=1;
a[x];
615 :
597 :2008/09/20(土) 16:47:26
>>613 文字列から数字に変換する必要もあるので
配列は使えないんです
> 文字列から数字に変換する必要もあるので > 配列は使えないんです 文字列を数字にしてから、数字に変換するんじゃダメなのだろうか、 と愚考してみる。
>>616 DialogResultは
>>610 の要求とちょっとズレてる。
>>611 の言うように、デザイナでフォームのAcceptButtonを指定するんでしょ。
>>597 正直言ってることがうなぎみたいにつかみどころがない気がする。
やりたいことを小出しに表現せずに全部詳細に書けば?
>>615 文字列というのは、今まで例に挙げていた 1,2,3,4,5 だけじゃなく、
アルファベットとかの任意の文字が含まれるということ?それとも数字だけ?
数字だけだったら、一旦数値に変換してから
>>598 のやり方をすればいいんじゃない?
分散してたらテーブルを配列で持つのは効率が悪いだろう
範囲次第だよね。
622 :
597 :2008/09/20(土) 19:02:16
>>617 それだとif文やswitchをしなければならないので・・
>>618 ユーザーから入力された文字列(数字やアルファベットが混在している任意の文字列)を
1文字づつ決まった法則(置換用データベースは用意してます)でint型やstring型に変換したいのです
"1"なら5、"a"なら1、5なら"1" という感じです
623 :
597 :2008/09/20(土) 19:09:22
入力された文字列が "1a5ig4"なら 5、1、1、9、7、2 <-すべてint そして、上の文字列配列をこちらからユーザーに対して出力する場合は "1a5ig4"
そこまで説明できて何が分からないんだ。
>>623 要するに全単射とその逆写像を簡単に実現する方法はないか、と?
Dictionaryから派生してBijectionクラスを作って、そこに逆写像を取得する
メソッドでも書くとか。
"1"なら5、"a"なら1、5なら"1" という感じです って、""をつけてるのはstring型なのか? それにその説明だと無理だろ。 エンコードされた結果が 5,1,1,9,7,2 ですべてint型というのであれば、 デコードは "1aaig4" か "155ig4" にしかならないだろ
627 :
597 :2008/09/20(土) 19:51:19
>>625 Bijection<string,int>
string Bijection.Keys[1]
string Bijection.GetKey(1)
こんな感じで値を渡すことでキーを取得できるようにする感じですか?
>>626 偶数番目の要素と6以上はアルファベットに変換など
いくつかの置換ルールがあるんです
なので、奇数、偶数番目用にそれぞれ別のDictionaryクラスを使用している感じです
628 :
597 :2008/09/20(土) 19:55:25
今書いてて気づいたけど、可逆的な暗号化って感じになるのかな? 実際そういうことをしたいわけではないんですが やろうとしていることは同じかもしれません
仕様を全て書き出すわけにはいかず 説明出来るような法則が無く、 そして一定のルーチン化が無理なら char分解とループとIF文でゴリ押ししかないんじゃない?
>>627 なんで情報をいちいち後出しにするんだ?
答えるほうの立場なってみろよ。
631 :
597 :2008/09/20(土) 20:17:07
最終的な出力を出すまでにはIF文などを使います その事前処理として、ユーザーからの入力文字列を置換テーブルで数値に変換します その後、いくつかのルール(IF文などで処理)と置換テーブルを使って数値を文字列に変換します このすべての処理をIF無しでしたいのじゃなくて、置換テーブルを使う部分だけを効率化したいなと思っていまして その置換の部分が 1,2,3,4,5 5,4,3,2,1 a,b,c,d,e という風に上下の要素で相互変換していく感じです
サポートセンターのお姉さんを泣かせるタイプだなw
もう要素数256の配列を2つ作ればいいじゃん
>>631 やりたい事とルールを説明できるようになってからもう一回来い
635 :
597 :2008/09/20(土) 20:30:34
ルール部分はコードがかなり長いし、説明しきれないんです やりたいのは始めに言ったように単純にデータを変換したいだけなんです 1,2,3,4,5 1,2,3,4,5 5,4,3,2,1 a,b,c,d,e ↑をそれぞれ上下で相互変換したいだけなんです ちょっと、これ以上どう説明していいかよくわからないので ともかく、ご助言していただいた方々ありがとうございました
もう二度と来るなよ
>>635 基本は
>>598 の方法でいいと思う。
数値ではなく文字コードを配列のインデックスとして使うだけでいい。
”1”とか数字の場合も、あくまで’1’の文字コードで
考えればいいだけ。
public int[] エンコ(string str) { List<int> result = new List<int>(); for (int i = 0; i < str.Length; i++){ if(i % 2 == 0){ result.Add(偶数用エンコテーブル[str[i]]); } else{ result.Add(奇数用エンコテーブル[str[i]]); } } return result.ToArray(); } public string デコ(int[] arr){ StringBuilder result = new StringBuilder(); for (int i = 0; i < arr.Length; i++){ if (i % 2 == 0){ result.Append(偶数用デコテーブル[arr[i]]); } else{ result.Append(奇数用デコテーブル[arr[i]]); } } return result.ToString(); }
639 :
597 :2008/09/20(土) 20:56:03
>>637 おお、文字コードchar型をインデックスにできるとは知りませんでした
これはいいですね。
>>638 おおお、まさにやりたかったのはこれです
非常に簡潔ですねぇ。私のはもっと無駄に長いです
If数個よりDictionary引く方が効率いいと思ってるおめでたいやつ
>>641 誰に向かって言ってるのか知らんが、数個ですまなくなったらどうするつもりか。
ついでに言えば"If"ってそれVBな。
というか、
>>597 は
>>638 みたいな泥臭いことしたくないから
ここで質問してたのではなかたのか?
こんなN88BASICみたいなコードで納得していいのかよw
>>643 ココじゃ無理って思ったから流したんじゃないの?
どうせまた後出し出てくるんだから放置でいいよ。
645 :
597 :2008/09/20(土) 21:31:27
データの変換を大量にそして早く処理しなければならないため
できる限り条件式や演算を使わないで置換で済ませたいのです
ルール部分の条件式は数個どころではないです。
>>643 まあはっきり言えばそうなんですけどね
forも展開して使っているぐらいなんで
>>638 のようなやり方は実はありえないです
釣りじゃないなら死ね。氏ねじゃなくて死ね。
639 597 sage 2008/09/20(土) 20:56:03
>>638 おおお、まさにやりたかったのはこれです
非常に簡潔ですねぇ。私のはもっと無駄に長いです
645 597 sage 2008/09/20(土) 21:31:27
>>638 のようなやり方は実はありえないです
俺が高効率になるように処理見直してやるから、関連コードと仕様を貼れ
649 :
638 :2008/09/20(土) 22:05:48
なんか俺もハズカシイからヤメテヨー
>>646 まあそれは言いすぎ。
確かに人をおちょくってるかのような要領を得ない質問の仕方はマジで反省して欲しいが、
たぶん説明能力が足りないだけで本人は真面目に質問してるつもりなんでしょ。
しかし、あんまり実用性がある処理内容とも思えないから
どこぞの学校の宿題なのかな。
>>649 いやあんたのエスパー能力はすごいよマジで。
それに泥臭いなんてケチをつけたけど、エンコードテーブルからデコードテーブルを
取得するメソッドをプラスすれば、ひょっとするとこれでいいのかもしれないと思いなおした。
値をスワップしているだけだから、エンコとデコを二つ用意するのは無駄だな
エンコード関数は単写なの?
653 :
デフォルトの名無しさん :2008/09/20(土) 22:44:01
質問です。ふたつのテキストを比較して一致する行だけを抜き出したいと考えています。 keyword.txt メラミン 事故米 汚染米 暴動 死刑 index.txt /national/update/0920/OSK200809200056.html メラミン混入の恐れ、丸大が5商品自主回収 /international/update/0920/TKY200809200170.html パキスタン新大統領、米の越境攻撃を批判 施政方針演説 /international/update/0920/TKY200809200168.html 中国政府、チベット・新疆で宗教抑圧 米報告書で批判 /national/update/0920/NGY200809200008.html カビ米混入のオムレツ、愛知459校で 県教委調査 のようなふたつのテキストファイルがあるとき、keyword.txtに合致する行のみをindex.txtから抜き出すには、どのようにしたらよいでしょう?
654 :
デフォルトの名無しさん :2008/09/20(土) 22:44:49
大まかな手順は、
(0)ダウンロード
(1)keyword.txtを読み込む。
(2)配列にして、一致するかどうか見る。
でよいと思います。(0)はできていて、index.txtができています。
(1)と(2)はどのようにしたらよいでしょう? (0)のforのなかに(1)を入れ子にするのかなと思うのですが…。
(0)ダウンロード
string anchor = "<a href=\"(?<url>.*?)\".*?>(?<text>.*?)</a>";
WebClient wc = new WebClient();
string asahi = ("
http://www.asahi.com ");
wc.Encoding = Encoding.GetEncoding("EUC-JP");
string html = wc.DownloadString(asahi);
wc.Dispose();
Regex re = new Regex(anchor, RegexOptions.IgnoreCase | RegexOptions.Singleline);
for (Match m = re.Match(html); m.Success; m = m.NextMatch())
{
string url = m.Groups["url"].Value;
string text = m.Groups["text"].Value;
Console.WriteLine(url + "\t" text);
}
配列でマッピングする以外にいったいどんな方法を期待してたんだ… そこまで速度重視かつ個数が多いならそれ以外選択肢はないだろうに。 って文字コードを元にテーブル化するという発想自体がなかっただけか…
656 :
デフォルトの名無しさん :2008/09/20(土) 22:45:45
(1)keyword.txtを読み込む。 string keywords = File.ReadAllText("keyword.txt",Encoding.GetEncoding("Shift_JIS")); string[] lines = keywords.Split('\n'); int lineNumber = 0; foreach (string line in lines) { if (line.Contains(":")) { Console.WriteLine(line); lineNumber++; } }
657 :
デフォルトの名無しさん :2008/09/20(土) 22:46:32
(2)配列にして、一致するかどうか見る。 for (Match m = re.Match(html); m.Success; m = m.NextMatch()) { string url = m.Groups["url"].Value; string text = m.Groups["text"].Value; string keywords = File.ReadAllText("keyword.txt",Encoding.GetEncoding("Shift_JIS")); string[] lines = keywords.Split('\n'); int lineNumber = 0; foreach (string line in lines) { if (text.Contains(line)) { Console.WriteLine(url + "\t" text); lineNumber++; } } } でオーケー?
658 :
デフォルトの名無しさん :2008/09/20(土) 22:49:13
>>655 あ、質問は、ふたつの配列を総当たりで比較する方法をどうコードに書くか、ということです。
grep -f keyword.txt index.txt
661 :
デフォルトの名無しさん :2008/09/20(土) 22:58:40
>>659 そうでしたか…。すごい反応が速いなと思ったのでした。早とちり。すみません。
>>660 そうです。まさにそれをC#でやりたいのです。
grepのソース読んで移植すればいいじゃんか
キーワードの一覧からTrie木をつくればいいんじゃね
664 :
デフォルトの名無しさん :2008/09/21(日) 00:28:13
static void Main(string[] args) { //keyword.txt読み込み string lines = File.ReadAllText("keyword.txt", Encoding.GetEncoding("Shift_JIS")); string[] keywords = lines.Split('\n'); //index.txt lines = File.ReadAllText("index.txt", Encoding.GetEncoding("Shift_JIS")); string[] index = lines.Split('\n'); foreach (string article in index) { foreach(string kw in keywords) { if (article.Contains(kw)) { Console.WriteLine(article); } } } } >ふたつの配列を総当たりで比較する方法 こんな感じになるんじゃ無かろうか?
>>665 ありがとうございます。
早速試したのですが、コンパイルして実行したところ、ぜんぶの行が出力されてしまいます。
単に
type index.txt
とやっているのとおなじ状況です。
if(article.Contains(kw))
という条件が無視されている感じです。
なぜでしょう…?
コンソールアプリケーションなんですが、 Console.WriteLineでShiftJISで日本語を出力したいのですがどうのようにしたらいいのでしょうか?
StreamWriter writer = new StreamWriter("test.txt" , false , System.Text.Encoding.GetEncoding("Shift_JIS")); ではどうでしょう。
改行文字が\r\nとかのファイルならlines.Split('\n');じゃだめかもわからんです
なんでReadAllLines使わんの?
そのメソッドを知らなかったからさ!!
string lines = File.ReadAllText("keyword.txt", Encoding.GetEncoding("Shift_JIS")); lines = lines.Replace("\r\n","\n"); string[] keywords = lines.Split('\n'); //index.txt string indexes = File.ReadAllText("index.txt", Encoding.GetEncoding("Shift_JIS")); indexes = indexes.Replace("\r\n", "\n"); string[] index = indexes.Split('\n'); foreach (string article in index) { foreach(string kw in keywords) { if (article.Contains(kw)) { Console.WriteLine(article); } としても状況は変わらず。
考えられる原因はkeywordsのなかに空文字が混入してるか 実は本当に全部一致してましたとかか if (article.Contains(kw));みたいになってるとかかな Splitはちょっとあれするとすぐ空文字が混入みたなのでStringSplitOptions.RemoveEmptyEntriesを第2引数にするといいみたいです まあでも教えてもらった↓でいいと思う string[] keywords = File.ReadAllLines("keyword.txt", Encoding.GetEncoding("Shift_JIS")); string[] index = File.ReadAllLines("index.txt", Encoding.GetEncoding("Shift_JIS"));
とりあえずLINQで var keys = File.ReadAllLines("keyword.txt"); var lines = File.ReadAllLines("index.txt"); var q = from line in lines where keys.Any(key => line.Contains(key)) select line; foreach(var s in q) Console.WriteLine(s); メソッド形式だと var q = lines.Where(line => keys.Any(key => line.Contains(key)));
>>674 TextFileReader使えば、事前に文字列に全て読み込まなくても
直接LINQできるし、indexの方をキーにしてjoin...intoすれば
自動的にいずれかのキーが存在する文字列が得られると思うが如何?
join〜intoはいいんだが、onに何を指定するつもり?
俺は思いつかなかったというか、無理と判断して
>>674 になったんだが
一応、ContainsはString::Containsだということにも留意
メソッドの方使って、String::Contains相当のIEqualityComparer<T>を実装する方法もあるけど、
手間がかかるし、IEqualityComparer<T>の意味的にも微妙
あと、TextFileReaderはMSDNに載ってないみたいだけど何者?
おはようございます!
>>669 、
>>673 その後、改行コードの可能性を考えていくつか試してみました。
ifの判定も変えてみたのですが、うまくいかず…。ただ、下記のコードにしたところ、ヒットした行は2回表示され、ヒットしなかった行は1回表示しているので、区切りはうまくいっている、ということまではわかりました。AllLinesについては別途。
//keyword.txt読み込み
string lines = File.ReadAllText("keyword.txt", Encoding.GetEncoding("Shift_JIS"));
lines = lines.Replace("\r\n","\n");
lines = lines.Replace("\r", "\n");
string[] keywords = lines.Split('\n');
//index.txt(略)
foreach (string article in index) {
foreach(string kw in keywords) {
if (!(article.Contains(kw))){}
else{Console.WriteLine(article); }}}
>>670 、671、673
ReadAllLines知りませんでした!
上記のコードを、次のように書き換えたところ、ばっちり動きました。大感謝! 条件のところも元に戻してオーケーでした。
//keyword.txt読み込み
string[] keywords = File.ReadAllLines("keyword.txt",Encoding.GetEncoding("Shift_JIS"));
//index.txt
string[] index = File.ReadAllLines("index.txt", Encoding.GetEncoding("Shift_JIS"));
foreach (string article in index) {
foreach(string kw in keywords) {
if (article.Contains(kw)){Console.WriteLine(article); }
}}
ところで、Readですが、ReadAllLinesとすると、いきなり1行ごとに配列にできるんですね!
すごくシンプルです。これから使おうと思います。
ReadAllLinesとReadAllTextの違いは、ReadAllLinesでは行単位になるという理解でいいんでしょうか? 逆にいうと、ReadAllLinesで、文章全体をstringとして扱うときにはどうするんですか? そういう必要があるかどうかはさておき。
>>674 var keys = File.ReadAllLines("keyword.txt", Encoding.GetEncoding("Shift_JIS"));
var lines = File.ReadAllLines("index.txt", Encoding.GetEncoding("Shift_JIS"));
var q = from line in lines
where keys.Any(key => line.Contains(key))
select line;
foreach(var s in q) Console.WriteLine(s);
var q = lines.Where(line => keys.Any(key => line.Contains(key)));
どちらも動きました!
varを見るのも触れるのも初めてですが、勉強になります。ありがとうございます。
>>675 、676
高度すぎてわかんなかったです。…。
以上、とりいそぎふたつのファイルの比較はできるようになったので、次は先の(ひとつはじつはファイルでなくてインターネット上からダウンロードしたデータ)プログラムに組み込んでみます。
みなさまありがとうございました。
charを配列のインデックスとする場合 無駄な配列の要素ができるよね? char[] c=new char[128]; a,b,c,d,e,fと1,2,3,4,5しか使わないなら無駄だよね? やっぱりdictionaryのほうがいいか
速度とメモリのトレードオフ。 まあ単なる例ではあるけど、128程度どうでもいい。 だいたいDictrionaryだって無駄はあるわけだ、オーバーヘッドも多い。
テキストデータをhtml形式に変換して保存するプログラムを作っています htmlデータを保存するHtml LibraryクラスはGet,Setメソッドでデータを入出庫できます この場合、一旦テキストからhtmlに変換するクラスを中継してからhtmlデータをHtml Libraryクラスに送るのがいいのか それともHtml Libraryクラスに直接テキストを送って、Html Libraryクラス内で変換処理をするのがいいのか どっちが自然な考えなんでしょうか?
>>682 それをエスパーと呼ぶなら、エスパーだらけになる。
>>683 DOM とかにならって、innerText、innerHtml 等のプロパティを完備してみるとか。
>>644 エスパーっていうのは嫌味で言っているのであって、
読解不能な文章を書く奴も○○だがそれを妄想で補って回答する奴も同じぐらい○○だ、
という意味なんだが。
馬鹿の負け惜しみですねわかります
680はそこまで読解不能でもないかな 昨日もそんな話題だった気がするし
どうみても普通の会話にしか見えない。 いきなり出た話でもないし。 どの辺がエスパーなわけ?
>>680 > charを配列のインデックスとする場合
> 無駄な配列の要素ができるよね?
> char[] c=new char[128];
>
> a,b,c,d,e,fと1,2,3,4,5しか使わないなら無駄だよね?
128程度ならどうでもいいと思うけど、それでも気になるなら
数字とアルファベットの分だけ確保すればいい。
char[] c = new char[75]{ 'a', '0', 'z', ... };
char ch = なんか有効なキャラ;
c[ch - '0'];
とかそんな感じ。
多少の無駄(数字、アルファベット以外の記号の分)はあるけどね。
使用メモリを削ることについ血道をあげてしまう気持ちは分かるが、 人生にはもっと大事なことがたくさんあるはずだ。
>>689 char[] c = new char[75]{ 'a', '0', 'z', ... };
const byte a=1;
const byte b=1;
これでいいんじゃないの?
>>691 >>615 のように、文字列から変換する必要があるらしいので
それだとダメらしいんですよ。
詳しくは
>>597 からの流れを読んでもらえればわかるかと…
int[] numA=new int[]{1,2,3,4,5} int[] numD=new int[]{5,4,3,2,1} char[] ch=new char[]{'a','b','c','d','e'} じゃあこれでいんじゃね?
C#スレでcharをアスキー扱いしてる点に誰も突っ込まないのはなぜ?
まともな人は誰も読んでないから 質問者いなくなったのにいつまで引っ張るつもりだよ
だって 'c' - '0' ができるもん
コピペ君って馬鹿だな、まで読んだ。
単に元の話がその範疇ぽいからだろ。
もう一度お聞きしますが、 コンソールアプリケーションなんですが、 Console.WriteLineでShiftJISで日本語を出力したいのですがどうのようにしたらいいのでしょうか?
エンコーディングを指定できるコンストラクタでStreamWriterオブジェクトを作ってConsole.SetOut
702 :
700 :2008/09/21(日) 22:31:20
エンコーディングについて全くの無知で前提が間違ってるかもしれませんが、 ファイル出力する必要はなくコンソールに出力するだけなのですが、 もしかしてエンコーディングは関係ないですか?
普通は意識する必要は無いな
704 :
700 :2008/09/21(日) 22:52:03
初歩的な質問に答えてくれてどうもありがとうございました
俺は心配だから必ずEncoding.Defaultはつけるな
>>702 言ってる意味がよくわかないんだけど。
その表示したいと思ってるソースは何なのさ?
707 :
700 :2008/09/21(日) 23:28:18
>>706 プログラムから直です。
単純に
Console.WriteLine("あいうえお");
のような出力です。
708 :
700 :2008/09/21(日) 23:32:34
あ、ただし、出力された文字列を他のプロセスから読み取る予定です。 その場合のエンコーディングを心配したのですが…
>>707 それは C# 側が気にすることではない。
使ってるコンソール側の問題。
>>707 別におちょくるつもりはないんだけど、
本当にわかってなさそうだね。
711 :
700 :2008/09/21(日) 23:40:19
>>709 そうですか。
出力さえ正しければ問題ないんですね。
ありがとうございました。
コマンドプロンプトのプロパティを見てみたら、現在のコードページはSJISって書いてあったけど、これって他のエンコーディングに変更できるの?
質問です。 キーワードリストになければ引数をキーワードを追加、あればなにもしない、という処理を書きたいです。 keyword.txt メタミドホス メラミン 事故米 コマンドラインで、 addkeyword.exe 汚染米 とかすると、keyword.txtに「汚染米」を追加します。 addkeyword.exe メラミン の場合には、すでにあるのでなにもしないで終了します。 現在コードは下記の通り。 static void Main(string[] args){ //keyword.txt読み込み string[] keywords = File.ReadAllLines("keyword.txt",Encoding.GetEncoding("Shift_JIS")); StreamWriter writer = new StreamWriter("keyword.txt" , true , System.Text.Encoding.Default);//出力ファイル名。trueで追記。 foreach(string kw in keywords) { if (kw.Contains(args[0])){} else{writer.WriteLine(args[0]);} } writer.Close();//閉じる 実行すると、ない場合、キーワードは追加されますが、行数分(3行分なので3回)追加されます。 ある場合にもキーワードがあった行数分追加されてます。 どこをどう間違えているのでしょう? ご助言お願いします。
break
行数分とか3行分とかどういう意味なんだろう。 さっぱりわからん。
もっとロジカルに考えようよ。 若干仕様があいまいだけど、ループもいらんだろ。
最初に全部読んで List なり HashSet なりにしておいて、 最後にもう一度書き出す方がいいわね。
>>713 ああ、やっと意味がわかったw
なんかプログラミングあまり向いてない人みたいだな君って。
それのマズいところは、本来、
・ファイルが入力された文字列Sに一致する行を含まなかったら
ファイルの末尾にSを追記する。
でなければならないはずなのに、
・ファイルの全ての行を列挙して、各行が入力された文字列Sと一致しないごとに
ファイルの末尾にSを追記する。
になってるところ。
まず、「ファイルが文字列に一致する行を持つかどうか」の判断を行う部分を
別のメソッドに切り出してみたら?
みなさま早速ありがとうございます。
>>716 、
>>718 ご推察の通り、あまりプログラムは得意でなく、ロジカルに考えるところがまだうまくいかずにおります。…。
向いているかどうかは微妙ですが、まあ楽しんでるのはたしかです。
>>715 3行分というのは、つまり
汚染米
汚染米
汚染米
とかが追加されてしまうということです。
>>718 ・ファイルが入力された文字列Sに一致する行を含まなかったらファイルの末尾にSを追記する。
そうそう、そうしたいのです。正確にいうと
・ファイルが入力された文字列Sに一致する文字列を含む行を含まなかったらファイルの末尾にSを追記する。
になるんでしょうか。
・ファイルの全ての行を列挙して、各行が入力された文字列Sと一致しないごとに
ファイルの末尾にSを追記する。
になってるところ。
はい。行数分増えているのでそうかな〜と思ってます。
「ファイルが文字列に一致する行を持つかどうか」の判断を行う部分を別のメソッドに切り出してみたら?
…。え〜と。
static void Main(string[] args){
//keyword.txt読み込み
string[] keywords = File.ReadAllLines("keyword.txt",Encoding.GetEncoding("Shift_JIS"));
StreamWriter writer = new StreamWriter("keyword.txt" , true , System.Text.Encoding.Default);//出力ファイル名。trueで追記。
if (keywords.Contains(args[0])){}
else{writer.WriteLine(args[0]);}
writer.Close();//閉じる
でいいんでしょうか。
>・ファイルが入力された文字列Sに一致する文字列を含む行を含まなかったらファイルの末尾にSを追記する。 あいうえお が存在するときに あいう は追加しない、でいいのかい?
if (File.ReadAllText(file, encoding).IndexOf(key) != -1) File.AppendAllText(file, key + "\r\n");
あ、最後エンコード指定忘れた。 if (File.ReadAllText(file, encoding).IndexOf(key) != -1) File.AppendAllText(file, key + "\r\n", encoding);
bool notIn = true; foreach (string kw in keywords) { if (kw.Contains(args[0])) { notIn = false; break; } } if(notIn) { keywords.add(args[0]); } foreach (string kw in keywords) { writer.WriteLine(args[0]); } 泥臭く書くならこんな感じの処理かな keywordsの中にargが入ってるか調べる場所と 出力したい場所を別に置けばわかりやすいかと
あ、条件逆だた… if (File.ReadAllText(file, encoding).IndexOf(key) == -1) File.AppendAllText(file, key + "\r\n", encoding);
あ、Containsあったんだた…… if (!File.ReadAllText(file, encoding).Contains(key)) File.AppendAllText(file, key + "\r\n", encoding); もうやめとこう
if (keywords.All(kw => !kw.Contains(args[0]))) { keywords.Add(args[0]); } foreach (string kw in keywords) { writer.WriteLine(args[0]); } ただフラグなんて使いたくねーので俺だったらたぶんこんな感じに書くかなぁ
プログラムを作る場合コンソールアプリを作ってからGUI化したほうがいいようなので コンソールアプリから出力した文字を、別のプロジェクトのフォームアプリから読み取ってテキストボックスに出力する 簡単なアプリを作ってテストしようとしているのですが コンソールアプリから文字列を出力することはできたのですが それをフォームアプリから読み込む方法がわかりません どうすればいいんでしょうか?
>プログラムを作る場合コンソールアプリを作ってからGUI化したほうがいいようなので 誰がそんなこと言った コンソール版とGUI版を両方用意したいなら処理を別のdllに移して共用するようにしたほうがいい 一応質問に答えるなら、フォームアプリからコンソールアプリをProcessクラスで起動したら Process.StandardOutputでコンソールアプリからの出力を取得できる
UNIXかぶれか?
お返事遅くなりました。
みなさん、い〜方だな。感謝します。
3カ月できなかった「なかったら追記する」が動きました!
>>721 あり? 「汚染米が流通」があるときに「汚染米」は追加する必要あります。むむむ。ちっともロジカルじゃないですね、わたし…。
>>722 、723、725、726
すごい…。1行で書けちゃうんですか。
しばし感動。
File.AppendAllTextってすごいですね。
Streamで書かなくてもいいんだ。これ、closeもいらないんですよね? すごい。
>>724 boolは、このあいだ勉強したばかりなので、復習になります。notがtrueなので頭がすこし混乱気味…。じっくり拝読します。
>>728 おお。これもシンプルですね。
keywords.Add(args[0]);
で引数をkeywordsのストリングに追加できるんですね。
ありがとうございました。
>>729 > プログラムを作る場合コンソールアプリを作ってからGUI化したほうがいいようなので
別にそんなことは無いぞ
出力先を自由に変更できるのはいい設計と言われるが
> コンソールアプリから出力した文字を、別のプロジェクトのフォームアプリから読み取ってテキストボックスに出力する
そういう設計もあるけど多分「出力先を自由に変更」って意味では方法論が違う
で、
Process使ってるならStartInfoのRedirectStandardOutputをtrueにしてStart
でStandardOutputを読む
>>730 >>733 ありがとうございます。子プロセスとして起動してやらないとだめなんですね。
コンソールアプリのプロジェクトにフォームアプリのプロジェクトを追加してやっているだけじゃだめだったんですね
今まで簡単なフォームアプリを作っていたのですが、後でGUIのインターフェースを変更しようと思うとすると
(例えばリストビューをデータグリッドビューに変更)、プログラム全体を書き直すような羽目になってしまい
結局一から作り直したほうが早いような状況になりました
ユーザーに対しての表示部分と、データを扱う部分を分離して設計できるような思考を身に着けるために
そういうものを作ろうと思いました
こういう場合
>>730 さんが言われたようにDLLというものでやったほうがいいのかな?
慣れるために作ろうと思っているのはオセロで、コンソールアプリからのコマンドに従って、GUI側の石を操作する感じです
>>734 そんなことしたら、CUIプログラムの出力を解析する手間が増えるだろうが。
CUI側のソースが手に入らないような状況で取る手法であって、
一から自分で作るならそんなめんどくさいことをする必要はない。
System.Windows.FormsのクラスやConsoleを一切使わないオセロクラスを作ればいいと思う
まずはコアになるオセロクラスの入出力の仕様をきっちり決めちまえ。 話はそれからだ。
>>735 どこのだれかが作ったコンソールアプリに対して
フォアグラウンドのGUIを作る場合ってことでしょうか?
そういうのもいづれ作ってみたいと思っています
>>736 既にオセロクラスにconsoleが侵食してました・・・
これを分離しないと結局同じことなんですね・・
オブジェクト指向って難しい
>>737 わかりました。そうします。
特定の入出力の方法に依存しないオセロクラスが作れたら、 コンソールだろうとWinFormsだろうとWebだろうとWPFだろうと同じだからね
740 :
729 :2008/09/22(月) 13:03:06
>>739 それを作ろうとしていたはずなんだけど・・・
こういうのはやっぱり数こなして慣れるしかないのかな
>>737 さんのアドバイスでもう一度設計し直してみました
@フォームクラス(StandardOutput)
↓
Aコンソールの入出力をするクラス(WriteLine,ReadLine)
↓
Bオセロクラスで扱うデータ形式に変換するクラス(OutPut)インターフェース?
↓
Cオセロクラス
今はA、B、Cが同じクラスに混在している状態です。
入出力の仕様、及びデータ構造を見直します
別にそんなに難しく考えなくてもさ class オセロ { public void 駒を置く(場所); public 白か黒 現在の盤面(場所); } でいいじゃない
742 :
729 :2008/09/22(月) 13:30:10
>>741 始めに入出力の仕様を決めてそういう風にしていればよかったんだけど、
プログラム内のどのクラスからもConsole.WriteLineなどが扱えるために
オセロコンソール(オセロフォーム)との共通の命令コマンドをあらゆるクラスから別々に送っている状態なのです
石を置くコマンドをコンソールに出力するメソッドなどが複数のクラスに存在するということです
>>736-737 さんのアドバイスがなかったら、また1から作り直さなければなりませんでした・・・
コマンドの入出力は入出力クラス内の、OUTPUTメソッドしか使わないようにしようと思います
1 CUIでバッチ処理もGUIで簡単操作もできるようにしたい 2 そうだ、DLLに実際の処理を書いて ホストアプリには単なるUIとして振舞うように作れば良いんだ 3 DLLだけじゃテストできないから、専用のテストアプリを書いて… 4 ふぅ出来た。あれ?やたらプロジェクトが乱立してる 5 う〜んやっぱりここの部分はこうした方が良いかな? 4 でも早く全体を通して動かしたいから先にUIを完成させよう! 5 出来た〜えへへ。自分が天才に慣れたみたいで気持いいおw 6 やっぱりあそこ変えたいなぁ 7 っハ!でもここを弄ると、これに依存している別の所を弄らないと…ああどうしよう面倒くさい! 8 僕ってやっぱりだめな子なんだ ショボーン 9 仕方ないから、位置から作り直そう。その方が気持がすっきり(ry の繰返しなんですが 効率がものすごく悪いです。 いったい何を勉強すれば改善されるんだろう?
コマンドライン引数によってはコンソールアプリとしても動作させられるGUIアプリにすればいいよ
あらゆるメソッドを(object(params object[]))の形のデリゲートに割り当てたいんだけど やっぱりDynamicMethodで仲介するしかない?
746 :
745 :2008/09/22(月) 22:00:58
あ、呼び出すときにはリフレクションを使わないようにするのが目的なので MethodInfo.Invokeは無しでお願いします
単体テストってなんですか?
指定したドライブ以下のみ選択可能(これ以外は表示されない) なフォルダブラウズダイアログの実装を行いたいです。 「FolderBrowserDialog」では任意のドライブの指定はできない ので、win32の「SHBrowseForFolder」を使用するべきことまではわかったのですが 実際の実装の仕方がわかりません。 エロくてハゲてるひと教えてください。
ハゲてないので教えられないな。
ぢゃあエロくてチンこでかい人おねがいします。
残念ながらおいらでかくないんだ
754 :
750 :2008/09/23(火) 13:19:05
ぢゃあ、そちんでも仕方がないです
人様捕まえて粗チンとはなんだ
756 :
750 :2008/09/23(火) 13:44:57
やっぱそちんぢゃないです。ごめんなさい。
757 :
750 :2008/09/23(火) 14:53:52
ホントごめんなさい。 あやまるので誰か教えてください。
SHBrowseForFolderの実装サンプル自体はちょっと調べりゃすぐ見つかるだろ .NET 1.0時代はそうするしかなかったんだし その上で分からんことがあったらそのとき具体的に質問に来い
しょっちゅう操作中に固まると思ってたら 自動修復機能というのがあるんだな 5分って・・・短すぎだろ
760 :
750 :2008/09/23(火) 15:42:08
>>759 でもクラッシュしたときのことを考えると
5分でも長すぎるくらいだぜ?
フィールドとプロパティの記述場所やフィールドの変数名の頭文字は小文字でとか クラスは○○のように記述の仕方などが載っているところはないでしょうか? それぞれの意味やクラスの例などは初心者サイトにいくつかあるけれども もうすこし掘り下げて知りたいんだけど
MSDNにある。「デザインのガイドライン」かなんかで検索してくれ
質問です。 Visual Studio 2008 Express EditionのC#で開発したWindows用のソフト(CUI/GUI)をLinuxに移植するにはどういうツールを用意すればよいでしょう?
MONO
ありがとさんです。 さらにそのMonoなんですが、いま手元にLinuxがないので、Windows上でLinux用のソフトを開発する場合、Paltformは、Windowsを選択してよいんでしょうか? それとも、Linuxを用意してから、Linux用のMonoで開発したほうがよいですか?
いやどうしても.NETでないといけない理由がないならJavaにしとけ
どうしても.NETでなければならない積極的な理由なんて皆無です。たまたまC#を使ってみたら、案外よさそうだという感じ。初心者でようやくC#がわかりはじめてきたところなので、いますぐにJavaに移行するのは、ちょっとむずかしいなと。 再コンパイルだけで動くのなら、Linuxでも動かしてみるか、という程度のモチベーションです。
PlatformはAnyCPU、再コンパイルの必要はない。 P/InvokeやWindows特有の機能は使えない。使えても動作が異なることがある。 C#3.0の機能はSystem.Core系は使用できるが基本的に.NET2.0の範囲で使う。 Monoスレは一応あるからつっこんだ内容ならそちらへ。
>>769 「初心者でようやくわかりはじめてきたところ」ならJavaでもたいして変わらん。
メソッド名の1文字目を小文字にするか大文字にするか、とか、
usingの代わりにimportとか、get/set 記法がない、とか、
そういう単純なところだけで、難しい違いは一切ない。
仮想関数の思想が異なるしGUIならイベント通知のモデルも全く異なるけどな あえて些細な差しか上げないのはどうかと
×上 ○挙
ジェネリックはけっこう難しくて大きな違いだね 発狂しそうになる
"_"(アンダーバー)から始まる識別子は使っていいの? C/C++では処理系に予約されてるから避けてたけど、C#ではどうなんですか?
別にそういう制限はない。 C#では予約語も頭に@つければ識別子にできるから。
778 :
776 :2008/09/24(水) 14:32:17
thx
アンダースコアをフィールドにつけたり、仮引数につけたり、いろんなスタイルがあるな。
仮引数につけるのはガイドライン違反だけどね
質問です。 なにかアクションしたときに、クリップボードのテキストを表示するには、 if (Clipboard.ContainsText()) { Console.WriteLine(Clipboard.GetText()); } で可能なのですが、クリップボードの内容がリフレッシュされるたびに、これを実行するには、どのようにしたらよいでしょう?
>>772 そりゃおっしゃるとおりです。たしかにあんまり違いはないかな〜とは思います。英語とフランス語くらい? もっと似ているのかな。よくわかりませんけども。
いずれもうちょっとしたら、C++とかにも手を広げる予定なので、Javaにもちょっと興味はあるかな。
ただ、環境を構築するのがすこしめんどうで、Eclipse(けっこうでかい)を入れる準備をこれから半年〜1年くらいかけて、ぼちぼちしてみるかな〜という感じです。一度入れたことがあるのだけど、なじみにくくて即効で消しちゃったのです。
いまのところC#のほうが、とっつきやすいです。使い始めて3カ月で、やっとおもしろくなってきたところですし。ここで教えてもらったりしているのがけっこう効いてます。
水泳でいうと、やっとクロールの息継ぎのコツがわかってきたところなので、背泳ぎはもうちょっとおいてからでいいかなと。
いや、水泳だと道具がおなじなんだけど、スキーになれてきたところでスノーボードに変えるくらいの転換がいるのかなという感じで、道具をそろえるのにちょっと躊躇気味という感じですか。
ま、焦らず。
雑談でした。
>>781 変更のたびとなると監視が必要で、これは.NET標準ライブラリではサポートされていない。
Win32API呼び出しの必要が出てくる。「クリップボード監視 C#」で調べればサンプルとか出てくる。
それがイヤならタイマで定期的にClipboard.GetTextだな。
>>782 クロールで息継ぎができるようになるのはかなり終盤じゃね?
LiveCDでも仮想環境を使ってもいいから
Mono使ってみたら?Monoで作ったプログラムがWindows上で動くのは感動できるが
Windows上で作ったプログラムがLinux上で動かないのは悲しいものだぜw
正直にWineを使った方が確実な気がしないでもない
なるほど。LiveCDという手もありますね。 ぶっちゃけハードディスクが20GBなんです。VisualC#の開発環境がこんなに大きいとは思わなかった。MonoのVMware仮想ファイルをダウンロードしようとして、でかくてめげたという…。ま、もうちょっと。 それはそれとして、最近マシンって安いですよね〜。物色中です。
786 :
デフォルトの名無しさん :2008/09/24(水) 20:33:30
FolderBrowserDialogのダイアログじゃない版って無いの? エクスプローラみたいなUIを作りたいんだけど見当たりませんorz TreeViewで自作するもんなのかな
>>783 ありがとうございました。
監視のソースを見たのですが、ちょっと手が出なかったので、タイマーを使ってみました。
200msで、充分オーケーでした。
監視はもともとクリップボードビューアのための機能だしね
質問です。 Windowsデスクトップサーチとか、IMEのパネルって、タスクバーの上に載せるというか格納しておけますが、C#で作ったプログラムをおなじように、タスクバーの上に載せるにはどうしたらいいんでしょう? タスクトレイに格納するのではなくて、タスクバーの上に載せたいです。
デスクバンドのことか。 COM をいくつか実装しなくちゃならんようなので初心者むきじゃないと思われ しかも1プロセス1CLR の制限を考えるとC++とATL行きですな普通に
デスクバンドっていうんですか。 なるほど。 次の質問は、「IEのツールバーへの登録」でしたが、これもおなじくらいむずかしいんですよね?
>>789 どんな使い方を想定しているかわからないけど、単にタスクバーの上にのせるだけならわざわざデスクバンドにしなくても、オブジェクトをタスクバーの上に配置するんじゃだめなの?
>>795 それなんか意味あるんか。タスクバーの動きと同期しないと邪魔なだけ
だと思うんだが
質問です。 ふたつのFormプログラムを統合したいと思います。 \programA\programA\programA.cs \programB\programB\programB.cs とあるときに、統合の手順は、 (1)programA.csのデザインで、Bのformを呼び出すボタンを追加する。 (2)ソリューションエクスプローラ-参照の追加でprogramB.csのソースを追加する。 だけでよいのですか? デザインやその他を統合する手順がいまいちよくわからない。 これだとprogramBのデザイン(form)が、読み込まれないような気もするし…。 参照すると、programB.csは\programA\programA\フォルダにコピーされるんでしょうか? このように統合した場合、programBを単独でバージョンアップすると、その成果は、programAから呼び出す場合にも反映されるのでしょうか? 反映したいです。programBは単独でも使いたいので。
>>793 あ、やっぱりおなじでしたか…。thanks
>>792 えっ、IE8だとなんか変わるんですか!?(プチ期待感)
>>795 Widgetというか時計みたいな1行表示系を考えてます。
>>796 たしかに同期しないと邪魔なだけな気もします。
でも、タスクバーの上に配置できるだけでもよいかもしれないので、試してみたいです。方法を教えてください。
>>797 早速ありがとうございます。
入門書をめくったところ、クラスラスブラリというのは、dllを作ることで、そのためには、あらたにprogramBとおなじ機能をもつprogramCを新しいプロジェクトとして作ると書いてありました。
それだと、programBを単独でバージョンアップしたとき、programCにはその成果を反映できないのではないかと思うのですが、そういうものですか?
そのくらいなら、そっくり単にprogramA.csのなかにprogramB.csをコピーしたほうが簡単?
ぜんぜんはずしてたらすみません。
ちなみに、いまここ。
・ソリューションエクスプローラ-参照の追加でprogramB.csのexeを追加する。ソースは見つからなかった。
・programA.csに次のように追記。
else if (textBox1.Text.Contains("条件")) { Process.Start(progarmB.programB(textBox1.Text)); }
これで、programAのtextBox1に、ある条件の文字列が入った場合、programBをその条件を引数として起動できるかな(起動したい)と思ったら、ビルドしたところ、
エラー 1 'progarmB.programB' は '型' ですが、指定されたコンテキストでは有効ではありません
と怒られてます。
違う違う programBを新しく作ったクラスライブラリプロジェクトに移して、 もともとprogramBを使ってたプロジェクトとprogramAがあるプロジェクトの両方から そのプロジェクトを参照するの
なるほど! ぜんぜん違ってました…。 ちなみにその場合、最終的にできるprogramAは、exeとdllをいっしょにまとめてexeにすることはできるんですか? あと、programBを新しくクラスライブラリCに移行するときには、formのGUIとかはBからある程度はコピーするとはいえ、プロパティの設定とかは、0から作るしかないんですよね? さらにさらに、もし将来的にプログラムを統合することがわかっていれば、最初からクラスライブラリで作ったと思うのですが、そうでない場合に、formからクラスライブラリに簡単に移行する手順というのはなんかありませんか。
>>802 1つのソリューションに複数のプロジェクトを作ればいいんじゃないの
それと設計がまずだめなんだと思う。formはあくまでユーザーインターフェースなだけ
クリックイベントを発生させたり、文字列や画像を表示するだけ
プログラムの核の部分は別に作る
核の部分だけ統合するなら、クラスライブラリで作成か単純に追加すればいいだけ
フォームを統合したいなら追加すればいいだけ
単にユーザーによって任意にどれかのフォーム呼び出したいってだけなら
多態性でやればいい
if(textBox1.text="A")
Form formBase=new formA();
if(textBox1.text="B")
Form formBase=new formB();
>>797 デザイン部分も見えないようになっているだけで、ソースに書かれている
統合ってのがどういう意味で使っているのかわからないが
(2)ソリューションエクスプローラ-参照の追加でprogramB.csのソースを追加する。
とするだけで、普通にプログラムソースもフォームデザインも読み込まれる
あとは、programAにForm formB=new Form();とすれば普通に使えるはず
この場合ネームスペースは書き換えないといけない
programBのデザイン部分のソースコードはprogramB.Designer.cs programB.resxっていうのもあれば一緒に持っていく ソースコード自体をいろんなプロジェクトから参照することもできるけど かえって繁雑になるからお勧めしない exeやdllの結合はILMergeというツールがある
>>803 なるほどね〜。少し前にもformとプログラムをわける話がありましたけど、やっとすこしわかってきました。
ひとつのソリューションに複数のプロジェクトを作ることができるんですか!
知らなかった。なるほど…。
設計がだめですね。読んでいてずばずば当たっているので笑いがこみ上げてきました。こりゃたしかに作り直したほうが早そうだと。
任意にどれかのフォーム呼び出したいだけ(かどうかはまだわからないのですが)、とりあえず「多態性」というのはわたしでもすんなりできそう。
「ひとつのソリューションに複数のプロジェクトを作る」のと、「任意のフォームを呼び出す」のとは、違うんですよね?
あと、formからプログラムをわけるという話ですが、
private void button_Click(object sender, EventArgs e)
{
//具体的な処理
}
のようになっているときに、具体的な処理だけを別ファイルにする、という理解でよいのですか?
>>806 そういうこと
formの機能を一切使わないクラスBを作る
フォーム上のコントロールに対する処理と そうでない処理をすべてform1なんかに記述すると いずれ頭がついていかなくなる。 常にプログラム全体を見渡しながらプログラムしないといけないからね できるだけ簡素な自己完結しているクラスをたくさん作っていく 一見面倒な感じだけどソースが肥大化していって問題が起きた場合 そのクラスだけを修正すればいいだけだから楽 またある機能を別のプロジェクトで必要になった場合 そのクラスだけを追加したり頻繁に使用するならDLLにすればいい よく使うフォームのコントロールもユーザーコントロールを使って 複数のコントロールをまとめてしまえばわざわざformを持ってくる必要もない
>>807 なるほど。もう一歩具体的に進めます。
form1.cs
private void button_Click(object sender, EventArgs e)
{
//具体的な処理
}
から、
program1.cs
//具体的な処理
としたとき、
(1)form1.cs
private void button_Click(object sender, EventArgs e)
{
ここにはなにを書けばいいの?
}
(2)program1.cs
ここに、usingとかは必要?
private void button_Click(object sender, EventArgs e)に変わるメソッド名(?)も必要?
//具体的な処理
ここは}で終わる必要あり?
private void button_Click(object sender, EventArgs e) { program1 p1=new program1(); p1.具体的な処理するメソッド名(); } (2)は言っている意味がわからない program1にusing Windows.Formを必要としないようにすればいい
っていうか、[フロジェクト]-[項目の追加]でクラスを追加したら、 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace programA { class Class1 { } } と書いてくれました。 class Class1 { //具体的な処理 } とすればいいんですね。
っていうか、まだそんなこと気にするレベルじゃないと思う
結局クラスの概念がわかってなかったって感じ?
form1.csからClass1.csに、具体的な手順を移動してみました。
form1.cs
private void button_Click(object sender, EventArgs e)
{
program1 p1 = new Class1();
p1.execute1();
}
Class1.cs
class Class1
{
execute1(object sender, EventArgs e){
//具体的な処理
}
}
エラー 1 メソッドは戻り値の型を持たなければなりません。
あと、具体的な手順のなかに、textBox1.Textがあり、これはFormを必要としていると思うのでなんとなく気になる。
private void execute1(object sender, EventArgs e){
としてみたら、予想はいやなほうに的中し、「現在のコンテキスト内に存在しません」のエラーが大量に発生…。
>>812 、
>>813 です。そんなレベルでなく、クラスの概念がわかってないです…。入門書読んでも、ちっともぴんと来ないんです…。
"VisualC#入門"系じゃなくて言語寄りの入門書を一通り終えた方がいいよ
>>814 >あと、具体的な手順のなかに、textBox1.Textがあり、これはFormを必要としていると思うのでなんとなく気になる。
だったらform1に書くしかない
>execute1(object sender, EventArgs e){
これだと、formに処理を書くのと変わらない
クラスを作る意味がない
初心者サイトをいくつか巡回して基礎から学んだほうが早いと思う
この間違いを訂正することはできるけど、基礎がわかってないと
同じ間違いを何度もするはず。
C#は簡単にプログラムできるから、概念なんて知らなくても書きなぐっていけるけどね
でも、それを学ばなければ今の状態からステップアップできないと思う
いい機会だから勉強したほうがいいと思う
自分も「C#.NET逆引き大全-500の極意」とか見ながら パズルを組み合わせるようなプログラムから入ったから クラス化とか意識してなくて苦労してるなぁ…。 まぁそれでも組める所が良いのかもしれないけど。趣味なら。
まぁ初めは組んで組んで組みまくって慣れる事が大事だし 最初ならそれでいいんじゃん?
>>815-817 いい機会だと思って勉強してみたのですが、新しい自分には出会えなかったみたい…。そう簡単じゃないか…。
>>818 なるほど。わたしも趣味なので…。いや、上達したくないわけではなく。
『C#.NET逆引き大全』は、2008対応版を待ってるんですけど、でもまあ、おんなじだなぁ。パズルを組み合わせるみたいにやってます…。sigh...
>>819 そうなんですよね〜。
そう思って、かれこれ15〜6本は作ったというかぱくったというか、まあかたちにはして動かしているところです。
動いてはいるけど、まだなんにもわかってないなぁとは常々感じてて。
Classは当面あきらめました。 今回は単純にFormAのプロジェクトにFormBを追加する方向で。 FormAのプロジェクトで[プロジェクト]-[既存項目の追加]で、FormB.csとFormB.cs(デザイン)を追加しました。 FormBを呼び出すために、 if(textBox1.Text.Contains("B")){ Form.formB.Show();} としてみました。 これでコンパイルすると、 エラー 1 'System.Windows・Forms.Form' に 'formB' の定義がありません。 と出ます。どのようにしたものでしょう?
FormBのインスタンスはどうやって作った?
一旦GUIから離れてコンソールアプリで勉強したら?
>>817 を読んで理解できないって、プログラミング自体に難が無いか?
>>822 インスタンスは作ってないです。たぶん。
どこにどう作るのかがわかってない。
やっぱりクラスに再入門!?
>Form.formB.Show(); おかしいだろ。 少なくとも、 FormB formB = new FormB(); formB.Show(); くらいやってみそ
それはやってみたです。うまくいってなかったのはタイプミスしてました。 久々にコンパイルできたので、テストしました。 が、formBは開かず、単に空のフォームが開きました。 ま、それはそれとして、使ってみたら、クリップボードからタイマーで文字をテキストボックスに貼る、というのがこのままでは使えないことがわかって、こちらのほうが緊急の対策項目に挙がってしまいました。 え〜と、現状だと、テキストボックスがひとつあり、タイマーで200ミリ秒ごとにクリップボードからテキストを貼っています。 これだと、なるほど、テキストボックスにキーボードから文字を入力しても、次々クリップボードから文字を貼ってしまうので、キーボードからの文字が消えてしまうわけです。 クリップボードを監視すればこの問題は回避できると思いますが、安易にタイマーで貼ったのがまずかった。 やっぱりクリップボードの監視でしょうか。
>>827 少し頭を使って考えろ。
単純に貼り付けるからいけないのであって
条件付きで貼り付け(選択位置に挿入する)ればいいんだろ?
で、その条件は「前回から変更があったとき」とか「キータイプしてからmsec後」とかいろいろあるだろ
後者はスレッド使って時間待ちするならいいけど、Timerの中でずーっとsleepするわけにはいかないので
ちょっと工夫が必要だな
>が、formBは開かず、単に空のフォームが開きました。
本当にFormBを生成して表示させたのか?Formを生成してないか?
>>825 勉強したって嘘だろ・・・
>>817 のサイトを読んでわからないわけがない
騙し騙しやったところで、概念理解してないといつまで経っても上達しない
逆に概念さえ理解すれば、
>>827 みたいな質問なんか出てこないはず
君が今やろうとしていること、覚えようとしていることははっきり言って覚える必要のないもの。
ライブラリの知識なんてその都度MSDN使えばいいだけ
四則演算できないのに微分積分やるようなもんだ
もういいからどっかのアップローダに全部うpしてよ なんか作りたいものがあって始めたんだろうと推測するけど それはとりあえず置いといてしばらく純粋に言語の基礎を勉強した方がいいよ 何に使うかは考えずに頭の体操だと思って取り組めば案外面白いもんだよ
出来ない人って最初から全部をやろうとしたり なぜか応用から入ろうとしたりするよね。 チュートリアル見ながら簡単な初歩とかやりたがらない。 実際に動かしてやってみる→試行錯誤がベストなのにね。
やりたいこと(別フォームを開くとか)でプロジェクトを分けて勉強しろ。
イベントは一回自分でadd/remove実装してみたら忘れないと思う
デリゲートだろ
知恵熱状態です。
>>828 条件つきで貼りつけはすぐに考えたのですが、その条件を書けるとは限らないので、それならもしcsファイルを参照できるようになれば(これも困難ではありますが、すでにcsファイルが動く状態なら条件を思いついて実現するよりはマシか)、そのほうが可能性があるかなと。
で、考えた条件は、
・キーボードの入力があったら貼りつけを止める(でもキーボードの入力が終わって貼りつけたら入力した文字列が消えるのでこれは最悪。
入力に手間どっている場合の終了判定をどうするかとか、それはenterを押したときでいいか)enterを押したら、その文字列をクリップボードに入れるとか(でもその場合クリップボードに入れておいた文字/図形が消える)。
・貼りつけてある文字が前回と同じときは貼らない。
違うときには入力しているということだから、貼らない。あり? いつ貼るんだ?
Formのほうは再確認します。
>>829 …。うそはついてないですよ。
「見た」「読んだ」「勉強した」「理解した」「使える」というようにレベルがあるとすると、「見た」「読んだ」このあたり「勉強した」「理解した」「使える」なのかな。
やっぱり、言葉がわからないんだと思うのです。
クラスとかステートメントとかデリゲートとか。ひとつひとつの言葉を充分理解するのに時間がかかる上に、それの説明に別の言葉を使われると、書いてある文章が素通りする感じ。
デリゲートとかきくと、なんかワニみたいなものが頭のなかに浮かんでくるです。
なにをわかっていないかをわかるために、自分で単語帳は作っているのですが、なかなか遅々として。
>>830 、831
基礎をやりたくないわけではなくて、うまくヒットする基礎例題がないような気がしてます。ドリルみたいなのがあるといいのになと思うのです。
やっぱり、やりたいことはあって、ちょっとずつでもできているのがモチベーションになってきているので。これでも、最初のときよりはだいぶマシになってきたと(どこがといわれそうですね…)。
>>832 たとえば、「別フォームを開く」というドリルがあって、例題をいくつかこなすみたいな方法なら、基礎でも楽しそうなんだけど。
勉強します。
>>833 、817も。
参考文献は感謝します。
幸い、実装したことを検索しながら使っているので、一度できれば(応用できるところまでは到達していないものの)、二度目はなんとかなることもあるかもな、というところまではきたみたいです。
見捨てずによろしくです。今日は知恵熱なので、これで…。
そんな駄文を打つ時間があったら、ほかにやる事があるだろ
>>833 のサイトは例題あるよ
「別フォームを開く」は基礎じゃない
>>837 消えるのが嫌なら、変数に代入するとか、さっき誰かが言ったみたいに挿入してテキストボックスに保存するとか
とにかく言っていることが抽象的過ぎて訳わかんね
いったいどういう機能を持ったものを作りたいんだ?
てか、わざわざ作らないでフリーソフトで探せばいいんじゃね?
>>838 お題は自分で見つけるんだよ。多分想像力がないんだろうな
モノづくりをする上で致命的
オブジェクト指向とは何ですか?
これについて説明しているところは山ほどある
わかるまで片っ端から読んでいけ
これが基礎
フォームの扱いやらクリップボードなんかはそれの応用、言語云々の問題じゃない
こういう奴みるとやっぱりC言語から勉強しろと言いたくなるよな
static void func() { int i = 1; ThreadPool.QueueUserWorkItem((param) => { Thread.Sleep(1000); Console.WriteLine(i.ToString()); ++i; }); } ラムダ式からローカル変数のiに読み書きアクセスしてるんだけど funcから抜けてiがスコープ外になった後スレッドが実行されるとメモリ破壊が起きますか?
確かに基礎概念を学ぶ課程はつまらないかもな フロッピーすらないカセットテープだったころは 画面に"Hello""1 2 3 4 5"なんて表示するだけで感動したもんだけど GUIや3Dゲームが当たり前の時代にそんなことしたって楽しいわけない まあ、その内わかってくるだろうし、今は好きなようにすればいいんじゃないかな
>>842 iは自動生成されたクラスのインスタンスフィールドになるんだよ
>>842 ラムダ式で作ったデリゲートが生きてる限りはその i も生きてる。
847 :
842 :2008/09/25(木) 23:45:08
>>844-846 ありがとうございます
ラムダ式から参照されるローカル変数は、スタックに積まれるのではなくnewされるような感じなのかな。
マウスの滑りが悪いので カーソルを慣性で動かせるようにしてみたが 静止摩擦->動摩擦 の一番疲れるタイミングで操作しなければならない 拷問ツールの何者でもなかった なんか工夫すればどうにかなるかな?Joypadから操作してみるか…
>>847 845 の言う通り。
匿名のクラスが作られて、
i は実はローカル変数じゃなくてその匿名クラスのメンバ変数になる。
ラムダ式を書いた時点で、その匿名クラスのインスタンスが new される。
デリゲートが生きてる限り、そのインスタンスが生きてる。
>>848 はやってないものはやっぱ何かしら使いにくいんだって。
>>847 func抜ける直前に、
Threed.Sleep(3000);
Console.WriteLine("[func] " + i);
とかしてみろ。なお、結果については自分で考察のこと
ildasmで生成されたIL確認するのもあり
クラス化していくと、どんどんインスタンスの生成が 増えていくのですが、そういうもんでしょうか? staticなクラスとどう分ければいいかイマイチ分からないです。
質問です。 if (textBox1.Text.Contains("条件")) のとき、みかんかりんごのように条件が複数ある場合には、どう書けばいいですか?
複数回比べては。 条件によるけど、正規表現使うほうがいい場合もある。
正規表現でお願いします。
まずは自分でやってみろよ
>>854 だから昨日言っただろ
基礎から学べって
学ぶ気のない奴に教える気はない
勉強してますし勉強する気もあります。たとえば、 ・Formの起動ができるようになりました。 ・なぜFormを起動できないかの原因の糸口がわかりました。 プロジェクト名と名前空間とFormに微妙な名前の違いがあり、統一すればFormを呼べるだろう、とわかりました。 微妙な違いは、バージョン違いで「2」をつけたことなどで起きています。 ・名前の統合はリファクタ-名前の変更でできます。やってみたところ、参照に不具合が生じてコンパイルできなくなりました。 いまはオミットしたほうがよさそう。いずれ全面的に作り直す必要ありのようです。 ・そこでFormは統合しないで、Process.Startでexeを起動することに。(起動コマンド,引数)で、引数にtextBox1.Textを指定すればオーケー。 ・起動ができるようになったので、あとは条件を指定。羅列すればできる。でもどうせなら正規表現のほうがよさそう。 Regex fruit = new Regex("みかん || りんご || 梨", RegexOptions.Singleline); else if (textBox1.Text.Contains(fruit)) はだめ。 if (Regex.IsMatch(textBox1.Text, @"[(みかん)(りんご)(梨)]")) もうまくいかない。 それで教えてですよ。
なんで途中経過とかあるのに書かないで、結果だけ求めようとする? 形だけ勉強してても勉強する気がないの? >羅列すればできる。でもどうせなら 出来ないなら出来る方でやればいいし、 どうしてもやりたいならMSDNに詳しく全て書いてあるよ。
まあまあ。 今回、正規表現というキーワードが出てきたんだから、正規表現 C# あたりでググって 気に入ったとこブックマークして今後も使うといいとおもうよ。 ただし、正規表現の場合は正規表現そのものの理解も重要。 今回のは、"みかん|りんご"dana
いらんことばっかり勉強してるなw
>>859 見る限り、えらい遠回りするつもりだなー、とは思う。
>>859 それのどこが基礎なんだよ
基礎を学べと言ってるだろ池沼
あと、Googleの使い方も学べ
string[] fruits = {"みかん","りんご","梨"}; if(fruits.Any(f => textBox1.Text.Contains(f))) { }
配列(例えばbyte[])をコピーや再確保無しで特定サイズに縮める方法はありませんか?
ありません
IList<T>でラップしてごまかす
Array.Resizeはちがうのん?
コピーしてるって明記されてる
Resizeは領域確保し直してるから再確保無しって条件には合わない
クラスインスタンスをメソッドの引数で渡すとき インスタンスの内容を変更されたくない場合はconstで渡せばおk?
そんな機能は無い コピーして渡すか、設計的に不変クラスにする
stringや配列もconstで渡せないの?
stringはもともと不変クラス 配列は無理だからReadOnlyList<T>でラップして渡したりする
お話のところ申し訳ないですが、いい考えがうかばず、いい実装ができてないので 質問します。 複数のクラス間で、共通に使う変数群を、扱うには、どうするのがエレガントなのでしょうか? VB6のPublic Typeで宣言された構造体が広いスコープで使われる(グローバルのように) イメージです。 Strategyパターンなどで、共通に使われるような変数群をいじりながら、戦略をとおして、 その結果を反映したい場合など、共通に使う変数を一旦Contextに渡して、それをいじって その結果のコピーを渡すなどといった不自然な発想しかおもいついていません>< みなさんどうしてるんでしょうか?
意外とめんどくさいのね(´・ω・`)
>>878 質問が漠然としすぎ。
ついでに言ってることが全体的に意味不明すぎる。
VBの構造体がどうのとか、Strategeパターンがどうのとかの記述は完全に頓珍漢。
そんなことはどうでもいいからもっと具体的に書かないと。
独立したクラス間で共通に使うデータ構造をどう実現するか? です。
だからw 具体的って日本語がわからないのよ。 そもそも「共通に使うデータを実現する」パターンなんてものはない。 というより、君の書きぶりじゃ恐らく単に設計が間違ってるだけ。 どのクラスに属するかはっきりしない(どのクラスにも属さない)データを 持ちたいなんてどこか考え方がオカシイんだろ。
>>878 プロパティってことかな?
「C# get set」でググってみては?
パターンじゃなくて、みんなどうしてるんかな?とおもいまして。 例えば、自分が直面している例では、 ある命令書の列がある。 List<Order> 命令書にもとづいて処理する実態があり、それが棚や机にちらばっている List<Rack> List<Desk> RackやDeskはもちろん子構造もっていますが本質じゃないので、ここでは省略 List<Order>の一連のセットを解析して、棚や机から最適な手順で 指定されたものを加工して、集配してきます。 そのアルゴリズムは、Orderの集合によっていろいろ変わります。 ってときにいちいちRack、Desk状況をContextにわたして処理させているのが 非常に不自然にかんじている状況です。
test
規制解除されたか RackやDeskの状況をまとめたクラスをOrderに渡せば処理が行われるようにしたらいいでしょ
>886 現状はそうしてるんですが。 そのあと状況の変化したRackやDeskをContextから受け取って 別のクラスで使うという状況で、 RackやDeskがCloneされまくってるのが不自然におもうんです。
>>884 Chain of Responsibliityでどうかな
あ、ごめんなさいOrderに渡すということでしたか。 Orderは、指令書という概念なので、 それが棚や机の状況をうけとるという考え方は受け入れられません。
>>889 変数群ならstructで構造体にして
それを扱うstaticなクラスを作れば
どのクラスからでも共通のデータとして扱えるが
なんでCloneしないといけないの?
Chain of Responsibility もちょっと違う気がします。 むしろ、全体を含めたNameSpaceやEnviroment といったスコープの広めの部分に位置している棚や机 のようなもので、 別Formでは、棚在庫をリアルタイムに表示、編集します。 また別のFormでは、処理のリアルタイムでの状況をTimerで表示 しています。リアルタイムのほうは、QueueにいれたCommand列を 順番に再現しています。 現状では、ある状況のコピーを各Formに渡してしまっています。
指令書は仮想メソッドにして指令ごとにクラスを作るわけでしょ そいつがRackやDeskの状況を受け取らなかったら何も出来ないじゃない
みんなエスパーなのか知らんが
>>878 のいう事がよく理解できるな。
棚や机に散らばっている(だから何が、だよ)と言っておきながら
List<Rack>とか List<Desk> とか、もう俺には何のことだかさっぱりわからん…。
public abstract class Base { public A a; } public class SubA:Base { public A a; } public class SubB:Base { public A a; } public class B { public void Start() { Base b=new SubA(); b.a=new A(); } } こうするとBaseクラスのaにインスタンスが代入されるだけで Subクラスのaはnullのままです 派生クラスにインスタンスを代入するにはどうすればいいでしょうか?
private以外のアクセス制限にしてよいフィールドはstatic readonlyのものだけ。 代わりにプロパティを使え。
多分だ、 Static変数をもったクラスを作ることで解決する。 が、エレガントじゃないきがするな。
普通にわかるんだが。。。 同じような経験してるからな。
「わかる気がする」のと「分かる」は全然違う。
前者は妄想後者は理解という。
少なくとも
>>898 が何をしたいのかは意味不明だ。
いや、
>>898 が「トイレの窓から外に出られない」のは分かるが、
そもそも本当に「トイレの窓から外に出る」という問題設定が正しいのかどうか怪しいだろう。
staticなworldクラスみたいなの作ってそのなかにRackやDeskを置いて 渡すんじゃなく読みにいけばいいとか? まあわかんないですけど。
903 :
896 :2008/09/27(土) 02:40:14
>>897 このレスは私向けだったんですね
うまくいきました。ありがとう
プログラミング経験ゼロですが、C#に取り組もうと思います。 書店にはいろいろな本がありますがどのような本から読んだらいいのでしょうか? よろしくお願いします。
>>905 最初はウェブで十分。
C# 入門 とかでぐぐるといい。
↑みたいな意見はありがちだけど、 俺はあまり信用しない方がいいと思うよ。 C#をはじめることと、C#‘で’プログラミングを始めることは全然別物なわけだが、 後者の立場の人間がweb上の情報だけで学習を進められるとは俺には思えない。
ほうほうそれでそれで
>>907 じゃあ、プログラミング 入門 でぐぐってみるといい。
C# のページが一番上だから。
>>909 書いてる人には悪いけど、俺は初心者がこれで尻込みせずに続けられるとは思えんわ。
ほうほうそれでそれで
>>861 thanks.(みかん|りんご|なし)で動きました!
>>866 なるほど。stringでいいんですね。すると、このあいだ教わった方法が使えるかも。
if (!File.ReadAllText(fileName, Encoding).Contains(keyword))
ということは、プログラム中に列挙せず、設定ファイルを作って、それを読めばいいという可能性もあるんですね。なるほど。それはスマートかも。
忘却機能。一時的に忘れる機能。忘れている期間はアクセスできない。
VBなら中学校みたいな数千円する参考書より親切なサイトがあるけど C#からプログラミング始めるのにWEBだけってないわ どんだけ予備知識があるのか知らないけど最初で躓くと思う
standardEditionについてくる入門書が一番参考になったわ
>>913 言語自体はVBよりC#の方が簡潔でわかりやすいとは思うけどな
歴史が浅い分、資料などがそろってないかもしれない。
>>910 はじめから読もうとすると内容が上長過ぎてだめだな。前置きが長いとも言う。
.netの話とかどうでもいい。
他の言語のスレだと入門書の話題は尽きないんだけど C#のスレだとそういう話題は見かけにくい印象があるな 個人的にはPythonかRubyでもやってプログラミング自体に慣れて 格好いいGUIアプリが作りたくなったらC#でもいいと思う
単にC#に関しての経験だけが初心者だと、考える観点も進め方も違うからな。 C#言語規約だとか、実装のされ方だとか、.NETフレームワークのアーキテクチャだとか、 Javaとの差異だとか、そこら辺の初めての部分を解決したいわけだし。
>884 俺もいつもその手の問題に悩ませている BindingSource使うとか スコープ広めのシングルトンにもたせようと やってみてたことがあるが、 ReadWriteLockでの同期がめんどうくさい
ObservableCollectionのSortedDictionary版がほしい場合は自分で作るしかないの?
うん。
めんどくさぁ…
C#ってもともと移行者のための言語だもん
↑デタラメ
J#のことも時々でいいから思い出してください
925 :
デフォルトの名無しさん :2008/09/27(土) 23:27:50
プログラミングが初めての人って、Visual Studioの使い方でまず躓くと思うから チュートリアルに従ってIDEの使い方と、初歩的なC#の知識を学ぶ本が役立つかも?
式木 これ何て読むんですか?しきき?
しきぼく、expression treeの直訳みたい。 ラムダ式に関係する用語ではstatement とexpressionの使い分けがピンとこないな。
しきぎだろ
どう考えても「しきき」か「しきぎ」。 「ぼく」なんて読みはありえない。
重箱読みを避けたい気持ちもわかるけど「しきぎ」かな 二分木を「にぶんぎ」って読んでるし・・・
佐々木もささきって読むしな
意味わからん
この木何の木気になる木
気になる木〜
どっちの読みが国語学的に正しいか、という話なら「シキボク」のような気もするけど。。
漢字の読みがむちゃくちゃな日本語において、 言語的に正しい読みとかあるのか?
二分木も赤黒木も数学用語では「き」なのだろうけど口頭でしゃべる場合は「ボク」も使うかな。 「シリツ」の市立や私立を「いちりつ」「わたくしりつ」というのと似てるかも。
そんな言い方する奴おらんやろ
あえて重箱読みにする理由はないからねえ。
>>938 「にぶんぼく」なんて聞いたことねーぞ。どこの方言だよw
まあこの場合は「木[キ]」が一つの術語でそこから派生した言葉と考えれば [〜キ]と読むのが術語的には正しいのかもしれない。
>>941 まともな学校出てない子にはわからんかもしれんが、
これに限らず大学の先生とかそういう読み方をしがち。
なんかかわいそうになってくるな にぶんぎはにぶんぎだよ 他の読み方などない
にぶんぼく(笑)
B木はびーきなのだが、しゃべるときはビーツリーかビーボクにしてるな 「せんせ、なんのご贔屓ですのん?」と言われたらかなわん 話し言葉と記述用の言葉が違うことは普通にあるよ
無理な日本語にしないでExpression Treeでいいよ ググってもあんまり出てこない>式木
>>943 旧帝で数学科から情報系の院へすすんでグラフ理論研究したが、一度も聞いたことないわ。
「しがち」っていうほどたくさんはいないんじゃないの
>旧帝で数学科から情報系の院へすすんでグラフ理論研究したが かなり痛い人だということはわかった
「ボク」派が1人で自作自演してるに1票。
結局バックボーンがなにもない主張なので 学歴攻撃で言い張るしかありません。 特亜的思考しか出来ずかわいそうですwww
むしろ「特亜」なんて言葉を平気で使うことに何も躊躇を感じないさまが「語るに落ちて」 いることにも気づかないっていうのは見てるこちらが気恥ずかしくなるな。
こういう話題で特亜とか言うやつ、頭おかしいだろ。
あと、まあこの「誤読の仕方」そのものが頭の悪さを語るに落ちているわけだが、
馬鹿な君らが誤読しているのと違って
>>938 や
>>947 は「そういう読み方をすることもある」
と言っているだけで、それが「正しい」とか「唯一無二の真実だ」とか言っているわけではない。
待て待て、つられすぎだろ。
MSDNでの表記は「式ツリー」になってるね。C#スレ的には「式ツリー」で丸く収めようや。
赤黒ツリーってなんかださくないか。
あれの英語表記はそのまま red black treeでいいの?
red-black tree
Expression Treeを読むのってすごい面倒だよね
expression 釣り
誰うま
大漁ですね
釣られすぎというか顔真っ赤ぶりワラタ コードが良ければどうでもいいじゃない
学校の課題で Button Label TextBox CheckBox RadioBotton ListBox Timer この中から最低5つ使って普段役に立つプログラムを作成せよ というものがあるのですが、高得点が狙えそうなものがまったく思いつきません。 何かアイディアを頂きたいのですが、お願いできますか?
いいえ。
そのひどすぎる課題出した奴に見本作らせてみて 役に立ちそうもなかったらフルボッコでいいかもしれない それでも作るのならラーメンタイマー付き電卓
既にあるもので普段役立つものを真似して作ればいいよ
>>967 役に立つってのは人それぞれってー事をバカに理解させる物を作ればいいんじゃないか?
無理やり5つ使って登録文言表示させるだけの物作って、「私はあなたみたいなバカとしゃべりたくないので役に立ちます」と表示してやれ。
日本語でおk
コントロールの機能サンプルでも作っとけ。
まじめに考えると Label/Button/TextBox/Checkboxは設定画面にでも使えばいいので後のこり一つか ListBoxはリソースの代わりに組み込みリストとして使うという邪道もある。 なんか役に立つものを作ってから足りない奴を無理矢理追加すればいいんじゃね?
>>967 「高得点が狙えそうなもの」ってふざけすぎだろ
そんなの自分で考えろよ
こんなくだらん質問にまじめに回答してるおまえらにビックリだよ
この前ものすごく役立つもの作ったよ ハードディスクの中でどのディレクトリが何%の容量を消費してるかを調べるソフト ハードディスクが足りなくなった時に何を捨てればいいか分かる
>>967 ボタン、ラベル、テキストボックス、...
それぞれのコントロールのプロパティを弄れて動作を確認できるような
サンプルプログラムにすればいい。
そして完成させたらその課題を出した講師にプレゼンテーションだ。
最後に一言、「フフフッ、勝ったな・・・。」で締めくくる。
本当に役立つものが提出されたら講師がパクるフラグ
俺ならrapidのダウンローダつくる
981 :
デフォルトの名無しさん :2008/09/29(月) 01:38:32
982 :
967 :2008/09/29(月) 02:26:07
みなさん親切にお答え頂いてありがとうございます。 すごく参考になりました。 参考になるHPも教えて頂いたので、みなさんのアドバイスも活かしつつ自分でどうにかしてみます。 他力本願の要望にお手数かけてくださってありがとうございました。
983 :
デフォルトの名無しさん :2008/09/29(月) 03:28:02
一次元の配列を追加という形で動的にサイズ変更させていきたいんですが 実現するにはArrayListクラスとList<T>クラスの2つの方法があるそうです。 両者の違いがよく分からないんですが、どうやって使い分ければいいでしょうか?
984 :
983 :2008/09/29(月) 03:29:36
失礼、補足です。 配列の型はint型とstring型の2種類を想定しています。 ※intとstringの両者を混在させるのではなく別々の配列に格納します。
ArrayListは使わなくていい
ArrayListはList<T>が無かった時代の遺物
.Net Framework1.1以前の環境で使う必要があるならArrayList
988 :
983 :2008/09/29(月) 03:38:45
ど、どうもです(;´∀`)ノシ そうでしたか、ArrayListは遺物扱いされてたんですか。 型指定できないことにどことなく違和感は感じていたんですが・・・
foreachを使ってListBoxに入っているitemを文字列として 列挙したいのですが、どうすればいいのでしょうか。 ↓のように書くとobjectのようで…。 foreach (string item in listBox.Items) {}
え?そのままいけないか
そのListBoxに何入れてんのよ
Item に string の値を入れてるならキャストする。 foreach (object item in listBox.Items) { string str = (string)item; }
993 :
デフォルトの名無しさん :2008/09/29(月) 11:59:14
フォルダやファイルで、「コピー」を不能にするセキュレイティ制限は 可能でしょうか? 「移動」を不能にするためには、「削除」の許可を与えなければよい のですが、「コピー」の方は、「読み取り」さえ許可されていればできて しまいました。 これを不能にするためのアクセス権の設定方法がありましたら、その ための設定方法を知りたく思います。ご回答またはアドバイスを頂ければ ありがたく。
>>993 訂正 >セキュレイティ -> セキュリティ
>>992 foreach (string
でキャストも同時に可能よ
もちろんstring以外が入ってたら例外だけどな
>>993 プログラムからバイトデータ全部読み込んで適当なファイルに書き出す
とかされたらどうしようもないだろ
いろいろフックかませば不可能では無いんじゃないか まあ、トロイかスパイウェアになるから自分のPC以外には使用不可だけど
998 :
デフォルトの名無しさん :2008/09/29(月) 13:08:09
>>995-996 やはり少なくともWindows系でのファイルシステムでは「読み取り」権限
さえあれば「コピー」を制限することは不可能ということなんですよね、
わかりました、またよろしくです。
いやいや、読み取りできてコピーできないってどんなシステムよ。
あらゆる個所に書き込み一切禁止とか
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。