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)
下一篇:

Popular Posts