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

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