2018年4月8日 星期日

.ini 檔案 操作及應用

ini檔顧名思義就是拿來初始化的
#include "inifiles.hpp"
TIniFile *IniFile;
IniFile = new TIniFile(ChangeFileExt(Application->ExeName, ".ini"));
IniFile->WriteString(category, parameter, value);
delete IniFile;
這裡介紹其中一個我最常用的 WriteString
可以看到它要傳入三個參數
這裡用圖片介紹

AnsiString __fastcall INI::ReadStr(AnsiString category, AnsiString parameter)
{
    AnsiString value;
    TIniFile *IniFile;
    IniFile = new TIniFile(ChangeFileExt(Application->ExeName, ".ini"));
    value = IniFile->ReadString(category, parameter, value);
    delete IniFile;
    return value;
}
第三個value指的是若沒值時的 Default

這裡想寫一些使用心得
ini 檔及其操作十分簡單但功能就是這樣,他不會有 SORTING 之類的功能
最多查詢有無值而已,你不能問它"你有什麼值?"
ini 檔紀錄的都是 "已知" 的資料,所以正常不會用它來找"未知"資料
你不會不知道 ini 資料全貌
要想用 ini 做簡單紀錄未知資料之類的,你只能做些設計讓 ini 可以記錄未知
例如利用某一 category 來記錄 ini 的資料全貌
達到"你"不用知道資料全貌,但其效用不會比你用其他像 XML 之類的方便

BCB 筆記2 (TDateTime)

BCB TDateTime 時間操作及應用

在 BCB 裡有關時間的操作幾乎都是與 TDateTime 這個 Class 相關
若找不到相關資料可以用 BCB 的 HELP
( 游標移到要查詢的函式或Class 並按 F1 )

介紹幾個個人有在用的函式
TDateTimePicker->DateTime = Now();
TDateTimePicker->DateTime.DateTimeString();
TDateTimePicker 是常用的 BCB(VCL)元件
可以讓使用方便選擇日期+防呆

String date = "2018/4/8";
StrToDate(date);
將字串轉為 TDateTime 格式
double(TDateTimePicker1->DateTime)-double(TDateTimePicker2->DateTime)
直接代入double() 就可使 TDateTime 量化
這裡 double() 後的數值基本單位是天
1.5 = 一天半

參考資料
1. http://yanphph.blogspot.tw/2009/01/bcb-vcl.html
2. http://cshartuc.blogspot.tw/2016/10/bcb.html

2018年4月1日 星期日

BCB 筆記1 (MessageBox、ComboBox)

寫有介面的程式時常會需要跳出訊息
這裡介紹Application->MessageBox int MessageBox(const char* Text, const char* Caption, int Flags);

這裡沒啥好講的
想寫的幾乎都會變照抄網上的東西,所以就給連結當備份吧
1. http://yanjuns.blogspot.tw/2015/06/cbuilder-vcl.html
2. http://nelson.pixnet.net/blog/post/217684-%5Bbcb%5D-messagebox-%E7%9A%84%E5%8F%83%E6%95%B8%E8%AA%AA%E6%98%8E


如何令 ComboBox 顯示的字不會被更改

答案就是將 ComboBox style 屬性改為 csDropDownList
因為我總是用 BCB10 給的元件去設定 ( Object Inspector )
所以再寫新程式的時候,總忘記當初怎改的
( 因為公司並不會一直要求我去寫資料彙整的程式,久久寫一次 )

令 ComboBox 顯示的字不會被更改

深入了解 ComboBox 後來發現另一招
當 ComboBox 顯示框文字被修改時
會自動尋找是否為 ComboBox 其中一個 Item
是 ItemIndex 修改為該Item 的
否 ItemIndex = -1
此為 BCB10 程式碼
int tempindex;
void __fastcall TMainForm::CSTestSiteComboBoxChange(TObject *Sender)
{
    if(CSTestSiteComboBox->ItemIndex == -1){
        CSTestSiteComboBox->ItemIndex = tempindex;
    }
    tempindex = CSTestSiteComboBox->ItemIndex;
}
如上所示
文字被修改後若不屬於原有 Item (也就是ItemIndex == -1)
修改回來後達到類似無法修改的效果
通常不給修改是為了防呆
所以只能顯示範疇內的東西也是防呆的一種

BCB OLE操作EXCEL(1)

BCB 操作 EXCEL、WORD ( OLE的應用 )


之前有講工作關係需要彙整報告,報告不外乎 WORD、EXCEL、PDF檔

程式要操作 WORD、EXCEL 可以靠微軟的
COM(Component Object Model)或 .NET Framework.
照理說應該要用 .NET Framework ( 比較潮?? ) 但是公司前輩使用的是 COM
新人啥都不懂乖乖跟著學就對了,其實也不知道兩者實際差異
因為從來沒試過另外一種XD

在 COM 的基礎下,OLE ( Object Linking and Embedding )就是我們要用的技術
簡單來說就是把應用程式 ( EXCEL、WORD ) 物件化後給軟體使用
所以在這基礎下達到操作 EXCEL、WORD 和兩者間的溝通操作

這裡使用的 IDE 是 BCB10 拿 EXCEL 作範例

#include "Comobj.hpp" //操作EXCEL
struct _Excel
{
        Variant App;
        Variant WorkBooks;
        Variant WorkBook;
        Variant WorkSheets;
        Variant WorkSheet;
};
首先宣告 Variant 去承接OLE的EXCEL物件
Excel::Excel(){
        Exc.App = CreateOleObject("Excel.Application");
        Exc.App.OlePropertySet("Visible", true);
        Exc.WorkBooks = Exc.App.OlePropertyGet("Workbooks");
}
void __fastcall Excel::Open(AnsiString path){
        Exc.WorkBook = Exc.WorkBooks.OleFunction("Open", OleStr(path));
        Exc.WorkSheets = Exc.WorkBook.OlePropertyGet("Worksheets");
        Exc.WorkSheet = Exc.WorkSheets.OlePropertyGet("Item", 1);
}
void __fastcall Excel::Close(){
        Exc.WorkBook.OleFunction("Close", true);
        Exc.App.Exec(Procedure("Quit"));
}
這裡我分三個FUNCTION 來模擬平時操作EXCEL的狀態( 對我來說直觀好理解 )
constructor 產生EXCEL物件,並開啟工作簿集合( 工作簿想像是EXCEL的外框 )
open            開啟路徑的EXCEL,並在工作表集合要編號為"1"的工作表
close            關閉工作簿,這裡第一行 CODE 代表意義是不儲存就關閉

這裡有個重要東西先講
OLE 物件吃的是 Wide String,這裡用的是萬能的 OleStr() 轉成 Wide String
我從 BCB10 的 UnicodeString 轉過去吃盡苦頭
這時去問了那個唯一可以問的前輩才知道有這個函式,那時真覺得他是活菩薩。
關於 Wide String 和 UnicodeString 的轉換以後再寫一篇

( PS 以下是我的體感,有錯我道歉
關於 OLE 網路上的資源並沒很多
第一個 BCB10 沒人用 (沒有當初BCB6那麼猛),要用都用 Visual C++ 去寫
第二個 OLE 也是一個快被替換的東西
所以用 BCB10 去寫這東西,上網查都是 BCB6 的CODE
所以要注意的是 BCB6 跟 BCB10 字串的差異 )


下一篇:
BCB OLE操作EXCEL (2)

參考來源:
1. http://skybow.pixnet.net/blog/post/98858843-%5Bbcb%5D%E7%94%A8c%2B%2B-builder%E6%8E%A7%E5%88%B6excel%E6%AA%94%E6%A1%88%E8%AE%80%E5%8F%96
2. https://zh.wikipedia.org/wiki/%E7%BB%84%E4%BB%B6%E5%AF%B9%E8%B1%A1%E6%A8%A1%E5%9E%8B
3. https://zh.wikipedia.org/wiki/%E5%AF%B9%E8%B1%A1%E9%93%BE%E6%8E%A5%E4%B8%8E%E5%B5%8C%E5%85%A5

Popular Posts