Developer Camp

Similar documents
C#の基本

「RAD Studio XE5によるマルチ言語/マルチデバイス開発の進め方」

24th Embarcadero Developer Camp

プログラミング実習I

テキストファイルの入出力1

プログラミング基礎I(再)

8th CodeGear Developer Camp

Microsoft Word - VB.doc

Prog2_6th

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

10th Developer Camp - B5

目次 はじめに... 3 システムの必要条件... 4 ライセンス認証... 4 アクティベーション... 6 開発... 7 手順 1. アプリケーションの作成... 7 手順 2. データソースの作成と代入... 7 手順 3. テンプレートの作成 手順 4. レポートビューアの追加

Javaの作成の前に

VB.NET解説

Java言語 第1回

PowerPoint プレゼンテーション

ルーレットプログラム

PowerPoint プレゼンテーション

Visual Studio2008 C# で JAN13 バーコードイメージを作成 xbase 言語をご利用の現場でバーコードの出力が必要なことが多々あります xbase 言語製品によっては 標準でバーコード描画機能が付加されているものもあるようで す C# では バーコードフォントを利用したりバー

JavaプログラミングⅠ

メディプロ1 Javaプログラミング補足資料.ppt

Microsoft Word - C言語研修 C++編 3.doc

AquesTalk プログラミングガイド

第 1 章 : はじめに RogueWave Visualization for C++ の Views5.7 に付属している Views Studio を使い 簡単な GUI アプリケーションの開発手順を紹介します この文書では Windows 8 x64 上で Visual Studio2010

AquesTalk Win Manual

HCI プログラミング 8 回目ボタン チェックボックス ラジオボタン 今日の講義で学ぶ内容 ボタンとアクションイベント ボタンのカスタマイズ チェックボックスとラジオボタン ボタンとアクションイベント 1 ボタンを配置してみましょう ボタンは ラベルと同じようにフォントやその色 画像の貼り付けなど

グラフィックトレーニング 概要.NET のグラフィック描画は どんなことができるのでしょうか? グラフィックオブジェクトやグラフィック環境 概念を理解するためには クラスを使って馴れることが近道です 本 書に記載されているコードをカットアンドペーストして 一つ一つの機能を体験してください 前提 グラ

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

JavaScript 演習 2 1

JavaScript演習

PowerPoint Presentation

Webコンポーネントのカスタマイズ入門

ミガロ.製品 最新情報

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

Microsoft PowerPoint - CproNt02.ppt [互換モード]

memo

WPF アプリケーションの 多言語切替

AquesTalk Mac マニュアル

ブロック パニック

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

Delphi/400バージョンアップに伴う文字コードの違いと制御

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

JavaプログラミングⅠ

文字列操作と正規表現

FastReportへの効率的な帳票レイアウトコンバート

Java言語 第1回

TestDesign for Web

Microsoft Word - J-jdev_dba_db_developers.doc

(一日目前半)2017SV演習C++CLI

プログラミング基礎

14.event-handling

Userコントロール

今どきのC++開発をもっと楽にする3つの武器

Embarcadero Developer Camp

Transcription:

1B Delphi/C++ チュートリアルセッション C++Builder 5/6 ユーザと初心者のための C++Builder2010 入門 株式会社日本情報システム 筑木真志

アジェンダ C++Builder についての簡単なおさらい C++Builder 2010 で簡易 CSV ビュワーを作る C++Builder 5/6 から C++Builder 2010 への移行ポイント 2

C++Builder についての 1 簡単なおさらい

C++Builder 2010 の特徴 C++Builder は 高速アプリケーション開発 (RAD) 用のオブジェクト指向のビジュアルなプログラミング環境 コンポーネント と呼ばれる部品をウィンドウに貼り付けてアプリケーションが作成できる Unicodeの全面的採用 言語の記述はC++ 膨大なC/C++ のソースコード ライブラリが使用できる 次期標準 C++ であるC++0xに部分的対応 次期標準 C++ ライブラリTechnical Report 1(TR1) に部分的対応 Boostに部分的に対応 ( バージョン1.39.0が同梱 ) 4

C++Builder の欠点 コンパイラの設計が古い OSSがサポートしていない場合がある C++0xや最新のBoostなどに対応できていない 新コンパイラが開発中 5

構造ビュマネージャープロジェクトツールパレットフォームデザイナ C++Builder 2010 の IDE ーメッセージビュー インスペクタオブジェクト6

C++Builder 2010 の IDE 検索バー コードエディタ 7

C++Builder でのプログラミングの流れ プロジェクト を作成する プロジェクトとは C++Builder を使ったアプリケーション開発の中核であり アプリケーションを構成するファイルの集まり これらのファイルは設計時に作成されるものもあれば ソースコードをコンパイルしたときに自動生成されるものもある アプリケーションのユーザーインターフェースを作成する ツールパレットより フォーム にコンポーネントを配置する コンポーネントのサイズや位置などを示す プロパティ を変更する オブジェクトインスペクタで設計時に変更 ソースコード内で動的に変更 ユーザーとアプリケーションの対話を取り持つ イベントハンドラ を記述する 8

VCL( ビジュアルコンポーネントライブラリ ) VCL とは C++Buiderの基本的なフレームワーク WindowsのAPIをベースとしたクラスライブラリ 中身はDelphi 言語で実装 9

ユニットとフォーム ユニット ユニットとは 個別にコンパイルされる C++Builder コードのモジュール ソースファイル (*.cpp) とヘッダファイル (*.h) の組み合わせ フォーム フォームとは アプリケーションのうち 目に見えるウインドウ C++Builder を起動すると 空のメインフォームが作成される アプリーケーションを作成するには フォームに コンポーネント を配置して その振る舞いをソースコードに記述する ユニット にフォームの内容定義ファイル(*.dfm) が加わったもの 10

コンポーネント コンポーネント とはアプリケーションを構成する 部品 ビジュアルコンポーネント ボタンやテキストボックス グラフィックイメージなど ユーザーの目に見える 部品 非ビジュアルコンポーネント タイマーやデータベースとの接続など ユーザーの目に見えない 部品 11

プロパティ メソッド イベント プロパティ とは コンポーネントの特性を表す Nameプロパティ : コンポーネントを識別する 名前 Captionプロパティ : ウィンドウやボタンのラベル Visibleプロパティ : 表示状態を表す メソッド とは オブジェクトの動作を定義する関数 Show メソッド : オブジェクトを表示する LineTo メソッド : 直線を描画する イベント とは プログラムにより検出されるアクションまたは出来事 OnClickイベント : ボタンがクリックされたときに発生 OnMouseMoveイベント : マウスがコンポーネント上で移動したときに発生 OnPaintイベント : コンポーネントが再描画されたときに発生 12

プロパティ メソッド イベントの例 フォームでボタンが押されたとき 線と楕円を描画する Button1 で OnClick イベントが発生 void fastcall TForm1::Button1Click(TObject *Sender) { this->canvas->pen->width = 3; // ペンの幅 this->canvas->moveto(100,0); // 座標を移動する this->canvas->lineto(300,200); // 線を描画する this->canvas->ellipse(100, 0, 300, 200); // 楕円を描画する } プロパティへのアクセスやメソッドの呼び出しはアロー演算子 (->) を使用する 13

プロパティとメンバー変数の違い プロパティはアクセスメソッドと呼ばれる特殊なメソッドを介して変数にアクセスする class aclasswithaproperty { private: int mymembervariable; protected: int fastcall GetMemberVariable(void) { return mymembervariable; }; void fastcall SetMemberVariable(int themembervariable) { mymembervariable = themembervariable; }; public: property int MemberVariable = { read=getmembervariable,write=setmembervariable } }; 14

C++Builder 2010 で 2 簡易 CSV ビュワーを作る

フォームにコンポーネントを配置する コンポーネントパレットから ドラッグアンドドロップして配置 16

ツールパレットの検索 コンポーネント名の一部を入力すると絞り込みをしてくれる 17

コンポーネントのプロパティ ColCount プロパティ : グリッドのカラム数 RowCount プロパティ : グリッドの行数 18

コントロール間の位置合わせ機能 Padding プロパティ (TPadding 型 ) コントロールの内側に配置する子コントロールとの間隔 Margins プロパティ (TMargins 型 ) コントロールの外側に必要な間隔のサイズ AlignWithMargins プロパティ Align が alnone 以外の場合 コントロールのサイズを Margins を考慮して決定する これらの属性は CSS の Padding と Margin と同様 19

イベントプロシージャーの記述 ButtonedEdit1 を選択して オブジェクトインスペクタの OnRightButtonClick でダブルクリックすると イベントプロシージャーのひな形が自動生成される //--------------------------------------------------------------------- void fastcall TForm1::ButtonedEdit1RightButtonClick(TObject *Sender) { if (FileOpenDialog1->Execute()) { ButtonedEdit1->Text = FileOpenDialog1->FileName; // CSV ファイルのパースをする LoadCSV1(FileOpenDialog1->FileName); } } //--------------------------------------------------------------------- 20

CSV ファイルのパース void fastcall TForm1::LoadCSV1(UnicodeString CSVFile) { std::unique_ptr<tstreamreader> pstreamreader( new TStreamReader(CSVFile, TEncoding::Default, false, 1024)); std::unique_ptr<tstringlist> pstringlist(new TStringList()); pstringlist->delimiter = L','; // カンマ区切り } int row = 1; while (pstreamreader->endofstream == false) { pstringlist->delimitedtext = pstreamreader->readline(); for (int i = 0; i < pstringlist->count; ++i) { if (i >= StringGrid1->ColCount) break; StringGrid1->Cells[i + 1][row] = pstringlist->strings[i]; } ++row; if (row >= StringGrid1->RowCount) break; } pstreamreader->close(); 21

VCL についての お約束 VCL クラスを動的に使用する場合は new 演算子で構築 E2459 が発生 void foo(void) { TObject o1; // エラー TObject *o2 = new TObject(); } C++Builder ではスマートポインタ ( 自動的に delete してくれるポインタ ) の使用を推奨 VCL クラスを継承してメソッドを追加する場合 ( イベントハンドラを含む ) は 必ず fastcall 修飾子をつける 22

CSV ファイルのパース (Boost 版 ) void fastcall TForm1::LoadCSV2(UnicodeString CSVFile) { typedef boost::char_separator<char> char_separator; typedef boost::tokenizer<char_separator> csv_tokenizer; char_separator separator(",", "", boost::keep_empty_tokens); std::ifstream ifs(csvfile.t_str(), ios::in); std::string buffer; int row = 1; while (ifs && std::getline(ifs, buffer)) { int col = 1; csv_tokenizer tokens(buffer, separator); // トークン分割 for (csv_tokenizer::iterator iter = tokens.begin(); iter!= tokens.end(); ++iter) { std::string s = *iter; boost::trim(s); // 空白を除去 boost::trim_if(s, boost::is_any_of(" "")); // 二重引用符を除去 StringGrid1->Cells[col][row] = UnicodeString(s.c_str()); } } ++col; if (col > StringGrid1->ColCount) break; } ++row; 23

実行結果 24

C++Builder 2010 への 3 移行ポイント

UnicodeString と AnsiString の違い 原則として UnicodeString と AnsiString 間の暗黙的な型変換が行われる ただし 状況によっては暗黙の型変換が発生せずにコンパイルエラーが発生する 26

AnsiString から UnicodeString へ ケース 1:Ansi~ 系関数で 未定義の関数 ~ を呼び出した が発生 AnsiStrings.hpp をインクルードする SysUtils.hpp で定義されている文字列ユーティリティ関数は UnicodeString 用 AnsiString を使った文字列ユーティリティ関数は AnsiStrings.hpp に移動 27

AnsiString から UnicodeString へ ケース 2:UnicodeString を使用する もしくは 明示的にキャストする 例 1) 三項演算子 // AsString プロパティは UnicodeString AnsiString Hinmoku = Code? pdataset->fieldbyname( HINMOKUCODE )->AsString : AnsiString(); 例 2) 関数の引数に AnsiString の参照がある AnsiString DestPath; // C++Builder 2010 ではコンパイルエラー (E2285) が発生する if (SelectDirectory("Select save folder.", " ", DestPath, TSelectDirExtOpts() << sdnewui << sdnewfolder)) { ShowMessage(DestPath); } 28

AnsiString から UnicodeString へ ケース 3: const char* / char* な引数に文字列を渡す UnicodeString::t_str メソッドは元のデータが破壊されてしまうことを予測していないことがあるので その場合は一度 AnsiString オブジェクトを用意して それを渡す必要がある void Foo(char* str); UnicodeString us; Foo(us.t_str()); // 文字列が破壊される場合がある UnicodeString us; AnsiString as(us); Foo(as.c_str()); us = as; 29

TDBGrid のブックマーク関連 TBookmarkList::Items の型が AnsiString から TByteDynArray に変更 TDataSet::GotoBookmark の引数も void* から TByteDynArray に変更 // C++Builder6 の場合 AnsiString Mark; Mark = DBGrid1->SelectedRows->Items[i]; pdataset->gotobookmark((void *)Mark.c_str()); // C++Builder2010 の場合 TByteDynArray Mark; Mark = DBGrid1->SelectedRows->Items[i]; pdataset->gotobookmark(mark); 30

リンクエラーに対する対処 "[ リンカ致命的エラー ] Fatal: ファイル 'STLPMT.LIB' を開けません " C++Builder 6 で作成したスタティックライブラリを BDS 2006 以降でリンクしたときに発生する場合がある スタティックライブラリの内部で STL を使用している場合 対処はスタティックライブラリを再ビルドする以外方法はない STLPort が C++Builder を既にサポートしていないため コンパイルオプションから NO_STRICT を外す 31

デモ

Q & A

最後に ご静聴ありがとうございました!! 34