スポンサーサイト

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    【C#】Excelを扱う時のテンプレート

    C#でExcelを扱う時のテンプレート
    
    
                Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
                if (xlApp == null) { throw new Exception("Excelアプリケーションオブジェクトが作成できません"); }
                Workbooks workbooks = xlApp.Workbooks;
                Workbook wb = null;
                try
                {
                    xlApp.Visible = false;
                    xlApp.Calculation = XlCalculation.xlCalculationManual;
                    xlApp.ScreenUpdating = false;
                    wb = workbooks.Open(path,
                            Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                            Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                            Type.Missing, Type.Missing, Type.Missing, Type.Missing);
    
                    foreach (Worksheet item in wb.Sheets)
                    {
                        Marshal.ReleaseComObject(item);
                    }
                    xlApp.ScreenUpdating = true;
                    xlApp.Calculation = XlCalculation.xlCalculationAutomatic;
                    wb.Close(false, Type.Missing, Type.Missing);
                }
                finally
                {
                    Marshal.ReleaseComObject(wb);
                    Marshal.ReleaseComObject(workbooks);
                    xlApp.Quit();
                    Marshal.ReleaseComObject(xlApp);
                    GC.Collect();
                }
    
    
    
    スポンサーサイト

    テーマ : プログラミング
    ジャンル : コンピュータ

    【C#】コントロールを移動可能にするクラス

    コントロールをマウスで動かせるようにする機能
    よくつかうので、クラスにまとめてみました。
    
        public class ControlDragable
        {
            private bool isDragging = false;
            private Point point = new Point();
            public ControlDragable(Control ctr)
            {
                ctr.MouseDown += (s, mouseDownArg) =>
                {
                    isDragging = true;
                    point.X = mouseDownArg.X;
                    point.Y = mouseDownArg.Y;
                };
                ctr.MouseMove += (s, mouseMoveArg) =>
                {
                    if (!isDragging) { return; }
                    ctr.Left += mouseMoveArg.X - point.X;
                    ctr.Top += mouseMoveArg.Y - point.Y;
                };
                ctr.MouseUp += (s, mouseUpArg) =>
                {
                    isDragging = false;
                };
            }
        }
    
    

    使い方は、以下の通り
        new ControlDragable(control);
    
    ここでcontrolは任意のコントロールです。
    コンストラクタですべてやっているので、コンストラクタの呼び出ししかしてません・・。

    テーマ : プログラミング
    ジャンル : コンピュータ

    【C#】ウェイティング表示WindowsForms版

    別スレッドで時間のかかる処理をしているときに表示する
    "しばらくお待ちください"的表示について
    自前で描画したいときのためにメモ

    実行すると↓こんな感じ
    ウェイティング 
    for (int i = 0; i < 8; i++)
    {
        double rr = Math.PI / 4 * ((i + WaitCounter) % 8);
        double cr = r - 2;
    
        PointF cp = new PointF(x + (float)(Math.Cos(rr) * cr), y + (float)(Math.Sin(rr) * cr));
        g.FillEllipse(new SolidBrush(Color.FromArgb(32 * i + 31, markcolor)), new RectangleF(cp.X - 2, cp.Y - 2, 5, 5));
    }
    

    テーマ : プログラミング
    ジャンル : コンピュータ

    【C#】.net Framework でWin32APIを使うときの注意

     久々の更新です。

    今回は、C#でWin32APIをいじっていてはまったのでメモ。
    (って別にC#に限らず、.net framework言語なら共通だけど・・。)

    ■どこではまったか。
     GetWindowRect で他のアプリのウィンドウサイズを取得しようとしたら
     「System.AccessViolationException はハンドルされませんでした。
    保護されているメモリに読み取りまたは書き込み操作を行おうとしました。
    他のメモリが壊れていることが考えられます。」
    ってなっちゃう・・。

    ■な~んでか。
     その原因は宣言にあった。
    [DllImport("user32")]
        static extern int GetWindowRect(IntPtr hWnd, RECT lpRect);

    と書いていたが、 これだと暗黙的にRECTが値渡しになってしまう。
    確かに、C#ではrefをつけなければ値渡しだ。
    しかし、APIで使う構造体は、構造体へのアドレスを使うので 参照渡し。だからrefが必要。
    これがないと、引数のlpRectには、RECT構造体のアドレスが来るのに、これを構造体そのものとして読んでしまい、
    アドレス分しか長さがないのにRECT構造体のサイズ分メモリを読むので、はみ出たところは不正アクセスになり、AccessViolationExceptionが起きる。 うん。納得。
    [DllImport("user32")]
      static extern int GetWindowRect(IntPtr hWnd, ref RECT lpRect);
    ↑こう書くのが正解。
    なるほどね~。

    テーマ : プログラミング
    ジャンル : コンピュータ

    【C#】TextBoxフォーカス取得時、TextBox内を全選択(反転表示)させたい

    久しぶりの更新になりますな。

    今回はTextBoxです。
    フォーカスを当てた時、(Tabキーもしくはマウスでクリックした時)
    内容を全選択するようにすると、コピペや下記顔氏が楽でいいですよね。
    (長い文章を書くようなTextBoxだと逆にうっかり消したりして嫌だったりしますが・・・)

    で、普通に考えたらこう書きますよね。
    protected override void OnEnter(EventArgs e)
    {
        base.OnEnter(e);
       this.SelectAll();
    }
    
    
    でも、これだと、マウスに反応してくれないのです。
    で、調べたところ、この辺のサイトに記述があり
    下記の用に書くとうまくいくようです
    protected override void OnEnter(EventArgs e)
    {
        base.OnEnter(e);
        //BeginInvokeするとマウスでクリックしたときも全選択になる
       this.BeginInvoke(new MethodInvoker(() => this.SelectAll()));
    }
    
    
    
    なんでなんでしょうね・・。

    テーマ : プログラミング
    ジャンル : コンピュータ

    プロフィール

    ざっち

    Author:ざっち
    ざっちのーと
    ♪自由なSEのメモ帳です♪

    ざっちのスキル一覧
    ----------------
    上級(手足も同然!)
    ・.net FrameWork
    ・C#
    ・SqlServer
    ・VisualBasic6.0
    ----------------
    中級(だいたいOK!)
    ・WPF(XAML)
    ・Android
    ・WindowsMobile6.5
    ・HTML
    ----------------
    下級(や、やればできるさ!)
    ・PHP
    ・JavaScript
    ・SilverLight
    ・SQLite
    ・Python(だってjetCreaterが・・・)
    ・C++(OpenCVいじってみたくて・・・)
    ----------------
    最近のお気に入り
    ・WPF(XAML)
    ・Android
    ・GoogleAPI
    ----------------

    最近の記事
    月別アーカイブ
    カテゴリー
    夢見る羊さん
    地球の名言Ⅱ

    presented by 地球の名言

    Twitter...A

    Twitter < > Reload

    ブロとも申請フォーム

    この人とブロともになる

    ブログ内検索
    RSSフィード
    リンク
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。