C#で何か作る日記

C#初学者が何かを作るその過程を備忘録として書いていく日記。同じようなことで悩んでいる1人、2人の役に立てたら嬉しいな。プログラムの他にたまに3Dモデルも作ったり作らなかったり。

delegateを使ってRedoUndoを実装

しばらく悩まされていたdelegateが一応の解決をした、、、のかな。

前回の最後に

public delegate bool Redo();
public Redo redo;

って書いてたけどこれが正解っぽい。

public Action Redo;

って書くとデリゲートの定義?がいらなくなるのね。
だからそのまま使うことができた、と。

戻り値がある場合は

public Func<T, TReturn> Invoke;

とすれば定義を省略できる。らしいけど、『Func』って名前の付け方がなんかイヤだな

というわけで最初の方法で実装することに。

続きを読む

続・デリゲート

前回に引き続きデリゲートを。

色々試してみてちょっと兆しが見えてきた。

f:id:MrSoumen:20171001185439p:plain

左側のようにCommandクラスを作成して、右側でそのCommandクラスを呼び出そうとしているところ。

public Action Invoke;

には、引数、返り値なしのDammy2関数を代入することができる。

一方、

public Delegate Undo;

には、引数なし、返り値boolのDammy1もDammy2も代入することができない。
エラーの内容は

CS0428 メソッド グループ 'Dammy1' を非デリゲート型 'Delegate' に変換することはできません。このメソッドを呼び出しますか?

Actionもデリゲートの一種じゃないの?といまいち納得がいかない。

public delegate bool Redo();

はデリゲートを宣言するだけで、そこにDammy1を代入できないことはなんとなく分かる。
そこで

public delegate bool Redo();
public Redo redo;

こんな風にredo変数を作ればそこに代入できるっぽいことは分かった。

全体的に納得がいっていないけど最後の方法で進めていこうかな。

delegateが分からない!

delegateを使ってコマンドパターンを実装しようとしたのだけど…

>|cs|
public class Command
{
public Delegate Invoke1;
public delegate bool Invoke2();
}
|

続きを読む

マウスのイベントを確認

今回はPictureBoxの……というよりマウスのイベントがどのタイミングで発生するかを確認。

こんな感じの画面を作って検証。
f:id:MrSoumen:20170918101742p:plain
番号は
 ①PictureBox。今回はここを中心に色々動作。
 ②同じアプリケーション上だけどコントロール外。
 ③アプリケーション外。

続きを読む

RedoUndoを初めて実装

何かアプリを作るとき、大体実装されてるよなーと思う機能の一つにUndo,Redoがあるけど今まで実装したことがないのでC#の勉強を兼ねて実装。

このサイトをパク…参考にした。
http://zecl.hatenablog.com/entry/20091002/p1zecl.hatenablog.com

ふむふむCommandパターンとMementoパターンを使うのね。なるほどなるほど(初めて見た)。

この例だとmementoに前や後の状態を全て保持していないといけないっぽい。
テキストくらいならそれでも大丈夫っぽいけどペイントソフトとかだとメモリを食い過ぎる気がする。

その場合は状態を持つんじゃなくて、何をしたら前、後の状態に遷移するかを持たせればいいのかな?
例えば、何らかのオブジェクトを移動させるとして・・・

CommandManagerは
move(x, y){
   ...
}

みたいな動作(関数)を受け取ってPictureBoxとかに命令を送る。
同時にUndoのスタックに

move(-x, -y){
   ...
}

みたいに逆の動作を保存しておく。
こうすればメモリを少し節約できるかも。

よし、近いうちに試してみよう。
次はPictureBoxを使ってみるよ。

F○2から移行してきて…

C#を勉強がてら何かを作ってみようと思い、どうせなら備忘録として残しておく。
……記憶力ないからね

で、最初はFC2ブログで運営していこうかと思っていたのだけど、ソースコードをうまく表示ができなくて、はてなにお引っ越し。
ちゃんと表示できるよね……
えっと、『pre記法』を使って…『cs』と入れて…

namespace FloatingWindowTest
{
    public partial class SubForm : WeifenLuo.WinFormsUI.Docking.DockContent
    {

        public SubForm(MainForm main_form)
        {
            
        }
    }
}

おお、出来てる出来てる。
行番号も表示させたいところだけど、それはまたそのうちかな。
とりあえずこんなところで。