伴我21個年頭的Delphi

2000年從商業經營科系轉至勤益的資訊管理科二專部後,就開始接觸Delphi5這門程式語言,記得當初使用QB/VB都覺得不到位,遇到Delphi後覺得這開發工具真的很強大,於是努力學習精進。

這門語言,也讓我得到了在國泰電腦的第一份軟體業工讀生工作後,甚至讓我進入海軍陸戰隊服役時,因為對資料庫程式的特別專長,也參與了兵棋、陸戰隊進銷存等專案開發。退伍後,也陸續進入公司開發過中醫醫療軟體、檢驗儀器系統連線、會計、人事薪資、票據、餐飲POS等系統,客戶也從中醫診所、檢驗室、檢驗所到流通業、百貨業甚至超市業。

毫無疑問的,Delphi是近25年來我覺得唯一也是擁有絕對地位的Windows資料庫應用程式開發工具王者,從幹掉VB、Powerbuilder的工具來看,近幾年也著重在APP的開發上,但也許因為有不少開源的開發語言(如:Cordova、Xamarin、NativeScript、React Native、Electron、Flutter) 導致優勢不再。連近期公司的走向也是主要以雲端開發為主了!

雖然還不致於正式跟它Say Goodbye~不過使用它的頻率真的減少許多就是

POS系統介接與信用卡機連線的作法

Delphi或C#與信用卡連接的方式,有直接透過com port通訊或是透過呼叫exe的方式,利用in.txt、out.txt做溝通。然後回傳信用卡卡號/授權碼/刷卡金額等資訊。
示範一下Delphi與C#如何做信用卡線上刷卡。
Delphi

  public
    { Public declarations }
    ExecInfo : TShellExecuteInfo;   // use shellapi
    i:integer;
  end;
procedure TForm1.Button1Click(Sender: TObject);
var 
  s:String;
  ts:TStringlist;
begin
  ZeroMemory(@ExecInfo,SizeOf(ExecInfo));
  with ExecInfo do begin
    cbSize := SizeOf(ExecInfo);
    fMask := SEE_MASK_NOCLOSEPROCESS;
    lpVerb := 'open';
    lpFile := 'ecr.exe'; 
      Wnd := self.Handle;
    nShow := SW_HIDE; 
  end;
  s:='xxxxxxxxxxxxxxxxxxxx'; // 填上信用卡的溝通格式
  ts := Tstringlist.Create;
  ts.Clear;
  ts.Add(s);
  ts.SaveToFile('in.dat');
  ts.Free; 
  ShellExecuteEx(@ExecInfo);
  deletefile('out.dat');
  caption := '刷卡中...';
  timer1.Enabled := True;
  i:=0;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var ts1:Tstringlist;
sstatus,smoney,scard,sappno:String;
begin
  i:=i+1;
  if fileexists('out.dat') then begin
     Timer1.Enabled := false;
     ts1 := Tstringlist.Create;
     ts1.LoadFromFile('out.dat');
     if ts1.Count >0 then begin
       // 讀入檔案,解析格式
     end;
     ts1.Free;
  end;
end;
string dir = System.Windows.Forms.Application.StartupPath;
[DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        private void uForm1_Load(object sender, EventArgs e)
        {
            try
            {
                if (File.Exists(dir + "/out.txt")) //刪除out.txt
                    File.Delete(dir + "/out.txt");
                string code = "";  // in.txt格式
                using (StreamWriter sw = new StreamWriter(dir + "/in.txt"))   //小寫TXT     
                sw.Write(code);    
                IntPtr PDC = FindWindow(null, "ecr");  //開啟PosDataCom
                if (PDC == (IntPtr)0)
                {
                    try
                    {
                        Process p = new Process();
                        p.StartInfo.FileName = dir + "/ecrnccc.exe";
                        p.StartInfo.WorkingDirectory = dir;
                        p.StartInfo.UseShellExecute = false;
                        p.StartInfo.RedirectStandardInput = true;
                        p.StartInfo.RedirectStandardOutput = true;
                        p.StartInfo.RedirectStandardError = true;
                        p.StartInfo.CreateNoWindow = true;
                        p.Start();
                    }
                    catch (Exception exp)
                    {
                        return;
                    }
                }
               
               
                this.timer1.Enabled = true;
               
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (times == 5)
            {                
                times = 0;
                i++;
                if (i > 4)
                {
                    i = 0;
                    try
                {
                if (File.Exists(dir + "/out.txt"))
                {
                   
                    using (StreamReader sr = new StreamReader(dir + "/out.txt"))     //小寫TXT
                    {
                        String line;
                      
                        if ((line = sr.ReadLine()) != null)
                        {
                          // 解析
                        }
                        else
                            return false;
                        return true;
                    }
                }
                return false;
            }
            catch
            {
                return false;           
            }
                }
            }
            times++;
        }

Metro Style初體驗

metro style pos

確認功能完整度後,開始一邊完善系統一邊調整介面了!這次採用是Metro Style的設計,Metro 的三大精神為Modern Design、International Typographic Style及Motion Design。

也讓我重新找Win8系統以及打開XBOX研究一番~目前POS系統有使用這樣概念設計的應該為中保的開店快手雲端POS跟育山資訊的大當家BB POS

揪Happy於2014台北國際連鎖加盟大展天天集字抽iPad Mini

準備開站的JOHAPPY(揪HAPPY)先在連鎖加盟展活動暖身囉!

只要在第15屆台北國際連鎖加盟大展-春季展展覽現場用手機掃瞄QR code,完成『加、盟、人、生、翻、紅』6個字的集字,將天天抽出一台iPad mini!

JOHAPPY! 玩遊戲!拿獎品!揪HAPPY!

官方網站:http://johappy.com/

官方粉絲頁:揪Happy了沒

展覽時間:2月21日~24日 上午10點~下午6點
展覽地點:台北世貿一館(台北市信義路五段五號)
門票資訊:全票250元、半票150元、優待票200元
主辦單位:社團法人台灣連鎖加盟促進協會Facebook粉絲頁
洽詢電話:02-2523-5118

2014第15屆台北國際連鎖加盟展 平面位置圖

http://www.inews.com.tw/download/1391998696.JPG

POS系統設備 – 餐飲點餐卡/ 餐飲業問卷調查

在餐飲業用餐後,某些比較大型的連鎖餐飲體系都會附上一張滿意度問卷調查表,或是在一些比較沒有過多調味變化的餐飲店中,也會出現學生時代答案卡形式的點餐卡。

點餐卡雖然沒有太深厚的技術,不過對於店家來說卻是蠻便利的,只要將客戶畫記好的點餐卡放入OMR光學閱讀機中,就可以輸入到POS系統畫面中。節省許多點餐及詢問的時間~

關閉清粥小菜_點餐卡

關閉鹽酥雞_點餐卡

關閉餐飲業

延伸連結:
名科資訊有限公司 http://www.dartgoal.com.tw/

 

POS系統設備 – 取餐呼叫器

在客戶那邊看到了蠻特別的機器「取餐呼叫器」,透過簡單的發送器及接收器,可以免除要廣播、大聲叫號的問題。等於手上的號碼牌(取餐牌)是會自動提醒的。操作也很簡單,只要透過發送器按下號碼後送出,手上對應的接收器就會閃爍,可以用在需要叫號的各行各業,甚至用在目前正夯的健康照護產業也可以。

 

 

延伸連結:
漢偉科技有限公司 http://www.ehanway.com.tw/