myAdBanner

2013年11月7日 星期四

獲得當前網頁中的所有鏈結

當在一個文本框中輸入網址單擊按鈕後,把當前這個網頁的所有鏈結保存到文本框中顯示出來!
private void btnScrape_Click(object sender, EventArgs e)
{
    string strHttpSource;
 
    if (UrlIsValid())
    {
        // 取得一個包含網頁的程式源代碼的字串。請進一步查看 GetHttpStream()
        // 與 ConvertStreamToString() 這兩個自訂函式。
        try
        {
            strHttpSource = ConvertStreamToString(GetHttpStream(txtURL.Text));
        }
        catch (Exception exp)
        {
            // 將文字設定成 exp.Message 以便顯示於被調用的函數中所設定的自定義錯誤資訊。
            MessageBox.Show(exp.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            return;
        }
 
        string strRegExPattern;
 
        // 將用戶所輸入的網址(URL)賦給一個變數。
        strUrlEntered = txtURL.Text.Trim();
 
        // 取得功能變數名稱以便於不同的地方使用之。最好是在 Click 事件處理函數中
        // 設定此值,如此一來,顯示於 ListView 控制項當中的專案會固定與正確
        // 的網功能變數名稱稱相關聯。如果此值是在其他地方賦值,用戶將能夠更改域
        // 名並且接著在 ListView 當中雙擊某個專案,此舉將會導致該項目
        // 所提取者是一個無效的 URL。
        string[] astrDomain = Regex.Split(strUrlEntered, "/");
 
        // 陣列中的第一個元素[0] 是 "http:" ,第三個元素則是實際的功能變數名稱。
        strDomain = astrDomain[0] + "//" + astrDomain[2];
 
        if (optLinks.Checked)
        {
            ShowStatusIndicators("正在鏈結到網頁以便擷取出鏈結,請稍待。");
 
            lvwLinks.Items.Clear();
 
            // 此處所使用的規則運算式用來剖析一個 HTML anchor
            // (例如: Microsoft ),
            // 說明如下:
            //
            //   ]+    任何字元的一或多個比對,除了位於中刮號中者以外。
            //   )           定義一個子字串之群組的結尾處。
            //   ""?         零或多個引號(逸出)。
            //   >           于 HTML anchor 中緊接著完全相同的文字。
            //   (.+)        比對任何字元的一個群組:也就是 anchor 文字。
            //           與 HTML anchor 之結尾標記完全相同的文字。
            //
            // 請注意:如果您要在 RegEx 測試器中試驗這些規則
            // 運算式模式,請確定您沒有逸出雙引號。
            strRegExPattern = @"]+)""?>(.+)";
        }
        else
        {
            ShowStatusIndicators("正在鏈結到網頁以便擷取出圖像,請稍待。");
 
            htImages = new Hashtable();
            lvwImages.Items.Clear();
 
            // 此處用來取出圖片標記的規則運算式,在觀念上與用來取出 HTML anchor
            // 的規則運算式非常類似。然而,此處的規則運算式卻是複雜許多,
            // 原因是我們必須擷取出可能會依任何順序出現的四個不同屬性。
            //
            // 為了讓此處所使用的規則運算式在長度與複雜度上都保有其合理性,
            // 我們對所要處理之網頁上的 HTML  標記做了下列假設:
            //
            //   1. 用來指定圖片來源的 src 屬性一定會出現。它是唯一的必要屬性。
            //    
            //   2. src 屬性會出現在 width 與 height 屬性之前。如果並非如此的話,
            //      width 與 height 屬性將不會被擷取。
            //
            //   3. 用來指定圖片替代文字的 alt 屬性會出現在 width 與 height 屬性之後。
            //      如果並非如此的話,alt 屬性將不會被擷取。
            //
            //   4. width 與 height 屬性可能會在 src 屬性之後以任何順序出現,
            //      本規則運算式能夠處理此狀況。
            //
            // 上述假設可以確保網頁上的所有圖片標記都會被擷取。然而,它也意味著,
            // 其他某些屬性可能不會出現。
            //
            // 以下是使用於本規則運算式中的幾個重要模式專案:
            //
            //   [^>]+       與 > 以外的任何字元比對。此顯示出您可以移至下一個您所感興趣的屬性。
            //             
            //   (?:         從一個非擷取的群組開始。它會與一個結束 )? 合用, 以便建立
            //               出一個選擇性群組(零或一個比對)。此顯示出您可以讓 src
            //               以外的所有屬性成為可選擇性的。
            //
            //   |           與 width 和 height 使用來成為一個 Or 運算式。
            //               請注意在第一個配對中,width 在前而 height 在後,而在第二個
            //               配對中,則是 height 在前而 width 在後。
            strRegExPattern = @"]+(src)\s*=\s*""?([^ "">]+)""?(?:[^>]+(width|height)\s*=\s*""?([^ "">]+)""?\s+(height|width)\s*=\s*""?([^ "">]+)""?)?(?:[^>]+(alt)\s*=\s*""?([^"">]+)""?)?";
        }
 
        Regex re = new Regex(strRegExPattern, RegexOptions.IgnoreCase);
        Match m = re.Match(strHttpSource);
 
        // 處理 HTML 程式源代碼。因為源是一個長字串,
        // 因此我們不使用 Matches 方法,而改用較有效率的 Match(),Match()
        // 一次只會傳回一個比對。Success 屬性能夠判斷是否存在另外一個比對。
        // NextMatch() 則能夠反復此項作業。
        while (m.Success)
        {
            if (optImages.Checked)
            {
                string strWidth, strHeight;
 
                // 因為規則運算式模式賦予 width 與 height 屬性選擇性的順序,
                // 因此必須先確認哪一個屬性是擺在前面,然後指派合適的 Group 專案值。
                if (m.Groups[3].Value.ToLower() == "width")
                {
                    strWidth = m.Groups[4].Value;
                    strHeight = m.Groups[6].Value;
                }
                else // height 屬性先出現
                {
                    strWidth = m.Groups[6].Value;
                    strHeight = m.Groups[4].Value;
                }
 
                // 調用 AddImage 以便將自定義的 ImageAttributes 物件新增
                // 至 Hashtable 中。請參閱 AddImages 的注釋來瞭解為什麼
                // 要使用一個 Hashtable。
                AddImage(new ImageAttributes(m.Groups[2].Value,
                    m.Groups[8].Value, strHeight, strWidth));
            }
            else
            {
                // 建立一個 ListViewItem 物件並設定第一欄("src")的文字。
                ListViewItem lvi = new ListViewItem();
                lvi.Text = m.Groups[1].Value;
                lvwLinks.Items.Add(lvi);
            }
 
            // 繼續迴圈至下一個比對。
            m = m.NextMatch();
        }
 
        HideStatusIndicators();
 
        // 將所擷取的每一個影像資訊填入清單檢視控制項中。
        if (optImages.Checked)
        {
            if (htImages != null)
            {
                FillImagesListView();
            }
            else
            {
                MessageBox.Show("沒有任何圖像的屬性與正則運算式相符。", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        else
        {
            if (lvwLinks.Items.Count == 0)
            {
                MessageBox.Show("沒有任何鏈結的 URL 與正則運算式相符。", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
    }
}
 
// 此函式會檢查使用者所輸入的網址是否以 http:// 開頭。
private bool UrlIsValid()
{
    if (txtURL.Text.Substring(0, 7) != "http://")
    {
        MessageBox.Show("您所輸入的網址必須以 http:// 開頭。");
        return false;
    }
 
    return true;
}
 
 
 
// 此函式會讀取 HttpWebResponse 物件所傳回的 HTTP 響應資料流程並將它轉換成一個字串以便交給 RegEx 處理之。
private string ConvertStreamToString(Stream stmSource)
{
    if (stmSource != null)
    {
        try
        {
            using (StreamReader sr = new StreamReader(stmSource))
            {
                // 讀取資料流程並傳回其整個內容。
                return sr.ReadToEnd();
            }
        }
        catch (Exception)
        {
            // 不要顯示一個訊息方塊。只需轉寄來自 GetHttpStream() 的自訂錯誤訊息。
            throw new Exception();
        }
        finally
        {
            // 清除 Stream 與 StreamReader。
            wresScrape.Close();
        }
    }
    else
    {
        return "";
    }
}
 
 
 
 
// 此函式使用衍生自 System.Net.WebRequest 的 .NET 類別來取得一個 HTTP 響應資料流程,
// 此 HTTP 回應資料流會成為 RegEx 的剖析來源或是所要顯示的影像(當
// 被 ImageViewer.Show() 呼叫時)。
public Stream GetHttpStream(string url)
{
    // 使用 WebRequestFactory 建立要求。
    wreqScrape = (HttpWebRequest)(WebRequest.Create(url));
 
    wreqScrape.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.1)";
    wreqScrape.Method = "GET";
    wreqScrape.Timeout = 10000;
 
    try
    {
        // 傳迴響應資料流程。
        wresScrape = (HttpWebResponse)(wreqScrape.GetResponse());
        return wresScrape.GetResponseStream();
    }
    catch (Exception)
    {
        // 最可能導致發生錯誤的原因是輸入了錯誤的 URL 或是並未連結至 Internet。
        // 建立一個自訂的錯誤訊息來轉回給呼叫者函式。
        throw new Exception("在提取您所要求的網頁時發生錯誤。" +
            "請檢查您所輸入的 URL 以及 Internet 聯機,並再次嘗試。");
    }
}

Access 自動更新最後修改日期

Access 自動更新最後修改日期
1.資料庫新增一個 最後修改 欄位 日期/時間 格式 預設值 Now()
2. 巨集 新增 上次修改
內容 巨集指令:SetValue 項目:修改日期。運算式:Date() 。
3.表單 -> 事件 ->Before Update 輸入 上次修改
程式碼 加入
Private Sub Form_BeforeUpdate(Cancel As Integer)
On Error GoTo BeforeUpdate_Err

‘ Set bound controls to system date and time.
DateModified = Date

BeforeUpdate_End:
Exit Sub
BeforeUpdate_Err:
MsgBox Err.Description, vbCritical & vbOKOnly, _
“Error Number " & Err.Number & " Occurred"
Resume BeforeUpdate_End
End Sub

字串與日期轉換

字串與日期轉換
短日期格式

VB
FormatDateTime(TextBox1.Text, DateFormat.ShortDate)
C#
DateTime strDate = DateTime.Parse(TextBox1.Text)
String.Format(“{0:yyyy/MM/dd}", strDate)

驗證日期




先下載 iTextSharp 目前最新版為itextsharp-all-5.4.0.zip 解壓縮後把 itextsharp.dll 放到bin中 程式中先引用這兩行 using iTextSharp.text; using iTextSharp.text.pdf; 再call這一段函數 TifFN 代表圖片路徑 PdfFN 代表PDF路徑
public void tif2pdf(string TifFN, string PdfFN)
{
    iTextSharp.text.Image image;
    //設定4個邊界
    int Mleft = 0;
    int Mright = 0;
    int Mtop = 0;
    int Mbottom = 0;
 
    Document document = new Document(iTextSharp.text.PageSize.A4, Mleft, Mright, Mtop, Mbottom);
    PdfWriter.GetInstance(document, new FileStream(PdfFN, FileMode.Create));
    document.Open();
 
    image = iTextSharp.text.Image.GetInstance(TifFN);
    //調整圖片大小,使之適合A4
    if (image.Height > iTextSharp.text.PageSize.A4.Height - Mtop)
        image.ScaleToFit(iTextSharp.text.PageSize.A4.Width - Mleft, iTextSharp.text.PageSize.A4.Height - Mtop);
    else if (image.Width > iTextSharp.text.PageSize.A4.Width - Mleft)
        image.ScaleToFit(iTextSharp.text.PageSize.A4.Width - Mleft, iTextSharp.text.PageSize.A4.Height - Mtop);
    //調整圖片位置,使之居中
    image.Alignment = iTextSharp.text.Image.ALIGN_MIDDLE;
    document.NewPage();
    document.Add(image);
    document.Close();
}

判斷日期函數

判斷日期函數
public static bool IsDate(Object obj)
{
    string strDate = obj.ToString();
    try
    {
        DateTime dt = DateTime.Parse(strDate);
        if (dt != DateTime.MinValue && dt != DateTime.MaxValue)
            return true;
        return false;
    }
    catch
    {
        return false;
    }
}

CSS自動分頁列印

CSS自動分頁列印
自動分頁列印!


<SCRIPT LANGUAGE='JavaScript'>

</SCRIPT>

這是列印的第一頁!

這是列印的第二頁!
第二段寫法:
第一頁
第二頁
第三段寫法:
第一頁

第二頁