Saturday, February 18, 2012

XE2: the Hello World Example!

首先, 我們建立一個 VCL Form 的應用程式, 然後從工具盤 Tool Palette 中, 從 standard 的群組中, 找出 TButton, 將其拉進 Form1 中, 並用滑鼠在 button1 元件上點選一下, 選擇起來。接著, 就可以透過 Object Inspector 修改 button1 的相關屬性, 例如:

a. 將 Name 改成 btnHelloWorld
b. 將 Caption 改成 Hello World

就可以看到如下圖的樣子。



接著, 我們可以連按(double click) TButton btnHelloWorld 兩下, 進入可以撰寫程式(事件處理程序)的畫面, 即 unit1.cpp 程式之中, 輸入下列指令:

ShowMessage("Hello World!");

如下圖:



就可以開始執行(Run, F9) 我們的第一個 C++ Builder 的應用程式了。



按下 TButton btnHelloWorld 就可以看到跳出如下的訊息視窗:



按 OK button 訊息視窗就會自動消失!

Wednesday, February 15, 2012

XE2: 儲存 Project

除了 Form/Unit 必須儲存之外, 每一個應用程式的專案也要儲存起來, 從功能表中選取 File | Save Project As.. 就可以將專案的內容儲存起來。



在你儲存的目錄中, 你一共可以看到關於專案的 3 個不同的副檔名。

1. Project1.cbproj

  副檔名是 cbproj, 指的是 C++ Builder 的 Project File, 儲存的內容是關於整個專案內容的描述。

2. Project1.cbproj.local

  在副檔名是 cbproj 的後面加加上 .local, 用記事本打開看, 可以看到專案儲存在這台電腦(local)的相關目錄。

3. Project1.cpp

  副檔名是 cpp, 因此是整個專案能夠在視窗環境下執行的 C++ 語言指令的相關部分。

如下圖的三個檔案。

XE2: 儲存 Form/Unit

當我們完成一個 Form 的設計與其對應的 Unit 的程式撰寫後, 或是想要休息一下, 下次再繼續寫程式, 就要先將 Form/Unit 先儲存起來, 可以從功能表中選取 File | Save 或 Save as... 來進行第一次的儲存, 如果已經儲存過了, 那就可以直接選 File | Save 進行儲存。



如果沒有對 Unit1 進行重新命名, 就會看到 Unit1 一共被儲存成下列三個檔案:

 1. Unit1.cpp

   副檔名為 cpp, 類型為 C++ Source File, 內容就是你在撰寫程式時, 所看到的程式內容。

 2. Unit1.dfm

   副檔名為 dfm, 內容其實就是對你所設計的 Form 之描述, 如果你用記事本開啟 Unit1.dfm, 你就可以看到 C++ Builder 是如何描述一個 Form 的。



  由於上圖中的 Form1 並沒有任何元件, 所以描述內容僅有對 object Form1 的描述。

 3. Unit1.h
 
   副檔名為 h, 表示為一個 C 語言的標頭檔(header file), 每一個 Unit 都會搭配一個標頭檔, 在 Unit1.cpp 中, 你也可以找到一行 #include "Unit1.h" 的指令。

 在你儲存的目錄中, 你一共可以看到如下圖的三個檔案。

XE2: Object Inspector

在 C++ Builder 中, 可以用 Object Inspector 來觀看與設定所有元件的 Properties, 也可以從 Events 中設定 Object 的所有事件處理程序。

XE2: 開啟一個 VCL Form 應用

進入 C++ Builder XE2 的整合開發環境後, 如果你要開始寫一個全新的應用程式, 你可以從功能列中選擇 File | New | VCL Forms Application (如下圖),
 

 
C++ Builder 就會幫你產生一個 Form, 讓你開始規劃你的 Form 上要放哪些元件。


要修改 Form1 物件 Properties 的內容, 可以直接在位於左下角的 Object Inspector 中直接更改。

Tuesday, February 14, 2012

XE2: 工具盤 Tool Palette

C++ Builder XE2 的工具盤(Tool Palette) 其實就是 BCB6 中的元件盤(Component Palette), 可以從這邊找到想要的元件, 直接拉到 Form 上就可以了。

Wednesday, November 09, 2011

動態宣告三維陣列

之前曾經介紹過如何 動態宣告二維陣列, 可是彩色影像是由 RGB 三個色彩所組成, 如果想用一個三維陣列來儲存一張彩色影像的 RGB 色彩值, 那又要該如何修改程式呢?

// 標頭檔
#include <iostream.h>

// 宣告
int ***iComponent;

// 程式

 try
  {
  iComponent = new int **[3];
  for (i=0;i<3;i++)
   {
   iComponent[i] = new int *[20];
   for (j=0;j<20;j++)
    iComponent[i][j] = new int [40];
   }
  }
 catch (std::bad_alloc)
  {
  ShowMessage("Could not allocate memory...Bye");
  exit(-1);
  }

// 使用測試  
 iComponent[2][19][39]= 10;
 ShowMessage(AnsiString(iComponent[2][19][39]));

  注意: 上述程式為了程式的可讀性, 用了全型的空白" "來控制部落格文章的內縮顯示。因此, 如果你要直接複製上述程式到 C++ Builder 執行, 請務必將全型空白" "改成半型空白" ", 否則, 編譯時發出現以下的錯誤訊息。:
[C++ Error] Unit1.cpp(40): E2206 Illegal character ' ' (0xa140)
 

Friday, September 09, 2011

Image Events

 
 

Image Properties

 
 

1. AutoSize

true or false: 是否讓影像元件的寬、高隨著 Load 進來的影像大小自動調整。

2. Stretch

true or false: 是否讓 Load 進來的影像大小自動隨著影像元件的寬、高顯示出來。

3.

Wednesday, September 07, 2011

TCanvas::FillRect Method

Image1->Canvas->Brush->Color =(TColor)RGB(130,67,33);
Image1->Canvas->FillRect(Rect(50,100,80,200));

這兩行指令就是
1. 設定Image1畫布上筆刷的顏色為 (130,67,33)
2. 把矩形 Rect(50,100,80,200) 用筆刷填滿

Tuesday, December 01, 2009

Stream Read Error

這兩個星期, 由於撰寫 IPCDMC範例程式 的緣故, 遭遇一個以前未曾發生過的問題: 我用 Photoshop CS 所儲存的 bmp 檔案, 用 C++ Builder 6 開啟, 會發生 Stream read error, 如下圖:



我的第一個反應也是問 Google 大神, 順利找到了一些相關討論[1, 2, 3], 但始終沒有人可以指出確切的問題點。

昨天晚上, 由於 對比度擴展(Contrast Stretching)範例程式 的實驗需要造一張低對比度的影像, 而我的電腦又只有灌 Photoshop CS, 因此逼得我一定要面對這個問題。



由於錯誤訊息是 Stream read error, 因此, 我直接排除是程式撰寫上的問題, 直接從有問題的 bmp 影像開始研究。為了比較, 我將可以順利用 C++ Builder 6 開啟的檔案 Carnivore.bmp 用 Photoshop CS 另存新檔 CarnivorePSCS.bmp, 然後再分別用 PSPad 用 Hex editor 開啟, 比較兩個檔案的異同。

BCB6-PS-bmp-StreamReadError.txt 在這個檔案中, 我列出了兩個 bmp 檔頭資料以供比對, 我發現兩個檔頭資料中, 只有第 34-37 位元組的影像原始大小有差異, 可以順利開啟的 Carnivore.bmp 並沒有儲存影像大小到檔頭之中, 而 CarnivorePSCS.bmp 則是存放了 0200 0C00 的資料, 我當下用 PSPas 將第 34-37 位元組修改成 0000 0000, 果然 CarnivorePSCS.bmp 就可以用 C++ Builder 6 順利開啟了。

接下來, 我當然先去完成 對比度擴展(Contrast Stretching)範例程式 的實驗, 把低對比度的彩色影像自動處理成高對比度的影像, 並完成 部落格範例程式的文章

今天, 在往學校的路上, 我一直在思考為何 Photoshop CS 會多此一舉把影像大小的值放進去, 而且還造成 C++ Builder 6 無法讀取? 難道 Photoshop CS 會把影像大小 Width * Height * BitCount / 8 這麼簡單的數學計算錯誤嗎?

晚上回到家後, 把 0200 0C00 換算, 得到 786434, 然而影像大小

 Width * Height * BitCount / 8
= 512 * 512 * 24 / 8
= 786432

果然就如同自己所推測的一樣, 影像大小差了 2 個 bytes。

我最後的一個實驗是將 CarnivorePSCS.bmp 的第 34-37 位元組 (影像大小) 修改成 0000 0C00, 果然 也可以用 C++ Builder 6 順利開啟。

真相大白了 !