上色

Code Block

2013年10月30日 星期三

[EndNote] 避免EndNote誤判文件中的Refence

  當文件中含有左右括號的文字時(通常是化學式或者方程式),EndNote預設會將之判別為參考文獻,但是事實上他根本不是參考文獻,因此就會出現如下的錯誤︰

此時只能按下"Ignore all"來告訴EndNote不要把該筆資料視為參考文獻,但是每次都要這麼做總是十分的魯洨...

那要如何避免這種情形呢? 只要在設定中把「暫時參考文獻格式」改掉就好,如下圖︰

要改成什麼都可以,只要不要與文件中會出現的符號衝突就可以,比如此處我是改為「<<......}」,如此一來只有被這樣的符號包圍的文字,EndNote才會將之視為參考文獻,就再也不會誤判了。




2013年10月25日 星期五

[VB.Net] 執行緒參數的傳入與傳出

首先定義一個Class,並在其中定義該執行緒要執行的方法
Public Class Class1
    Public Event ShowMsg(ByVal text As String) '宣告事件,觸發該事件即可傳出參數
    Private sum As Integer '執行緒執行時傳入的參數

    Property Num As Integer '設成屬性存取
        Get
            Return sum
        End Get
        Set(value As Integer)
            sum = value
        End Set
    End Property

    Public Sub calcd() '該執行緒要執行的方法
        For I = 0 To 1000
            sum += I
            RaiseEvent aa(sum) '觸發事件
            Threading.Thread.Sleep(100)
        Next
    End Sub
End Class

接著新建一個該類別的執行個體,並設定要傳入的參數,接著設定事件的處理方式,啟動執行緒。

Public Class Form1

    Private Delegate Sub InvokeDelegate(ByVal text As String)
    Private t As Threading.Thread

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim c As Class1 = New Class1 '建立一個Class1的執行個體
        c.Num = 10 '設定要傳入的參數(也可在建立執行個體時以建構式設定)
        '新建一個執行緒,指向Class1的執行個體中要執行的方法(該方法必須為Public)
        t = New Threading.Thread(AddressOf c.calcd) 
        AddHandler c.ShowMsg, AddressOf ShowMsg '設定事件的處理方式,將事件指向Form1的ShowMsg()
        t.Start()
    End Sub

    Private Sub ShowMsg(ByVal text As String)
        '若呼叫端不是建立該控制項(Me)的執行緒,則以委派方式呼叫
        If Me.InvokeRequired Then
            Invoke(New InvokeDelegate(AddressOf ShowMsg), text)
        Else
            TextBox1.Text = text '顯示訊息
        End If
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        t.Abort()
    End Sub
End Class

如此一來,每一次執行緒觸發事件時都會指向Form1的ShowMsg(),藉此傳出參數

2013年10月14日 星期一

[VB.Net] 表單開啟及關閉時觸發的事件順序

開啟表單時,順序如下:

1. Control.HandleCreated:發生於為控制項建立控制代碼時
2. Control.BindingContextChanged:發生於 BindingContext 屬性的值變更時
3. Form.Load:發生在表單第一次顯示之前
4. Control.VisibleChanged發生於: Visible 屬性值變更時
5. Form.Activated:發生於表單以程式碼或由使用者啟動時
6. Form.Shown:每當第一次顯示表單時發生

關閉表單時,順序如下:

1. Form.Closing:發生於表單正在關閉時
2. Form.FormClosing:發生於表單關閉之前
3. Form.Closed:發生於表單已關閉時
4. Form.FormClosed:發生於表單關閉之後
5. Form.Deactivate:發生於表單失去焦點且不再是使用中的表單時

Reference:
1. http://msdn.microsoft.com/zh-tw/library/86faxx0d.aspx
2. http://www.dotblogs.com.tw/yc421206/archive/2009/07/24/9668.aspx




[Windows] 設定預設開啟程式命令

找到HKEY_CLASSES_ROOT\Applications\程式名稱\shell\open\command
指定執行檔名稱即可 
Ex. 
在...\程式名稱\shell\open\command新增以下機碼 
類型︰REG_EXPAND_SZ(可擴充字串值)
資料︰"%ProgramFiles(x86)%\Windows Media Player\wmplayer.exe" /Open "%L"

2013年10月9日 星期三

[VB.Net] 簡單快速讓程式崩潰

Environment.FailFast(text as String)
簡單快速讓你的程式崩潰,馬上crash
◢▆▅▄▃ 崩╰(〒皿〒)╯潰 ▃▄▅▆◣

2013年9月5日 星期四

[VB.Net] 「執行緒已經中止」的錯誤

當Thread中止的時候(如使用Abort函式),會拋出一個ThreadAbortException,因此在程序中以Try...Catch作例外處理的時候,要避開此項錯誤,或是不要使用Try...Catch。

Reference: http://www.dotblogs.com.tw/shunyeh/archive/2008/09/16/5386.aspx

2013年9月3日 星期二

[EndNote] 中興Open URL Link 查找全文設定方式

OpenURL Path:http://muse.lib.nchu.edu.tw:8080/1cate/

Authenicate with URL:http://muse.lib.nchu.edu.tw:8080/SSO/CateExtra/pages/index.jsp

其餘設定詳見:http://tul.blog.ntu.edu.tw/archives/1677http://tul.blog.ntu.edu.tw/archives/4549

2013年8月2日 星期五

[VB.Net] Using並不包含錯誤處理

如下列程式碼︰
Using cmd As New OleDbCommand("CREATE TABLE [test] ([ID] INTEGER,[Username] VarChar,[UserPwd] VarChar)", CalcdConnection)
  cmd.ExecuteNonQuery()
  cmd.CommandText = "INSERT INTO [test$] VALUES(1,'elmer','password')"
  cmd.ExecuteNonQuery()
End Using
可寫成如下表示︰
Dim cmd As New OleDbCommand("CREATE TABLE [test] ([ID] INTEGER,[Username] VarChar,[UserPwd] VarChar)", CalcdConnection)
Try
  cmd.ExecuteNonQuery()
  cmd.CommandText = "INSERT INTO [test$] VALUES(1,'elmer','password')"
  cmd.ExecuteNonQuery()
Finally
    If cmd <> vbNull Then
        cmd.Dispose()
    End If
End Try
事實上並不包含錯誤處理,也就是Catch區塊;因此需自行添加錯誤處理方式

[Date Structure] Class和Structure

Class是reference type,程式執行時資料儲存在heap中
Structure是Value type,程式執行時資料儲存在stack中

因此在method中使用structure時,事實上是建立該structure的副本,因此改動這個數值並不會影響本來的資料,如︰

Structure TotalTime
  Dim tt As String
End Structure

Dim result(100) as TotalTime '定義result為TotalTime陣列 

For Each a As TotalTime In result
    a.tt=a.tt+1
Next
此時,result陣列中的數值並不會改變,因為Structure是Value type,所以For...Each時是複製一個result的副本。
因此需將result定義為class才可正確獲得預期效果。

但是同樣需要注意的是,因為Class是reference type,必須以New關鍵字一一將陣列中的元素定義為執行個體(物件)

[VB.Net] 讀取Access與Excel資料庫

'Access資料庫之連接位址
Public DBLocation As String = "Provider=Microsoft.ACE.Oledb.12.0;Data Source=檔案位址"
'Excel資料表之連接位址
Public DBLocation As String = "Provider=Microsoft.ACE.Oledb.12.0;Data Source=檔案位址;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1,ReadOnly=0"""
屬性意義
HDR=Yes: 第一列不要視為資料欄位,應視為欄位標題
IMEX=1: 所有資料視為文字讀取,如此即可順利讀取所有資料
ReadOnly=0: 設定為可讀寫,如此才可以更新內容

以OleDbConnection開啟資料庫
DBConnection = New OleDbConnection(DBLocation)
DBConnection.Open() '打開連接

以SQL命令執行各種搜尋,如︰
Dim objCmd As OleDbCommand = New OleDbCommand("SELECT * FROM 資料表", DBConnection)
此處資料表即為Access中的資料表,或是Excel中的工作表

引用Excel工作表時︰
  • 若要引用工作表全部範圍
    Select * from [Sheet1$]
  • 引用已定義名稱的範圍
    Select * from [MyNamedRange] 
  • 引用工作表中特定位址的某範圍
    Select * from [Sheet1$A1:B10] 
※工作表後的美元符號($)代表工作表存在的指示,若要新增工作表,請勿使用此符號

Reference:  HOW TO:使用 ADO.NET 擷取與修改利用 Visual Basic .NET 之 Excel 活頁簿中的記錄

2013年7月6日 星期六

[VB.Net] ThreadStart與ParameterizedThreadStart

若要建立一個不含參數的執行緒(thread),使用ThreadStart這個委託函式即可;但是若要建立含有參數的執行緒,則須以ParameterizedThreadStart這個委託函式建立。

但是自.Net framework 2.0開始,只要方法不是overloading,compiler都會自行判斷要使用哪個方法建立執行緒,因此直接以一般方法建立即可,如︰
Dim thread1 As Thread = New Thread(AddressOf MyThread);
thread1.Start();

Dim thread2 As Thread = New Thread(New ThreadStart(AddressOf MyThread));
thread2.Start();

Dim thread3 As Thread = New Thread(AddressOf MyThreadWithParameter);
thread3.Start(myClass);

Dim thread4 As Thread = New Thread(New ParameterizedThreadStart(AddressOf MyThreadWithParameter));
thread4.Start(myClass);
以上四種方法都是可行的。

Reference:
http://www.cftea.com/c/2012/03/0ELGB9V327N8CCKT.asp

2013年7月4日 星期四

[VB.Net] Invoke and BeginInvoke

Control.Invoke︰強制於UI thread上執行委派,與原始thread同步
Control.BeginInvoke︰強制於UI thread上執行委派,與原始thread不同步

[delegate].Invoke︰在原來thread上同步執行委派
[delegate].BeginInvoke︰在一個新的背景thread上執行委派,與原始thread不同步

2013年6月30日 星期日

[VB.Net] 物件XML序列化及反序列化方法

可將物件序列化之後利用網路傳送至其他程序,或者另存為文件
 
Public Function Serialize(ByVal objType As Type, ByVal obj As Object) As String
    '將元件進行序列化
    Dim XMLString As String = String.Empty
    Dim mySerializer As XmlSerializer = New XmlSerializer(objType) '以objType建立XML序列化元件
    Dim writer As New IO.StringWriter '建立資料流
    mySerializer.Serialize(writer, obj) 'XML序列化
    XMLString = writer.ToString '轉為字串
    writer.Close() '關閉資料流
    Return XMLString '回傳
End Function

Public Function Deserialize(ByVal objType As Type, ByVal XMLString As String) As Object
    '將取得的內容進行反序列化
    Dim mySerializer As XmlSerializer = New XmlSerializer(objType) '以objType建立XML序列化元件
    Dim reader As New IO.StringReader(XMLString) '以序列化後的XMLString建立資料流
    Return mySerializer.Deserialize(reader) '回傳反序列化後的物件
End Function 

2013年5月1日 星期三

[圖像處理] BMP影像分散寬度(stride)與影像寬度(width)

Stride︰代表每列影像列的位元長度(bytes),等於argb(32bits)或rgb(24bits)乘上影像寬度
Width︰影像寬度

此處有個問題,若影像寬度乘上位元之後不是4的倍數(32bits),系統會自動補足到4的倍數;如影像寬度270,則Stride應為810,但810不是4的倍數,因此系統會自動補到812,若直接以Stride/Width取得位元組數或是要取得影像起始位置時就會出錯。

2013年4月19日 星期五

[PHP] 區分同一個表單上的兩個按鈕

以onclick設定不同按鈕所送出的參數,例如︰

按鈕1︰
<input type="submit" name="button" value="Choose" onclick="document.form.action='sign.php?no=1' "/>

按鈕2︰
<input type="submit" name="button" value="Choose" onclick="document.form.action='sign.php?no=2' "/> 

如此即可在目的地表單(sign.php)藉由$_GET[no]方法取得此表單所送出的no變數,即可輕易分辨不同按鈕

2013年4月18日 星期四

[SQL] select指令

SELECT what_to_select
FROM which_table
WHERE conditions_to_satisfy
 
what_to_select表示要搜尋的目標,也可以「*」表示所有的列
which_table表示要搜尋的資料表
conditions_to_satisfy是選擇性參數,代表搜尋條件 

[PHP] Session無法啟用 - Cannot send session

Warning: session_start() [function.session-start]: Cannot send session ... - headers already sent (output started at .... )

發生原因
session_start() 之前不能有任何字元輸出,UTF-8 編碼裡的 BOM 也會被認為是 headers,有上述狀況 Session 將無法順利傳遞,並會顯示錯誤訊息。

解決方法1
1. 確定 <?php 和 session_start() 之間沒有其他字元,空格也要移除。
2. 若是 UTF-8 編碼,請用編輯器(例 UltraEdit、Notepad++...)將檔案裡的 BOM 移除。

解決方法2
以 ob_start() 開啟緩衝區將輸出資訊寫入緩衝區,可避免 headers 先於 session_start() 輸出,寫入緩衝區的內容可由 flush() 或 ob_end_flush() 輸出至瀏覽器,以下範例不會顯示錯誤訊息:
<?php
ob_start();
echo "test";
session_start();
ob_end_flush();
?>
Reference:
http://www.pczone.com.tw/vbb3/thread/47/73367/

2013年4月14日 星期日

[Phone] 合併vCard檔案 (*.vcf)

利用copy命令的/b參數將多個vcf檔案以二進位形式合併

copy /b *.vcf all.vcf

以上命令的意義代表將該資料夾下所有的vcf檔案(vCard檔案)合併成為all.vcf

2013年4月9日 星期二

[VB.Net] 取得視窗大小資訊

Public x0, y0, x1, y1 As Integer '視窗四角座標
Public Client_x0, Client_y0 As Integer '視窗左上座標(不含標題邊框)
Public ClientX, ClientY As Integer '視窗長寬(不含標題邊框)
Public Border As Integer '視窗邊框寬度
Public Title As Integer '視窗標題高度
Public hwnd As Integer '視窗hwnd

'取得視窗大小(含邊框,功能表)
Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Integer, ByRef rectangle As RECT) As Integer

'取得視窗大小(不含邊框,功能表,左上角為0,0)
Public Declare Function GetClientRect Lib "user32 " (ByVal hwnd As Integer, ByRef lpRect As RECT) As Integer

Structure RECT '視窗大小資料結構
    Dim x1 As Integer
    Dim y1 As Integer
    Dim x2 As Integer
    Dim y2 As Integer
End Structure

'取得特定視窗資訊
Sub GetWindowInfo(hwnd As Integer)
    Dim R As RECT
    Dim RetVal As Integer
    RetVal = GetWindowRect(hwnd, R)
    x0 = R.x1
    x1 = R.x2
    y0 = R.y1
    y1 = R.y2
    RetVal = GetClientRect(hwnd, R)
    ClientX = R.x2
    ClientY = R.y2
    Border = ((x1 - x0) - ClientX) / 2
    Title = (y1 - y0) - ClientY - Border
    Client_x0 = x0 + Border
    Client_y0 = y0 + Title
End Sub

[VB.Net] 清除無效的系統圖示

Dim hWndShell, hWndTray, hWndPager, hWndToolBar As Integer '系統用hwnd

'抹除通知區域圖示
hWndShell = FindWindow("Shell_TrayWnd", "") '取得系統圖示區hwnd

'取得通知區域hwnd
If Environment.OSVersion.Version.Major = 5 AndAlso Environment.OSVersion.Version.Minor = 0 Then
    hWndTray = FindWindowEx(hWndShell, 0, "TrayNotifyWnd", "")
    hWndToolBar = FindWindowEx(hWndTray, 0, "ToolbarWindow32", "")
Else
    hWndTray = FindWindowEx(hWndShell, 0, "TrayNotifyWnd", "")
    hWndPager = FindWindowEx(hWndTray, 0, "SysPager", "")
    hWndToolBar = FindWindowEx(hWndPager, 0, "ToolbarWindow32", "使用者升級的通知區域")
End If

'取得邊界
GetWindowInfo(hWndToolBar) '以自訂函數GetWindowInfo取得視窗資訊
Dim ibx, iby As Integer
iby = CInt(ClientY / 2) * 65536
'以WM_MOUSEMOVE消去無效圖示(將通知區域全部掃過一次)
For ibx = 1 To ClientX Step 1
    PostMessage(hWndToolBar, WM_MOUSEMOVE, 0, iby + ibx)
Next

**********以下為API宣告**********
'發送訊息到執行緒佇列
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
'定義常數
Public Const WM_KEYDOWN As Integer = &H100
Public Const WM_KEYUP As Integer = &H101
Public Const VK_C As Integer = &H43
Public Const WM_CLOSE As Integer = &H10
Public Const WM_LBUTTONDBLCLK As Integer = &H203
Public Const WM_LBUTTONDOWN As Integer = &H201
Public Const WM_LBUTTONUP As Integer = &H202
Public Const WM_MBUTTONDBLCLK As Integer = &H209
Public Const WM_MBUTTONDOWN As Integer = &H207
Public Const WM_MBUTTONUP As Integer = &H208
Public Const WM_RBUTTONDBLCLK As Integer = &H206
Public Const WM_RBUTTONDOWN As Integer = &H204
Public Const WM_RBUTTONUP As Integer = &H205
Public Const WM_MOUSEACTIVATE As Integer = &H21
Public Const WM_MOUSEWHEEL As Integer = &H20A
Public Const WM_MOUSEFIRST As Integer = &H200
Public Const WM_MOUSELAST As Integer = &H209
Public Const WM_MOUSEMOVE As Integer = &H200
Public Const WM_SETCURSOR As Integer = &H20 

2013年4月8日 星期一

[VB.Net] 將視窗影像截圖並轉存為圖片

Dim saveFileDialog1 As New SaveFileDialog() '儲存檔案公用視窗

Try  '預設錯誤處理方式
    '定義存檔格式
    saveFileDialog1.Filter = "Bitmap (*.bmp)|*.bmp|JPEG (*.jpg)|*.jpg|EMF (*.emf)|*.emf|PNG (*.png)|*.png|GIF (*.gif)|*.gif|TIFF (*.tif)|*.tif"
    saveFileDialog1.FilterIndex = 2  '預設為第二種(JPG)
    If saveFileDialog1.ShowDialog() = DialogResult.OK Then '使用者按下確認之後紀錄檔名
        GetWindowInfo(Me.Handle)  '以自訂函數GetWindowInfo取得視窗資訊
        '建立一個Bitmap作為存檔目標
        Dim Screenshot As Bitmap = New Bitmap(ClientX, ClientY - 50, PixelFormat.Format32bppArgb)
        Dim picOutput As Graphics = Graphics.FromImage(Screenshot) '建立儲存影像的Graphic
        Dim picSource As Graphics = Graphics.FromHdc(GetDC(Me.Handle)) '建立獲取來源影像的Graphic
        '以Bitbit將來源影像轉存到目標影像
        BitBlt(picOutput.GetHdc(), 0, 0, ClientX, ClientY - 50, picSource.GetHdc(), 0, 50, CopyPixelOperation.SourceCopy) '把來源影像複製到儲存影像中
        '釋放hdc
        picSource.ReleaseHdc()
        picOutput.ReleaseHdc()
        '存為圖片
        Screenshot.Save(saveFileDialog1.FileName)
    End If
Catch ex As Exception
    MsgBox(ex.Message) '錯誤訊息
End Try

**********以下為API宣告**********

'重繪圖檔用API
Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hSrcDC As Integer, ByVal xSrc As Integer, ByVal ySrc As Integer, ByVal dwRop As Integer) As Integer