石鹸製造支援プログラムを Visual C# で書き直しました

以前に Excel VBA で作成したものを、Visual C# で書き換えてみました。

Excel ではシートのセルに入れていた情報はテーブルに入れました。

また、鹸化剤については苛性ソーダだけを対象にするように仕様を変更しました。

オルト珪酸ソーダは熟成しても珪酸塩が含まれるので洗顔などの用途に向かないからです。

Visual C# でフォーム間のデータ受け渡しはちょっと大変でした。classや構造体で受け渡したかったのですが、うまく出来なくて "," で区切った一連の文字列として渡し、受け取った側で解体するといった面倒なやり方になりました。

それ以外はコードを VBA から C# に変換していくだけなので問題ありませんでした。

多少仕様変更したところもありますが、基本機能は同じです。

0 コメント

Visual C# で Excel をコピーする

Visual C# から Excel VBA を呼び出してコピーさせます。

"CopyMacro.xlsm" は、 適当なフォルダに入れます。今回はこの C# プログラムのカレントフォルダに入れました。

書式・数式など含めてコピーしますので、循環参照やリンク切れに注意して利用して下さい。

 

Windows10, VisualStudio2015, Excel2013 で動作確認済み

C# で Excel の Range を 書式なども含めてコピーする


C# で Excel の Range を 書式なども含めてコピーするには次のようにします。


        // Visual C# プログラムに書く内容         

        // fB = コピー元ファイルフルパス指定
    // fW = コピー元ファイル名(パスなし)
        // fS = コピー元シート名
    // fR = コピー元レンジ("A1:H13"のような形)

        // tB = コピー先ファイルフルパス指定
    // tW = コピー先ファイル名(パスなし)
        // tS = コピー先シート名
    // tR = コピー先レンジ("T5"のような形)

        public void CallMacro(string fB, string fW, string fS, string fR,
                              string tB, string tW, string tS, string tR)
        {
            // カレントディレクトリを取得する
            string stCurrentDir = System.IO.Directory.GetCurrentDirectory();
            // Excel.Application の新しいインスタンスを生成する
            var xlApp = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel.Workbooks xlBooks;

            // xlApplication から WorkBooks を取得する
            // 既存の Excel ブックを開く
            xlBooks = xlApp.Workbooks;
            xlBooks.Open(stCurrentDir + @"\CopyMacro.xlsm");

            // Excel を表示する
            xlApp.Visible = true;
            //fExcelApp.Visible = true;
            //tExcelApp.Visible = true;

            // マクロを実行する
            // 標準モジュール内のCopyRange 実行
            xlApp.Run("CopyMacro.xlsm!CopyRange", fB,fW,fS,fR,tB,tW,tS,tR);

            //fExcelApp.Visible = false;
            //tExcelApp.Visible = false;

            // Excel を終了する
            xlApp.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
        }


' Excel VBA [ CopyMacro.xlsm ] の標準モジュールに書く内容

Option Explicit

Private Declare Function AccessibleChildren Lib "oleacc" _
    (ByVal paccContainer As Office.IAccessible, ByVal iChildStart As Long, _
     ByVal cChildren As Long, ByRef rgvarChildren As Any, ByRef pcObtained As Long) As Long _

Private Const CHILDID_SELF = 0&
Private Const ROLE_SYSTEM_LIST = &H21
Private Const ROLE_SYSTEM_PROPERTYPAGE = &H26
Private Const ROLE_SYSTEM_PUSHBUTTON = &H2B
Private Const ROLE_SYSTEM_WINDOW = &H9

Private Sub PasteOfficeClipboardItem(ByVal Num As Long)
'Officeクリップボードに登録されているアイテムを貼り付け
  Dim Acc As Office.IAccessible
  
  Set Acc = GetAccOfficeClipboardList
  If Acc Is Nothing Then Exit Sub
  If (Acc.accChildCount = 1) And (InStr(Acc.accName(1&), "クリップボードは空")) Then
    MsgBox "クリップボードは空です。" & vbCrLf & "処理を中止します。", vbCritical + vbSystemModal
    Exit Sub
  End If
  If Num > Acc.accChildCount Then
    MsgBox "指定した番号は無効です。" & vbCrLf & "処理を中止します。", vbCritical + vbSystemModal
    Exit Sub
  End If
  Acc.accDoDefaultAction Num
  Set Acc = Nothing
End Sub

Private Sub DoActionOfficeClipboard(ByVal AccObjName As String)
'Officeクリップボードコマンド実行
  Dim Acc As Office.IAccessible
  Dim Count As Long
  Dim i As Long
  
  Select Case AccObjName
    Case "すべて貼り付け", "すべてクリア"
    Case Else
      MsgBox "指定したコマンドには対応していません。" & vbCrLf &  _
      "「すべて貼り付け」か「すべてクリア」のどちらかを指定してください。", _
         vbCritical + vbSystemModal 
      Exit Sub
  End Select
  
  Application.CommandBars("Office Clipboard").Visible = True
  DoEvents
  Set Acc = Application.CommandBars("Office Clipboard")
  Set Acc = GetAcc(Acc, "Collect and Paste 2.0", ROLE_SYSTEM_WINDOW)
  Set Acc = GetAcc(Acc, "Collect and Paste 2.0", ROLE_SYSTEM_PROPERTYPAGE)
  Count = Acc.accChildCount
  If Count > 0& Then
    For i = 0 To Count
      If (Acc.accName(i) = AccObjName) And (Acc.accRole(i) = ROLE_SYSTEM_PUSHBUTTON) Then
        Acc.accDoDefaultAction i
        Exit For
      End If
    Next
  End If
  Set Acc = Nothing
End Sub

Private Sub GetOfficeClipboardList(ByRef ItemList As Variant)
'Officeクリップボードリスト取得
  Dim Acc As Office.IAccessible
  Dim Count As Long
  Dim v() As Variant
  Dim i As Long
  
  Set Acc = GetAccOfficeClipboardList
  If Acc Is Nothing Then Exit Sub
  Count = Acc.accChildCount
  If (Count = 1) And (InStr(Acc.accName(1&), "クリップボードは空")) Then
    MsgBox "クリップボードは空です。" & vbCrLf & "処理を中止します。", _
            vbCritical + vbSystemModal
    Exit Sub
  End If
  ReDim v(Count - 1)
  For i = 1 To Count
    v(i - 1) = Acc.accName(i)
  Next
  Set Acc = Nothing
  ItemList = v
End Sub

Private Function GetAccOfficeClipboardList() As Office.IAccessible
'Officeクリップボードリスト(Accessibleオブジェクト)取得
  Dim Acc As Office.IAccessible
  
  Application.CommandBars("Office Clipboard").Visible = True
  DoEvents
  Set Acc = Application.CommandBars("Office Clipboard")
  Set Acc = GetAcc(Acc, "Collect and Paste 2.0", ROLE_SYSTEM_WINDOW)
  Set Acc = GetAcc(Acc, "Collect and Paste 2.0", ROLE_SYSTEM_PROPERTYPAGE)
  Set Acc = GetAcc(Acc, "クリップボード", ROLE_SYSTEM_LIST)
  Set GetAccOfficeClipboardList = Acc
  Set Acc = Nothing
End Function

Private Function GetAcc(myAcc As Office.IAccessible, myAccName As String, _
                        myAccRole As Long) As Office.IAccessible
  Dim ReturnAcc As Office.IAccessible
  Dim ChildAcc As Office.IAccessible
  Dim List() As Variant
  Dim Count As Long
  Dim i As Long
  
  If (myAcc.accState(CHILDID_SELF) <> 32769) And _
     (myAcc.accName(CHILDID_SELF) = myAccName) And _
     (myAcc.accRole(CHILDID_SELF) = myAccRole) Then
    Set ReturnAcc = myAcc
  Else
    Count = myAcc.accChildCount
    If Count > 0& Then
      ReDim List(Count - 1&)
      If AccessibleChildren(myAcc, 0&, ByVal Count, List(0), Count) = 0& Then
        For i = LBound(List) To UBound(List)
          If TypeOf List(i) Is Office.IAccessible Then
            Set ChildAcc = List(i)
            Set ReturnAcc = GetAcc(ChildAcc, myAccName, myAccRole)
            If Not ReturnAcc Is Nothing Then Exit For
          End If
        Next
      End If
    End If
  End If
  Set GetAcc = ReturnAcc
End Function



Sub CopyRange(fBook As String, fWindow As String, fSheet As String, fRange As String, _
              tBook As String, tWindow As String, tSheet As String, tRange As String)
'
' CopyRange Macro
'   
    Workbooks.Open fBook
    Workbooks.Open tBook
    
    
    Workbooks(fWindow).Activate
    Worksheets(fSheet).Select
    Range(fRange).Select
    Selection.Copy
    
    Workbooks(tWindow).Activate
    Worksheets(tSheet).Select
    Range(tRange).Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    
    On Error Resume Next
    ActiveWorkbook.Save
    If Err.Number > 0 Then MsgBox "保存されませんでした"
    
    DoActionOfficeClipboard "すべてクリア" ''「すべてクリア」実行

    Workbooks(fWindow).Close   
    Workbooks(tWindow).Close   
End Sub

        






0 コメント

Excel VBA で画面より大きなフォームを表示する

Excel などの VBA では、フォームに Zoom プロパティがあるのでそれを調節することで、画面が切れずに拡大・縮小ができます。

 

 

画面より大きなフォームを表示する


画面より大きなフォームを表示するには次のようにします。


'ユーザーフォームのモジュールに書く内容

    Option Explicit
       
    ' グローバル定数定義
    Const FullHD_W As Long = 1920
    Const FullHD_H As Long = 1080
    Const ZoomRatio As Long = 99
    Const UserForm1_Width As Long = 1440

' フォームの初期化処理
Private Sub UserForm_Initialize()   
    
    Dim ScreenW, ScreenH As String
    Dim Rt, RtH, RtW As Double
      
    ' イメージ表示領域のサイズ設定
    ImageDisplayHeight = FrameDisplatImages.Height - 4
    ImageDisplayWidth = FrameDisplatImages.Width
    
    ' スクリーンサイズによる設定
    ScreenW = GetScreenX
    ScreenH = GetScreenY
    ' FullHD 未満の場合は画面の横幅に合わせてズームする
    If Val(ScreenW) < FullHD_W Or Val(ScreenH) < FullHD_H Then
        Me.Width = ActiveWindow.Width
        Me.Zoom = Round((Me.Width) / UserForm1_Width, 2) * ZoomRatio
    End If
    
End Sub


'標準モジュールに書く内容
Option Explicit

'*** Timer Function ***

Declare Function SetTimer Lib "user32" _
      (ByVal hwnd As Long, _
      ByVal nIDEvent As Long, _
      ByVal uElapse As Long, _
      ByVal lpTimerFunc As Long) As Long

Declare Function KillTimer Lib "user32" _
      (ByVal hwnd As Long, _
      ByVal nIDEvent As Long) As Long

Declare Function BeepAPI Lib "kernel32.dll" Alias "Beep" _
    (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long


Global iCounter As Integer


'*** Computer Infomation ***

'------------------------------------------
' ハードウェア
'------------------------------------------
     
' ユーザー名の長さを示す定数
Private Const UNLEN = 256 + 1
 
' NCBの名称の文字数
Private Const NCBNAMSZ = 16
 
' コンピュータ名の長さ
Private Const MAX_COMPUTERNAME_LENGTH = 15 + 1
 
' NCB(Network Control Block)コマンド
Private Const NCBRESET = &H32
Private Const NCBASTAT = &H33
     
' ローカルネットワーク名を格納する構造体
Private Type NAME_BUFFER
    name       As String * NCBNAMSZ
    name_num   As Byte
    name_flags As Byte
End Type
 
 
     
'さまざまなシステムメトリックの値(表示要素の幅と高さ)とシステムの現在の構成を取得
 
Private Const SM_CXSCREEN = 0       'スクリーン幅
Private Const SM_CYSCREEN = 1       'スクリーン高さ
Private Const SM_CMOUSEBUTTONS = 43 'マウスボタン数
Private Const SM_CMONITORS = 80     'モニター数
 
 
#If Win64 Then
 
    'システムの現在の構成を取得
    Private Declare PtrSafe Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
 
'    ' コンピュータ名を取得
'    Private Declare PtrSafe Function GetComputerName Lib "kernel32.dll" _
'        Alias "GetComputerNameA" _
'       (ByVal lpBuffer As String, _
'        nSize As Long) As Long
'
'    ' コンピュータ名を取得
'    Private Declare PtrSafe Function GetComputerNameEx Lib "kernel32.dll" _
'        Alias "GetComputerNameExA" _
'       (ByVal NameType As Long, _
'        ByVal lpBuffer As String, _
'        lpnSize As Long) As Long
 
     
    ' ユーザー名を取得
    Private Declare PtrSafe Function GetUserName Lib "advapi32.dll" _
        Alias "GetUserNameA" _
       (ByVal lpBuffer As String, _
        nSize As Long) As Long
     
 
 
#Else
 
    'システムの現在の構成を取得
    Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
     
'    ' コンピュータ名を取得
'    Private Declare Function GetComputerName Lib "kernel32.dll" _
'        Alias "GetComputerNameA" _
'       (ByVal lpBuffer As String, _
'        nSize As Long) As Long
'
'    ' コンピュータ名を取得
'    Private Declare Function GetComputerNameEx Lib "kernel32.dll" _
'        Alias "GetComputerNameExA" _
'       (ByVal NameType As Long, _
'        ByVal lpBuffer As String, _
'        lpnSize As Long) As Long
     
    ' ユーザー名を取得
    Private Declare Function GetUserName Lib "advapi32.dll" _
        Alias "GetUserNameA" _
       (ByVal lpBuffer As String, _
        nSize As Long) As Long
 
#End If
 
 
'------------------------------------------------------------------------
'
'Function ComputerName() As String
''
'' コンピュータ名
''
'    Dim strComputerNameBuffer _
'        As String * MAX_COMPUTERNAME_LENGTH
'    Dim lngComputerNameLength As Long
'    Dim lngResult             As Long
'
'    ' コンピュータ名の長さを設定
'    lngComputerNameLength = Len(strComputerNameBuffer)
'    ' コンピュータ名を取得
'    lngResult = GetComputerName(strComputerNameBuffer, lngComputerNameLength)
'    ' コンピュータ名を取り出し
'    ComputerName = Left(strComputerNameBuffer, InStr(strComputerNameBuffer, _
'                   vbNullChar) - 1)
'End Function
 
Function UserName() As String
'
' ログインユーザ名
'
    Dim strUserNameBuffer As String * UNLEN
    Dim lngUserNameLength As Long
    Dim lngResult         As Long
 
    ' ユーザー名の長さを設定
    lngUserNameLength = Len(strUserNameBuffer)
    ' ユーザー名を取得
    lngResult = GetUserName(strUserNameBuffer, lngUserNameLength)
    ' ユーザー名を表示
    UserName = Left(strUserNameBuffer, InStr(strUserNameBuffer, _
                   vbNullChar) - 1)
End Function
 
 
 
'Function MacAddress() As String
''
'' MAC アドレス
''   WMI を用いて MAC アドレスを取得
'
'    Dim strComputer As String   'コンピュータ名
'    Dim objWMI As Object        'WMIオブジェクト
'    Dim objAdapter As Object    'ネットワークアダプタ
'
'    ' 初期値
'    MacAddress = ""
'
'    Set objWMI = GetObject("winmgmts:\\.\root\cimv2").ExecQuery _
'        ("Select * From Win32_NetworkAdapterConfiguration " & _
'            "Where IPEnabled = True")
'
'    ' ネットワークアダプタ参照
'    For Each objAdapter In objWMI
'        'MACアドレス参照(最初に見つけたもので確定)
'        MacAddress = objAdapter.MacAddress
'        Exit Function
'    Next
'
'End Function
 
 
'Function GetIPAddress() As String
''
'' IP アドレス取得
''   WMI を用いて IP アドレスを取得
''
'    Dim NetAdapters, objNic, strIPAddress
'    Set NetAdapters = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") _
'                           .ExecQuery("Select * from Win32_NetworkAdapterConfiguration " & _
'                           "Where (IPEnabled = TRUE)")
'     'ネットワークアダプターが複数ある場合、複数IPが割り当てられている場合は最初のみ取得
'    For Each objNic In NetAdapters
'        For Each strIPAddress In objNic.IPAddress
'            GetIPAddress = strIPAddress
'            Exit Function
'        Next
'    Next
'
'End Function
 
 
 
Function GetScreenX() As String
'
' スクリーンの幅
'
    GetScreenX = GetSystemMetrics(SM_CXSCREEN)
End Function


Function GetScreenY() As String
'
' スクリーンの高さ
'
    GetScreenY = GetSystemMetrics(SM_CYSCREEN)
End Function
'
'Function GetMonitorCount() As String
''
'' モニター数
''
'    GetMonitorCount = GetSystemMetrics(SM_CMONITORS)
'End Function
'
'Function GetMouseButtonCount() As String
''
'' マウスボタン数
''
'    GetMouseButtonCount = GetSystemMetrics(SM_CMOUSEBUTTONS)
'End Function

        






0 コメント

Visual C# で画面より大きなフォームを表示する

高解像度の画面目いっぱいに作ったフォームをそれより解像度の低いモニターで表示するとフォームの右と下が切れてしまいます。

そんな場合に、フォームサイズを小さくしてスクロールさせる方法を紹介します。

使いづらくはなりますが、とりあえず利用可能に成ります。

 

Excel VBA などではフォームに Zoom というプロパティが有りそれを調節することで、画面の表示倍率そのものを変化できましたが、C# にはないですね。

画面より大きなフォームを表示する


画面より大きなフォームを表示するには次のようにします。


        private void Form1_Load(object sender, EventArgs e)
        {
            SetFormScale();
        }


        private void SetFormScale()
        {
            //スクロール機能を有効にする
            AutoScroll = true;
            //フォームが存在しているディスプレイの作業領域の高さと幅を取得
            double Dh = System.Windows.Forms.Screen.GetWorkingArea(this).Height;
            double Dw = System.Windows.Forms.Screen.GetWorkingArea(this).Width;
            double Fh = this.Size.Height;
            double Fw = this.Size.Width;

            if (Dh < Fh | Dw < Fw)
            {
                double zoomh = Dh / Fh;
                double zoomw = Dw / Fw;
                if (zoomh <= zoomw)
                {
                    this.Height = Convert.ToInt32(Fh * zoomh);
                    this.Width = Convert.ToInt32(Fw * zoomh);
                }
                else
                {
                    this.Height = Convert.ToInt32(Fh * zoomw);
                    this.Width = Convert.ToInt32(Fw * zoomw);
                }
            }
        }

        






0 コメント

Visual C# フォームの印刷 class

ネットで調べて3つぐらいのサイトの合成です。            8/27 修正

 

この印刷では、フォームがプリント領域よりも大きいときに用紙にピッタリ収まるように縮小しているのがポイントです。

 

使用するプリンターは [A4] サイズ用紙が利用できるものとしています。

印刷出力は通常使うプリンターを使用することになります。

 

印刷上部に日付と時刻がプリントされます。

必要ない場合は、

e.Graphics.DrawString(...);

の行をコメントにして下さい。

 

フオームは横長が基本なので、印刷は [横向き] としています。

また、カラー印刷にしています。

それらも引数として渡すようにして、その値を使うように変更すれば自由度は増すでしょう。

 

(Windows10 VisualStudio 2015 C# フォームアプリケーションで動作確認済み)

 

フォームの印刷


フォームの印刷には次のようにします。



        //--------------------------------------------------------------
        //                  印刷クラスの定義
        //--------------------------------------------------------------
       
using System;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.Drawing;

namespace WindowsFormsApplication1
{
        class Print
        {
            #region プリンターの初期設定
            protected void initializePrinterSettings(System.Drawing.Printing.PrintDocument PrintDocument1)
            {
            //プリンタ名の取得
            string defaultPrinterName = PrintDocument1.PrinterSettings.PrinterName;
            PrintDocument1.DefaultPageSettings.PrinterSettings.PrinterName = defaultPrinterName;
            int paperIndex = 0;
            foreach (PaperSize ps in PrintDocument1.PrinterSettings.PaperSizes)
            {
                if (ps.PaperName.Contains("A4"))//用紙のサイズ指定
                {
                    break;
                }
                paperIndex++;
            }
            PrintDocument1.DefaultPageSettings.PaperSize =
                PrintDocument1.PrinterSettings.PaperSizes[paperIndex];        
            PrintDocument1.DefaultPageSettings.Landscape = true;          //横向きならtrue
            PrintDocument1.DefaultPageSettings.Color = true;              //カラー印刷ならtrue
            }
            #endregion

            #region 印刷イベントハンドラ  印刷時の縮小倍率の決定
            public void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
            {
                //拡大率を指定.
                float zoom = 1;
                float padding = 30;
                if (this.memoryImage.Width > e.Graphics.VisibleClipBounds.Width)
                {
                    zoom = e.Graphics.VisibleClipBounds.Width /
                        this.memoryImage.Width;
                }
                if ((this.memoryImage.Height + padding) * zoom >
                        e.Graphics.VisibleClipBounds.Height)
                {
                    zoom = e.Graphics.VisibleClipBounds.Height /
                        (this.memoryImage.Height + padding);
                }
            e.Graphics.DrawString(DateTime.Now.ToString("yyyy年MM月dd日 (dddd) tt hh時mm分ss秒"),
                                  new Font("MS UI Gothic", 8), Brushes.Black, new Point(0, 0));
            // フォントサイズは適当な値を指定して下さい。
            //EventArgsのGraphicsにデータを書き込むとそれが印刷される.
            e.Graphics.DrawImage(this.memoryImage, 0, padding,
                                                   this.memoryImage.Width * zoom,
                                                   this.memoryImage.Height * zoom);
            }
            #endregion

            #region 印刷処理
            //フォームのイメージを保存する変数
            public Bitmap memoryImage;
            /// 
            /// フォームのイメージを印刷する
            /// 
            /// イメージを印刷するフォーム
            public void PrintForm(Form frm)
            {
                //フォームのイメージを取得する
                memoryImage = CaptureControl(frm);
                //フォームのイメージを印刷する
                System.Drawing.Printing.PrintDocument PrintDocument1 =
                     new System.Drawing.Printing.PrintDocument();
                initializePrinterSettings(PrintDocument1);
                PrintDocument1.PrintPage +=
                     new System.Drawing.Printing.PrintPageEventHandler(
                     printDocument1_PrintPage);

                //printPreviewDialog1.Document = PrintDocument1;
                //PrintPreviewDialog printPreviewDialog1 = new PrintPreviewDialog();
                //printPreviewDialog1.ShowDialog();
                PrintDocument1.Print();
                memoryImage.Dispose();
            }
            #endregion

            #region コントロールのイメージを取得する
            [System.Runtime.InteropServices.DllImport("gdi32.dll")]
            public static extern bool BitBlt(IntPtr hdcDest,
                 int nXDest, int nYDest, int nWidth, int nHeight,
                 IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);

            public const int SRCCOPY = 0xCC0020;
            public Bitmap CaptureControl(Control ctrl)
            {
                Graphics g = ctrl.CreateGraphics();
                Bitmap img = new Bitmap(ctrl.ClientRectangle.Width,
                    ctrl.ClientRectangle.Height, g);
                Graphics memg = Graphics.FromImage(img);
                IntPtr dc1 = g.GetHdc();
                IntPtr dc2 = memg.GetHdc();
                BitBlt(dc2, 0, 0, img.Width, img.Height, dc1, 0, 0, SRCCOPY);
                g.ReleaseHdc(dc1);
                memg.ReleaseHdc(dc2);
                memg.Dispose();
                g.Dispose();
                return img;
            }
            #endregion

            #region PrintDocument1のPrintPageイベントハンドラ
            public void PrintDocument1_PrintPage(object sender,
                 System.Drawing.Printing.PrintPageEventArgs e)
            {
                e.Graphics.DrawImage(memoryImage, 0, 0);
            }
        #endregion
    }
}


        //--------------------------------------------------------------
        //       プロブラムで印刷ボタンがクリックされたときの処理
        //--------------------------------------------------------------
        #region Print Form
        //プロブラムで印刷ボタンがクリックされたときの処理
        private void buttonPrint_Click(object sender, EventArgs e)
        {
            ///クラスのインスタンスを作成して呼び出す。
            Print Pr = new Print();
            Pr.PrintForm(this);   //引数=フォーム名
        }
        #endregion




1 コメント

ノートPCのHDD換装

息子のノートPCのHDDが壊れたので換装しました

続きを読む 0 コメント

外付けSSDのディレクトリが壊れた

元のパソコンに入れていたSSDを外付けのUSB接続で使って間もなくパーティションで仕切ったドライブの1つが読めなくなりました。

「ディレクトリが壊れているために読めません」とエラーが出ました。

静電気かなんかで壊れたのかなと思いつつ、ネットでググってみました。

CHKDSKをかければ治ることもあるらしいのでやってみました。

スタートボタンを右クリックしてコマンドプロンプトを出します。

「ドライブG:」が読めないので

chkdsk g: /f

と入れてEnterキーを押します。

何だかたくさんメッセージが出てきました。

ディレクトリが壊れて読めないので、削除してファイルを1つずつ読んで作り直しているというメッセージでした。

数分後すべての作業が完了してchkdskが終了しました。

どうなったかと気にしながらドライブG:をもう一度読み直してみました。

オー、素晴らしい。

ちゃんとファイルが読めるではありませんか。

いやー、良かった良かった。

0 コメント

パソコンを買いました

今まで使っていたパソコンが古くなったので新しく買い替えました。

価格を安くしたかったのと余分なソフトが入ってないものがよいということでBTOショップのものにしました。

 

私が購入したのはFRONTIERというショップのNZシリーズです。

インテルCOREi7で15.6インチのノングレア フルHD液晶モニターが付いています。

メモリーは16GB(8GBx2)にしました。デュアルチャネル接続なのでシングルに比べて2倍の速度になります。

グラフィック装置はNVIDIA GeForce GTX950Mがついています。

記憶装置には安くなってきたSSDを2基おごりました。250GBと500GBのものです。

本当は小さいほうのSSDはM.2のPCI接続のものが5倍くらい速くてよいのですが、まだ出始めで割高なのでM.2のSATAⅢ接続のものにしました。

あとはドライブ装置にBlueRayを付けました。

 

いろいろなショップを比べたのですが、手ごろなスペックと価格の安さからここに決めました。

ちょうど伊勢志摩のG7首脳会議が開かれるということでG7セールというのをやっていて、

この機種は定価より20,000円引きだったのも良かったです。

このショップは評判も割とよくてそれほどひどいものはないようです。

納期も一週間の予定が5日目に届きました。

 

自宅では23インチの外部モニターに表示しています。テレビにも出力できるようにしてます。

YOUTUBEのカラオケを再生しながらテレビに出せば手軽に楽しめます。

サウンドはUSBのDACでステレオから出力してます。

使ってみた印象は、一昔前のものと比べると非常に速くて快適です。

Windowsの起動は5秒あまりです。スリープにする必要がないくらい速いです。

 

前のパソコンからのデータの引っ越しは、入っていたSSDをUSB用のケースに入れ接続しコピーしました。

ソフトはコントロールパネルのプログラムと機能の画面コピーをプリントして必要なものを一つずつダウンロード・インストールするしかありません。これには一晩中かかりました。

 

メールソフトにはThunderBirdを使っているのですがこれのプロファイルはコピーするだけで設定や今までのメールも引き続き使えるので便利です。

 

またブラウザはChromeを使っていますが、これもログインするだけで今までのお気に入りやパスワードなんかも其のまま使えて便利ですね。

 

 

Windows10では、ちょっとした問題点が2つあります。

ひとつ目はWindows起動時にテンキーのNumLockがオフになってしまっているということです。

今までは13.3インチのノートだったのでテンキーがなく知りませんでしたが毎回起動したらNumLockをオンにするのは煩わしいですね。

調べたら、レジストリの値を書き換えるだけで治りましたので困っている方は参考にしてください。

まずレジストリエディタを起動します。 

Windowsキーを押しながら”R”を押します。

そこへ「regedit」と入れてOKします。

続きを読む 0 コメント

Visual C# で Excel の色々なアドインを作ってみました

全部で十数種類のアドインを作りました。

プログラムとしては1つですがボタンをどんどん追加して行って作りました。

適当な場所にセパレータを入れるとボタンが分類できます。

 

全てのアドインはCtlキーを押しながら複数の選択範囲をしたときは、その全てを処理するようにしました。

参考にしてもらえれば嬉しいです。

 

 

まず罫線関係のものです。

続きを読む 0 コメント

Visual C# で Excel のアドインを作りました

Visual Studio 2015 Community で 罫線を引くアドインを作りました

作り方を順に説明します。

 

前準備として、OfficeToolsForVS2015 をインストールしておきます。

やり方は、次のサイトを参考にしてください。

 

続きを読む 0 コメント

Visual C# でグラフを描いてみました

ダイエットをしているのでそれの記録管理をします

>>> 2017/9/8 <<<   pakuさんからの要望より、他のソースコードも掲載しました。

続きを読む 1 コメント

iPhoneからPCを遠隔操作で起動する【WOL】

同一LAN内空だけでなくインターネットからもPCを起動できるアプリを探していました。

これができると外出先からWOLPCを起動してその後TeamViewerを使って自分のPCを利用できるからです。自分のPCにしかない環境・ソフトやアプリ・ファイルなどがそのまま利用できるのが良いところです。

 

私が使ってみたのはTommaso MadoniaWakeUp - The Wake on LAN (WOL) tool」です。
(有料です 2016/3/24現在\120) (有料です 2016/3/24現在\120)

 WakeUp - The Wake on LAN (WOL) tool                                 

続きを読む 1 コメント

音声認識の利用を試してみました

パソコンで音声認識ができると言うことが分かったので、マイクを購入して試してみました。

 実はこのブログもほとんど音声認識で記述しています。

 

 Windowsでは、Vista以降音声認識できるようになったということです。

 私は知りませんでした。

 スマートホンなどではできるので、パソコンでもできるのかなと調べてみました。

 随分と前から可能だったんですね。

 

これは、メモ帳やメールなどWindowsのほとんどのソフトで使えます。

使ってみると、日本語はずいぶん正しく認識されますがカタカナ語はうまく変換できないものもあります。

おそらく変換辞書に乗ってない言葉は認識できないんでしょうね。

まだ使い始めたばかりで使い方がよく分かっていないせいもあります。

 

でもキーボードからすべて打ち込むのに比べるとずっと速く記入できて良いです。

これだとキーボードの操作がほとんど不要になります。

キーパンチャーみたいな仕事はだんだんと無くなってくるんでしょうね。

 

それと文章を考えるのに集中できるので考えがまとめやすいです。

だから、アイデアなどを記述していくのに非常に良いと思います。

こんな便利なものもっと早く知っていればよかったなあとちょっと後悔してます。


 

0 コメント

Windows10 アップグレード 補足

Windows10へアップグレードする前に、

Windows7など 古いOSでは BIOSの設定画面で 詳細タブの

USB設定で レガシーUSBサポートを使用しない にしないとアップグレードできません。

アップグレードしたあとも、そのままにしておかないと起動できません。

これが一番大事なことです。ちゃんとやったのに忘れてて、すみませんでした。


因みに 私が使っているのは 富士通のLIFEBOOK SH760/AN という機種です。

これはメーカーのWindows10へのアップグレード対象機種には指定されていません

でも、CPU、メモリー、ファイルシステム、アプリケーションなど

互換性に問題はありませんでした


でも、HDDはSSDに換装してあります。この時点でメーカー保証対象外ですけれども。

SATAは II で、III ではないですが、それでも HDDに比べたらSSDは7~10倍速いです。

普段使用するには、十分なスペックです。


また、SSDではデフラグが基本的に不要です。

HDDだとデフラグをスケジュール化して週に一度とかしてると思いますが、

それが要りません。しかも読み書きがずっと高速です。

価格も下がってきています。Intelの240GBだと、535 Series SSDSC2BW240H6R5

Amazonで \15,700程度です。

新品のPCを買う価格の1割程度です。


私としては、このPCが壊れるまで 使い続けたいたと思います。




0 コメント

Windows10へアップグレードしました

Windows10がリリースされてから、私のWindows7マシンも早くアップグレードしたいと思っていました。

 

でも何度試みても、最初の再起動の画面で止まってしまって進みませんでした。

エラーコードを見ると0xC1900101-0x20017というものでブートがうまく出来なかったというものです。

ネットで色々調べて片っ端から試していきました。

やってみたことは、

     ウイルスチェックソフトの一時削除

     デバイスのインストール設定で、

             Windows Updateからドライバーソフトをインストールしないにする

     回復パーティションの削除

     BIOSのアップデート

     不要なデバイスドライバーの削除

でもダメでした。

 

ここで調べていくうちにわかったことは、

Windows10のアップグレードで再起動するときには、今までのデバイスドライバーを引き継がないということです。

だから、一般的でないデバイスドライバーはサポートしていないだろうということが想像できます。

 

じゃあ、私のPCで一般的でないのは何かと考えてみると、

・生体認証(指紋認証)

・WiMAX

・Bluetooth

ぐらいです。

 

これらは削除できないものがあったりしたので、

コンピューターの管理画面から、それらのデバイスドライバーを全て「無効」にしてみました。

こうしてから、もう一度アップグレードしてみたら、ようやくうまく出来ました。

なお、アップグレード後は元のデバイスのドライバーが再設定されていましたから、アップグレード中だけデバイスドライバーが最低のものになるようです。

 

その後で、ディスクの領域を見てみると変なところ(CドライブとDドライブの間)に回復パーティションが作られていました。

これは多分アップグレード後一ヶ月間は元のOSの状態に戻せるということだったので、そのためのものだと思います。

 

さて、Windows10を少し使ってみました。

見た目は WindowsXP時代みたいになって、ウインドウの透過がなくなりました。

また、ウインドウの四隅も角張って丸みがなくなりました。

レスポンスは良いと思います。これはOSが低スペックのタブレットでも快適に動作するように作られているからだろうと思います。

 

メニューの使い方やタスクバーのアイコンが何を表しているかなどは、大体わかります。

ただし、メニューは左クリックの場合はアプリで右クリックの場合はシステムの状態や変更に関するものと別れました。


また、来年4月末ぐらいからはWindows10でiOSやAndroidのアプリが動くようになるというニュースを見ました。Windowsマシンで他のスマホやタブレット用のアプリが動作するのは面白いですね。使えるようになるのが楽しみです。

 

1 コメント