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 便大功告成

BCB 筆記3 (TSpeedButton)

在 BCB 裡 Button 我常用的是 TSpeedButton

1. 可以載入圖片( TButton不行 )。
2. TSpeedButton 屬性裡有 GroupIndex 可以集合一群 TSpeedButton 成一個群組,同個群組後,
    一個群只能有一個被選取,被選取的 TSpeedButton 的 Down 值為 TRUE ,為選取則為
    FALSE。
3. 有 FLAT ( 滑鼠移上去會有浮起來的效果 ),對於單人開發的程式,這可以讓你的 Button 看
    起來比較有質感。

2018年5月1日 星期二

心情日記 2018/05/01

距離上次寫 BLOG 過了三個禮拜

看來維持寫 BLOG 真需要些意志力跟重訓一樣

不知不覺進入職場半年 (3天特休 GET!!)

但依然跟標題一樣,總覺得繼續做這個不行沒前途要換

但又沒本錢換QQ

今天想想後又回來寫 BLOG,充實自己

樂觀點的話就是我又繼續寫 BLOG 沒浪費這個得來不易的假日

希望自己不要鬆懈太久,維持住這個習慣

網頁開發(1) 使用 IE 瀏覽器時 Javascript 失效

我本人非專業寫網頁,大學沒寫過是進公司才學的,因為沒人維護XD
公司常用瀏覽器是 IE,因為IE可以直接讓你以檔案總管的方式直接開啟 file://... 的超連結,其他瀏覽器都會擋,詳細原因我不知道,但這個可以讓你方便調用 SERVER 上資料,方便很多,其實其他瀏覽器也可以辦到,但要做設定,但不可能你叫公司員工都做這設定,所以大家都用 IE,離題了...

JS 檔放到 Server 後無反應

    我自己在寫程式時,第一個問題是為什麼我改.JS檔放到SERVER後無反應
這裡無反應是指像什麼都沒改過一樣,搞了很久才發現原來 .JS檔會被瀏覽器存進快取
所以只要檔名一樣,他就會跑之前的.JS 造成所謂無反應。
 src="xxxx.js?2018032833"
想要解決又不想改檔名就靠這個加流水號,簡單又方便

為什麼我的 IE 可以跑,別人的不行

    但這個又讓我引來第二個問題,為什麼我的IE可以跑,別人的不行
後來發現因為我對第一個問題有陰影,所以我總是進入開發者模式(IE 按F12)
IE只有在開發者模式才會認識 Javascript 的 console 這個物件
沒開啟就不認識 console 導致 Javascript 又失效
所以放進 SERVER 前刪除所有 console 才是唯一解

IE 讀不了 JS,報錯

    有可能原因跟 CSS 一樣,用版本過舊的 IE 去讀取,可以參考這篇 CSS 在 IE 瀏覽器下失效

BCB OLE操作EXCEL(2)

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


有時候再操作 EXCEL 和 WORD 的時候,有可能會要應用到 MultiProcess 的概念
但真正需要的地方很少,我自己是用偷懶的方式來避開,
因為互相搶奪導致資料錯誤出現的機率微乎其微。
下面介紹一些我常碰到的錯誤
bool __fastcall JunYe_Word::getDataTable(int index){
    Variant Range;
    bool flag = true;
    try{
        Range = Wd.DataDoc.OlePropertyGet("Tables").OleFunction("Item",index).OlePropertyGet("Range");
    }catch(EOleSysError *e){
        BugReport(L"Ranging Fail !! This Word doesn't have No."+IntToStr(index)+" Table.");
        flag = false;
    }
    if(flag){
        Range.OlePropertyGet("Rows").OleFunction("Item",1).OleFunction("Delete");
        Range.OleFunction("Copy");
    }
    return flag;
}
有時候要 Range 但 FAIL,有可能資料錯誤或跳錯誤訊息,且造成程式當掉的機會很大
這時候就會用 Try and Catch 如上面的程式碼來避免
String __fastcall Excel::getCellValue(int row, int column){
    String data;
    Variant temp;
    try{
        temp = Exc.WorkSheet.OlePropertyGet("Cells", row, column).OlePropertyGet("Value");
        if(VarType(temp) != varError){
            data = temp;
        }
    }catch(EOleSysError *e){
        BugReport(L"The Cell Can't transmit to OleStr");
    }
    return data;
}
這個段程式是防止吃 EXCEL CELL的值時,會導致 Can't transmit to OleStr 的狀況, 不是吃錯值,而是格子可能是#FFFFFF之類的東西,你直接用上述的data(String)去接會錯 Try and Catch 也擋不了( 我自己試擋不了 ),這時我用多了一層判斷, 用 VarType 去檢查 CELL 值是否能轉 OleStr。

上一篇:
BCB OLE操作EXCEL (1)
下一篇:

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

Popular Posts