2018年7月1日 星期日

BCB 筆記9 (String Replace)

既然使用 BCB 作為開發工具
不免俗就會常常使用他們的 String
這裡介紹 BCB 取代字串的方法
StringReplace(const UnicodeString Source, const UnicodeString OldPattern, const UnicodeString NewPattern, TReplaceFlags Flags);


    String Str;
    TReplaceFlags rf = TReplaceFlags()<<rfReplaceAll;
    Str = StringReplace(Str, L"@", L"\n", rf);


這裡的 TReplaceFlags 有兩種
rfReplaceAll -> 有這個參數會取代全部,無則只取代第一個
rfIgnoreCase -> 有這個參數會無視大小寫,無則會分辨大小寫

參考資料
http://www.cppfans.com/cbknowledge/reference/strings/stringreplace.asp

BCB OLE操作EXCEL(3)

在用 OLE 操作 Excel 時
有可能會遇到剪貼簿裡的資料過大
導致關閉 Excel 時跳出視窗警告
"是否放棄剪貼簿裡的資料"

要避開的話通常會用關閉 DisplayAlert 的方法來避免
但我常常失敗,原因不明。

所以給失敗的朋友另一個辦法
在 Excel 關閉前複製一格 避免剪貼簿裡資料過多跳出視窗


void __fastcall Excel::Close_2(){
    Exc.Range = Exc.WorkSheet.OlePropertyGet("Cells", 1, 1);
    Exc.Range.OleFunction("Copy");
    Exc.WorkBook.OleFunction("Close", false);
    Exc.App.Exec(Procedure("Quit"));
}

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

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;
輕鬆!!!

2018年5月6日 星期日

BCB 筆記4 (DrawText)

在 BCB 裡設計表格類的東西
幾乎都是從 TCustomGrid 繼承而來
在填入表格值都是用 DrawText 來填值
而我們要改變一些東西,例如文字置中
就要自己下 DrawText 的參數

首先第一步,把 DefaultDrawing 的值改為 Fault
不改的話會 DrawText 兩次,造成重疊

第二步改寫 OnDrawCell

void __fastcall TMainForm::LGridDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State)
{
    TStringGrid *vle = dynamic_cast<TStringGrid *>(Sender);
    int flag = DT_WORDBREAK+DT_CENTER+DT_VCENTER+DT_SINGLELINE;
    vle->Canvas->FillRect(Rect);
    vle->Canvas->Font->Size = 11;
    vle->Canvas->Font->Style = TFontStyles() << fsBold;
    vle->Canvas->Pen->Color = clBlack;
    vle->Canvas->Rectangle(Rect);
    String Str = vle->Cells[ACol][ARow];
    DrawText(vle->Canvas->Handle, Str.w_str(),Str.Length(), &Rect, flag);
}


首先要通用的話,就必須用 Sender 來判斷呼叫的 TStringgrid
再來調整 Flag 來改寫置左中右,上下置中似乎只對單行有作用
接下來就常見的 Font 的操作,最後 DrawText 便大功告成

Popular Posts