ふらっと C#,C♯,C#(初心者用) Part144
■ このスレッドは過去ログ倉庫に格納されています
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください
>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■関連スレ
C#, C♯, C#相談室 Part95
https://mevius.5ch.net/test/read.cgi/tech/1508168482/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/
■前スレ
ふらっと C#,C♯,C#(初心者用) Part143
https://mevius.5ch.net/test/read.cgi/tech/1558002486/
■情報源
https://docs.microsoft.com/ja-jp/dotnet/standard/class-libraries
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://docs.microsoft.com/en-us/dotnet/standard/class-libraries
http://referencesource.microsoft.com/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured >>390
var f1 = new Form1();
var f2 = new From2();
foreach(var i in Enumerable.Range(0, 5).Reverse())
{
await Task.Delay(1*1000);
if(0 == i)
f1.DoDomething();
// f2?
}
Form1とForm2のメソッド呼び分け条件を提示して。
あと
>複数class間で通知する方法がよくわかりません。
の意味が分からないんでもう少し詳しく 「通知」…もし表示済みのフォームをあとからいじりたい場合、
public static class static1 {
public static form1 form1; //スタティッククラスのフィールドを用意して、
-------------------------------------
public partial class form1 : Form {
public form1() {
static1.form1 = this; //各自のインスタンスを各自のコンストラクタで設定しておく
-------------------------------------
public partial class CounterForm : Form {
public void hoge() {
try {
Exception er = null;
this.Invoke( (MethodInvoker)delegate { //デリゲートせずに外からフォームをいじるとエラーになることがある
try {
static1.form1.DoSomething(); //スタティッククラスのフィールドを経由すると表示済のものがいじれる
} catch( Exception e ) { er = e; } //ちなみにデリゲート内のエラーは外側でキャッチできないので、
} );
if( er != null ) { throw er; } //変数を経由して外側でスローする >>390
Formだろうが何だろうが、操作したい側が操作対象の参照を握れば良いだけだけど、
親子関係が成立しているとか特殊な前提がなければ、Formが別のFormの参照を
握るのはあんまり良くない。
原則論を言えばそもそもFormにUIと無関係の処理を書く時点で間違っている。 UIと関係あるからフォームなんだろうけど…
非同期処理中にポップアップが出て、その間もメインは触れるが、終わるとメインが変更される
なんてことはよくある
書式設定的なのも別フォームから別フォームをいじるわけだし
前のいじり方を残すために、閉じても隠すだけで、同じインスタンスを再表示したい場合とか フォームと無関係な〜って書いてあるぞ
そんなことより全角半角がきもい 対象のフレームワーク:Framework 4.0 でコンパイルした自作 DLL があります。
この DLL を 対象のフレームワーク:Framework 4.8 なプロジェクトから参照して使用したとき、
DLL の中はどっちで動くのでしょうか?
たとえば自作DLL内で、DataGridView から継承した DataGridViewEx を作ってあったとして
これを 4.8 なプロジェクトで利用したとき、DataGridViewEx 内で
4.0 の DataGridView が使われるのか、4.8 の DataGridView が使われるのか、って意味です。 自作DLL内でDataGridViewの参照を特定バージョンにしておけば4.0になるしそうじゃなければ4.8 自作DLL 側の System.Windows.Forms を見たら
特定バージョン:false
になっていたので、呼ばれる側のバージョンの System.Windows.Forms.dll が使われるってことですね。
Framework 4.8 用に新たに作らないといけないかと思ったのですが、その心配ないみたいで安心しました。 あ、間違えた
× this.Invoke( (MethodInvoker)delegate {
〇 static1.form1.Invoke( (MethodInvoker)delegate {
(thisは自フォーム内のマルチスレッド部分のソースだった)
カウントダウンにマルチスレッドが必要とは限らんが
むしろモーダルだったり
でも「オブジェクトがあれば必ず「通知」できる」という方法は確立しといた方が、オブジェクト指向っぽい
クラスオブジェクト指向の前にメッセージオブジェクト指向があったので(Win32API)
メッセージ、つまり「通知」 >>392
解答どうもありがとうございます。
event かデリゲートで解決できそうです。
// Form1
private void CountDownBtn_Click(object sender, EventArgs e) {
var countdownForm = new MYCountDownForm();
// 4 3 2 1 0と表示してから、下に行きたいが、
// これだとカウント 0 を待たずにすぐ下に行く。
countdownForm.Show();
// このクラスのいろいろな処理
} >>400
そっちかw
そっちは「モーダルフォーム」でググると出てくると思う
その方が普通に基本 APIが公開されていなくてもスクレイピングして非公開websoketに接続したいのですが、
解析からトークンなど必要なheader情報取得すればできるものですか? 出来るけど利用規約読め
API経由だとセーフで
API経由しないと逮捕とか書いてあるから >>402
非公開だろうがクライアント側で処理してるのには変わりないんだから
お前が本当にブラウザになり切れればやれるよ
単純に能力と手間の問題だ この質問結構前からいたるところで見る気がするんだけどただのマルチ? >>400 >>401
とりあえず自力でできたのでソース抜粋 1
// Form1 呼び出し側
private void CountDownBtn_Click(object sender, EventArgs e){
var countDownForm = new MYCountDownForm(7);
countDownForm.ZeroReached += OnCounterZeroCallBack;
countDownForm.Show();
}
// コールバック
private void OnCounterZeroCallBack(Object sender, DestReachedEventArgs e){
// UI 更新
} ソース抜粋 2 // MYCountDownForm
private System.Windows.Forms.Timer countDownTimer;
public int timeLeft;
public delegate void ZeroReachedEventHandler(Object sender, ZeroReachedEventArgs e);
public event ZeroReachedEventHandler ZeroReached;
void Timer_Tick(object sender, EventArgs e){
if (timeLeft >= 1){
timeLabel.Text = this.timeLeft.ToString();
timeLeft--;
}
else if (this.timeLeft <= 0){
timeLabel.Text = this.timeLeft.ToString();
var args = new ZeroReachedEventArgs();
args.TimeReached = DateTime.Now;
OnDestReached(args);
this.Close();
}
} // END Timer_Tick
protected virtual void OnZeroReached(ZeroReachedEventArgs e){
var handler = ZeroReached;
if (handler != null){ handler(this, e); }
}
}
public class ZeroReachedEventArgs : EventArgs {
// コンストラクタないけどいいの?
public DateTime TimeReached { get; set; }
} アホな質問ばっかですいません
光速の計算をしたいんですが、doubleでは無理ですか?
decimalは使いません
お願いします。小数点以下が信用できません。 >>411
お前さんが使おうとしている計算方法や欲しい精度とか示さんと答えられんだろうよ 質問いいですか、クラスの処理の途中経過をTextboxのコントロールに送りたいのです
public partial class Form1 : Form
{
Class1 class1 = new Class1();
}
class Class1
{
public Class1()
{
Form1.Textbox1.AppendText("Class1を実行しています");
}
}
このようにしてもForm1のインスタンスがないから実行できません
みなさんはクラスのログなどをテキストボックスに送るとき、どう書かれてますか? >>414
public partial class Form1 : Form
{
public TextBox Textbox1;
Class1 class1 = new Class1(this);
}
class Class1
{
public Class1(Form1 fm)
{
fm.Textbox1.AppendText("Class1を実行しています");
}
}
またはFom1のなかに
public void appenttext(string st)
{
Textbox1.AppendText(st);
}
としてClass1から呼び出す >>415
レスさんくすです
上の方法でうまくいきました
クラスからコントロールを操作ってあまり使わない、というか推奨されてないのかな? コントロールは何かを操作する為の機能なんだから、
普通はその操作する何かを直接操作するだろ? >>416
インスタンスをどう指定していいかわからないんじゃなかったのか
親子関係にあるウィンドウでの操作はいろんなアプリで普通にあるし
C#だけにしても「C# 別のフォームのコントロール」でググればやっているところはいっぱい出てくる >>416
非推奨というか、普通はやりたいと思わないね。
何かの参照を握るってことはそれに依存してしまうってことだから。
Class1は本来はForm1の参照を持つ設計にしたことで、
事実上そのプログラム専用の他で流用できないコードになってる
他で使う予定ないからそれで問題ないと思うかもしれないが(以下略 >>417
確かにコントロールというぐらいだし
>>418
さんくす、実際にやる方法もわからなかったし、教えてもらったのはわかりやすかった
考え方を標準っぽいやり方に寄せたいのです
>>419
さんくす、なるほどパーツとして完成してないですね
汎用性の低いコードは改善しないと、でも今回はこれでいきます
logの取り方考えないと 処理側に出力するだけの意味しかないデリゲートでも渡してやれば?
受け側はコントロールを操作とか意識しなくて済むけど
public partial class Form1 : Form {
:
Class1 class1 = new Class1((string s) => { this,Textbox1.AppendText(s); })
;
}
class Class1 {
delegate void output_delegate(string s);
output_delegate output = (string s) => { Console.WriteLine(s); }; //デフォルト出力先はコンソール
:
Class1(output_delegate _output) {
output = _output;
}
:
} よく答えられるな
なにをしようとしてるのかすらわからんわ >>421
レスさんくすです
でもしかし、半分ぐらいしか理解できませんでした、スイマセン
〜解読中〜 refやout, in引数のないdelegateなら
自分で定義せずにSystem.ActionやSystem.Funcを使う手もあるよ >>423
理解しなくていいよw
デリゲートを直で受け渡しなんかせず、素直にイベントの方を使いましょう。 使う手もあるというか余程じゃなければActionかFuncでは MethodInvoker(´・ω・`)ボクも忘れないでね >>414
こういうのってbindingでどうにかするものじゃないの? 可変長の戻り値って実現できませんか?もしくは可変長のタプル
これを
public void hoge<T>(List<T> list, Func<T, string[]> selector) { ... }
hoge(list, listItem => new string[2] { listItem.A, listItem.B });
hoge(list, listItem => new string[3] { listItem.A, listItem.B, listItem.C });
↓
public void hoge<T>(List<T> list, Func<T, params string[]> selector) { ... }
hoge(list, listItem => (listItem.A, listItem.B));
hoge(list, listItem => (listItem.A, listItem.B, listItem.C));
こんな風に書けたらいいのにって感じです >>424
さんくす、スマートに書けそうですね、他の人もさんくす、ただ考え中
>>425
今回はイベントで、ただデリゲート勉強するいいちゃんす
>>429
さんくす、ググったら実現したいことをピンポイントっぽい
>>430
さんくす、binding、さらにむずい、今までと違うアプローチっぽい >>431
何言ってるのか理解するのに5分かかったw
ラムダ式の右辺(?)の評価方法をジェネリックの型パラメータを確定する場面で指定するとか
普通に無理筋でしょう
hoge(list, listItem => new[] { listItem.A, listItem.B });
が
hoge(list, listItem => (listItem.A, listItem.B));
と書けたところでたいして嬉しいと思えんけど >>433
おお、new[]で推論してくれるの忘れてました
new[]で十分スマートですねこれで問題ないです、ありがとうございました Formのプログラムで普通に動作してたOpenFormDialogを使ってる箇所が突然フリーズしてしまいます。
一旦そうなるとWindows自体が不安定になり、他のプログラムで恐らくOpenFormDialogを使ってる所が全てフリーズしOSの再起動が必要になります。
どんな要因が考えられるでしょうか。
プログラムはかんたんなグラフィックエディタで矩形やテキストを移動したり変形する程度です OpenFormDialog? OpenFileDialogじゃなくて?
OpenFileDialogならフリーズの話はあるから検索して
騒がれたのもう結構前だからまだ残ってるともあんまり思えないけど あ、残ってるってのはフリーズするバグを残してる環境の話ね >>436
OpenFileDialogでした
cymon.sysの件は見つけましたけど家のPCにはありませんでした
地道にバグを見つけます List<Employee> のIDとList<int> の一致するEmployeeを取得したいです。
List<int>をforeach、その中でList<Employee>をFirstOrDefaultで探して
新たなList<Employee>にAddする方法はできました。
これのforeachを撲滅して簡潔に書きたいのですがいい方法はありますか? var employees = new List<Employee>();
var ids = new List<int>();
・・・・
var hitEmployees = employees.Where(employee => ids.Where(id => id == employee.id).Any()).ToList(); employees.Join(ids, _emp => _emp.ID, _id => _id, (_emp, _id) => _emp)
joinはクエリ構文の方が読みやすいな
from emp in employees join id in ids on emp.ID equals id select emp employees.FindAll(emp => ids.Contains(emp.ID)) EnumSetってEnumの値を2のベキにすればいいから存在しないの? イベントハンドラのいなづまアイコンってどういう意味なの?
気になって開発が手につきません。 execute
神がいかずちをもって手を下す
的な >>440-443
どれもなるほど!と勉強になりました
ありがとうございます
今回はシンプルな>>443さんのでいきます! おお、なるほど。LINQのクイズ集があれば面白そうだな。 443はlinqじゃないぞ
2.0の頃からあるListクラスのメソッドだけだ >>450
ラムダ式が使えるようになったのはC#3.0から >>451
そうそう。なのでデリゲート使って書く必要はあるけど 次のようなことをしたいのですが、どうすればいいでしょうか。
async、awaitを使えばいいようにも思えたのですが、クラス内のループが止まらず・・・
1.ボタン押下でとある処理をするクラスのインスタンスを生成し、クラス内で処理を無限ループ
2.ボタン押下でクラス内のループを停止 >>453
ループさせているクラス内に止めるメソッド付けてボタン押したときにそれ呼び出せばいいだけでは
イベントメソッドは別のクラスでもできるから直にボタンのイベントに追加してもいいし CancellationTokenSourceを使うのが比較的妥当なやり方かな
2でボタンを押したらcancellationTokenSource.Cancel()
無限ループ側の処理では適宜cancellationToken.ThrowIfCancellationRequested() 低レベルな実装だと終了フラグの参照を渡しておくとか >>455
単純なループ処理でキャンセル例外が必要なければ
CancellationToken.IsCancellationRequestedをチェックするのでも良いね 皆さん、ご回答ありがとうございます。
>>454
停止メソッドにより、ループ条件から外れるフラグを立てて
処理停止させるイメージでしょうか。
>>455
CancellationTokenSource初めて聞きました。
便利ですね!
>>456
すみません。フラグでの終了処理しか思いつきませんでした・・・
もう少しマシな実装になるとどうなるのでしょうか。
教えてもらえると助かります。 >>457
そういった方法もあるのですね。ありがとうございます。 すみません・・・
あるフォルダにファイルが保管されたときに
そのファイルを処理したくて監視に無限ループを使ってしまいました。
他に良い方法があれば、お教え願えないでしょうか。 >>461
System.IO.FileSystemWatcher もしくは、win32ApiのFindFirstChangeNotification()か >>462
そんな便利なものまであるんですね!びっくりしました!
全然C#のこと知らなくて恥ずかしいです・・・
教えてくださってありがとうございました。 自分はC#といえば当たり前のようにWindowsFormでやってたけど
みんなは何使ってるの? >>465
特に必要なければwinform
というか、初期のブレンドが使い物にならなかったので、WPFやUWP?は必要になるまで覚えないことにした WinformからUWP APIを呼び出すことも出来るしな WPFでやってるけど誰かにお勧めしたことはないしとてもお勧めできない >>465
Winformなプロジェクトだが、XAMLでのレイアウトが好きだから自分の担当画面はWPF使ってる >>465
WinFormsやらWPFやらXamarin >>465
アンカーやドック追加してくれたのが嬉しすぎて、他に浮気してまで新たに覚える気にならないってのもあるかな [DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
アクティブウィンドウのクライアント領域を取得するにはどうすればいいでしょうか?
上のメソッド使えば行けそうなんだけど、行き詰まってます。 >>473
それはアクティブになっているウインドウのハンドルを返すだけのもの
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getclientrect
RECTの構造体は自分で用意して上のURLではポインタが引数になっているけどC#なら
[DllImport("user32.dll")]
private static extern int GetClientRect(IntPtr hwnd, ref RECT Rect);
みたいに構造体をrefかoutで指定したらそこに戻ってくる c#楽しいね
直感ですぐGUIアプリ作れるからプログラミング覚えたいけど特に目標がないって人にはc#一択だと思う >>475
ほぼそのまんまのサンプルを見つけて問題はとりあえず解決しました。
https://ja.stackoverflow.com/questions/21328/c-processで指定した別プロセスのウインドウを-クライアント領域のみキャプチャしたい
アクティブウィンドウのクライアント領域の取得は、
c# + netframework ではできないのですか? 次はListViewの要素の長方形を得たいとかかな
結局.netからは離れていきそう TreeViewの表示を標準の
項目1
┗項目2
┣項目3
┗項目4
から、
項目1━項目2┳項目3
┗項目4
にするにはどうすればよいでしょうか? >>473
GetActiveWindow()って無かったっけ? ドラッグアンドドロップで拡張子を.txt→.jsonに変更するプログラムのコードをください batでやったほうが早そうなレベルだけど
fileをrenameするだけでしょ? renameするだけですね
どうしてもC♯でやりたいんです >>487
拡張子の書き換えは
System.IO.Path.ChangeExtension(filepath, extension)
ここはコードを代わりに書くスレじゃないのでキーワードはあるのだから後はググってください 誰が一日ググれば聞いていいって言ったんだよ
ひと月はググれ ■ このスレッドは過去ログ倉庫に格納されています