2010/01/30

XPの共有プリンタをVISTA/7で使用する

このエントリーをはてなブックマークに追加
VISTA/7マシンから、XPマシンにアクセスして共有プリンタを接続しようとすると、「プリンタへ接続できませんでした。操作を完了できませんでした(エラー0x0000000006)。」というメッセージが出てしまう。


これは接続時に出てくる「プリンタドライバをインストールします」という処理が、XPのドライバをインストールしようとするせいらしいです。
なので、個別に接続の設定をしてあげます。

※画面はVistaです。

●Vista/7のプリンタドライバを入手する


プリンタのメーカサイトから対応ドライバを入手してください。使用しているプリンタの型番を調べておきましょう。
大体は、サポートという名前の付いたページから探せるようになっています。

●ローカルプリンタを作成する


  1. プリンタを追加

    プリンタを追加します。
    ネットワークプリンタではなく、ローカルプリンタを選択。


  2. ポートの選択

    新しいポートの作成を指定して、Local Portを選択します。


  3. プリンタのポート名を設定する

    ここで、プリンタの接続アドレスを指定します。



  4. ドライバを指定する

    すでにドライバがインストール済みであれば、リストの中から選択してください。
    リストにない場合は、「ディスク使用」から入手したプリンタドライバ(*.inf)を直接指定してあげます。


●テストページのプリント


出力できれば、出来上がり。


共有プリンタへの接続の失敗には、ネットワーク絡みの別の問題が関係している場合もありますので、ご注意を。

2010/01/16

[C#]角丸の矩形を描画する

このエントリーをはてなブックマークに追加

角丸の矩形を描く

角丸の矩形を描画する関数です。
GraphicsPathで角丸を作ってDrawPathで描画しています。
Form1_Clickは呼び出し側のコードです。
ソースコード
/* using System.Drawing.Drawing2D; */
private void Form1_Click(object sender, EventArgs e) {
  Graphics g = this.CreateGraphics();
  g.SmoothingMode = SmoothingMode.AntiAlias;
    
  DrawRoundRectangle(g, 40.0f, 40.0f, 200.0f, 120.0f, 16.0f, new Pen(Color.Black, 4.0f));
  g.Dispose();
}

private void DrawRoundRectangle(Graphics g, float x,float y,float w,float h, float r, Pen pen) {
  float a = (float)(4 * (1.41421356 - 1) / 3 * r);
    
  GraphicsPath path = new GraphicsPath();
  path.StartFigure();
  path.AddBezier(x, y + r, x, y + r - a, x + r - a, y, x + r, y); /* 左上 */
  path.AddBezier(x + w - r, y, x + w - r + a, y, x + w, y + r - a, x + w, y + r); /* 右上 */
  path.AddBezier(x + w, y + h - r, x + w, y + h - r + a, x + w -r + a, y + h, x + w -r, y + h); /* 右下 */
  path.AddBezier(x + r, y + h, x + r - a, y + h, x, y + h - r + a, x, y + h - r); /* 左下 */
  path.CloseFigure();
    
  g.DrawPath(pen, path);
}

実行結果

まったく同じ要領で、描画にFillPathメソッドを使うことで塗りつぶした図形を描くことができます。
AddBezierメソッドを使用した擬似円弧で描画していますが、AddArcメソッドを使うほうが簡単かもしれません。

補足:GraphicsPathの仕様について気付いたこと

最初は下記のように、角を描いて、線を描いて、角を描いて、線を描いて、とやってました。
GraphicsPath path = new GraphicsPath();
path.StartFigure();
path.AddBezier(x, y + r, x, y + r - a, x + r - a, y, x + r, y);
path.AddLine(x + r, y, x + w - r, y);
path.AddBezier(x + w - r, y, x + w - r + a, y, x + w, y + r - a, x + w, y + r);
path.AddLine(x + w, y + r, x + w, y + h - r);
path.AddBezier(x + w, y + h - r, x + w, y + h - r + a, x + w -r + a, y + h, x + w -r, y + h);
path.AddLine(x + w - r, y + h, x + r, y + h);
path.AddBezier(x + r, y + h, x + r - a, y + h, x, y + h - r + a, x, y + h - r);
path.AddLine(x, y + h - r, x, y + r);
path.CloseFigure();

これって、パーツの終点と次のパーツの始点が同じ座標点になっているので、重なり合った点が無駄にぼろぼろと出そうだなと思ったんです。
ところがデバッグしてGraphicsPathのpointsプロパティをじっくり見てみると、同じ座標点は勝手に省かれていました。このコードは上記のコードと同じ結果になります。
GraphicsPath優秀です。でも逆に考えると、Add~の指定だったら、同じ場所に点が打てないというジレンマもあるのですね…。

2010/01/14

[C#]テーブルの一覧を取得する

このエントリーをはてなブックマークに追加

データベースのテーブルの一覧を取得する

OleDbConnectionのGetSchemaを使用してテーブルの一覧を取得する方法です。
下のソースコードはMDBを使った例です。
ソースコード
string mdbFile = @"db1.mdb";
string connectionString =
    "Provider='Microsoft.Jet.OLEDB.4.0';" +
    "Data Source='" + mdbFile + "';";

OleDbConnection connection = new OleDbConnection(connectionString);

try {
    connection.Open();
    DataTable table = connection.GetSchema("Tables",new string[4]{null,null,null,"TABLE"});

    foreach (DataRow row in table.Rows) {
        Console.WriteLine(row["TABLE_NAME"].ToString());
    }
}catch(Exception ex){
    Console.WriteLine(ex.Message);
}finally{
    if (connection.State == ConnectionState.Open) {
        connection.Close();
    }
}

テーブルの列名を取得する

列名を取得するには、下記のように指定します。
ソースコード
string tableName = "ExampleTable"; 
DataTable table = connection.GetSchema("Columns", new string[4] { null, null, tableName, null });

foreach (DataRow row in table.Rows) {
    Console.WriteLine(row["COLUMN_NAME"].ToString());
}