2018年6月10日 星期日

BCB 筆記8 (Compile)

我在寫程式的時候
偶爾會想寫個固定字串在 Header (路徑之類的)
但這會在 Compile 上造成很大的負荷
Cannot create pre-compiled header: initialized data in header
因為我的 Header 都寫在一起


    const String __SavePath = "Save\\";
    const String __NameCardPath = "NameCard\\";
    const String __PicturePath = "Pic\\";

所以 Header 必須分開
但最好是改讀檔的

但我因為這個發現了一個講解 Compile 的網頁
在此留個紀錄
http://bcbjournal.org/articles/vol4/0005/Pre-compiled_header_tips.htm

BCB 筆記7 (StrToInt)

報告在製作時,一定會遇到要字串轉數字
在 BCB 裡有方便的函式

常見的有

    String str = "123"
    int x = StrToInt(str);
    float y = StrToFloat(str);

但有時候不一定可以轉成數字
這時就可用

    String str = "@123"
    int x;
    float y;
    bool z;
    z = TryStrToInt(str, x);
    z = TryStrToInt(str, y);

2018年6月3日 星期日

BCB 筆記6 (Sender)

說來慚愧,但我很後面才知道這東西
BCB 設計按鈕不外乎 TButton TBitBtn TSpeedButton

但按鈕通常邏輯差不多,只是因為傳的值不一樣而用不同 Button
然後程式碼變成這樣


void __fastcall TMainForm::TButton1Click(TObject *Sender)
{
    MyButtonFunction("TButton1");
}

void __fastcall TMainForm::TButton2Click(TObject *Sender)
{

    MyButtonFunction("TButton2");
}

void __fastcall TMainForm::TButton3Click(TObject *Sender)
{

    MyButtonFunction("TButton3");
}
但你其實可以

void __fastcall TMainForm::ButtonClick(TObject *Sender)
{
    TControl *btn = dynamic_cast<TControl *>(Sender);
    MyButtonFunction(btn->Name);
}
然後再去修改三個 Button 的 OnClick 指向 ButtonClick
這裡為什麼用 TControl 因為一次就可以相容三種 Button
用了半年BCB才知道...

BCB 筆記5 (TValueListEditor)

轉報告下一步就是自動產生報告
要自動產生報告,不外乎就是填表格。

你可以用 DrawGrid 或 StringGrid 來製作表格
但我認為 DrawGrid 和 StringGrid 都是完成度很高的元件
完成度很高代表若目的與設計方向不同,用起來就會綁手綁腳
要覆寫很多功能或者沒有與你目的相同的東西

我想當初 Grid 就是來完成表格,不是給你填,
所以在填值方面不會有太多方便的功能。
填表格通常會想要用下拉式表單 ( ComboBox )
網路上找想用 Grid 來做下拉式表單不外乎兩種
1. 創一個 ComboBox 但"位置"在 Grid 的該 Cell 上
2. 在該 Cell 真的創一個 ComboBox

但我兩種都不用
我這裡要介紹的元件是 TValueListEditor 來 Implement 我要給填的表格
TValueListEditor 只有兩個 Column 一個 Key 和 Value
所以要三欄的你只好乖乖用他給 Grid 元件,或者用CustomGrid 自己做一個 Grid

但 TValueListEditor 她有 EditStyle 可改,讓你的表格更靈活

void __fastcall MyValueListEditorClass::setDropList(TValueListEditor* List, int index, TStringList* li){
    List->ItemProps[index]->EditStyle = esPickList;
    List->ItemProps[index]->PickList = li;
    List->ItemProps[index]->ReadOnly = true;
}
我將 EditStyle 變成 esPickList 就等於是下拉式表格
表格內容就是 PickList (TStringList*)
我覺得比用 Grid 方便許多,結果如下
有些人(我)會想刪掉 TValueListEditor 上面的 FixRow
但是我找了很多方法都不行,最後只能開大絕

    MyValueListEditor->RowHeights[0] = 0;
輕鬆!!!

Popular Posts