發表文章

在 Visual Studio 2017 下使用 RDLC 報表設計功能

圖片
這個 VS2017 (Visul Studio 2017) 有點詭異,從這個版本開始就看不到RDLC報表設計的功能。 雖然我之前在設計發票時覺得這個報表解析度太低,非常不實用。 在使用 VS2015 (Visul Studio 2015) 時,還是有看到它的存在,但是在 2017 版卻不見了, 也許微軟覺得它也不重要了,大家都用第三方元件(我本身使用 Telerik Report) 但是作為『基本』報表輸出,它還算是很有用處的了。 如果希望在 VS2017 也能夠使用RDLC 設計器,就必須先把它的功能裝回來: 1、先到『工具』→『擴充功能與更新』 2、在搜尋找『RDLC』→『Microsoft RDLC Designer for Visual Studio』→安裝   (下面畫面因為我已經安裝過了,所以沒有出現安裝按鈕) 3、有了這個『Microsoft RDLC Designer for Visual Studio』就可以在新增項目中看到『報表』、『報表精靈』兩格項目了。 接下來,如果你的專案要進行報表的開發,除了RDLC設計功能外,還必須要有 『Microsoft.ReportingServices.ReportViewerControl.Winforms』 如果是web版開發則要用『Microsoft.ReportingServices.ReportViewerControl.Webforms』 4、到 NuGet 安裝 『Microsoft.ReportingServices.ReportViewerControl.Winforms』到專案 5、這個安裝包會安裝同時會安裝『Micrsoft.SqlServer.Type』 接受授權合約以便安裝 6、安裝完後,專案的參考會加入一些東西 接下來就可以去開發 RDLC 報表了

在 Powerbuilder 下轉換 UTF-8 文字為 ANSI 文字

圖片
PB10 + 版本 & Pocket Powerbuilder 2.1+ 版本 直接使用 String 就可以轉換 lbl_src = blob ( ls_string1 , encodingutf8! ) ls_string2 = string ( lbl_src , encodingansi!) powerbuilder 9 (含以下版本) 就得借助 Windows API 來完成轉換 首先,你必須宣告外部函數(declare external functions) function ulong MultiByteToWideChar(           ulong CodePage,           ulong dwflags,           ref string lpmultibytestr,           ulong cchmultibyte,           ref blob lpwidecharstr,           ulong cchwidechar ) library "kernel32.dll" function ulong WideCharToMultiByte(           ulong CodePage,           ulong dwFlags,           ref blob lpWideCharStr,           ulong cchWideChar,           ref string lpMultiByteStr,          ulong cbMultiByte,           ref string lpUsedDefaultChar,           ref boolean lpUsedDefaultChar ) library "kernel32.dll" 然後下面實做一個轉換函數 string of_utf8_to_ansi( string as_utf8) 程式碼: //轉換 utf-8 -> ansi //use a wide-char native string as pivot consta

C# 使用 Process.Start 執行外部程式

圖片
C# 執行外部程式的方式並不難,也很簡單,首先引入 using System.Diagnostics; 然後使用 Process.Start( "OtherProgram.exe" ) 方式就可以呼叫並執行。 但是,某些情況下會導致程式無法被執行(或是無法正常執行), 很多原因在於『執行程式的起始位置』,由於被呼叫的程式執行時, 它所啟動的路徑其實是在呼叫程式的路徑下, 如果被呼叫程式需要讀取與程式相同路徑下的文件檔案(或是INI),可能會導致找不到的問題。 為了測試這樣的現象,我準備了2支程式, 一支是被呼叫端的程式 HelloConsole.exe 另外一支就是呼叫端程式 CallOtherProgram.exe HelloConsole.exe 這支程式 在啟動時會讀取相同路徑下的 Doc.txt 並將內容顯示出來,如果有參數也會把參數列出來。而這支程式我固定放在 D:\TEST\ 下,以方便測試,如果不是在這路徑下,那呼叫端的程式碼裡面的路徑也要變更。 HelloConsole.exe using System; using System.IO; namespace HelloConsole {     class Program     {         static void Main(string[] args)         {             Console.WriteLine("This is HelloConsole.exe");             Console.WriteLine(" ");             Console.WriteLine("Environment.CurrentDirectory is ");             Console.WriteLine(Environment.CurrentDirectory);             Console.WriteLine(" ");             Console.WriteLine("AppDomain.CurrentDomain.BaseDire

C# 在環境變數路徑下找尋並執行程式

圖片
這個需求是希望在系統環境變數給定的路徑 PATH 下找尋並執行程式 //取得系統環境變數 var enviromentPath = System. Environment . GetEnvironmentVariable ( "PATH" ); //把路徑分割出來 var paths = enviromentPath. Split ( ';' ); //利用LINQ對每個路徑進行 File.Exists 查詢,並取得第一個找到的程式 var exePath = paths.Select(x => Path . Combine (x, "myApp.exe" )).Where(x => File . Exists (x)).FirstOrDefault(); //如果有程式存在才執行 if ( string .IsNullOrWhiteSpace(exePath) == false ) {     Process . Start (exePath); } 參考: Process.Start() and PATH environment variable

Xamarin : Designer show error : you need to use a theme.appcompat theme (or descendant) with the design library

圖片
這個問題是出現在使用 Visual Studio 2017 Xamarin 建立 Android 單一檢視應用程式時發生的問題,主要原因應該 原因是這個專案預設使用了 appcompat 主題的 android.support.design.widget.CoordinatorLayout 框架,而預設主題無法解析這個框架導致錯誤 如果你在 Designer 的畫面上點擊 show error 就可以看到這個相關訊息 java.lang.IllegalArgumentException was throw  you need to use a theme.appcompat theme (or descendant) with the design library 如果堅持使用 CoordinatorLayout 解決方式就是去更改 Designer 上的 主題(Theme),將它改為 Theme.AppCompat 樣式 就可以正常顯示了

國道高速公路交通路況圖擷取小程式

圖片
這是一支專門下載國道高速公路交通路況圖的小程式。 程式下載: FreewayTrafficPics.zip 需要環境: dotNet Framework 4.5 、 dotNet Framework 4.5 語言套件 使用方式: 設定程式設定檔 FreewayTrafficPics.ini 裡面有個 SavePath 路徑,這個是你要儲存圖檔的路徑(該路徑資料夾必須先建立好,程式不會主動建立資料夾)。 設定 Windows 工作排程器,把程式放入排程,設定為每1分鐘執行一次(或5分鐘,程式會自動把缺少的檔案補齊)。 這個國道路況圖的路況,在 交通部高速公路局 發布,每分鐘更新一次圖檔,這個圖檔分成北中南 3 個區塊,檔案名稱命名規則如下: 北部:map_n_3_{分鐘}.jpg 中部:map_c_3_{分鐘}.jpg 南部:map_s_3_{分鐘}.jpg 圖片樣式如下: 北部 中部 南部 由我們的程式依照排程每分鐘去抓一次(原則上是抓前一分鐘比較不會有問題),抓到我們指定的資料夾: ※應用方式: 寫個主動式網頁,不管是透過 ajax 或是 refresh 或是 flash 方式都可以,輪播最新的北中南三個檔案就可以在畫面上讓使用者看到畫面了 下面是使用 HTML 展示的範例: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=big5" /> <META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE"> <META HTTP-EQUIV="EXPIRES" CONTENT="Mon, 22 Jul 2002 11:12:01 GMT"> <META HTTP-EQUIV="PRAGMA" CONTENT=&

ASP.NET Core 2 使用 HttpClientFactory 讀取中央氣象局 OpenData 的 API (json格式)

圖片
帳號申請方式可以參考前一篇文章: ASP.NET Core 2 使用 HttpClientFactory 讀取中央氣象局 OpenData 的XML下載→註冊CWB會員 以下稱中央氣象局 OpenData 平台為 CWBODP 這個API服務是提供給APP使用的,畢竟XML格式對行動裝置的運算解讀能力與傳輸資料量都是很傷的(消耗資源),操作起來也不是那麼便利,雖然它(XML)比較嚴謹。 CWODP 取用 API 資料的 URI: https://opendata.cwb.gov.tw/api/v1/rest/datastore/{資料代碼}?Authorization={授權碼} 前面篇章 已經講述過 HttpClientFactory 的用法了,所以這裡我只演示直接處理接收後的資料方式。 首先在 startup.cs 裡面的 ConfigureServices 定義讀取方法(以讀取F-C0032-001資料為例): startup.cs         public void ConfigureServices( IServiceCollection services)         {             services.AddHttpClient( "CWBAPI" , c =>             {                 c.BaseAddress = new Uri ( "https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=CWB-1234ABCD-78EF-GH90-12XY-IJKL12345678" );                 c.DefaultRequestHeaders.Add( "Accept", "*/*" );                 c.DefaultRequestHeaders.Add( "User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:7.0.1) Gecko/20100101 Firef