ふらっとC#,C♯,C#(初心者用) Part23
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/01/11(金) 15:41:00「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。
ふらっとC#,C♯,C#(初心者用) Part22
http://pc11.2ch.net/test/read.cgi/tech/1197802312/
0153デフォルトの名無しさん
2008/01/15(火) 01:15:19MSDN
0154デフォルトの名無しさん
2008/01/15(火) 02:33:43したらいいかわからないものが出てきた(ファイルとか)ので、ゴミ箱クラス作って
そこで一括管理しようと思ったのですが、対象となる変数の参照カウンタって
取得できないのでしょうか?
やっぱり自分で皮をかぶせるしかないですかね?
0155デフォルトの名無しさん
2008/01/15(火) 02:40:28LRのガーベジコレクタは参照カウント方式じゃないぞ
0156デフォルトの名無しさん
2008/01/15(火) 02:40:590157デフォルトの名無しさん
2008/01/15(火) 02:48:42ありゃ、そうなんですか… orz
今ざっと調べたところ、Finalize()を積んでおけばGCが勝手に実行
してくれるみたいなんですが、どうしてもDispose出来ないときは
それでいいんですかね?
0158デフォルトの名無しさん
2008/01/15(火) 04:03:32ところで 「やり直し等の機能」 って何?
0159デフォルトの名無しさん
2008/01/15(火) 06:24:53アンマネージリソースを扱うなら、必ず適切なタイミングで
Disposeを呼ぶような設計しなきゃ駄目だよ。
細かい話が多いので割愛するけど、
ファイナライザに頼るスタイルは色々問題があるのヨ。
ぶっちゃけマネージドな世界では、例えばC++において参照カウンタ式スマートポインタで
自動化できてたリソース管理の一部は使えなくなると思っていた方が良いかと。
0160デフォルトの名無しさん
2008/01/15(火) 06:30:02Label1.Text = DirectCast(Me.PreviousPage.FindControl( _
"TextBox1"), TextBox).Text
をC#で書くにはどうしたらいいですか?
0161デフォルトの名無しさん
2008/01/15(火) 07:42:540162デフォルトの名無しさん
2008/01/15(火) 08:30:22ペイントなどに良くあるやり直し・元に戻す操作です。
>>159
やっぱり自前でDisposeしなきゃだめなんですね…
ちょっと基本設計見直してきます orz
0163デフォルトの名無しさん
2008/01/15(火) 14:07:03Form1内で
Form2 f2 = new Form2();
f2.ShowDialog();
でForm2を呼び出した後にf2内のbutton_Clickイベント処理内でf2の中のテキストボックスや、コンボボックスの値をForm1で取得したいのですが
どうしたらよいでしょうか?
0164デフォルトの名無しさん
2008/01/15(火) 15:56:14イベントデリゲート自分で定義してテキストやコンボボックスの値をEventArgsにつっこむか
またはプロパティで公開しとく
0165デフォルトの名無しさん
2008/01/15(火) 16:31:400166デフォルトの名無しさん
2008/01/15(火) 16:39:14//Form2.cs
public event EventHandler HogeEvent;
private void button_Click( object sender, EventArgs e )
{
if( this.HogeEvent != nul )
this.HogeEvent( this, EventArgs.Empty ); // ← ココ
}
-------------------------------------------
//Form1.cs
...
Form2 f2 = new Form2();
f2.HogeEvent += new EventHandler( f2_HogeEvent );
...
private void f2_HogeEvent( object sender, EventArgs e )
{
//ココが呼ばれる
}
0167デフォルトの名無しさん
2008/01/15(火) 18:47:13これは何をしているのでしょうか?
form1では
private void button_add_Click(object sender, EventArgs e)
{
Addition add = new Addition();
add.ShowDialog();
}
でform2(Addition)を呼び出し、手動で、form2内のテキストエリアやコンボボックスに入力してOKボタンを押す
そのとき、したのイベントに遷移して、このメソッド内で、form1内のデータグリッドを更新できないか?ということなんですが。
private void button_OK_Click(object sender, EventArgs e)
{
}
0168デフォルトの名無しさん
2008/01/15(火) 18:52:380169デフォルトの名無しさん
2008/01/15(火) 19:03:28初めてコンソールアプリを作ろうとしているのですが、
エクスプローラーからコマンドプロンプトにディレクトリパスをD&Dで使わせようと思っています。
そのとき、長いフォルダ名を含む場合、絶対パスを表す文字列がダブルクォーテーションで囲まれてしまいます。
そのため、"入力文字列補正処理"を入れるようにしましたが、なんだかスッキリしません。
皆様どうやってやってますか?
以下にソースを書きます。宜しくお願いいたします。
0170169
2008/01/15(火) 19:04:04{
string[] str; //検証用変数
string Input, Output; //フォルダパス
Console.WriteLine("入力フォルダパスを入力して下さい");
//入力文字列補正
str = Console.ReadLine().Split(new char[] {'\"'});
if (str.Length == 3) { Input = str[1]; }
else { Input = str[0]; }
Console.WriteLine("出力フォルダパスを入力して下さい");
//入力文字列補正
str = Console.ReadLine().Split(new char[] { '\"' });
if (str.Length == 3) { Output = str[1]; }
else { Output = str[0]; }
if (Directory.Exists(Input) & Directory.Exists(Output))
{
Console.WriteLine("valid");
Console.ReadLine();
}
else
{
Console.WriteLine("invalid");
Console.ReadLine();
}
}
0171デフォルトの名無しさん
2008/01/15(火) 19:07:37form2でセットするんじゃなくて、form2はセットさせたい項目をpublicなプロパティで返すようにする
form1でDialogResultをチェックしてform2のプロパティからセットするのが正解
0172デフォルトの名無しさん
2008/01/15(火) 19:07:400173デフォルトの名無しさん
2008/01/15(火) 19:18:45個人で作ってるだけでプロパティ作るのが面倒くさかったら、
form2の該当の入力フィールド(textBoxとか)のModifiersをPublicにするのも手だけど
0174デフォルトの名無しさん
2008/01/15(火) 19:22:07丁寧にありがとうございます。
>>セットさせたい項目をpublicなプロパティで返すようにする
というのがいまいちわかりません。
ソース載せます。
//form1(Main)
public partial class Main : Form
{
public Main(){
InitializeComponent();
}
private void button_add_Click(object sender, EventArgs e) {
Addition add = new Addition();
add.ShowDialog();
}
}
//form2(Additon)
public partial class Addition : Form
{
public Addition() {
InitializeComponent();
}
private void button_OK_Click(object sender, EventArgs e) {
//MessageBox.Show(textBox_name.Text+"\n"+ comboBox1.Text+"\n"+textBox1.Text);
}
}
0175デフォルトの名無しさん
2008/01/15(火) 19:24:50{
public string 結果 { return textBox_name.Text+"\n"+ comboBox1.Text+"\n"+textBox1.Text; }
}
0176デフォルトの名無しさん
2008/01/15(火) 19:24:57publicにしたら、Form1.csの補完機能からform2のコントロールが見えました!
ありがとうございます!
0177175
2008/01/15(火) 19:25:16public string 結果 { get { return textBox_name.Text+"\n"+ comboBox1.Text+"\n"+textBox1.Text; } }
0178デフォルトの名無しさん
2008/01/15(火) 19:37:02まことに簡単な質問で恐縮なのですが、DataGridViewのculomnsのプロパティで
オートインクリメントをしたい列があるのですが、どうすればよいでしょうか?
よろしくお願いいたします。
0179デフォルトの名無しさん
2008/01/15(火) 20:33:34な、何を言ってるのかね?
0180デフォルトの名無しさん
2008/01/15(火) 20:53:51ただファイルを開くとかくらいなら、
ダブルクォーテーションがあっても問題なかった気がするけど。
0181デフォルトの名無しさん
2008/01/16(水) 10:43:24dos窓でドロップやったことないのか?
スペース含むパス取り込むためにデフォルトで""囲みになるのが普通だよー
0182デフォルトの名無しさん
2008/01/16(水) 11:16:560183デフォルトの名無しさん
2008/01/16(水) 11:40:31情報しか見つける事ができませんでした。
何か参考になる本やサイトなど知っていたら紹介して貰えませんか?
0184デフォルトの名無しさん
2008/01/16(水) 12:33:030185169
2008/01/16(水) 13:21:32そうだと思ったんですが、パスを変数に格納した後にフォルダの存在確認を>>170の下の方で
行っているんですが、""つきのパスだと存在しないよって言われちゃうんですよ。
>>182
調べてみます
0186デフォルトの名無しさん
2008/01/16(水) 13:51:480187デフォルトの名無しさん
2008/01/16(水) 14:00:080188デフォルトの名無しさん
2008/01/16(水) 14:38:39質問なのですが、テキストファイルに
1 200
2 356
3 1250
4 870
5 692
といったような行列があり、それをC#のプログラムで読み込み
1000以上の値を持つものだけピックアップすることはできるでしょうか。
ピックアップした後に計算もしたいので、変数にその値を代入したいのです。
よろしくお願いします。
0189デフォルトの名無しさん
2008/01/16(水) 15:00:03ReadLineして
パースすればいい
0190デフォルトの名無しさん
2008/01/16(水) 15:01:21from line in File.ReadAllLines(@"...")
from str in line.Split(' ')
let value = Int32.Parse(str)
where value >= 1000
select value;
0191デフォルトの名無しさん
2008/01/16(水) 15:05:510192169
2008/01/16(水) 15:46:16StreamReader sr = new StreamReader(filepath);
List<int[]> list = new List<int[]>();
do
{
string str = sr.ReadLine();
if (str != "")
{
string[] ary = str.Split(new char[] { ' ' });
int n1 = int.Parse(ary[0]);
int n2 = int.Parse(ary[1]);
if (n2 > 999)
{
list.Add(new int[] { n1, n2 });
}
}
}
while (sr.Peek() != -1);
0193169
2008/01/16(水) 15:51:20splitを使って面倒なことをしてましたが、
Trim(もしくはReplaceでも可)を使って少しコードがすっきりしました。
ありがとうございました。
Console.WriteLine("入力フォルダパスを入力して下さい");
Input = Console.ReadLine().Trim(new char[] { '\"' });
Console.WriteLine("出力フォルダパスを入力して下さい");
Output = Console.ReadLine().Trim(new char[] { '\"' });
if (Directory.Exists(Input) & Directory.Exists(Output))
{
Console.WriteLine("valid");
Console.ReadLine();
}
else
{
Console.WriteLine("入力したフォルダパスが不正です");
Console.ReadLine();
}
0194デフォルトの名無しさん
2008/01/16(水) 21:00:020195デフォルトの名無しさん
2008/01/16(水) 21:20:34VS2005 .netでプログラムしていますが、HOMEPATHの取得法はあるのでしょうか?
もしあるならば方法をご教授ください。
よろしくお願いします
0196デフォルトの名無しさん
2008/01/16(水) 21:23:02Environment.GetEnvironmentVariable( "HOMEPATH" );
0197デフォルトの名無しさん
2008/01/16(水) 21:27:22どっちも改行するわけだが動違うの?
0198デフォルトの名無しさん
2008/01/16(水) 21:31:50サイズが違う。
0199デフォルトの名無しさん
2008/01/16(水) 21:38:14Unix:\n
Windows:\r\n
Mac:\r
ってか基本だと思うけど。
0200デフォルトの名無しさん
2008/01/16(水) 21:40:24トンクス
Cとかだと\nが改行だから\r\nって何かと思ってたんだが
Windowsなら\r\nでいいってことでつね
0201デフォルトの名無しさん
2008/01/16(水) 21:46:35Cは、テキストモードだと、\nは\r\nに変換される。(winでは)
0202デフォルトの名無しさん
2008/01/16(水) 21:52:10ありがとうございました。無事解決です
0203デフォルトの名無しさん
2008/01/16(水) 22:09:14どうでもいい話ではあるんだが意味的に言うとWinがたぶん正しい
なのでhttpとかも\r\n。この辺はCRとLFを調べてみれ
0204デフォルトの名無しさん
2008/01/16(水) 22:28:130205デフォルトの名無しさん
2008/01/16(水) 22:57:060206デフォルトの名無しさん
2008/01/16(水) 23:00:210207デフォルトの名無しさん
2008/01/16(水) 23:16:31ラインフィニッシュ?
0208デフォルトの名無しさん
2008/01/16(水) 23:20:380209デフォルトの名無しさん
2008/01/16(水) 23:21:27LF=ラインフィード=紙送り。
0210デフォルトの名無しさん
2008/01/17(木) 00:53:22たとえば、こういうコードがあったとします。
if (Result == null) {
transaction.Rollback();
MessageBox.Show("エラー0です。");
return false;
}
if ((int)Result == 1) {
transaction.Rollback();
MessageBox.Show("エラー1です。");
return false;
}
if ((int)Result == 2) {
transaction.Rollback();
MessageBox.Show("エラー2です。");
return false;
}
transaction.Commit();
return true;
これをスッキリ表記するのに何かいい手段はないですかねぇ…。
throwで例外起こしてtry〜catchってのもスッキリしなくて…
0211デフォルトの名無しさん
2008/01/17(木) 01:08:540212デフォルトの名無しさん
2008/01/17(木) 01:13:400213デフォルトの名無しさん
2008/01/17(木) 01:20:460214デフォルトの名無しさん
2008/01/17(木) 01:27:18result = (Result == null) ? 0 : (int)Result;
switch(result){
case 0:
case 1:
case 2:
transaction.Rollback();
string temp = "エラー" + result + "です。";
MessageBox.Show(temp);
return false;
break;
default:
transaction.Commit();
return true;
break;
}
0215デフォルトの名無しさん
2008/01/17(木) 01:39:340216デフォルトの名無しさん
2008/01/17(木) 09:07:05しかし不必要なbreakを強要されるのが面倒くさいな。
Cの文法に慣れてる人がバグを作らないようにってことなのかな。
0217デフォルトの名無しさん
2008/01/17(木) 09:10:590218デフォルトの名無しさん
2008/01/17(木) 09:22:090219デフォルトの名無しさん
2008/01/17(木) 13:16:16自分よく分かってないんですが
typedef struct tagDESKBANDINFO {
DWORD dwMask;
POINTL ptMinSize;
POINTL ptMaxSize;
POINTL ptIntegral;
POINTL ptActual;
WCHAR wszTitle[256];
DWORD dwModeFlags;
COLORREF crBkgnd;
} DESKBANDINFO;
の WCHAR wszTitle[256];って
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)]
にした上で
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)]
string wszTitle;
じゃないんですか?
http://www.pinvoke.net/default.aspx/Structures/DESKBANDINFO.html
とかだと255になってるんですがどっちが正しいんでしょう?
0220デフォルトの名無しさん
2008/01/17(木) 13:16:550221デフォルトの名無しさん
2008/01/17(木) 13:20:25http://msdn2.microsoft.com/ja-jp/library/795sy883(VS.80).aspx
文字列のマーシャリングだと
TCHAR szCSDVersion[ 128 ];
↓
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]
String versionString;
になってるしワケワカリマセン
0222デフォルトの名無しさん
2008/01/17(木) 13:20:51256であってる
0224219
2008/01/17(木) 13:30:11さらにワケワカメ
アラインとかPackとかのせいですか?
ということは実害なし?
0225デフォルトの名無しさん
2008/01/17(木) 18:06:120226デフォルトの名無しさん
2008/01/17(木) 18:08:57C#でGTKといったらMono?
Monoスレに行かないといないかもしれない。
0227デフォルトの名無しさん
2008/01/17(木) 18:11:31すみません、ありがとうございました。
0228デフォルトの名無しさん
2008/01/18(金) 01:31:530229210
2008/01/18(金) 02:17:47ありがとうございます。
これで試してみます。
0230デフォルトの名無しさん
2008/01/18(金) 03:32:280231デフォルトの名無しさん
2008/01/18(金) 03:46:58pictureboxに表示する画像のリソースを指定するときは
this***.Image = Properties.Resources.abc;
のようにしますが(というかVSが勝手にやってくれますが)
これを文字列型の変数を使ってやることはできないでしょうか?
string TMP;
TMP = "abc";
として5行目と同じように指定したいのです。
0232デフォルトの名無しさん
2008/01/18(金) 06:06:540233デフォルトの名無しさん
2008/01/18(金) 07:02:540234デフォルトの名無しさん
2008/01/18(金) 07:27:360235デフォルトの名無しさん
2008/01/18(金) 09:13:14>>234
リソース名が連続した英数字なので、for文で数十の文字列の配列を作ったんですが、それをリソース名の指定に使う方法が分からなくて・・・
手動でやるよりはるかに効率的だと思うので、できればさわりだけでも簡単に教えてもらえればと
>>233
では、結局出来ないということになるんでしょうか・・・?
0236デフォルトの名無しさん
2008/01/18(金) 09:21:160237デフォルトの名無しさん
2008/01/18(金) 10:18:33XLinqでも使ってみれば
0238188
2008/01/18(金) 11:19:39ありがとうございました。
0239デフォルトの名無しさん
2008/01/18(金) 15:01:23byte[] b2 = new byte[] {1,2,3,4};
があったとして、2つの配列の内容が全て等しいか簡単に調べる方法ってないですか?
b1 == b2;
も
b1.Equals(b2);
もfalseになります(´・ω・)
やっぱいちいちforeachで回さないとダメですか?
0240デフォルトの名無しさん
2008/01/18(金) 15:04:53Array.Equals は object.Equals と変わらんからな
0241デフォルトの名無しさん
2008/01/18(金) 15:06:27出来ないみたいですねorz
お騒がせしました。
0242デフォルトの名無しさん
2008/01/18(金) 15:09:45親クラスで共通の処理をさせたいのですがどうすればいいでしょうか
うまく説明できないんですがポリモーフィズム的なメソッドの共通処理を
継承クラスでは意識せずに親で処理させたいのですが・・・
0243デフォルトの名無しさん
2008/01/18(金) 15:24:50virtual void Hoge()
{
...
}
//子
override void Hoge()
{
...
base.Hoge();
}
じゃあかんのん?
0244デフォルトの名無しさん
2008/01/18(金) 15:27:51やっぱりそうなりますかね
base.Hoge()の処理は必ずして欲しいのに
base.Hoge();を付け忘れちゃったりするものですから
0245デフォルトの名無しさん
2008/01/18(金) 16:21:12Hoge のなかで HogeOverridable を呼ぶ
ただし派生クラスで基底クラスの処理の呼び出す位置を変更できないデメリットもある
0246231
2008/01/18(金) 19:49:57http://www.atmarkit.co.jp/fdotnet/dotnettips/220resources3/resources3.html
を参考に
Assembly thisExe = Assembly.GetExecutingAssembly();
ResourceManager TMPres = new ResourceManager(
"***.Properties.Resources", thisExe);
xxx = (Image)TMPres.GetObject("abc");
とやったらできました。
0247デフォルトの名無しさん
2008/01/18(金) 20:10:420248デフォルトの名無しさん
2008/01/18(金) 23:19:52FormのFormClosingイベントを捕らえて
フォームを閉じることを中止するにはどうすればいいのでしょうか?
以下のように書いてもだめでした。
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult result = MessageBox.Show("変更を保存しますか?", "確認",
MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
this.menuSaveProject_Click(sender, e);
}
else if (result == DialogResult.Cancel)
{
return; // ←これ
}
}
よろしくお願いいたします。
0249デフォルトの名無しさん
2008/01/18(金) 23:26:030250デフォルトの名無しさん
2008/01/18(金) 23:28:22とやればいいようですね(´・ω・`)
今までeなんて無視してました
ありがとうございました
0251デフォルトの名無しさん
2008/01/18(金) 23:29:030252デフォルトの名無しさん
2008/01/19(土) 00:16:31があったとして、
この中から特定のIPの項目だけ削除ってどうすればいいんでしょうか。
InteliSenseで見てると
addrs.Except();
とかそれっぽいのはあるんですが、いまいち使い方がわかりません・・・
■ このスレッドは過去ログ倉庫に格納されています