スポンサーサイト
- 2022.01.16 Sunday
一定期間更新がないため広告を表示しています
- -
- -
- -
C++/CLI初心者入門をはじめてから、1年になります。
まだ、説明していない項目が山ほどありますが、
全部書いていたら私の寿命がきてしまいます。
いちおう、これまでやってきたまとめとして書いて、
この初心者入門シリーズは終わりにしたいと思います。
なぜか、一般のプログラムの説明は、(わざと?)分かりにくく書かれています。
読むたびに、本当は教えたくないんじゃないか?と思うことがあります。
ここでは、極力イメージしやすいようにしたつもりです。
もちろん、この説明も素人がしていますので、説明のしかたは正確ではありませんが、
なんとなくわかって、もらえば幸いです。
プログラム全般
基本的にプログラムは、一度に書くと分かりにくいので、複数の
Header(拡張子.h)プログラムとひとつのmainプログラム(拡張子.cpp)に分けて作ります。
おもに、関数(クラス等)や定義などをheaderに書くのですが、例外的に
form(ボタンなどを使うもの)を使ったものは、Headerにメインを書いていきます。
プログラムの中で、クラス内、関数内だけで使うときは、private:
全体で使うときは、public:
省略すると、privateです。
注釈文を付けるには、//を頭につける。
基本形
int A; 整数型(小数点なし)
double A; 実数型(小数点あり)
char A;文字型(一文字の時)
string A:文字列型(多くの文字)ですが、string^ A;と^を付ける。
^とつけると文字列のポインタ(場所の情報)を使って値をもらうということ。
(正確ではありませんが、10番地をAとするともらう値が100番地にあるとすれば、
10番地Aは「100番地の値です」という値になる。
ついでに、B=&A(変数)はBはAの変数のアドレス、B=*A(アドレス)はBはAのアドレスの値です。)
Datetime A;日付時間型(例:2017/01/25 16:25:30など) 今日の日付は、 DateTime::Today
bool A:論理型(結果によりfalse 0かtrue 1になる)
const A;定数で値を変更できない(同じようなもので、#define 文字列1 文字列2があります。これは、翻訳時に文字列1を文字列2に変えて実行するというものです。)
あと、わかりにくいのが、参照型です。
object名 A;object(クラス内のプログラム)をA(インスタンス名)と関連つける
A = gcnew クラス名();とするとAという名前でクラス名()のプログラムが使えるようになる。
(ボタンの例)
private: System::Windows::Forms::Button^ button1;
private: System::Windows::Forms::Button^ button2;
this->button1 = (gcnew System::Windows::Forms::Button());
this->button2 = (gcnew System::Windows::Forms::Button());
配列を宣言する。array<doubleやint>^変数名
文字の配列の宣言は、 array<String^>^変数名 = gcnew array<String^>(配列数)
二次元配列の宣言(文字)は、 array<String^,2>^変数名=gcnew array<String^,2>(配列数,配列数)
の,2のところが、次元数です。
そのほかいろいろありますが、ネットで調べてください。
関数形(ボタンなどイベントで自動的にできるものなど)
一般的なかたち(プロトタイプ):
RETURNで返す型 関数名(引数){実行文、return 値}
例:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
}
RETURNで返す型 System::Void
関数名 button1_Click
(引数)(System::Object^ sender, System::EventArgs^ e)
returnで返す必要がないときや引数がないときは、void
returnする値がないときはreturnのみで文の最後であれば省略可(逆に途中であれば必ず付けてください)
下の実行文は、ほとんどこの形で作られています。
よく使う実行文の例(これまで使ってきたもの)
フォームの部品関係
ラベルに表示するには、label -> Text = L"文字列";
テキストボックスを読み取りは、string^ a = textBox -> Text;
テキストボックスにフォーカスを移す。textBox->Focus();
リストボックスにアイテムを追加する。listBox->Items->Add(文字列);
リストボックスのアイテム数を取得する。listBox->Items->Count;
リストボックスの項目を削除する。listBox->Items->Remove(項目番号);
リストボックス(現在選択している)の項目番号は、listBox->SelectedItem
リストボックスの項目の移動は、listBox->SelectedIndex = 項目番号
リストボックスの内容の呼び出しは、string^ a = listBox->Text;
リストボックスの初期化は、listBox->Items->Clear();
コンボボックスは、リストボックスと同じように使う、
コンボボックスのテキストは、comboBox->Text
ファイル保存のダイアログは、saveFileDialog
保存ダイアログの表示は、saveFileDialog->ShowDialog();
保存ダイアログから渡されたファイル名は、saveFileDialog->FileName;
保存ダイアログの保存ボタンが押されたか: System::Windows::Forms::DialogResult::OK
ファイル読込のダイアログは、openFileDialog
入力関係
押されたキーを得るのは、keys::キーボードのキー名
押されているキーのキー番号は、(char)keys::キーボードのキー名
ボタンが押されたことの初期化、e->handled = true;
分岐関係
数字や文字を比較する iF( 条件式 ) 命令文;または{実行文;実行文}
(条件式は、== 等しい、!= 等しくない、>大きい、<小さい、>=大きいか等しい、<=小さいか等しい、&&かつ、||または、!でない)
if文の条件を満たさないとき else 実行文;または{実行文;実行文}
swith文(式){case 定数1;実行文; case 定数2;実行文;case…}は式と定数が等しければ実行
for文とは、for(int i=0;i<c;i++){実行文}カッコの中の真ん中が成り立っている間は{}の命令を実行
while文とは、while(条件式){実行文}条件式が成り立っているときは、{実行文}内を実行する 。
(カウントなどをあらかじめ設定し、永久ループにならないように注意してください。)
for each (変数 in 配列変数){実行文}配列変数から1行づつ変数に入れて{}内の処理をする。
配列が終わったら処理を抜けます。
比較関係
double::TryParse(a,b)とは、 aが数字のdouble型なら真(ture)で、bに代入,違えば偽(false)を返す。
(bool a = double::TryParse(a,b); aはtrueかfalseになる)
表示関係
メッセージボックスを表示は、messageBox::Show("文字","タイトル名",ボタンの形,その他)
16進数の表示は、Convert::ToString(変数,16);例 MessageBox::Show(Convert::ToString(bspeed,16));
ファイル関係
文字配列をまるごと保存する。File::WriteAllLines(ファイル名,配列名)
ファイルを開くダイアログは、openFileDialog->ShowDialog()
開くで指定したファイル名は、openFileDialog->FileName
文字配列に読み出しは、File::ReadAllLine(ファイル名)
ファイルを書き込むときのエンコード: File::WriteAllText(ファイル名,変数,Encoding::GetEncoding("Shift_JIS等"));
(ただし、ネームスペースに using namespace System::Textが必要 )
テキストを保存する。File::WriteAllText(ファイル名,テキスト名);
バイナリデータの保存は、File::ReadAllBytes(ファイル名);
例array<Byte>^ content = File::ReadAllBytes(saveFileDialog1->FileName)
バイナリデータの呼び出しは、File::WriteAllBytes(ファイル名,保存先);
文字関係
文字列を数値に変換は、double a = double::Parse(textBox->Text);
数値を文字列に変換は、textBox = a.ToString();(数字の出力形式を整える、.ToString("#,#")など)
文字列をつなぐには、string^ a="文字列"+"文字列";
フルパスからファイル名を取り出す: Path::GetFileNameWithoutExtension(フルパス名)
ファイル名からの拡張子の取り出しは、Path::GetExtension(ファイル名)
文字を分けるときには、split('区切り文字');例mytext = aa->Split('¥t');は
文字列(aa)をタブ(¥t)で区切って配列変数(mytext)に入れます。
計算式
カウントをとるには、i++とはi=i+1と同じでiを1づつ増やす。(逆に減らすならi--)
累計をするには、a=a+変数、または、a+=変数(逆に減らすならa-=変数)
実行関係
キーボードを押すことでボタンをクリックしたことにする、button->Performclick();
コマンドラインの実行: Process::Start(実行ファイル名)
参考:テキストボックス2の中を実行するときの例
ProcessStartInfo^ startInfo = gcnew ProcessStartInfo(textBox2->Text);
Process::Start(startInfo);
これまで、使ってきたものだけですので、ほかにも山ほどあります。
説明が分かりにくいものは、随時直していきますので、ご容赦願います。
ただいま編集中です。
JUGEMテーマ:PC関連
いまさらですが、メインプログラムのMyform.cppの簡単な説明を書いておきます。
なにしろ、素人が説明していますので、正確ではありませんが、イメージとして知っておいてください。
上のようにC++Windows Formを選んでOKボタンを押して実行すると
自動的にMyForm.cppが出来ています。
ダブルクリックをすれば、
が表示されます。
これが、メインプログラムとなります。
以下が、簡単な説明です。
#include "MyForm.h"
は、Myform.hのプログラムが含まれるという意味です。
(ここに、Myforn.hのプログラムが書いてあると思ってください。)
using namespace System;
using namespace System::Windows::Forms;
はnamespace:Systemと名前の付けられた中の、Windowsと名前の付けられた中の
formsと名前の付けられた中にある命令文を使います。という宣言です。
(#includeはnamespaceの前に書いてください。名前がこんがらがってしまいます。)
[STAThread]
は、ここからプログラムを始めますという意味です。
void Main(array<String^>^ args)
は、Mainと名前がついているように、メインプログラムでここからプログラムが始まります。
カッコ内の配列は、引数(args アーギュメント)で与える値です。
Application::EnableVisualStyles();
は、ほんとは、System::Windows::Forms::Application::EnableVisualStyles()ですが、
using namespaceで宣言してますので短く書くことができます。
フォームの外観を既定のものにするという意味です。
Application::SetCompatibleTextRenderingDefault(false);
は、フォームの中の文字列の描き方です。
CppWinForm11::MyForm form;
は、namespaceのCppWinForm11の中のMyFormはformですと宣言します。
CppWinForm11は最初にプロジェクト名で付けた名前です。
参考:myform.h
Application::Run(%form);
は、先ほど名付けたformを終了するまでループで実行します。
頭の%は、どこのメモリにformがあるのかを探してくれて、それを実行します。
ここは、ポインターを説明しなくてはならなのですが筆者ではうまく説明できません。
また、CppWinForm11::MyForm form;をやめて、直接
Application::Run(gcnew CppWinForm11::MyForm);
としてもらっても動きます。
JUGEMテーマ:PC関連
これまでの説明で、プログラミングの基本的なことは行ってきました。
よく使われる、IF文、FOR文、配列を使えばだいたいのプログラムを作ることができます。
そこで、サンプルとして、ちょうど4月に入ったので、名簿ソフトを作ってみたいと思います。
学生名簿や社員名簿になるように、いままでのものをベースにして作成します。
基本的な機能しかありませんが、それだけにいろんなものに応用できると思いますし、
また、自分で機能を追加するのも、面白いと思います。
名簿ソフトの仕様書としては、
入力:氏名、性別、生年月日、備考
機能:追加、表示、修正、削除、ファイル保存、ファイル呼び込み
出力:テキストファイル
ですが、入力項目名は、生年月日や備考を電話番号やメールアドレス等にしてもらっても何の問題ありません。
新規プロジェクトを選択して、名前を付けて立ち上げたのち、
Header FilesのMyForm.hをクリックしてください。
MyForm.h[デザイン]で下のように作成してください。
氏名、性別、生年月日、備考の見出しは、labelのプロパティのTextで入力してください。
氏名の表示部分(左側)はListBoxです。
また、入力の欄には、textBoxを使っています。
なお、性別の入力では、あわせてcomboboxを使います。
comboboxのアイテム(Item)の男性、女性をプロパティのItemsで作っておいてください。(下記参考)
コンボボックスも機能的にはリストボックスと同じように使います。
前に説明したように、最初のmanespaceにusing namespace System::IO;を追加しておいてください。
データを扱い易くするために、2次元配列を使います。
array<String^,2>^meibo=gcnew array<String^,2>(100,5);
は変数のmeboは100行5列のデータを作ります。ので100人分のデータを扱えます。
array<String^>^meibof=gcnew array<String^>(500);
のmeibofはファイル保存、呼び出し用の変数です。
変数のcはリストボックスの位置などに使います。
関数のskk()はテキストボックスの初期化用です。
関数のmda()はテキストボックスの内容を配列に入れます。
初期設定として、ファームを表示したときに、
今日の日付、DateTime now = DateTime::Today;を入れてます。
Datetimeとは、日付形式という意味です。変数のnowにDateTime::Todayをいれると
今日の日付が、日付形式で入ります。
追加ボタンを押したとき
修正ボタンを押したとき
削除ボタンを押したとき
データ保存ボタンを押したとき
データ呼出ボタンを押したとき
リストボックスをクリックしたとき
コンボボックスを選択したとき
このように、それぞれのイベントに対してコードを書いていきます。
いままでの、初心者入門の1から8まで読んでいただければ、理解できると思います。
ただ、二次元配列になってますので、ちょっと複雑かもしれません。
少しでも解かりやすいように、配列は1から使用しています。(meibo[1~99,0]は使っていないので、好きに使ってください)
例)AKB48のメンバーを入力してみたところ
今回のまとめです。
二次元配列の宣言(文字)は、 array<String^,2>^変数名=gcnew array<String^,2>(配列数,配列数)
の,2のところが、次元数です。
日付時間の変数の形式は、DateTime
今日の日付は、 DateTime::Today
コンボボックスは、リストボックスと同じように使う、
コンボボックスのテキストは、comboBox->Text
ここまでできるようになれば、立派なプログラマーです。
なので、いちおうこのシリーズは終了させていただきます。
あとは、番外編をつくる予定です。
追記:
記事の最初の部分で説明不足がありましたので、追記しておきます。
リストボックス1の氏名については、MyForm[デザイン]のlistBox1のプロパティでItemsにおいて氏名を設定しておいてください 。
次の記事は(応用編その〜1〜)となります。
一般的なWin32を使ったものは、(ゲーム編その〜1〜)となります。
追記:
を作りましたので、いままでの流れについて復習してみてください。