發表文章

目前顯示的是有「程式理論」標籤的文章

由網頁呼叫本機端列印方式

圖片
※本篇會參考使用到  將 RDLC 報表不需預覽直接列印(Print RDLC Report without Preview) 部分程式實作方式,重覆部分不再說明。 現在,很多系統都是開發成為 WEB 型態(也稱雲端平台之類...)。 因此,只需要 Browser (瀏覽器) 即可進行系統操作。雖然有很大的便利程度,但是現實中還是會面臨到一些問題,像是 I/O控制等。這是因為受限於 瀏覽器的安全性不得直接讓程式碼介入系統控制,以免被駭客入侵等.... 但這也造就許多問題 ...... 撇開其它不談,就以我們常見的列印來說好了。 也許大家都知道,瀏覽器也是可以列印的啊,不管是直接列印,或是輸出成PDF列印等等。 但所謂不在其位不知其苦,部分行業或是以目前台灣推行的電子發票的列印格式(奇特格式),基本上瀏覽器列印就做不到了。 目前,有接觸過幾家廠商在做這類的系統,遇到電子發票列印實的做法怎麼處理呢? 當然回歸老路囉........ IE + ActiveX ....... 說真的,我有點語塞了。 怎麼有種回歸到 IE 綁架的時代的 Feel 呢? IE only 都會遇到 Windows 重大改版後導致 IE不支援繼續更新會始操作版面出現怪異現象 ,然後 ActiveX 有無法移植到其它瀏覽器(Chrome/FireFox/Safari/Opera...)的問題存在。 當然不是沒有辦法解決,只是台灣可能很多軟體公司面臨賺錢問題,不太願意花太多時間/金錢做研究是擺明事實(IT行業是個很燒錢的行業,由其它的RD部門更是如此),既有技術能快速上手開發賺錢,憑甚麼不做? 有天,在研究 MIT 開發的 Android App 開發(MIT app inventor) 介面得到了很棒的靈感(外國都已經行之有年了) 技術上,大致就像一開始的圖一般: 那個齒輪狀的東西就是一個本地(使用者電腦上的)一個程式或是服務,它提供了基本的 HTTP 通訊能力用來接收指令,並控制印表機。 通訊圖 所以,我有一台伺服器 www.myweb.com.tw 提供了作業頁面 localprint-test.html <html> <head> <meta http-equiv= "

RDLC 報表不預覽直接列印(Print RDLC Report without Preview)

圖片
RDLC 報表在使用時,一般情況下都會開啟預覽畫面,再按列印才能列印出來。 但是如果設計的程式沒有畫面呢?(Console Mode / Service Mode) 所以,這次我就使用 Console 程式設計方式把報表列印出來,並且使用 Class Data Mode 方式處理資料,不使用 RDLC 報表直接連接資料庫。 由於我使用的是 Visual Studio 2017,本身以不含RDLC報表設計功能,所以必須先到 NuGet 安裝 『Microsoft.ReportingServices.ReportViewerControl.Winforms』 這裡測試的方式是把一篇文章(SourceDoc.txt)讀取出來,然後放到 Report1.rdlc 做成的版面上,然後再將它印出來。 1、建立 DataModel.cs 用來儲存資料 namespace PrintRDLCWithoutPreview {     class DataModel     {         public int no { get; set; }         public string line { get; set; }     } } 2、先進行方案的建置,因為RDLC要使用Class Model 資料來源時,需要建置過才能看到。 3、建立 Report1.rdlc 展開專案後可以看到自己定義的 DataModel.cs,選擇它作為資料來源 注意資料集的名稱,待會設定 DataSource 需要用到 拉取要顯示的欄位到需要顯示的類型,由於我們只有文字資料,所以只有拉『line』到顯示『值』上面 如果不需要統計值,直接『下一步』即可 調整位置與版面 4、需要用到的參考,由於會使用到Draw和winform集合的功能,所以必須引入 5、 記得 資料檔案和 RDLC 檔案必須將屬性設成『 一律複製 』,才不會發生找不到檔案問題 6、程式碼(說明在注解上) using System; using System.Collections.Generic; using System.Text; using Syst

在 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

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