C# で MyClock Ver 0.10 を作る (2/2)

プログラム電卓のためのC#プログラミング
e-Gadget

<MyClock トップへ戻る>


2017/01/31

初めて作る C# プログラム - MyClock


MyClock Ver 0.10を作る (2/2)

MyClock が動作するようになりましたが、.NET Framework を必要とする C# アプリに関しては、.NET Framework のバージョンが気になります。


Windows 10 にインストールした Visual Studio Community 2015 の C# で MyClock の新規プロジェクトを作成する時に「対象のフレームワーク」を .NET Framework 4.6.1 に設定しています。



.NET Framework と Windows バージョンの関係



.NET Framework には新旧多くのバージョンがあります。開発と同じPCで使う場合は .NET Framework のバージョンを気にする必要がありませんが、別のPCで使う場合はWindowsのバージョンによってはアプリが正常動作しない可能性が考えられます。

そこで、Windows と .NET Framework のバージョンの関係を調べてみました。

 .NET Frameworkのバージョンを整理する (1/2)
 .NET Frameworkの一部バージョンのサポート終了が差し迫る! その対策は? (1/2)

Windows 7 のサポートは 2020年1月15日に終了し、プレインストールされている .NET Framewok 3.5.1 の同日までサポートされるようです。Windows 8.1 / 10 のサポートと、プレインストールされている .NET Framework 3.5.1 / 4.5.2 / 4.6.x は 2023年1月15日までサポートされるようです。

そこで、Windows 7 以降で使えるようにするには、.NET Framework 3.5.1 を対象にしてアプリを作れば2020年1月15日までは問題ないことが分かります。Windows 8.1 以降を対象にするなら、.NET Framework 4.6.2 (本日時点での最新版) を対象のフレームワークにしておけば 2023年1月15日まで問題ないことになります。

さすがに Windows XP をネットに繋いで使っているケースを考慮する必要は無いと割り切れますが、Window 7 は未だに人気が高いので、MyClock は .NET Framework 3.5.1 を前提にしようと思います。




対象の .NET Framework バージョンを変更

プロジェクトの「対象のフレームワーク」に設定する .NET Framework バージョンの確認や変更は、プロジェクトのプロパティで行えます。

ソリューションエクスプローラーで、プロジェクト MyClock を選び、

プロジェクトのプロパティの出し方 

右クリックでメニューが現れ、

プロジェクトのプロパティの出し方2 

[プロパティ(R)] を選ぶと、

 プロジェクトのプロパティ縮小  

プロジェクト MyClock のプロパティが現れます。対象のフレームワークが、デフォルトで .NET Framework 4.6.1 になっていることが確認できます。

これを .NET Framework 3.5 に変更 (3.5 Client Profile ではなくて 3.5) し、プロパティを保存します。変更を有効にするにはソリューションを一旦閉じてから再び開く必要があります。

そこで、全てのファイルを保存後、[ファイル(F)] - [ソリューションを閉じる(T)] を選ぶか、右上の[X] でソリューションを一旦閉じます。そして再びソリューションを開くと、「対象のフレームワーク」の変更が反映されます。

では、[F5] を押してビルド後デバッグモードで実行します。

するとエラーと警告が発生しました。

フレームワーク3.5でのエラー  

 マークがエラーで、これがあるとビルドできません。そこでこのエラー表示の上でダブルクリックしてみると、エラー箇所が表示され、カーソルが Display.cs と Program.cs の冒頭にある


using System.Threading.Tasks;

の Tasks の前にあり、Tasks の下に赤い波線がついています。

この機能が .NET Framework 3.5 ではサポートされていないので、上記2つのファイルでこの行をコメントアウトします。

//using System.Threading.Tasks;


コメントアウトすると、その場でエラー表示が消えます。[F5] を押してビルド&実行してみると、ビルドに成功して MyClock が正常動作しました。

なお、4つの警告がありますが、Microsoft.CSharp と System.Net.Http が見つからないことによります。.NET Framework 4.6.1 には用意されているので組み込まれたが、3.5.1 に変更したら見つからなくなったのが原因のようです。

以下のように、これら2つに警告マークがついています。

参照エラー 

今は、これらの機能を使わなくても MyClock は正常動作しているので、この警告を無視することにします。

対象フレームワークを変更したのに参照の対象を自動的に更新できていない、つまり 開発環境がそこまで万能では無いのだと思います。これらを削除することもできますが、将来の機能追加で対象フレームワークをより新しいものに変更した時に、削除したものを自動で追加してくれないかも知れず(動作が怪しい)そのときに苦労したくないので、そのままにしておきます。


これで、MyClock は、対象フレームワーク .NET Framework 3.5 (つまりWindows 7 以降) で動作するようになりました。






アセンブリ情報を変更

プロジェクトのプロパティを開き、

プロジェクトのプロパティ縮小 

 [アセンブリ情報(I)...]をクリックすると、デフォルトのアセンブリ情報が出てきます。

アセンブリ情報変更前 

ここで、タイトル、製品、著作権を変更してみます。

アセンブリ情報変更後 

[OK] で保存。

ここでの設定は、実行ファイル MyClock.exe を右クリックして表示されるプロパティで [詳細] ボタンを押して現れる情報に反映されます。

プロパティ情報が変更されたので、[F5] でビルドしデバッグモードで実行して動作確認します。

デバッグモードで作成された MyClock.exe は、作業フォルダの下にある bin\Debug フォルダにあります。このファイルを右クリックしてプロパティを表示すると、ここにアセンブリ情報が反映されていることが分かります。

プロパティ1 

プロパティ2 





アイコンを設定


今は既定のアイコンになっています。そこでアイコンを変更してみます。

以下のサイトから無償で使えるアイコンを選んで使うことにします。

FIND ICONS

こんなアイコンにしてみました。

アイコン 

このアイコンデータは、作業フォルダのどこかにコピーしておきます。今回は、作業フォルダに res フォルダ (リソースフォルダ) を作り、そこにアイコンファイルを入れることにします。

resを追加した作業ファイル  


さて、これをアプリに登録するには、プロジェクトのプロパティを開き、

アイコン登録1縮小 

アイコンとマニュフェスト(C) にチェックが入っていますが、この下にある(既定のアイコン) の右にある参照ボタンをクリックして、res フォルダ内にコピーした xclock.ico を選択します。

アイコン登録2縮小 


このように、アイコンが登録できました。

こうしておいてビルドすれば、アプリのアイコンが変わります。作業フォルダの下にある bin\Debug\ フォルダを開くと、MyClock.exe のアイコンが時計のアイコンになっています。

デバッグモードの実行ファイル 

表示を「中アイコン」に変えてみると、

新アイコンの実行ファイル2 

こんな感じで、それらしいアイコンになったことが分かります。

ところで、作業フォルダの下にある *cs ファイルがあるところに、アイコンファイルがあります。自動的にここにコピーされるようです。

新アイコンのもう一つの場所 


なお、フォーム Display のプロパティにある Icon がまだ既定のアイコンのままになっていますので、これも変更しておきます。今は FormBorderStyle が FixedToolWindow になっているので、フォームにアイコンは表示されませんが、これを仮に Sizable に変更してみると新しいアイコンになります。FixedToolWindow に戻しておきます。

Debug モードで「リビルド」しておきます。そして [F5] キーで実行して、問題ないことを確認します。



Releaseモードでビルド

さて、ビルドには Release モードもありますので、これを使ってみます。

リリースモードに変更 

このように「ソリューション構成」を Rlease に変更し、ビルドするとリリースモードで実行ファイルができます。

リリースモードの MyClock.exe は、作業ファイルの下の bin\Release\ の中にあります。
リリースモードの実行ファイル 
リリースモードで [F5] キーを押すとエラーになって実行できません。リリースモードでビルドするとデバッグ情報が無いのでエラーになります。従って、このフォルダにある実行ファイルを直接実行して動作確認をします。

リリースモードでビルドは、デフォルトで最適化が行われる設定になっています。しかし、デバッグモード、リリースモードいずれの実行ファイルもファイルサイズは 142KBと同じ、この程度の簡単なアプリでは実行速度の違いも分かりません。

一応 リリースモードの実行ファイルを完成形とします。これで、C#で初めて作るアプリ MyClock Ver 0.10 ができました。



ダウンロード

 MyClock Ver 0.10 (ソース付き)








応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: プログラム関数電卓、Windowsプログラミング

リンク集 | ブログ内マップ

関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

C# で MyClock Ver 0.10 を作る (1/2)

プログラム電卓のためのC#プログラミング
e-Gadget

<MyClock トップへ戻る>


2017/01/31

初めて作る C# プログラム - MyClock


MyClock Ver 0.10を作る (1/2)

仕 様
  • フォントが大きい
  • 時計は半透明で常に前画面表示


MyClock プロジェクトを作る

初めての C# なので、分かる範囲で手順とポイントを記録しておきます。

1. Visual Studio Community 2015 を起動

起動時に、管理者権限にするかそうでないかの選択肢があります。取り敢えず管理者権限で起動します。


2. 初めてのソリューションとプロジェクトの作成

 新しいプロジェクト作成の方法

新しいプロジェクト作成には複数の方法があります。
  • スタートページにある「新しいプロジェクト ...」のリンクをクリック
  • ツールバーの左から3詰めの"新しいプロジェクト"ボタンをクリック
  • メニューで、[ファイル] - [新規作成] - [プロジェクト] を選ぶ

ひな形プロジェクトを選ぶ

[テンプレート] - [Visual C#] - [Windows]  から「Windowsフォームアプリケーション」を選択

「名前(N):」と「ソリューション(M):」に MyClock と入力し、「場所(L):」に適切に入力します。
なお、「場所(L):」で設定したフォルダの下に、ソリューションに指定した名前のフォルダが自動的に作られ、その下に必要なファイルが自動生成されます。

バージョン管理を分かり易くするために、新規プロジェクトを作る前に MyClockフォルダを作っておき、さらにその下に例えば MyClock0100 とバージョンが分かるフォルダも作っておき、このフォルダを「場所(L):」に指定しています。

 <MyClock>
  <MyClock0100> ← [場所(L):」に入力したフォルダ

[OK] をクリックすると、ひな形のプロジェクトが作成されます。自動作成だけで合計 92KB のファイルが数多く生成されます。

 <MyClock>
  <MyClock0100> ← [場所(L):」に入力したフォルダ
   <MyClock>
    MyClock.sln
    <vs.>
    <MyClock>
     App.config
     MyClock.csproj
     Form1.cs
     Form1Designer.cs
     Program.cs
     <bin>
      <Debug>
       MyClock.exe.config
       MyClock.vshost.exe
       MyClock.vshost.exe.config
       MyClock.vshost.exe.manifest
      <obj>
       <Debug>
        MyClock.csproj.FileListAbsolute.txt
        DesignTimeResolveAssemblyReference.cache
        TemporaryGeneratedFile_xxxxxxxx_xxxx_xxxx_xxxx_xxxxxxxxxxxx.cs
        TemporaryGeneratedFile_yyyyyyyy_yyyy_yyyy_yyyy_yyyyyyyyyyyy.cs
        TemporaryGeneratedFile_zzzzzzzz_zzzz_zzzz_zzzz_zzzzzzzzzzzz.cs
        <TempPE>
      <Properties>
       AssemblyIngo.cs
       Resource.Designer.cs
       Resource.resx
       Setttings.Designer.cs
       Settings.settings

そして、フォームデザイナーが開いて、デフォルトの (素の) フォームが現れます。

初めてのフォームデザイナー 


 初めてビルドしてみる

メニューバーの下に「Debug」「Any CPU」とあります。この状態で、メニューで、[ビルド(B)] - [ソリューションのビルド] を選び、ビルドを実行します。すると、出力ウィンドウで

1>------ ビルド開始: プロジェクト:MyClock, 構成:Debug Any CPU ------

と表示され、その後すぐに

1>------ ビルド開始: プロジェクト:MyCloxk, 構成:Debug Any CPU ------
1> MyClock -> C:\MyData\MySource\VS2015\Projects\C#\MyClock\MyClock0100\MyClock\MyClock\bin\Debug\MyClock.exe

と1行追加表示されます。デバッグモードでビルドした実行ファイル名とパスが表示されます。

ここで、
1> MyClock -> C:\MyData\MySource\VS2015\Projects\C#\MyClock\MyClock0100\
は「場所(L):」で設定したパスで、

その下の MyClock フォルダがソリューション MyClock のフォルダ、
さらにその下にある 同じ名前の MyClock フォルダが プロジェクト MyClock のフォルダです。

そして、実行ファイル MyClock.exe は プロジェクトフォルダの下の bin\Debug フォルダに作成されていることが分かります。リリースモードでビルドすると、bin\Release フォルダ内にファイルが出力されます。

ビルドが終わると、出力は以下のようになります。

1>------ ビルド開始: プロジェクト:MyCloxk, 構成:Debug Any CPU ------
1> MyClock -> C:\MyData\MySource\VS2015\Projects\C#\MyClock\MyClock0100\MyClock\MyClock\bin\Debug\MyCloxk.exe
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========


1 正常終了 となっているのでビルドエラーが無かったことが分かります。


デバッグモードで実行してみる

方法は複数あります。
  • [F5]キーを押す
  • ツールバーの[ 開始]ボタンを押す
  • メニューで、[デバッグ] - [デバッグの開始] を選ぶ
ソースファイルが変更された状態でデバッグを始めると、先にビルドが行われてからデバッグが始まります。従って [F5] を覚えておけば、キーを押すだけでビルドとデバッグ開始になるので便利です。

素のMyClock 
素のウィンドウが既にできています。最小化ボタン、最大化ボタン、中止ボタン、システムメニューを出すアイコン、プログラムのタイトル Form1 が備わっていて、いっちょ前にウィンドウの陰までできています。これは Windows 10 で実行した時の画像です。Windows 7 や 8 ではその環境でのデフォルトのウィンドウになる筈です。

1行もコードを書かずに、取り敢えずここまでは自動的に作ってくれますが、昔の VC++ 6 でも変わりなく驚くことでもありません。実はVisual Studio 2015 での開発の段取りは、基本は以前の Visual Studio 6 と同じような感じですので、経験があれば必要なものは探して使えると思います。

ここで、MyClock ソリューションと、その中に含まれる MyClock プロジェクトが作成されたことになります。このソリューションの中に 新しいプロジェクトを作って含めることができます。


 namespace、class そして Form

私には Namespace (名前空間) は新しい概念で、クラスやメンバー は MFC (Microsoft Foundation Class) で馴染みがあり、Form は Visal Basic で出てきました。

C# は、これらが混じった感じですね。C++ で記述できる Visual Basic とでも言えそうな感じです。

画面右にあるソリューションエクスプローラで、Form1.cs を
右クリックして [コードの表示] を選んで、自動作成されたコードを眺めてみます。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MyClock // これがプロジェクトMyClock
{
  public partial class Form1 : Form // ここで Form1 ウィンドウに必要な処理を書く
  {
    public Form1() // Form1 の最初の処理として初期化している
    {
      InitializeComponent();
    }
  }
}

ここで、using は、VC++ の include のような感じで、予め準備されているライブラリからデフォルトで必要なものが列挙されていて、今後必要に応じて追加することになります。

public Form()
{

}

は、この先頭の位置に記述しておかないと、開発環境がエラーを出します(実際悩みました)。Form1 のインスタンス生成で最初の1回だけ行われる処理のようです。

さらに分かることとしては、

using System.Windows.Forms;

で、関連づけられた Forms に 基底クラスの Form の定義があって、それをサブクラス化して Form1 クラスが作られています。

仮に、以下のように class Form1 の中で、public な静的文字列変数 m_variable を宣言しておきます。

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

  public static string m_variable; // 静的文字列変数
 }
}

この変数へ、class Form1 の外の例えば class Form2 からアクセスするには、

Form2 の中では、

(namespace).(class).m_variable

つまり

Form1.Form1.m_variable

と記述する必要があります。スコープを考えると名前空間がクラスの上位にあるわけです。

そして、Form2 の中で、一例として

public string m_var = Form1.Form1.m_variable;

と橋渡しをしておけば、タイプ数の少ない m_var を使えて便利です。

なお、Visual Studio では正しく記述すれば、クラス名を Form1 と色分けして表示してくれるので、目安になって便利です。


Form名 = クラス名

今、名前空間とプロジェクト名が、MyClock になっています。フォーム名とクラス名は自動生成された Form1 のままです。

これを適切な名前に変更します。時間を表示させるので、Display としましょう。フォーム名とクラス名を変更するために、全て手で変更するのは大変なので、自動変更の機能を使います。但しプログラムが込み入ってくると自動生成も完璧ではないと心配される (どこまで信用して良いか分からない)ので、自動生成された直後に名称変更を自動で行わせることにします。

ちょっと脱線しますが、ここで自動作成された主なファイルは、以下です。
  • Form1.cs
  • Form1.Designer.cs
  • Program.cs
主にコーディングするのが Form1.cs です。

Form1.Designer.cs は開発環境の機能を使って自動でコードに落としてくれるものです。部品をフォームへドラッグ&ドロップで追加したり、フォームや部品のプロパティを変更したり、イベントハンドラのテンプレート作成などがコーディングせずに行えます。そして、その結果がこのファイルと Form1.cs の両方に反映されます。

Form1.Designer.cs は宣言や定義が書き込まれ、Form1.cs にはテンプレートが書き込まれます。このテンプレートの中に具体的にコーディングしてアプリを作ってゆきます。

一旦作成したイベントハンドラが不要になった場合は、Form1.cs と Form1.Designer.cs の両方で関連する部分だけを慎重に削除しないと、Visual Studio が混乱して面倒なことになります。

Program.cs には WinMain() 関数が書かれていてます。これはアプリが起動した時に最初に実行されるもので、終了時にもここへ戻ってきて必要な処理を行います。アプリが起動してからフォームのインスタンスを生成する前に必要な処理はここにコーディングします。

話を元に戻して、フォーム名とクラス名を実際に Display に変更します。

ソリューションエクスプローラで、Form1.cs で右クリックして[名前の変更] を選ぶと、Form1.cs が反転するので、そこで Display.cs となるように変更します。すると以下のメッセージボックスが現れます。

リファレンス 

ここで [はい]をクリックすると、自動で名称変更してくれます。他の関連ファイル名も変更され、主要ファイル名は以下のようになりました。
  • Display.cs
  • Display.Designer.cs
  • Program.cs
これら3つのファイル内に記述されている内容では、フォーム名とクラス名が Form1 から Display に変更されています。自動処理に任せるとフォーム名とクラス名が同じになります。どうしてもこれらを違う名前にする必要性が無い限り、この作法に従うことにします。

上記以外のファイル名も変更されているのは、ソリューションエクスプローラで確認できます。
Ver1.00ソリューションエクスプローラ 

Display.cs [デザイン] で表示されるフォームのタイトルバーは、まだ Form1 となっています。これはフォーム名やクラス名とも無関係で、単にフォームのテキスト (Display.Text) の設定が Form1 のままになっているためです。これは、フォームのプロパティで変更できます。プログラム中で変更するには Text プロパティを使って、

Display.Text = "変更する文字列";

とします。タイトルバーに表示するテキストをアプリの状況に応じて動的に変更したい時に使えます。

今回は、フォームのテキストを Form1 から MyClock に変更してみます。Display.cs[デザイン]を表示して、フォームをクリックすると、Displayフォームのプロパティ一覧が(右下に)表示されるので、そこで Text というキーを探して、Form1 から MyClock に変更します。この変更は Display.Designer.cs に自動的に反映されます。

全てのファイルが変更されたので、[F5] を押して、ビルドとデバッグモードでの実行を行います。
なお、ビルドする際に変更されたファイルは上書き保存されます。

Displayフォーム 
これで下準備終了です。


3. デジタル時計の部品を追加

時刻を表示するために、ラベルとタイマーの2つの部品を導入します。ラベルは 12:34:56 といった文字列を表示するための部品、タイマーは現在の時刻を取得するための部品です。

そして、タイマーで1秒ことに時刻と取得し、その結果をラベルに表示するように仕上げてゆきます。

ところで、Windows アプリは、四角い領域を視覚的に表示したウィンドウから構成されるのが基本です。タイトルバー付きのウィンドウ (C# や VB ではフォームという) であれ、ボタンであれ、文字列入力用のエディットボックス (C# や VB ではテキストボックスと言う) だろうと、全てウィンドウであって、味付けが違うだけです。

フォームに貼り付ける部品には、他にもメニューバーやツールバーなどがあります。タイマーも視覚効果は無いけれど部品の1つです。


部品の登録

Visual Studio (の左) にツールボックスがあり、そこには様々な部品が準備されています。これをウィンドウにドラッグ&ドロップすることで、これらのサブクラス化、インスタンス生成、宣言や定義などの初期的なコードが自動的に追記されます。

今回は、時間表示用に ラベル(コモンコントロール)とタイマー (コンポーネント) を使うことにします。

左にあるツールボックスをクリックて一旦ピン止めし、ラベルとタイマーをドラッグ&ドロップするとこんな感じになります。

部品登録 

フォーム内に label1 があり、フォーム外の下に timer1 があります。

この段階で、Display.cs と Program.cs は変更されず、
DisplayDesigner.cs では多くのコードが自動生成されているのが分かります。

namespace MyClock
{
 partial class Display
 {
  /// <summary>  /// 必要なデザイナー変数です。
  /// </summary>

  private System.ComponentModel.IContainer components = null;

  /// <summary>  /// 使用中のリソースをすべてクリーンアップします。
  /// </summary>
  /// <param name="disposing">マネージ リソースを破棄する場合は true を指定し、その他の場合は false を指定します。
  protected override void Dispose(bool disposing)
  {
   if (disposing && (components != null))
   {
    components.Dispose();
   }
   base.Dispose(disposing);
  }

  #region Windows フォーム デザイナーで生成されたコード

  /// <summary>  /// デザイナー サポートに必要なメソッドです。このメソッドの内容を
  /// コード エディターで変更しないでください。
  /// </summary>

  private void InitializeComponent()
  {
   this.components = new System.ComponentModel.Container();
   this.label1 = new System.Windows.Forms.Label();
   this.timer1 = new System.Windows.Forms.Timer(this.components);
   this.SuspendLayout();
   //
   // label1
   //
   this.label1.AutoSize = true;
   this.label1.Location = new System.Drawing.Point(101, 64);
   this.label1.Name = "label1";
   this.label1.Size = new System.Drawing.Size(35, 12);
   this.label1.TabIndex = 0;
   this.label1.Text = "label1";
   //
   // Display
   //
   this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
   this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
   this.ClientSize = new System.Drawing.Size(284, 261);
   this.Controls.Add(this.label1);
   this.Name = "Display";
   this.Text = "MyClock";
   this.ResumeLayout(false);
   this.PerformLayout();

  }

  #endregion

  private System.Windows.Forms.Label label1;
  private System.Windows.Forms.Timer timer1;
 }
}

ここでは、上の方でアプリケーション終了時に各部品を解放する処理、それ以下で追加した部品の定義とデフォルトのプロパティの設定が記述されています。


ラベルとフォームのプロパティ設定

ラベルとフォームのプロパティを設定して、以下のような外観にします。

Ver1.00外観作成 

先ずはラベルの設定:
ラベルをクリックすると(右下に)ラベルのプロパティが表示されるので、そこで以下のように変更しますます。
  1. デザイン - (Name) を currentTime
  2. 配置 - Dock を Fill
  3. 表示 - Font を MS UI Gothic のまま 36pt、太文字
  4. 表示 - Text を 12:34:56
  5. 配置 - Size は 192, 48 (マウスで大きさを調整するとこのくらいになる)
Text を 12:34:56 とすることで実際に時刻が表示された時のラベルのサイズを調整できます。
Doc を Fill にすることで、ラベルがフォームにうまく張り付きます。


次は、フォームの設定:
フォームのタイトルバーをクリックすると(右下に)フォームのプロパティを表示されるので、そこで以下のように変更します。
  1. ウィンドウ スタイル - Opacity を 50%
  2. ウィンドウ スタイル - TopMost を True
  3. デザイン - (Name) は Display になっている筈
  4. 表示 - FormBoderStyle を FixedToolWindow
  5. 表示 - Text は MyClock になっている筈
  6. 配置 - Size は 207, 85 (マウスで大きさを調整するとこのくらいになる)
Opacity 50% で半透明になり、TopMost True で最前面に表示されます。

では、[F5] を押して、ビルドとデバッグモードでアプリを実行をすると、

Ver1.00外観 

こんな感じで、アプリが起動します。半透明で最前面表示になっていることを確認します。

右上の[X]ボタンをクリックすれば終了。なおデバッグモードで実行している時は、
  • [デバッグの停止]ボタンを押すか、
  • メニューで [デバッグ(D)] - [デバッグの停止] を選ぶ
ことで、アプリを強制的に終了できます。

これで外観ができたので、時刻を表示する機能を作ります。


タイマーの設定

タイマーは 1 Tick が 1 ms (ミリ秒) です。1秒ごとに数字が変わるデジタル時計を作るのでタイマーの間隔 (Interval) は 1000 ms になります。そこで、タイマーの名前を secTimer に変更します。すると、タイマークラスの名前が自動的に secTimerに変更されます。

実際の作業は、ドラッグ&ドロップした timer1 をクリックして、(右下にある) timer1 のプロパティを変更することです。
  1. デザイン - (Name) を secTimer
  2. 動作 - Enabled を True  (これを忘れるとタイマーは動作しない)
  3. 動作 - Interval を 1000
フォーム、ラベルそしてタイマーのプロパティの設定を変更した結果は、全て DisplayDesigner.cs に反映されています。チョット眺めてみると、それぞれのクラスとメソッド(関数)の使い方のヒントが得られて大いに参考になると思います。但し、くれぐれも不用意な編集・変更には注意しましょう。


 現在の時刻を表示させる方法

ここまで一切コーディングせずに進めてきましたが、これ以降は実際にコードを書く必要があります。

Windowsプログラミングでは、発生したイベントを捕らえて、そこで必要な処理を記述するのが基本です。これは、ある単独の処理がCPUを占有しないための方策です。そうしないとマルチタスク処理が破綻してしまいます。

イベントを捕らえて必要な処理を行う部分をイベントハンドラと呼びます。

今回は、タイマーイベントが 1000 ms (=1秒) ごとに発生するのを利用します。タイマーイベントハンドラを作り、その中で現在の時刻をラベルに渡すようにコーディングするだけです。


タイマーイベントハンドラの作成

既に、secTimer という名前 (クラス名) でタイマーを作りました。

secTimerコントロール  

secTimer コントロールを、マウスの左ボタンでダブルクリックします。すると、自動的にイベントハンドラのテンプレートを作成し、それを表示してくれます。

タイマーイベントハンドラのテンプレート 



現在の時刻をラベルに渡す

コモンコントロールという視覚的に機能する部品は、データを受け取って表示する機能があります。

例えば、文字列を受け取れるコントロールに文字列を渡すには、以下のようにコーデイングします。

(コントロールのクラス名).Text = "文字列";

今回は currentTime と名前をつけたラベルコントロールに時刻の文字列を表示させるので、

currentTime.Text = (現在時刻の文字列);

とすれば良いわけです。currentTime クラスはラベルの基本クラスから全ての機能を引き継いでいて、Text プロパティも引き継いでいます。上の作業で自動的に作成された MyClockDesinger.cs には、この引き継ぎに必要なコードとプロパティ設定のコードが含まれています。

具体的には、

//
// currentTime
//

の下に currentTime に必要な処理が書かれています。


さて (現在時刻の文字列)を取得するには、DateTime クラスを利用します。DateTime クラスには Now というプロパティがあって、現在時刻を取得してくれます。さらに Now に対して ToSring() 関数も使えるようになっていて、これは時刻を書式に従って文字列に変換してくれます。つまり、

DateTime.Now.ToString("HH:mm:ss");

と書けば、現在時刻の文字列を返します。

従って、

currentTime.Text = DateTime.Now.ToString("HH:mm:ss");

の1行で、ラベルに現在時刻が渡されます。

Private void secTimer_Tick(object sender, EventArgs e)
{
  currentTimer.Text = DateTime.Now.ToString("HH:mm:ss");
}

それでは、[F5] を押して、ビルド後にデバッグモードで実行してみます。一応時計として動作しますが、起動直後の一瞬だけ以下の表示になります。

Ver1.00外観 

起動直後は、タイマーイベントハンドラが働かないのが原因です。


フォームの描画

タイマーイベントが発生する時(1秒ごと)に現在時刻の表示を行うようにコーディングしました。それ以外のタイミングでは時刻を表示しません。そしてフォームが表示されると同時にタイマーイベントが発生する保証はありません。

そこで、MyClock を起動し、そのフォームが描画されるタイミングで時刻表示をさせれば、問題が解決しそうです。フォームの描画はメッセージ を受け取ることで動作するのが Windows プログラムの基本なので、フォームを描画するイベントを捕らえて、現在時刻をラベル currentTime に渡せば良さそうです。

C# で最初に自動で作成されるソースコードには、フォーム描画のイベントハンドラが自動作成されていないので、自分で作る必要があります。タイマーイベントハンドラを作ったのと同様に、マウス操作だけでフォーム描画するイベントハンドラのテンプレートが作れます。

MyClockのフォーム (Display) のデザイナー画面を開きます。
  • ソリューションエクスプローラで Display.cs をダブルクリックするか、
  • ソリューションエクスプローラで Display.cs を右クリック - [ビューデザイナー(D)] を選ぶ
MyClock.cs 

ビューデザイナーを開く
 


Display.cs [デザイン] (フォームデザイナー) が開いたら、タイトルバーあたりをダブルクリックします。


Displayビューデザイナ 

すると、イベントハンドラのテンプレートが自動作成され、そのコードが表示されます。

フォームイベントハンドラ 

今自動作成されたイベントハンドラの中に

currentTime.Text = DateTime.Now.ToString("HH:mm:ss");

をコーディングすれば、フォーム描画時に現在の時刻が表示されます。

private void Display_Load(object sender, EventArgs e)
{
 currentTime.Text = DateTime.Now.ToString("HH:mm:ss");
}

では、[F5] を押して、ビルドと実行をします。

MyClock2

フォームが表示された直後から正しく時刻を表示されていることが確認できます。


コードの重複を避ける

取り敢えず機能面では完成ですが、少し気になることがあります。Display.cs のコードを眺めてください。

フォーム描画イベントハンドラ完成


ラベル currentTime に現在時刻を渡すコード

currentTime.Text = DateTime.Now.ToString("HH:mm:ss");

が、そのまま2カ所に記述されています。機能追加やプログラムの複雑化に備えて、関数に置き換えることにします。時刻を表示する関数なので、DisplayTime() とします。

DislayTime() の中に、この1行のコードを入れます。

Display_cs完成

念のため [F5] を押して動作確認します。


 MyClock Ver 0.10 を作る (2/2)







応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: プログラム関数電卓、Windowsプログラミング

リンク集 | ブログ内マップ

関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

番外編 - True Image でHDDの復帰をした

番外編
e-Gadget

2017/01/09

Windowsが起動しなくなったので、予め保存してあった HDD丸ごとイメージバックアップを使って、復帰作業を行いました。

PCは、Inspiron 11 3148  (Windows 10) です。

2006年版の True Image 8 から Acronis True Image を使っていて、今はWindows 10 対応した 2016 版を使っています。HDD丸ごとイメージバックアップは万一に備えてのことなので、これまで滅多にHDD を丸ごと復帰させることはなく、特に Windows 10 ではまだ一度も復帰させたことがありません。

バックアップが正しく作成されていなかったり、復帰で何か間違った操作をすればとても面倒なことになります。なので、不安でかなりドキドキしながら復帰しました。

うまく復帰できたのですが、今後ドキドキしないために、手順のメモを残します。



イメージバックアップの作成

一度完全バックアップを作っておくと、それに対して変化した分を継ぎ足しバックアップできて、時間とディスクスペースの節約になります。
True Image 2016 では、この継ぎ足しバックアップの方法については、多くのスキームを選べるようになっています。私は、今のところ増分バックアップを採用し、詳細をカスタマイズした設定て使っています。

継ぎ足しバックアップの利点は、何世代ものバックアップを履歴とともに限られたディスクスペースに保存できることだと思います。

面白いのは、一旦作ったバックアップファイルはエクスプローラで開くことが出来て、ファイル1個単位で取り出すことができるのが便利です。無くしてしまった必要なファイルをエクスプローラで選んでコピーができます。

マニュアルを読んでも何だかわからない場合は、チャットサポートがあるので便利です。チャットでサポートを始めて、その後電話サポートに切り替えてくれることもあり、Team Viewer を使ってサポートからの遠隔操作で対処することも可能です。

従って、本当に正しくバックアップが作れているかどうか不安がある場合は、サポートと連絡をとって疑問や不安を予め解消しておくと良いと思います。


復帰方法の選択

イメージ復帰は3通りあります。それぞれには、予め必要な準備があります。

1) Windows上からの復帰

マニュアルを読むと、細かな設定が可能であることから Windows上からの復帰を推奨しています。
HDD丸ごと復帰などは頻繁に行う作業でないので、細かな設定を全て理解して覚えておくことが出来ないかも知れません。この機会にマニュアルを細かく読んで、おおよそ全体を理解できたのですが忘れてしまう自信があります(^^;

Windows 回復ドライブからの復帰に必要なデータが書き込まれている特殊パーティションの復帰など、利用価値は有ると思います。
今回は、Windowsが起動しなくなったので、この選択肢は使えません。


2) レスキューメディアからの復帰

Windowsが起動しなくなった時のために、予めレスキューメディアを準備しておく必要があります。

True Imageのほぼ全ての機能を含んでPC起動が出来るメディアを CD か USB で作っておきます。復帰が必要な時にはこれらメディアを接続し BIOS (UEFI) でこれらメディアをブートドライブとして設定して、PCを起動すると Linux 版 True Image が起動します。

私は、SanDisk Cruzer Fit (16GB, USB2) でレスキューメディアを作ってあります。非常に小さいので無す恐れもありますが、持ち運びに殆ど支障が無いので、この USB ドライブを使うことにしました。



今回は、この方法を使いませんでした。理由は以下に書きます。


3) スタートアップ リカバリ マネージャからの復帰

PCの HDD に True Imageを起動するパーティションを作っておけるので、レスキューメディアすら不要です。

Windows上で True Imageを起動し、「ツール」をクリックして選び、さらに「その他のツール」をクリックすると、その "他のツール"のフォルダが表示されます。ここで "Activate Acronis Startup Recovery Manager" のショートカットからこの機能を起動して、Linux 版 True Image に必要なパーティションを作成できます。

こうしておけば、PCを再起動する時に、UEFI 起動の直後に、以下のように表示され、

Starting UEFI Loader(x64)(v.1.1.42)...
Press F11 for Acronis Startup Recovery Manager...

ここで、[F11] を押すと True Image が起動するので、そこから HDD丸ごと復帰ができます。復帰だけでなく Linux 版 True Image の他の機能も使えます。

BIOS (UEFI) でBootable Drive の設定の必要もなく、トラブル時にレスキューメディアが手元に無い可能性もあるので、Windows が起動できなくなった時は、私はこの復帰方法が一番良いと思います。

そこで、今回はこの方法を採用しました。



スタートアップ リカバリーマネージャからの HDD丸ごと復帰

PCの再起動時に [F11] を押すと True Image が起動します。

最初に表示される画面です。

Start 

"復元する" - "ディスク" をクリックすると、

Select File 1 

「アーカイブの選択」に移ります。ここで [参照] をクリックして、

Select File 2 

復帰させたいバックアップファイルを選んで [OK] クリック。

Select File 3 

これで、「アーカイブの選択」が終わり、[次へ(N)] をクリック。

左側に、復帰の準備状況の手順が表示されるので、少し安心!

復元方法 

「復元方法」の選択画面で、"ディスクまたはパーティション全体を復元する" を選んで [次へ(N)] をクリック、

復元対象 

「復元対象」設定画面で、全てにチェックを入れ、[次へ(N)] をクリック。

パーティション1-1の設定 

「パーティション1-1の設定」画面で、EFI システムパーティションの内容を確認して、そのまま [次へ(N)] をクリック。

すると、以下の表示でかなり待たされます。不安になりますが...

パーティション1-1の設定でのお待ちください 

やっと 「パーティションCの設定」 画面に推移しました。

パティションCの設定 

Windows システムのインストールパーティションの内容を確認して、[次へ (N)] をクリック、

また待たされますが、辛抱強く待ちます。

パーティション1-4の設定 

リカバリーパティション(工場出荷状態のディスクイメージを格納した回復パーティション、914MB))の内容を確認して、[次へ(N)] をクリック、

パティション1-5の設定 

もう一度、リカバリパーティション(Winidows 回復ツールを含んだ回復パーティション、11.22MB)の内容を確認して、[次へ(N)] クリック、

MBR設定 

「ディスク1のMBR」画面で、MBRの復元先ディスクに 内蔵 HDD 設定します。
ディスク1 にカーソルを合わせて、[次へ(N)] をクリック。

「ディスクシグネチャを復元」にクリックを入れ忘れたが、結果的に問題なし。

完了 

「完了」画面で、復元設定内容を確認します。

[実行(E)] をクリックすると、、復元が始まります。
ドキドキしながら作業を見守ります。

Recovering 

500GB のHDD復帰作業は2時間くらいかかりました。

Finish 

エラーメッセージもなく、無事に作業が終わったようです...

右上の [X] ボタンを押すと、このアプリが終了して、PCの起動が始まります。

無事に Windows が起動しました。

ところが、再帰起動すると 「F11 キーで スタートアップ リカバリ マネージャーを起動する表示が出ません。

そこで、Windows上で True Image 2016 を起動して、その中から Acronis Startup Recovery Manager を起動して、一旦無効化した後、サイド有効化しました。これで、問題は解消し、[F11] でスタートアップ リカバリー マネージャ の起動を確認しました。



True Image 2016 の活用

今回は、とあるアプリケションをインストールして試用した後、アンインストールした結果、Windowsが起動しなくなりました。

True Image 2016 には、Try&Decide という機能があって、これを先に起動してからインストールすると良さそうです。次回はこれを活用してみようと思います。



True Image 2016 のスタートアップ設定

私は、HDD丸ごとバックアップを不定期に行っていて、クラウドへのバックアップは行わないし、ファイル / フォルダのバックアップもわざわざTrue Image では行いません。必要と思う時に HDD 丸ごとイメージバックアップを行うだけです。

オリジナルのインストールでは、スタートアップに何か登録され、「クラウドの契約を更新しろ」だとか、最新バージョンの案内など、私には不必要なプッシュ情報が表示されます。無駄な動作にバックグランドで CPU パワーを無断で使われるのは好きでありません。

そこで、タスクマネージャで表示される3つのサービス(上から3つ)を全て無効にしています。

TruImage 不要なスタートアップ 

今回の復元でも問題がなかったので、これらの無効化での悪影響はなさそうです。

なお、Acronis のサポートに、これらのサービスの役割について問い合わせたところ、「製品を正常に使うために有効化してください」と言った意味の無い回答がありました。公式には無効化して良いと言ってはダメと教育されている可能性大です。

一応、詳細動作についての公式回答が無かったことはメモしておきます。




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ




keywords: Dell Inspiron 3148、 Windows10、外部ストレージ

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

番外編 - 外付け HDD、USBメモリ、SDカードを調べてみた

番外編
e-Gadget

2017/01/07

年末に手持ちの各種外部ストレージの速度比較をしてみました。

それまで、ストレージの速度については、USB2 より USB3 接続が速いだろう、程度にしか考えていなくて、特に気にしていませんでした。ところが実際に測定してみると興味深いことが分かったので、上の記事を書きました。

その結果をグラフにしてみると、傾向がよく分かるので、ここでまとめてみようと思います。

年末の大掃除で、USB Flash Memory で Princeton の激安 8GB USB3 メモリ (Xiao Tuen3, PFU-XT3S//8GK) が出てきたので、ここではそれも追加します。これは数年前にヨドバシカメラで 確か980円で安売りしていたもので、一時期メインで使っていたものです。

これらストレージの速度測定結果をグラフにしてみると、ちょっとした傾向が見えます。最新の状況と合わせて調べてみました。


外付けHDD

HDD Speed Comaprison 

グラフにすると分かり易いですね。
  • シーケンシャルアクセスとランダムアクセスがこんなに違うという実感が得られます。

5機種のうち、1機種のみが USB2 インターフェースです。一応 USB3 ポートに接続して測定した結果です。
USB2 HDD を USB3 ポートに繋ぐと明らかに速くなることは、年末の測定結果から分かっています。
  • USB2 よりも USB3 が圧倒的に速いことが実感できます。

たまたま私が持っている上記の HDD のなかで、Western Digital の Elements 25A2 (2TB USB3) がトップの成績なので、以下のストレージ別比較の代表選手としておきます。






USB3 メモリ

USB3 Speed Comparison 

シーケンシャルアクセスがランダムアクセスよりも圧倒的に速いことは分かりますが、製品によって傾向が異なります。チップの種類や特性の違いが出ています。

シーケンシャルアクセスについては、
  • 青の SanDisk Ultra Fit (128GB) や オレンジの Kingston DataTraveler (64GB) に対して、グレーの激安USB3メモリ Princeton PFU-XT3S (8GB) は、シーケンシャルリードでは明らかにが意外に検討しています。
  • しかし、激安USB3メモリは、シーケンシャルライトで意外に健闘しています。

ランダムアクセスでも、
  • グレーのPrinceton激安USB3メモリが書き込み性能で意外に健闘しています。ランダムライトはオレンジの Kingston DataTraveler (16GB) より比較として明らかに速い結果です。

全体のバランスを考えると、Kingston DataTraveler も悪くありませんが、私の好みで SanDisk Ultra Fit (128GB) をトップにします。並行輸入品ですが価格もお手頃です。





USB2 メモリ

USB2 Speed Comparison 

これらは、USB3 ポートに繋いで測定したものです。

USB2 メモリは、USB3 メモリよりも圧倒的に遅いものの、価格面ではかなり遊離なので、緊急時のブートドライブとして使うか、各種ソフトを入れたポータブルドライブとして使っています。

上記にはかなり古いものも含まれているので、チップ性能が向上した最近のものに軍配が上がると思います。中でも、性能トップを SanDisk Cruzer Fit (16GB) とします。5年保証付きで¥1,000 を切るのもポイントが高いと思います。






HDD、USB3 メモリ、USB2 メモリ、SDカードの比較

Storage Speed Comparison 

それぞれの代表選手に 今使っている SD カード (SDHC) を含めて比較した結果です。




速度でいえば、HDD と USB3 メモリは優劣が付けられませんが、HDD は、ギガバイト当たりのコストが圧倒的に有利で、ストレージ容量も圧倒的に多くなっています。

ちなみに、10TB の 3.5 インチHDD が登場しています。
世界最大容量・10TBのハードディスクついに発売、気になるお値段は?

この記事で、HGST製とありますが、Western Digital に買収されたので今は WD製です。

ちなみに、この記事を書いている時点で、最大容量が 10TB、Amazon では 4万円程度から入手できます。窒素に比べて熱伝導度が高く分子量の小さい(つまり軽くて、内部機構の抵抗を小さくできる)ヘリウムガスが封止されていてるようです。2年前(2014年) に 6TB の HDD が登場した時もヘリウム封止でした。

ヘリウムは全ての気体の中で最も漏れやすいので、封止が破れることが耐久性を左右するのでしょうから、内蔵HDDとして使う想定だと思います。技術の進歩により、持ち運びできる外付け HDD (2.5インチ) で 10TB が登場するのが楽しみです。




面白いのは、USB メモリも大容量化していて、現在は Kingston 製の最大 1TB のUSBメモリが発売されています。Amazonでも非常に高価ですが、いずれ指数関数的に価格が下がるでしょう。



そして、もうすぐ 2017年2月に Kingston から 2TB の USBメモリが発売予定です。
2TBのUSBメモリー、何に使う?…Kingstonが「DataTraveler Ultimate Generation Terabyte」を発表

SSD も 2TB 版が登場しており、確実に HDD からフラッシュメモリへの置き換えは進むのでしょう。当面は容量の面で HDD が有利ではありますが...

面白いことに、HDD メーカーの Western Digital が フラッシュメモリメーカーの SanDisk を買収したことも、HDD からフラッシュメモリへの世代交代を懸念してのことだと思います。


SDカードは、SD、SDHC そして SDXC の規格があって、これらSDカードの規格では、SDXC は最大 2TB ですが、SanDisk / WD が 1TB の SDXC のプロトタイプを発表しています。

現時点では、Samsung の 256GB SDXC が最大のようで、Amazonでは 200GB だと相対的にかなり安くなっています。 



SDXC カードは、カメラなどとのデータ保存&PCへの転送用といった用途があって、USB2 並の 転送速度よりもサイズが重要なのでしょう。



個人的には、最高速や最高容量のストレージを欲しいとは思わず、量産性が確保されて値段がこなれたものを使う主義だが、年末の速度測定をきかっけに調べてみた結果、業界動向なども分かり、今後は選定にある程度意識する気になりました。




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ




keywords: Dell Inspiron 3148、 Windows10、外部ストレージ

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

Casio Basic: ◢ (出力命令)

Casio Basic
コマンドリファレンス

Casio fx-5800P、fx-9860GII、fx-CG20、fx-CG50 で確認をとっています。Casio fx-FD10 Pro では互換性はあると考えられますが、実機で確認していないので「可能性」としてご覧ください。
最終更新 2017/01/03

fx-5800P / fx-9860GII / fx-CG20 / fx-CG50
◢ (出力命令)

◆概 要: プログラムを一時停止し、数字、文字列、式や関数の計算結果、コマンドの戻り値を出力する。

◆書 式: [出力内容]◢


出力命令 ◢ は、CasioBasic 独特のコマンド。

この出力命令は、プログラムを一時停止して出力を行い、[EXE] で一時停止を解除する一連の動作を行う。
プログラムの一時停止をせずに出力したい場合は、"   " (文字列出力)、や Locateコマンドを用いる。

※ 出力命令 でプログラムが一時停止した時の画面出力が、fx-9860GII と fx-5800P で違いがある。
・ fx-9860GII や fx-CG20/50現在の内部カーソル行に - DISP - (右から8桁使用) が上書き表示される。
 [EXE] キーを押せば - DSIP - 表示は消える。

・ fx-5800P: 画面最上部のステータス表示部に  DISP  アイコンが表示され、プログラム実行画面には特に何も表示されない。

(参考) " "  命令に関連した内部カーソル行について ⇒ Casio Basic コマンドリファレンス - " " (出力命令)






変数Aに5が代入されている時、
A◢
と記述すると、画面に5が表示される。


5→A◢
と記述すると、画面に5が表示される。


Aに1234が、Bに5678が代入されている時、
AxB◢
と記述すると、画面に 7006652 と表示される。


"OUTPUT TEST"◢
と記述すると、画面に OUTPUT TEST が表示される。


fx-9860GII や fx-CG20/50 での - DISP - 表示について
一時停止する時表示される - DISP - は、右から8桁を使用して、右橋に表示される。表示される行は、現在の内部カーソル行になる。内部カーソル行は プログラム起動後の出力命令 "  "  の実行回数で決まる。起動直後および "  " が実行されない時は1行目、1回実行されるたびに改行されて1つ下の行になる。" " が6回実行されると内部カーソル行が7行目になり、それ以降は " " が何回実行されても内部カーソル行は7行目のままとなる。

現在のカーソル行が1行目のの時、

Locate 1,1, "LINE"

を実行すると、LINE と表示されるが、

Locate 1,1,"LINE"◢

を実行すると、LINE の表示の上に、ー DISP ーが上書きされるので、LINE の表示が消える。

従って、"" を利用して内供カーソル行を所定の位置にしてから Locate コマンドを使うか、" " を一切使わずに内部カーソル行を1行目に固定した上で、Locate コマンドを2行目以下で使うように、プログラム上で考慮すると良い。

"":"":"":"":"":""
Locate X,Y,"LINE"


とすると、最初に "" を6回実行することで内部カーソル行を7行目にしいる。その後 Locate コマンドでの表示では、Y は 1~6 の範囲で使えば、- DISP - に表示を妨害されない。

(参考) ⇒ fx-9860GII への移植 - ピタゴラス数




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: fx-5800PCasioBasic出力命令プログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

Casio Basic: ⇒命令(条件ジャンプ)

Casio Basic
コマンドリファレンス

Casio fx-5800P、fx-9860GII、fx-CG20、fx-CG50 で確認をとっています。Casio fx-FD10 Pro では互換性はあると考えられますが、実機で確認していないので「可能性」としてご覧ください。
最終更新 2017/01/03

fx-5800P / fx-9860GII / fx-CG20 / fx-CG50
⇒命令 (条件ジャンプ)

◆概 要: 条件ジャンプを行う。

◆書 式: [条件][処理]


⇒命令は、CasioBasic特有の命令。

[条件]「真」の場合は[処理]を実行、そうでない場合([条件]「偽」の場合)は[処理]を飛ばして(ジャンプして)、次へ進む。

[条件]⇒[処理]まで は、改行なしで1行に書かないとエラーとなる。さらに⇒の前後にスペースが入ると、これもエラーになる。



If 文との類似性

[条件][処理]

は、

If [条件]
Then [処理]
IfEnd


と同等です。


複数条件分岐への応用

CasioBasicには、switch~case (C言語)やSelect~Case (VisualBasic)のような多条件分岐コマンドが用意されていません。
しかし、⇒命令を工夫すると、複数条件分岐処理ができます。この記法の利点は、Fall Through (フォールスルー)が実現できる点にあります。

[2014/02/23 補足] If Else と言う記法を使えば、複数条件分岐をスッキリと書くことができます。
CasioBasicコマンドリファレンス If文 参照>

Lbl 0
"N"?→N
N=1⇒Goto 1
N=2⇒Goto 2
N=3⇒Goto 3

N=4⇒Goto 4
Goto Z

Lbl 1
[処理1]
      例えば Locate 1,2,"ONE  " (スペース2個)
(Goto 0)

Lbl 2

[処理2]      例えば Locate 1,2,"TWO  " (スペース2個)
(Goto 0)

Lbl 3
[処理3]
      例えば Locate 1,2,"THREE" (スペースなし)
(Goto 0)

Lbl 4
[処理4]
      例えば Locate 1,2,"FOUR " (スペース1個)
(Goto 0)

Lbl Z


この記法には、重要な注意点があります。

※ 重要な注意点: 赤文字で示した Goto Z Lbl Z は絶対に省略しないこと!
※ 応用上の注意点: (Goto 0) は省略可能です。但し必要な時のみ省略すること。

この記法には、Goto を正しく使うことが条件で、1つ利点があります。青文字出示した (Goto 0) を省略すると Else If の記法では実現しない機能が得られます(Fall Through、フォールスルーが可能になります)。

(Goto 0) を省略すると、下のラベルの処理を連続して行えます。ラベルの並び順を工夫することで処理の効率化が可能になります。

柔軟で有名なC言語での以下のような記法と同等なことがCasioBasicで実現できるわけです。そのため、敢えて Goto を使った記法を紹介しています。

switch (E) {
    case 4:
        [処理4]
        break;
    case 3:

        [処理3]  // フォールスルー
    case 2:
        [処理2]
        break;
    case 1:
        [処理1]
        break;
}


ここで、break; は Goto 0 に相当します。Eが3の時、case 3: へジャンプし、ここには break; が無いので、続いて case 2 の処理を実行します。

これを CasioBasicの上の記法を用いると以下のようになります。

Lbl 0
E=4⇒Goto 4
E=3⇒Goto 3
E=2⇒Goto 2
E=1⇒Goto 1
Goto Z


Lbl 4
[処理4]
Goto 0

Lbl 3

[処理3]

Lbl 2
[処理2]
Goto 0

Lbl 1
[処理1]
Goto 0


Lbl Z


[2014/12/14 修正: (Goto Z) を (Goto 0) に変更]



If文と⇒命令の処理速度比較

If ~Then~IfEndを使った以下のプログラムの処理時間は21秒。
0→L:0→H
1000→C
Lbl 0
Ic C>500
Then Isz H
IfEnd

Dsz C
Goto 0
"DONE"


⇒命令を使った以下のプログラムの処理時間は20秒
0→L:0→H
1000→C
Lbl 0
C>500⇒Isz H
Dsz C
Goto 0
"DONE"



命令は If 文よりも僅かに処理速度が速く、表記が分かりやすいので利用価値の高い命令です。


一方、Elseを用いたIf文では、事情が少し異なります。
If ~Then~Else~IfEndを使った以下のプログラムの処理時間は28.5秒。
0→L:0→H
1000→C
Lbl 0
Ic C>500
Then Isz H
Else Isz L
IfEnd

Dsz C
Goto 0
"DONE"


⇒命令を使った以下のプログラムの処理時間は32秒
0→L:0→H
1000→C
Lbl 0
C>500⇒Isz H
C≦500≦Isz L

Dsz C
Goto 0
"DONE"


従って、2者択一の条件分岐は、If文を使った方が速いことが分かります。

fx-5800P の場合、処理速度の絶対値が変動するようなので、相対比較しか出来ません。



応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 




keywords: fx-5800PCasioBasic命令プログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

Casio Basic: Locate

Casio Basic
コマンドリファレンス

Casio fx-5800P、fx-9860GII、fx-CG20、fx-CG50 で確認をとっています。Casio fx-FD10 Pro では互換性はあると考えられますが、実機で確認していないので「可能性」としてご覧ください。
最終更新 2017/01/03 更新

fx-5800P / fx-9860GII / fx-CG20 / fx-CG50
Locate

◆概 要:
数字や文字を画面内の指定した座標に出力する。

◆書 式: Locate [x 座標],[y 座標],[出力内容]

◆引 数:
[x 座標] (左端からの1から始まる桁数)
  fx-5800P: 1 ~ 16 のいずれかの整数値。
   - これ以外の数値を設定するとエラーになる。
   - 正数、変数、式、この範囲の正数を返す関数やコマンドも設定可能。
  fx-9860GII や fx-CG20/50: 1 ~ 21 のいずれかの整数値。
   - これ意義亜の数値を設定するとエラーになる。
   - 正数、変数、式、この範囲の正数を返す関数やコマンドを設定可能。
   ※ 画面の左上が原点(1,1) 、x座標は右へ行くほど大きくなる。

[y 座標] (上端からの1から始まる行数)
  fx-5800P: 1 ~ 4 のいずれかの整数値。
   - これ以外の数値を設定するとエラーになる。
   - 正数、変数、式、この範囲の正数を返す関数やコマンドを設定可能。
  fx-9860GII や fx-CG20/50: 1 ~ 7 のいずれかの整数値。
   - これ以外の数値を設定するとエラーになる。
   - 正数、変数、式、この範囲の正数を返す関数やコマンドを設定可能。
   ※ 画面の左上が原点(1,1)、y座標は下へ行くほど大きくなる。

[出力内容]: 数値、変数、式、文字、文字列、値を返す関数やコマンドを設定可能。
    文字および文字列は "   "で括る

◆戻り値: なし



ENGモードが On になっている時は、Locate による表示で、空白が付加されることがあるので、要注意です。
 ⇒ Casio Basic コマンドリファレンス: EngOn / EngOff / Eng




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 




keywords: fx-5800PCasioBasicLocateプログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

Casio Basic: Prog

Casio Basic
コマンドリファレンス

Casio fx-5800P、fx-9860GII、fx-CG20、fx-CG50 で確認をとっています。Casio fx-FD10 Pro では互換性はあると考えられますが、実機で確認していないので「可能性」としてご覧ください。

最終更新 2017/01/03

fx-5800P / fx-9860GII / fx-CG20 / fx-CG50


Prog


◆ 概 要: サブルーチン呼出コマンド (プログラム呼出コマンド)

◆ 書 式: Prog "[プログラム名]"

◆ 引 数: プログラム名

◆ 戻り値: なし


Prog はプログラムを呼び出しすコマンドです。

プログラム中でプログラムを呼び出すので、サブルーチン呼び出しに使えます。

メインルーチンとサブルーチンは、いずれも独立したプログラムであって、メインルーチンとサブルーチンの違いは呼出関係で決まります。呼出元のプログラムをメインルーチンと呼び、呼び出されるプログラムをサブルーチンと呼びます。サブルーチンとして作成したプログラムも、それだけで独立して動作します。



呼び出されたサブルーチンの実行が終了すると、メインルーチン内の呼出元の位置へ戻ります。サブルーチンが Returnコマンド で終了した場合も、メインルーチンの呼出元の位置へ戻ります。

サブルーチンが実行されている間は、メインルーチンの動作は一時停止します。サブルーチンとメインルーチンが同時に動作することはありません。



サブルーチンからサブルーチンを階層的に呼び出すこと(ネスティング)ができます。ネスティングの階層(レベル)には限度があり、10階層(レベル)が最大です。

PROG 1
Prog "ROUTINE 1"

ROUTINE 1
Prog "ROUTINE 2"

ROUTINE 2
Prog "ROUTINE 3"

    :
    :
    :

ROUTINE 9
Prog "ROUTINE 10"

階層呼出(ネスティング)で、10階層を超えて呼出を行うと「ネスティング エラー(Ne ERROR)」が発生します。





大域変数

サブルーチンで使用する変数とメインルーチンで使用する変数は共有されます(大域変数 / グローバル変数)。
メインルーチンとサブルーチンで共用されている変数がサブルーチンで変更されると、メインルーチンへ戻った時には、その変数の内容が変更されています。

MAIN
0→A
Prog "SUB"


SUB
5→A

この MAIN プログラムを実行すると、プログラム SUB が呼び出されます。SUBプログラムでは、Aに5を代入していて、この時点で MAIN で使われている変数 A  は MAIN と共用されているので、 5 が格納されます。つまり、SUBの実行が終了してMAINへ戻った時には、既にプログラム MAIN の変数A は5に変更されています。
 


ラベルの範囲

Goto / Lbl で使用するラベルは、メインルーチンとサブルーチンで共有されません。サブルーチンで Goto 1 を実行すると、そのサブルーチンにある Lbl 1 にジャンプしますが、メインルーチンにある Lbl 1 へはジャンプしません。Goto / Lbl は1つのプログラム内だけで使えて、他のプログラムへジャンプすることはありません。




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 




keywords: fx-5800PCasioBasicReturnプログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

Casio Basic: Return

Casio Basic
コマンドリファレンス

Casio fx-5800P、fx-9860GII、fx-CG20、fx-CG50 で確認をとっています。Casio fx-FD10 Pro では互換性はあると考えられますが、実機で確認していないので「可能性」としてご覧ください。
最終更新 2017/01/03

fx-5800P / fx-9860GII / fx-CG20 / fx-CG50
Return

◆ 概 要: サブルーチンを強制終了させ、呼出元のメインルーチン内の、呼び出された位置に復帰するコマンド

◆ 書 式: Return

◆ 引 数:なし

◆ 戻り値:なし


実行中のサブルーチン強制終了させ、メインルーチン内にある、そのサブルーチンを呼び出した位置へ復帰する。

メインルーチンで Return コマンドを実行すると、メインルーチンを終了させる。


Returnコマンドは、サブルーチンで実行すると実行されたサブルーチンのみを終了させ、メインルーチンは終了させない。




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 




keywords: fx-5800PCasioBasicReturnプログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

Casio Basic: 配列変数

Casio Basic
コマンドリファレンス

Casio fx-5800P、fx-9860GII、fx-CG20、fx-CG50 で確認をとっています。Casio fx-FD10 Pro では互換性はあると考えられますが、実機で確認していないので「可能性」としてご覧ください。
最終更新: 2017/01/03

fx-5800P
配列変数 Z[ ] 

◆ 概 要:
インデックス付き変数。多くの高級言語でいう 配列 と似ている。Z[ ] の [ ] 内に1以上の整数のインデックスを入れて使う。 インデックスに0(ゼロ)や負の整数を指定するとエラーとなる。配列変数は、通常の変数と同様に数値のみを代入可能 (文字列には対応していない)。

変数領域を確保してから使用する必要があり、変数の数を指定して領域確保する。メモリが許す限りの領域を確保できるが、配列変数を多く確保すると、その分プログラム領域が減る。


◆ 領域確保 
50→DimZ

DimZ[SHIFT] [・] と入力する。
この例では、50個の配列変数を確保し、Z[1]、Z[2]、・・・ Z[49]、Z[50] を使える 
※ 領域確保を行うと、各配列変数は0で初期化されます。


◆ 領域解放
0→DimZ

0個の領域確保をすれば、領域解放となる。


◆ インデックス
数値や変数を使える。1以上の整数を返す式も使える。配列変数をインデックスにすることもできる。


※ fx-9860GII や fx-CG20/CG50 の場合、搭載 Casio Basic には配列変数が無いので、配列変数の代わりに行列かリストを使う。リストよりも行列の方が処理が速いので、行列の使用を勧める。



プログラム事例

fx-5800P では、インデックス付き変数という配列変数の特性を活かした使い方があります。

参照テーブル(但し1次元)としての使い道が最もふさわしいと思われます。但し、配列変数を使う場合は、アクセス速度が非常に遅いことを十分に留意する必要があります。実行速度が必要な場合は配列変数の利用は最小限にすべきです。


キーコードに対応するテンキーの値を返す事例 [2015/04/30 修正]

87→DimZ
1→Z[35]:2→Z[36]
3→Z[37]:4→Z[21]
5→Z[22]:6→Z[23]
7→Z[31]:8→Z[32]
9→Z[33]:0→Z[25]


Do
Getkey→K
Locate 1,1,"  "
Locate 1,1,Z[K]
LpWhile K=0
0→DimZ

これを実行すると、押したテンキーの値が表示されます。「入力命令: ?」 以外の方法で、テンキー入力を得る一例です。
この方法の利点は、入力を自在に操れる点にあります。入力のエコーバックをさせたくない、入力のエコーバックを自由な位置に表示したい、テンキーを入力させ ONE、TWO、・・・と対応する内容を表示させる...など、自在な入力機能を実現可能です。



フィボナッチ数列の1項から50項までの総和を計算する事例

フィボナッチ数列は、
・1項と2項がそれぞれ1
・3項目以降は、「1つ前」と「2つ前」の項の和になる

1 1 2 3 5 8 13 21 34 55 ...と続く

100→DimZ
1→Z[1]:1→Z[2]
2→S
For 3→I To 50
Z[I-2]+Z[I-1]→Z[I]
S+Z[I]→S

Next
0→DimZ
S◢


これを実行すると、正解の 2147483646 が表示されます。




配列変数へのアクセス速度

配列変数へのアクセスは、通常変数に比べて大変遅いことがわかっています。

通常変数を使ったプログラム
0→A
1000→C
Lbl 0
A+C→A
Dsz C
Goto 0
A◢


これを実行すると、約15秒で結果A (500500) が表示されます。


配列変数を使ったプログラム
1→DimZ
1000→C
Lbl 0
Z[1]+C→Z[1]
Dsz C
Goto 0
Z[1]◢


これを実行すると、約50秒で結果 Z[1] (500500) が表示されます。

この実験結果では、配列変数への入出力は、通常変数に比べて3倍近く時間がかかります。従って配列変数へのアクセスが頻繁なプログラムは動作が非常に遅くなることに留意すべきです。




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 




keywords: fx-5800PCasioBasic配列変数プログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

最新記事
検索フォーム
最新コメント
カテゴリ
C# (3)
Visitors
Online Counter
現在の閲覧者数:
プロフィール

やす (Krtyski)

Author:やす (Krtyski)
since Oct 30, 2013


プログラム電卓は、プログラムを作って、使ってナンボ!

実際に触って気づいたこと、自作プログラム、電卓プログラミングについて書いています。

なお管理人はカシオ計算機の関係者ではなく、Casio Basicが面白いと感じる1ユーザーです。


写真: 「4駆で泥んこ遊び@オックスフォード郊外」

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR