X



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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ドコグロ MM2f-DHp5)
垢版 |
2019/07/16(火) 15:36:23.74ID:i1fbuZ/pM
!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
0391デフォルトの名無しさん (ワッチョイ 0bda-dCD9)
垢版 |
2019/08/20(火) 00:22:58.41ID:sL7gwS880
>>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間で通知する方法がよくわかりません。
の意味が分からないんでもう少し詳しく
0392デフォルトの名無しさん (ワッチョイ 13ad-gVUp)
垢版 |
2019/08/20(火) 01:06:30.58ID:yjnOK/Bv0
「通知」…もし表示済みのフォームをあとからいじりたい場合、

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; } //変数を経由して外側でスローする
0393デフォルトの名無しさん (アウアウウー Sa5d-woyF)
垢版 |
2019/08/20(火) 01:15:05.72ID:zheL5RcIa
>>390
Formだろうが何だろうが、操作したい側が操作対象の参照を握れば良いだけだけど、
親子関係が成立しているとか特殊な前提がなければ、Formが別のFormの参照を
握るのはあんまり良くない。

原則論を言えばそもそもFormにUIと無関係の処理を書く時点で間違っている。
0394デフォルトの名無しさん (ワッチョイ 13ad-gVUp)
垢版 |
2019/08/20(火) 07:52:56.91ID:yjnOK/Bv0
UIと関係あるからフォームなんだろうけど…

非同期処理中にポップアップが出て、その間もメインは触れるが、終わるとメインが変更される
なんてことはよくある

書式設定的なのも別フォームから別フォームをいじるわけだし

前のいじり方を残すために、閉じても隠すだけで、同じインスタンスを再表示したい場合とか
0396デフォルトの名無しさん (ワッチョイ b32d-bnMF)
垢版 |
2019/08/20(火) 12:03:48.15ID:NghMzgaN0
対象のフレームワーク:Framework 4.0 でコンパイルした自作 DLL があります。
この DLL を 対象のフレームワーク:Framework 4.8 なプロジェクトから参照して使用したとき、
DLL の中はどっちで動くのでしょうか?

たとえば自作DLL内で、DataGridView から継承した DataGridViewEx を作ってあったとして
これを 4.8 なプロジェクトで利用したとき、DataGridViewEx 内で
4.0 の DataGridView が使われるのか、4.8 の DataGridView が使われるのか、って意味です。
0398デフォルトの名無しさん (ワッチョイ b32d-bnMF)
垢版 |
2019/08/20(火) 12:17:12.47ID:NghMzgaN0
自作DLL 側の System.Windows.Forms を見たら
特定バージョン:false
になっていたので、呼ばれる側のバージョンの System.Windows.Forms.dll が使われるってことですね。

Framework 4.8 用に新たに作らないといけないかと思ったのですが、その心配ないみたいで安心しました。
0399デフォルトの名無しさん (ワッチョイ 31ad-gVUp)
垢版 |
2019/08/21(水) 00:27:12.96ID:7whQ/iRu0
あ、間違えた
× this.Invoke( (MethodInvoker)delegate {
〇 static1.form1.Invoke( (MethodInvoker)delegate {
(thisは自フォーム内のマルチスレッド部分のソースだった)

カウントダウンにマルチスレッドが必要とは限らんが
むしろモーダルだったり
でも「オブジェクトがあれば必ず「通知」できる」という方法は確立しといた方が、オブジェクト指向っぽい
クラスオブジェクト指向の前にメッセージオブジェクト指向があったので(Win32API)
メッセージ、つまり「通知」
0400デフォルトの名無しさん (スププ Sd33-/7bP)
垢版 |
2019/08/21(水) 00:57:19.98ID:CGK7jfA0d
>>392
解答どうもありがとうございます。
event かデリゲートで解決できそうです。

// Form1
private void CountDownBtn_Click(object sender, EventArgs e) {
var countdownForm = new MYCountDownForm();

// 4 3 2 1 0と表示してから、下に行きたいが、
// これだとカウント 0 を待たずにすぐ下に行く。
countdownForm.Show();

// このクラスのいろいろな処理

}
0403デフォルトの名無しさん (ワッチョイ da47-9WLl)
垢版 |
2019/08/22(木) 16:50:43.33ID:xQsiKIbM0
出来るけど利用規約読め
API経由だとセーフで
API経由しないと逮捕とか書いてあるから
0409デフォルトの名無しさん (スププ Sd9a-kbW9)
垢版 |
2019/08/22(木) 23:55:52.03ID:W1llczT4d
>>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 更新
}
0410デフォルトの名無しさん (スププ Sd9a-kbW9)
垢版 |
2019/08/23(金) 00:00:27.51ID:RwBPjFxxd
ソース抜粋 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; }
}
0411デフォルトの名無しさん (ワッチョイ 6568-CMhc)
垢版 |
2019/08/24(土) 00:16:35.07ID:EZ15JXYo0
アホな質問ばっかですいません
光速の計算をしたいんですが、doubleでは無理ですか?
decimalは使いません
お願いします。小数点以下が信用できません。
0414デフォルトの名無しさん (ワッチョイ 4501-AdB2)
垢版 |
2019/08/24(土) 08:41:25.65ID:VP6gB9DD0
質問いいですか、クラスの処理の途中経過をTextboxのコントロールに送りたいのです
public partial class Form1 : Form
{
Class1 class1 = new Class1();
}

class Class1
{
public Class1()
{
Form1.Textbox1.AppendText("Class1を実行しています");
}
}

このようにしてもForm1のインスタンスがないから実行できません
みなさんはクラスのログなどをテキストボックスに送るとき、どう書かれてますか?
0415デフォルトの名無しさん (ワッチョイ d67b-F52R)
垢版 |
2019/08/24(土) 09:03:40.17ID:BNVmeU2m0
>>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から呼び出す
0418デフォルトの名無しさん (ワッチョイ d67b-F52R)
垢版 |
2019/08/24(土) 15:45:48.43ID:BNVmeU2m0
>>416
インスタンスをどう指定していいかわからないんじゃなかったのか
親子関係にあるウィンドウでの操作はいろんなアプリで普通にあるし
C#だけにしても「C# 別のフォームのコントロール」でググればやっているところはいっぱい出てくる
0419デフォルトの名無しさん (アウアウウー Sa09-Aknt)
垢版 |
2019/08/24(土) 15:56:01.09ID:dsz+mirUa
>>416
非推奨というか、普通はやりたいと思わないね。
何かの参照を握るってことはそれに依存してしまうってことだから。

Class1は本来はForm1の参照を持つ設計にしたことで、
事実上そのプログラム専用の他で流用できないコードになってる

他で使う予定ないからそれで問題ないと思うかもしれないが(以下略
0420デフォルトの名無しさん (ワッチョイ 4501-AdB2)
垢版 |
2019/08/24(土) 19:37:50.96ID:VP6gB9DD0
>>417
確かにコントロールというぐらいだし

>>418
さんくす、実際にやる方法もわからなかったし、教えてもらったのはわかりやすかった
考え方を標準っぽいやり方に寄せたいのです

>>419
さんくす、なるほどパーツとして完成してないですね
汎用性の低いコードは改善しないと、でも今回はこれでいきます
logの取り方考えないと
0421デフォルトの名無しさん (ワッチョイ 7a79-BXNL)
垢版 |
2019/08/24(土) 21:52:23.83ID:PMKXSgkW0
処理側に出力するだけの意味しかないデリゲートでも渡してやれば?
受け側はコントロールを操作とか意識しなくて済むけど
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;
 }
 :
}
0425デフォルトの名無しさん (アウアウウー Sa09-Aknt)
垢版 |
2019/08/24(土) 23:15:15.44ID:dsz+mirUa
>>423
理解しなくていいよw
デリゲートを直で受け渡しなんかせず、素直にイベントの方を使いましょう。
0431デフォルトの名無しさん (ワッチョイ cdb0-lNpu)
垢版 |
2019/08/25(日) 07:21:22.29ID:UfI3Un4o0
可変長の戻り値って実現できませんか?もしくは可変長のタプル
これを
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));
こんな風に書けたらいいのにって感じです
0432デフォルトの名無しさん (ワッチョイ 4501-AdB2)
垢版 |
2019/08/25(日) 09:33:25.01ID:NieUwdLz0
>>424
さんくす、スマートに書けそうですね、他の人もさんくす、ただ考え中
>>425
今回はイベントで、ただデリゲート勉強するいいちゃんす
>>429
さんくす、ググったら実現したいことをピンポイントっぽい
>>430
さんくす、binding、さらにむずい、今までと違うアプローチっぽい
0433デフォルトの名無しさん (アウアウウー Sa09-Aknt)
垢版 |
2019/08/25(日) 13:39:47.35ID:aNsJH+ura
>>431
何言ってるのか理解するのに5分かかったw
ラムダ式の右辺(?)の評価方法をジェネリックの型パラメータを確定する場面で指定するとか
普通に無理筋でしょう

hoge(list, listItem => new[] { listItem.A, listItem.B });

hoge(list, listItem => (listItem.A, listItem.B));
と書けたところでたいして嬉しいと思えんけど
0435デフォルトの名無しさん (ワッチョイ baf9-RyRR)
垢版 |
2019/08/25(日) 22:03:25.03ID:4LqybIGY0
Formのプログラムで普通に動作してたOpenFormDialogを使ってる箇所が突然フリーズしてしまいます。
一旦そうなるとWindows自体が不安定になり、他のプログラムで恐らくOpenFormDialogを使ってる所が全てフリーズしOSの再起動が必要になります。
どんな要因が考えられるでしょうか。

プログラムはかんたんなグラフィックエディタで矩形やテキストを移動したり変形する程度です
0439デフォルトの名無しさん (ワッチョイ 3a89-lNpu)
垢版 |
2019/08/26(月) 01:40:22.77ID:YZSrPKBs0
List<Employee> のIDとList<int> の一致するEmployeeを取得したいです。

List<int>をforeach、その中でList<Employee>をFirstOrDefaultで探して
新たなList<Employee>にAddする方法はできました。

これのforeachを撲滅して簡潔に書きたいのですがいい方法はありますか?
0446デフォルトの名無しさん (アウアウウー Sa09-Aknt)
垢版 |
2019/08/26(月) 12:01:50.23ID:EHOEsFfWa
地下鉄漫才かよw
0453デフォルトの名無しさん (ワッチョイ 99b0-P0k6)
垢版 |
2019/08/27(火) 19:15:36.40ID:4aKZbpn00
次のようなことをしたいのですが、どうすればいいでしょうか。
async、awaitを使えばいいようにも思えたのですが、クラス内のループが止まらず・・・

1.ボタン押下でとある処理をするクラスのインスタンスを生成し、クラス内で処理を無限ループ
2.ボタン押下でクラス内のループを停止
0454デフォルトの名無しさん (ワッチョイ d67b-F52R)
垢版 |
2019/08/27(火) 19:21:08.99ID:a3Zgv65M0
>>453
ループさせているクラス内に止めるメソッド付けてボタン押したときにそれ呼び出せばいいだけでは
イベントメソッドは別のクラスでもできるから直にボタンのイベントに追加してもいいし
0458デフォルトの名無しさん (ワッチョイ 99b0-P0k6)
垢版 |
2019/08/27(火) 21:12:50.98ID:4aKZbpn00
皆さん、ご回答ありがとうございます。

>>454
停止メソッドにより、ループ条件から外れるフラグを立てて
処理停止させるイメージでしょうか。

>>455
CancellationTokenSource初めて聞きました。
便利ですね!

>>456
すみません。フラグでの終了処理しか思いつきませんでした・・・
もう少しマシな実装になるとどうなるのでしょうか。
教えてもらえると助かります。
0461デフォルトの名無しさん (ワッチョイ 99b0-P0k6)
垢版 |
2019/08/27(火) 22:40:07.64ID:4aKZbpn00
すみません・・・
あるフォルダにファイルが保管されたときに
そのファイルを処理したくて監視に無限ループを使ってしまいました。
他に良い方法があれば、お教え願えないでしょうか。
0473デフォルトの名無しさん (スププ Sd9a-kbW9)
垢版 |
2019/08/28(水) 20:18:04.95ID:h4zgSqGZd
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();

アクティブウィンドウのクライアント領域を取得するにはどうすればいいでしょうか?

上のメソッド使えば行けそうなんだけど、行き詰まってます。
0475デフォルトの名無しさん (ワッチョイ d67b-F52R)
垢版 |
2019/08/28(水) 20:39:43.87ID:j6ZvHlbE0
>>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で指定したらそこに戻ってくる
0477デフォルトの名無しさん (ワッチョイ 9a07-kbW9)
垢版 |
2019/08/28(水) 23:50:51.61ID:RWMmexzc0
>>475
ほぼそのまんまのサンプルを見つけて問題はとりあえず解決しました。

https://ja.stackoverflow.com/questions/21328/c-processで指定した別プロセスのウインドウを-クライアント領域のみキャプチャしたい

アクティブウィンドウのクライアント領域の取得は、
c# + netframework ではできないのですか?
0480デフォルトの名無しさん (ワッチョイ d1da-ca7b)
垢版 |
2019/08/29(木) 01:53:51.70ID:KY//KYCr0
TreeViewの表示を標準の
項目1
┗項目2
  ┣項目3
  ┗項目4

から、
項目1━項目2┳項目3
           ┗項目4

にするにはどうすればよいでしょうか?
0485デフォルトの名無しさん (ワッチョイ d101-drPI)
垢版 |
2019/08/30(金) 21:10:43.61ID:euEksp6k0
ドラッグアンドドロップで拡張子を.txt→.jsonに変更するプログラムのコードをください
0487デフォルトの名無しさん (ワッチョイ d101-drPI)
垢版 |
2019/08/30(金) 21:18:37.15ID:euEksp6k0
renameするだけですね
どうしてもC♯でやりたいんです
0489デフォルトの名無しさん (ワッチョイ d101-drPI)
垢版 |
2019/08/30(金) 21:39:06.95ID:euEksp6k0
一日ググってもわからなかったので聞きに来ました
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況