読者です 読者をやめる 読者になる 読者になる

Windowsでのバックアップ

Windowsでファイルをバックアップするには xcopy が便利。

こんなバッチファイルを作成しておいて、実行すればよい。

set SOURCE=C:\Source
set DESTINATION=D:\Backup
REM /C: コピー時のエラーを無視する
REM /D: コピー先に同名のファイルが存在する場合に更新日が新しいファイルのみコピーする
REM /E: ファイルが存在しなくてもディレクトリごとコピーする
REM /I: コピー先のディレクトリが存在しない場合は新規にディレクトリを作成する
REM /H: 隠しファイルやシステムファイルも全てコピーする
REM /R: 読み取り専用属性のファイルも上書きコピーできるようにする
REM /Y: 同名のファイルが存在する場合、上書きの確認を行わない
xcopy %SOURCE% %DESTINATION% /C /D /E /I /H /R /Y
pause

Emacs で文字コードを調べる

ある文字が 'O' (アルファベットのオー) なのか '0' (数字のゼロ) なのかで悩んだら、

してみましょう。カーソル位置の文字の文字コードなどが表示されます。

f:id:tt195361:20150723170122p:plain)

参照型と値型のEquals

参照型と値型での Object.Equals メソッド の動作の違い。

  • 参照型: 同一オブジェクトならば true
  • 値型: 保持している値が同じならば true
using System;

namespace EqualForValueTypeAndReferenceType
{
    class Program
    {
        static void Main(string[] args)
        {
            ReferenceType ref1 = new ReferenceType(123);
            ReferenceType ref2 = new ReferenceType(123);
            Console.WriteLine("ref1.Equals(ref2) = {0}", ref1.Equals(ref2));

            ValueType val1 = new ValueType(123);
            ValueType val2 = new ValueType(123);
            Console.WriteLine("val1.Equals(val2) = {0}", val1.Equals(val2));
        }
    }

    class ReferenceType
    {
        private int _intValue;

        internal ReferenceType(int intValue)
        {
            _intValue = intValue;
        }
    }

    struct ValueType
    {
        private int _intValue;

        internal ValueType(int intValue)
        {
            _intValue = intValue;
        }
    }
}

f:id:tt195361:20150714135445p:plain

DataGridView の CheckBox に Text も表示する。

DataGridView ではチェックボックスだけが表示されテキストを表示できない。そこでチェックボックスに加えて、テキストも表示できるようにしてみた。

f:id:tt195361:20150707173705p:plain

DataGridViewCheckBoxCell クラスを継承し、テキストも表示できる CheckBoxAndTextCell クラスを作成する。

  • Text プロパティを追加。
  • Paint() で、base.Paint() を呼びチェックボックスを描画したあと、テキストを描画する。
  • GetPreferredSize() で、テキストを含めたサイズを返す。この値は自動サイズ設定で使われる。
  • Clone() で、追加した Text プロパティの値もコピーする。
using System;
using System.Drawing;
using System.Windows.Forms;

namespace DataGridViewCheckBoxAndTextCell
{
    public class CheckBoxAndTextCell : DataGridViewCheckBoxCell
    {
        private const Int32 PadLeft = 2;
        private const Int32 PadRight = 3;
        private const Int32 PadTop = 4;
        private const Int32 PadBottom = 3;

        private readonly TextFormatFlags FormatFlags = TextFormatFlags.Left | TextFormatFlags.EndEllipsis;

        private String _text = String.Empty;

        // チェックボックスの横に表示するテキストを取得、設定する。
        public String Text
        {
            get { return _text; }
            set { _text = value; }
        }

        public override object DefaultNewRowValue
        {
            get { return false; }
        }

        protected override void Paint(Graphics graphics,
                                      Rectangle clipBounds, Rectangle cellBounds,
                                      Int32 rowIndex, DataGridViewElementStates cellState,
                                      Object value, Object formattedValue, String errorText,
                                      DataGridViewCellStyle cellStyle,
                                      DataGridViewAdvancedBorderStyle advancedBorderStyle,
                                      DataGridViewPaintParts paintParts)
        {
            // DataGridViewCheckBoxCell.Paint で、チェックボックスを描画する。
            base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState,
                       value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);

            // チェックボックスの横のセル内の残りスペースに、テキストを描画する。
            Rectangle checkBoxBounds = base.GetContentBounds(graphics, cellStyle, rowIndex);
            Point textLocation = GetTextLocation(cellBounds, checkBoxBounds);
            var availableTextSize = GetAvailableTextSize(cellBounds, checkBoxBounds);
            var availableTextRect = new Rectangle(textLocation, availableTextSize);
            TextRenderer.DrawText(graphics, Text,
                                  cellStyle.Font, availableTextRect, cellStyle.ForeColor, FormatFlags);
        }

        private Point GetTextLocation(Rectangle cellBounds, Rectangle contentBounds)
        {
            Int32 textX = cellBounds.X + contentBounds.Right + PadLeft;
            Int32 textY = cellBounds.Y + PadTop;
            var textLocation = new Point(textX, textY);
            return textLocation;
        }

        private Size GetAvailableTextSize(Rectangle cellBounds, Rectangle contentBounds)
        {
            Int32 textWidth = Math.Max(0, cellBounds.Width - contentBounds.Width - PadLeft - PadRight);
            Int32 textHeight = Math.Max(0, cellBounds.Height - PadBottom);
            var textSize = new Size(textWidth, textHeight);
            return textSize;
        }

        // カラムの自動サイズ設定に使用する。
        protected override Size GetPreferredSize(Graphics graphics,
                                                 DataGridViewCellStyle cellStyle, Int32 rowIndex,
                                                 Size constraintSize)
        {
            Rectangle checkBoxBounds = base.GetContentBounds(graphics, cellStyle, rowIndex);
            Size preferredTextSize = TextRenderer.MeasureText(graphics, Text, cellStyle.Font);
            Int32 contentWidth = checkBoxBounds.Width + preferredTextSize.Width + PadLeft + PadRight;
            Int32 contentHeight = Math.Max(checkBoxBounds.Height, preferredTextSize.Height + PadTop + PadBottom);
            var contentSize = new Size(contentWidth, contentHeight);
            return contentSize;
        }

        // 追加した Text プロパティもクローンに含める。
        public override object Clone()
        {
            var cloneCell = (CheckBoxAndTextCell)base.Clone();
            cloneCell.Text = this.Text;
            return cloneCell;
        }
    }
}

作成した CheckBoxAndTextCell クラスを DataGridView で使うには、

  • 追加するカラムの CellTemplate プロパティに CheckBoxAndTextCell のオブジェクトを設定する。
using System;
using System.Windows.Forms;

namespace DataGridViewCheckBoxAndTextCell
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            AddColumn("カラム 1");

            AddRow("データ行 1");
            AddRow("データ行 2");
            AddRow("データ行 3");
        }

        private void AddColumn(String headerText)
        {
            var viewColumn = new DataGridViewColumn();
            viewColumn.HeaderText = headerText;
            // このカラムのセルは CheckBoxAndTextCell を使う。
            viewColumn.CellTemplate = new CheckBoxAndTextCell();
            dataGridView1.Columns.Add(viewColumn);
        }

        private void AddRow(String text)
        {
            Int32 rowIndex = dataGridView1.Rows.Add();
            DataGridViewRow viewRow = dataGridView1.Rows[rowIndex];
            CheckBoxAndTextCell chkAndTxtCell = (CheckBoxAndTextCell)viewRow.Cells[0];
            chkAndTxtCell.Value = false;
            chkAndTxtCell.Text = text;
        }
    }
}

参考: DataGridViewCheckBoxColumn with Text Information

Emacs で yank したものが違っていた

Emacs で C-y を押して kill した内容を yank したとき、

  • あれ、これと違う!

ということがある。こんなときは、すぐに M-y (yank-pop) してみると、yank したいものに巡り合えるかもしれない。

kill した内容は順に kill-ring に保存されており、

  • yank は最新の kill の内容を、
  • 直後に yank-pop すると、その次に新しい kill の内容を、
  • また、直後に yank-pop すると、そのまた次に、、、

と、順に以前のものを戻してくれる。

コントロールの背景を透過色にする

コントロールの背景を透過色にするには、

  • コントロールの BackColor プロパティに Color.Transparent を設定する。

f:id:tt195361:20150619115302p:plain

using System;
using System.Drawing;
using System.Windows.Forms;

namespace TransparentLabel
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            checkBox1.BackColor = Color.Transparent;
            radioButton1.BackColor = Color.Transparent;
            label1.BackColor = Color.Transparent;
            button1.BackColor = Color.Transparent;
        }
    }
}

Button は、FlatStyle プロパティが Flat と Popup のとき、透過色になった。

DataGridView の行や列に区切りを入れる

DataGridView の行や列に区切りを入れるときは、

を設定する。

using System;
using System.Windows.Forms;

namespace DataGridViewDividerWidthSample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            for (Int32 columnIndex = 0; columnIndex < 3; ++columnIndex)
            {
                String name = String.Format("カラム {0}", columnIndex + 1);
                dataGridView1.Columns.Add(name, name);
            }

            for (Int32 rowIndex = 0; rowIndex < 3; ++rowIndex)
            {
                dataGridView1.Rows.Add();
            }

            dataGridView1.Columns[1].DividerWidth = 2;
            dataGridView1.Rows[1].DividerHeight = 2;
        }
    }
}

f:id:tt195361:20150618105236p:plain