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

ふらっとC#,C♯,C#(初心者用) Part35

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん2008/12/17(水) 22:17:18
このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。

>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
0809デフォルトの名無しさん2009/01/13(火) 20:23:26
>>808
大丈夫かよ……
if( A || B )
の場合、AがtrueだとBは評価されないってのは理解してるよな……?
0810デフォルトの名無しさん2009/01/13(火) 21:03:00
質問です。
2009/01/13
という文字列から、
2009/01/20
2009/01/27
2009/02/03
……
という文字列を得たいと考えています。
ToString()みたいな感じでToDateTimeしてAddDays(+7)とかできないかと考えたのですが、違うみたいです。
どう考えたらいいですか?
0811デフォルトの名無しさん2009/01/13(火) 21:04:16
こいつからはカレンダーのにおいがするぜ!間違いねえ!
0812デフォルトの名無しさん2009/01/13(火) 21:06:58
>>810
君が間違いを犯してると思う
全コードのせてみ?
0813デフォルトの名無しさん2009/01/13(火) 21:12:00
>>811
え…。カレンダーってなんかまずいっすか?
コンソールで
makecalendar.exe 2009/01/13 21:00 メイちゃんの執事
と入力して結果として、
2009/01/13 21:00 メイちゃんの執事
2009/01/20 21:00 メイちゃんの執事
2009/01/27 21:00 メイちゃんの執事
2009/02/03 21:00 メイちゃんの執事
……
というファイルを作りたいと思っています。

>>812
いまコードは次のとおりです。
string[] args = Environment.GetCommandLineArgs();
File.AppendAllText("plan.txt" , args[1] + "\t" + args[2] + "\t" + args[3] + "\r\n", Encoding.Default);
でこのあとの部分で、stringを日付にして、AddDaysを12回くり返す。forで。と考えました。
0814デフォルトの名無しさん2009/01/13(火) 21:14:07
おい肝心の
> でこのあとの部分で、stringを日付にして、AddDaysを12回くり返す。forで。と考えました。
はどこいった
0815デフォルトの名無しさん2009/01/13(火) 21:14:40
なんで日本語で書くかな〜
全部そのまま載せろ、ドアホ
0816デフォルトの名無しさん2009/01/13(火) 21:15:37
ドアフォ
0817デフォルトの名無しさん2009/01/13(火) 21:18:09
現在、あるExcelファイルを予め開いておき、
そのExcelからC#で作ったプログラムを起動して処理をさせる事を
しています。
そのときC#で行った処理の結果を先ほどの既に開いている
Excelファイルのあるシートのあるセルに
文字列として書きこみたいのですがどうすればよいでしょうか?
Excel.Openだと新しくファイルを開こうとするので
そうではなくすでに開いているExcelを操作したいのです。

どなたかご教授お願いします。。
0818デフォルトの名無しさん2009/01/13(火) 21:23:42
>>813
ヘルプの「解説」の1行目読んで。
0819デフォルトの名無しさん2009/01/13(火) 21:33:45
>>814
いや、その肝心のところで躓いていて。
>>815
コードこれでぜんぶです〜。
まず日本語でやりたいことを忘れないようにメモしたところです。
これから日付をクリアしたら、forの使い方を調べて…。
0820デフォルトの名無しさん2009/01/13(火) 21:36:21
>>819
何を言いたいのかよくわからんがプログラム書いてからこい
0821デフォルトの名無しさん2009/01/13(火) 21:45:20
正規表現でぐぐればいいんじゃね?
0822デフォルトの名無しさん2009/01/13(火) 21:59:09
forのところは次のようになりました。
for (int i=2; i<13; i++) {
File.AppendAllText("plan.txt" , (i) + "\t" + args[2] + "\t" + args[3] + "\r\n", Encoding.Default);
}
これで最初の質問のargs[1]の日付を文字から日付にする方法をアドバイスお願いします。
0823デフォルトの名無しさん2009/01/13(火) 22:01:18
DateTime.Parse
0824デフォルトの名無しさん2009/01/13(火) 22:04:10
>>819
日付の計算の仕方がわかったら、本当にforの使い方を調べるんだな。
おじさんとの約束だぞ。

stringをDateTimeに変換するのは、 DateTime.Parse() を使う。

string s = "2009/01/13 21:00";
DateTime dt1 = DateTime.Parse(s);

Parse()というメソッドはよく覚えておけ。文字列表現を解釈するために、いろんなクラスに
存在しているからな。目を皿のようにしてMSDNライブラリを渉猟するがいい。
次は、「DateTime.AddDays()が機能しません」と言って泣きついてくるような気がするが、
それはそのとき答えよう。
0825デフォルトの名無しさん2009/01/13(火) 22:11:16
その前にFormatExceptionが出る気がする
08268242009/01/13(火) 22:13:55
>>825
大丈夫、確認はしているさ。
0827デフォルトの名無しさん2009/01/13(火) 22:16:54
>>824
なんか知らんが、あんた気色悪いよ。
いや本気で。
0828デフォルトの名無しさん2009/01/13(火) 22:19:48
DateTimeに変換とか言う以前に、コマンドライン引数を""で囲わないとだめなんじゃないか?
0829デフォルトの名無しさん2009/01/13(火) 22:41:44
こんなんかな。

DateTime startDate = DateTime.Parse(args[ 1 ]);
using (StreamWriter writer = new StreamWriter("plan.txt"))
{
  for (int i = 0; i < 13; ++i)
  {
    DateTime onAirDate = startDate.AddDays(i * 7);
    writer.WriteLine("{0:yyyy/MM/dd}\t{1}\t{2}", onAirDate, args[ 2 ], args[ 3 ]);
  }
}

次はだれかLINQを使う例を頼む。
0830デフォルトの名無しさん2009/01/13(火) 22:42:11
>>823
ありがとうございます。
>>824
詳しくありがとうございます。
できました。
0831デフォルトの名無しさん2009/01/13(火) 22:46:28
ああ、書いちゃった
今夜の楽しみがひとつ減った
0832デフォルトの名無しさん2009/01/13(火) 22:46:33
>>830
できたプログラムキボンヌ。
0833デフォルトの名無しさん2009/01/14(水) 00:25:47
>>832
いま、こんな感じです。
// 周期と初期値は今後対応予定。
// 日付 時刻 項目 初期値 周期
// 予定の表記は、「2009/01/20 21:00 メイちゃんの執事 2 7」
DateTime dt;
DateTime.TryParse(args[1].ToString() + " " + args[2].ToString(), out dt);
for (int i=1; i<13; i++) {
File.AppendAllText("plan.txt" , dt.AddDays(+7*(i)).ToString().Replace(" ","\t").Replace("00:00","00") + "\t" + args[3] + (i) + "\r\n", Encoding.Default);
}
0834デフォルトの名無しさん2009/01/14(水) 00:29:50
TryParseの戻り値放置はダメだろ
0835デフォルトの名無しさん2009/01/14(水) 00:36:46
829と見較べて勉強してました。
>>834
え!? なんですかそれ…。
0836デフォルトの名無しさん2009/01/14(水) 00:37:32
あとはとりあえず
・DateTimeは時間も扱えるのでまとめてParseした方がいい。
・DateTimeを文字列に変換する際には書式指定できる。
 ヘルプで「日付と時刻の書式指定文字列」を調べてみる。
0837デフォルトの名無しさん2009/01/14(水) 00:43:05
>>835
Try○○パターンは常にif (Try○○(out result)) { 成功したとき } else { 失敗したとき }
の形で使うんだよ
失敗したときはresultの値は無意味なので使っちゃいけないお約束
0838デフォルトの名無しさん2009/01/14(水) 01:06:54
整理しました。こんなんでいかがでしょう。
DateTime startDate = DateTime.Parse(args[1] + " " + args[2]);
for (int i=1; i<13; i++) {
File.AppendAllText("plan.txt" , startDate.AddDays(+7*(i)).ToString("yyyy/MM/dd/\tHH:mm") + "\t" + args[3] + (i) + "\r\n", Encoding.Default);
}
0839デフォルトの名無しさん2009/01/14(水) 01:10:27
for(int i=0;...な
0840デフォルトの名無しさん2009/01/14(水) 01:17:41
>>837
失敗したときの値は普通は default(T) だから(値はMSDNに明記されてる)、
変換できない文字列は default(T) とみなすということも有り得る
08416512009/01/14(水) 01:56:17
自己解決しました。
EditingControlWantsInputKeyメソッドの
switch文のdefaultの時に
return !dataGridViewWantsInputKey;
を返したら無事入力できるようになりました。

ttp://windowsclient.net/downloads/folders/applications/default.aspx
のDataGridViewを参考にしました。
0842デフォルトの名無しさん2009/01/14(水) 10:08:59
           ∩_
           〈〈〈 ヽ
          〈⊃  }
   ∩___∩  |   |
   | ノ      ヽ !   !
  /  ●   ● |  /
  |    ( _●_)  ミ/ こいつ まピョーん☆
 彡、   |∪|  /
/ __  ヽノ /
(___)   
0843デフォルトの名無しさん2009/01/14(水) 10:56:21
ToolStripMenuとContextMenuで共通のものがあるですが
同じアイテムを使う事ってできないんでしょうか?
0844デフォルトの名無しさん2009/01/14(水) 10:58:16
ContextMenuStrip使えばいいよ
0845デフォルトの名無しさん2009/01/14(水) 11:07:00
たぶんひとつのToolStripMenuItemを使い回したいということなんだろうけど、
違う親にAddするともとからはRemoveされる仕様です
0846デフォルトの名無しさん2009/01/14(水) 13:09:14
>>807
サンクス。だが遅かったな
俺が寝てる間(=意識がもうろうとしている状態)に小人さんが作ってくれたんだぜw 俺の小人さん乙

Console.ReadKey(true).KeyChar == 0 の場合は考えてなかったな
まあいいや
0847デフォルトの名無しさん2009/01/14(水) 16:18:02
昨日はいろいろありがとうございました。
周期と初期値に対応したつもりですが、周期と初期値の引数がない場合になにも処理されないという症状に困っています。
アドバイスいただければと。
引数つきでデバッグするときにはどうしたらよいんでしょう?

//予定の表記は「2009/01/20 21:00 メイちゃんの執事 2 7」
//日付 時刻 項目 初期値 周期
DateTime startDate = DateTime.Parse(args[1] + " " + args[2]);
int defaultValue = 1;
if (args[4] != null) {defaultValue = Int32.Parse(args[4]);}
else if (args[4] == null) {}
int incrementDays = 7;
if (args[5] != null) {incrementDays = Int32.Parse(args[5]);}
else if (args[5] == null) {}
for (int i=defaultValue; i<13; i++) {
string writefolderDate = (startDate.AddDays(i*incrementDays).ToString("yyyy/yyyyMM/yyyy_MMdd/"));
File.AppendAllText("plan.txt" , startDate.AddDays(i*incrementDays).ToString("yyyy/MM/dd\tHH:mm") + "\t" + args[3] + i + "\r\n", Encoding.Default);
0848デフォルトの名無しさん2009/01/14(水) 16:26:03
>>847
もうちょっと機能を分割したほうがいいが、、
引数付きでデバッグ開始したいなら、プロジェクトのプロパティのデバッグのとこに
開始オプション-コマンドライン引数とかあるが。
0849デフォルトの名無しさん2009/01/14(水) 16:26:06
キモい。
0850デフォルトの名無しさん2009/01/14(水) 16:50:45
args[4] == null
って引数足りないときはArgumentOutOfRangeExceptionだぞ
Lengthプロパティで確認
0851デフォルトの名無しさん2009/01/14(水) 17:07:33
>>848
ありがとうございます。
>>850
ありがとうございます。
int defaultValue = 1;
if (args.Length >= 5) {defaultValue = Int32.Parse(args[4]);}
int incrementDays = 7;
if (args.Length >= 6) {incrementDays = Int32.Parse(args[5]);}
でできたみたいです。
0852デフォルトの名無しさん2009/01/14(水) 17:12:20
質問があります。
周期的に行う予定で、雑誌の発売日などの場合、2週目と4週目の火曜日、というようなことがあるのですが、C#で2週目の火曜日、というのはどう書くものなのですか?
0853デフォルトの名無しさん2009/01/14(水) 17:24:06
>>851
普通にメソッド化しろよ。
もう遅いとは思うが
0854デフォルトの名無しさん2009/01/14(水) 17:48:37
>>853
遅いってことはないんですけど、普通のメソッド化って、どんなふうにするものなのですか?
メソッド化って、自分ではまだしたことがなく、リファクタ-メソッドの抽出でメソッドを作ったことがあるくらいです。
この場合、どこをどうメソッドにするものなのでしょう?
0855デフォルトの名無しさん2009/01/14(水) 18:11:35
>>852
1日が何曜日かしらべて自前で計算したらよかんべ
0856デフォルトの名無しさん2009/01/14(水) 18:14:45
>>852
そういうのはまず条件を整理するんだよ。
で、何週目かは7で割ればいいし、
DateTime 使うんなら、DayOfWeekで曜日がわかる。
0857デフォルトの名無しさん2009/01/14(水) 18:28:11
>>854
やってることを分けて考えれば自然に出てくる
たとえ一回しか使われない処理でも,
はっきりとした機能単位でメソッドに分けられていたら見通しが良くなる
0858デフォルトの名無しさん2009/01/14(水) 18:34:09
>>852
今月の場合だと

int i = Convert.ToInt32(new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).DayOfWeek);
int n = (7 - i) + 3;

任意の月だとDateTime.Now.Monthを変えればOK。
0859デフォルトの名無しさん2009/01/14(水) 18:46:57
>>852
因みに、ある月の「2週目の火曜日」と「第2火曜日」は違うと言っておく
雑誌なんかは普通は後者だと思う。前者も無いとは言い切れないが
0860デフォルトの名無しさん2009/01/14(水) 18:50:42
リファクタ-メソッドの抽出なんて初めて知ったw
すごいなこれw
0861デフォルトの名無しさん2009/01/14(水) 18:56:57
便利ではあるが、抽出の仕方を上手い事誘導するにはコツがいる

void NewMethod(ref int a, ref int b, out int c);

もう、あほかとw
0862デフォルトの名無しさん2009/01/14(水) 18:59:16
>>859
確かにw
第二火曜日の場合

int i = Convert.ToInt32(new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).DayOfWeek);
int n = (i > 2) ? (7 - i) + 3 + 7 : (7 - i) + 3;
0863デフォルトの名無しさん2009/01/14(水) 19:06:13
>>856
ありがとうございます。
う〜む。なんかこんなんなりました…。
割り算苦手…。
string[] targetDay = {"日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"};
string targetOnlyDate = DateTime.Now.ToString("dd");
DateTime targetDate = DateTime.Now;
string stringTargetDate = DateTime.Now.ToString("yyyy年MM月dd日");
if (Int32.Parse(targetOnlyDate)<=7) {MessageBox.Show(stringTargetDate + "は第1" + targetDay[(int)targetDate.DayOfWeek]);}
else if (Int32.Parse(targetOnlyDate)<=14) {MessageBox.Show(stringTargetDate + "は第2" + targetDay[(int)targetDate.DayOfWeek]);}
else if (Int32.Parse(targetOnlyDate)<=21) {MessageBox.Show(stringTargetDate + "は第3" + targetDay[(int)targetDate.DayOfWeek]);}
else if (Int32.Parse(targetOnlyDate)<=28) {MessageBox.Show(stringTargetDate + "は第4" + targetDay[(int)targetDate.DayOfWeek]);}
else {MessageBox.Show(stringTargetDate + "は第5" + targetDay[(int)targetDate.DayOfWeek]);}

>>858
うっ。ありがとうございます。四苦八苦しているうちに…。
すごいスマートです…。

>>857、860
メソッド化については、最近必要性がわかってきたものの、もうちょっと頭を整理してから考えます。
0864デフォルトの名無しさん2009/01/14(水) 19:13:07
>>863
これはひどい
0865デフォルトの名無しさん2009/01/14(水) 19:18:44
中学生か?
0866デフォルトの名無しさん2009/01/14(水) 19:21:00
targetOnlyDateいらないだろ
しかもなぜかstringで毎回Int32.Parse…
0867デフォルトの名無しさん2009/01/14(水) 19:38:39
C#じゃなくてアルゴリズムだよなこれは・・・
0868デフォルトの名無しさん2009/01/14(水) 19:49:06
こういう嘘くさいメソッドを捏造してやればおk

public static int 第nx曜日の日付を調べる(int n, DayOfWeek x, DayOfWeek firstDay)
{
int firstDateX = x - firstDay + 1;
if (firstDateX <= 0)
firstDateX += 7;
return firstDateX + 7 * (n - 1);
}
0869デフォルトの名無しさん2009/01/14(水) 20:25:29
>>863
if a b の人じゃないのwww
0870デフォルトの名無しさん2009/01/14(水) 21:17:42
852は2週目の火曜日の何の型を知りたかったのだろうか
0871デフォルトの名無しさん2009/01/14(水) 22:21:03
今夜も酒がうまい
0872デフォルトの名無しさん2009/01/15(木) 04:12:59
privateとかpublicとかの識別子が付いてないクラスのアクセスレベルはなんなの?
0873デフォルトの名無しさん2009/01/15(木) 04:32:35
MSDN見れ
http://msdn.microsoft.com/ja-jp/library/ms173121.aspx
0874デフォルトの名無しさん2009/01/15(木) 04:41:06
わかりましたありがとう
0875デフォルトの名無しさん2009/01/15(木) 16:53:43
>>868
第nx曜日の日付を調べる()
を呼び出すときの引数を教えてください。
たとえば第2火曜日の日付を求めるには?
第nx曜日の日付を調べる(2, "火", "木")
0876デフォルトの名無しさん2009/01/15(木) 17:04:18
DayOfWeek型だって書いてるだろ
0877デフォルトの名無しさん2009/01/15(木) 17:37:22
>>875
>>862を発展させたのが>>868なんじゃないの?
両方を見ればどうするか分かりそうだけど・・・。
0878デフォルトの名無しさん2009/01/15(木) 17:49:32
なんでも文字列でやりたがるお人じゃのぅ
0879デフォルトの名無しさん2009/01/15(木) 18:26:49
DayOfWeek列挙体でなくて?
ほとんどstringしか使ったことがないので、Intとかよくわからないのです。
両方見ても、ぜんぜん見当がつかないです。
0880デフォルトの名無しさん2009/01/15(木) 18:39:26
intがよくわからないんじゃコンピュータさんとお話はできないな
0881デフォルトの名無しさん2009/01/15(木) 18:41:27
機械語でお話できればok
0882デフォルトの名無しさん2009/01/15(木) 18:48:29
IntPtr型ってIntの参照型ですか?
それともアドレス?
0883デフォルトの名無しさん2009/01/15(木) 18:55:16
インテリセンスで出るだろそれくらい・・・
0884デフォルトの名無しさん2009/01/15(木) 19:50:44
キーワードとか予約語が分かりません、てレベルは来なくていいよ
0885デフォルトの名無しさん2009/01/15(木) 19:55:40
>>882
ポインタをはじめとした,プラットフォームによってサイズが変わる整数値を格納するための型
0886デフォルトの名無しさん2009/01/15(木) 19:57:34
そのプラットフォームにおけるポインタのサイズと同じサイズの整数型
と言った方がいいかもしれない
0887デフォルトの名無しさん2009/01/15(木) 20:05:15
ありがとうございます。
IntPtrの仕様書(?)説明ではよく分からなかったので質問しました。
BitmapData.Scan0というのがよく分からなかったので
0888デフォルトの名無しさん2009/01/15(木) 20:08:41
C#は変数の型を厳密に区別する堅牢な言語と最初に教わった気がする。
var世代にはもう必要なくなったのかも・・。
0889デフォルトの名無しさん2009/01/15(木) 20:17:45
Scan0はポインタそのもの
void*とか公開するのはさすがにまずいのでそのかわりにIntPtr

値はやっぱり生のアドレス
0890デフォルトの名無しさん2009/01/15(木) 20:21:25
>>887
要は、

実態: ただの整数の別名
用途: ハンドルとかポインタとか、普通の整数のように扱われては困る値を扱うためのもの

ってことじゃないの?俺はそう思ってるけど。
ただ、整数と「意味的に」区別するために導入したはずのIntPtrなのに、
結局のところ「意味的に」全然異なるいろんなハンドルやポインタの値を
扱うんじゃ、考え方として一貫してないしあんまり意味ないなー、と思うのは俺だけ?
0891デフォルトの名無しさん2009/01/15(木) 20:23:07
>>888
C#は静的な強い型付けの言語だけど、それと型推論は別の概念。
0892デフォルトの名無しさん2009/01/15(木) 20:27:22
>>890
ハンドルでもいいんだよ
要は32ビット環境では32ビット,64ビット環境では64ビット環境になるような値に対して使う
0893デフォルトの名無しさん2009/01/15(木) 20:30:21
size_tのマーシャリングにもIntPtr使ったりする
0894デフォルトの名無しさん2009/01/15(木) 20:31:10
環境によってビット数を変える必要がある整数に対して使うと言うことですね。
ありがとうございます。
(Scan0以外で多分当分使わないだろうな…)
0895デフォルトの名無しさん2009/01/15(木) 20:33:13
サイズの基準がポインタっていうだけのことだな
だからIntPtrという名前なんだろう
0896デフォルトの名無しさん2009/01/15(木) 20:44:02
算術演算できないのに整数型って呼んでいいの?
0897デフォルトの名無しさん2009/01/15(木) 20:47:03
算術演算には型のサイズが必要だからな
0898デフォルトの名無しさん2009/01/15(木) 20:52:29
ポインタのサイズは一定だから、関係ないだろ。
0899デフォルトの名無しさん2009/01/15(木) 21:05:49
>>896
それはbyte型に対する当て付けか
0900デフォルトの名無しさん2009/01/15(木) 21:17:01
>>894
いやだから、意味的な重点は「フツーの整数とは違うよ」っていうことにあって、
Cのintみたいに環境で大きさが変わるっていうのはむしろそう重要なことではないかと。

もちろんポインタを扱う場合には重要な特徴ではあるんだけど。
0901デフォルトの名無しさん2009/01/15(木) 21:28:29
少なくともIntPtrていう名前は
Int32,Int64等に対応して"Int"+(サイズ)と理解していいのかなあ
0902デフォルトの名無しさん2009/01/15(木) 21:35:18
IntPtrはIntPtrだろ
無理に何かにあてはめることは無い
0903デフォルトの名無しさん2009/01/15(木) 21:42:58
>>900
う〜ん
何となくは分かるんですが…
0904デフォルトの名無しさん2009/01/15(木) 21:47:07
>>893
C#コードで完結するならUIntPtr使いたいな。
0905デフォルトの名無しさん2009/01/15(木) 23:15:11
C#をつかってデータベースファイル(*.mdf)を扱うシステムを作ろうとしています。
質問をよろしくお願いします。
次の各項目について、方法は長くなってしまうでしょうから、可能なのかどうかだけでも教えてください。

(a) exeファイルになってからSQLServerがインストールされていないPCで使用したい
(b) mdfファイルとの接続を、メイン実行ファイル自身(exeファイル)からの相対パスで指定したい

以上2点ですが、可能なんでしょうか?
0906デフォルトの名無しさん2009/01/15(木) 23:20:10
ホイールでスクロールできるようにするにはどうすればいいですか?
0907デフォルトの名無しさん2009/01/15(木) 23:26:00
>>905
a. 無理。Compact ならいけるかも。調べてみれ
b. いけるはず
0908デフォルトの名無しさん2009/01/15(木) 23:46:02
>>906
なにをスクロールさせたいんだ?
おれたちゃお前のお母ちゃんじゃねえんだ
出直しな
レス数が900を超えています。1000を超えると表示できなくなるよ。