2021年4月22日 星期四

Delphi Ole excel container, Save Xlsx file

 
uses ComObj, Excel;

var Excel: OleVariant;
Excel := CreateOleObject('EXCEL.Application');
Excel.Application.Workbooks.Add;
Excel.Application.Workbooks[1].SaveAs('c:\test.xlsx', xlWorkbookDefault); // or xlOpenXMLWorkbook (51)
Excel.Application.Quit;

-----------------------------------------

unit Excel;

interface

uses Windows, Activex;
// originally from Excel97.pas
// XlFileFormat constants

type
  XlFileFormat = TOleEnum;
const
  xlAddIn = $00000012;
  xlCSV = $00000006;
  xlCSVMac = $00000016;
  xlCSVMSDOS = $00000018;
  xlCSVWindows = $00000017;
  xlDBF2 = $00000007;
  xlDBF3 = $00000008;
  xlDBF4 = $0000000B;
  xlDIF = $00000009;
  xlExcel2 = $00000010;
  xlExcel2FarEast = $0000001B;
  xlExcel3 = $0000001D;
  xlExcel4 = $00000021;
  xlExcel5 = $00000027;
  xlExcel7 = $00000027;
  xlExcel9795 = $0000002B;
  xlExcel4Workbook = $00000023;
  xlIntlAddIn = $0000001A;
  xlIntlMacro = $00000019;
  xlWorkbookNormal = $FFFFEFD1;
  xlSYLK = $00000002;
  xlTemplate = $00000011;
  xlCurrentPlatformText = $FFFFEFC2;
  xlTextMac = $00000013;
  xlTextMSDOS = $00000015;
  xlTextPrinter = $00000024;
  xlTextWindows = $00000014;
  xlWJ2WD1 = $0000000E;
  xlWK1 = $00000005;
  xlWK1ALL = $0000001F;
  xlWK1FMT = $0000001E;
  xlWK3 = $0000000F;
  xlWK4 = $00000026;
  xlWK3FM3 = $00000020;
  xlWKS = $00000004;
  xlWorks2FarEast = $0000001C;
  xlWQ1 = $00000022;
  xlWJ3 = $00000028;
  xlWJ3FJ3 = $00000029;
  xlExcel12 =50;
  xlExcel8 = 56;
  xlHtml = 44;
  xlOpenXMLAddIn = 55;
  xlOpenXMLTemplate = 54;
  xlOpenXMLTemplateMacroEnabled = 53;
  xlOpenXMLWorkbook = 51;
  xlOpenXMLWorkbookMacroEnabled = 52;
  xlTemplate8 = 17;
  xlUnicodeText = 42;
  xlWebArchive = 45;
  xlWorkbookDefault = 51;
  xlXMLSpreadsheet = 46;

implementation
end.

轉貼至 https://stackoverflow.com/questions/9067053/delphi-ole-excel-container-save-file


XlFileFormat 枚举 (Excel)

指定保存工作表时的文件格式。

XLFILEFORMAT 枚举 (EXCEL)
名称说明扩展名
xlAddIn18Microsoft Excel 97-2003 外接程序*.xla
xlAddIn818Microsoft Excel 97-2003 外接程序*.xla
xlCSV6CSV*.csv
xlCSVMac22Macintosh CSV*.csv
xlCSVMSDOS24MSDOS CSV*.csv
xlCSVUTF862UTF8 CSV*.csv
xlCSVWindows23Windows CSV*.csv
xlCurrentPlatformText-4158当前平台文本*.txt
xlDBF27Dbase 2 格式*.dbf
xlDBF38Dbase 3 格式*.dbf
xlDBF411Dbase 4 格式*.dbf
xlDIF9数据交换格式*.dif
xlExcel1250Excel 二进制工作簿*.xlsb
xlExcel216Excel 版本 2.0 (1987)*.xls
xlExcel2FarEast27Excel 版本 2.0 中文 (1987)*.xls
xlExcel329Excel 版本 3.0 (1990)*.xls
xlExcel433Excel 版本 4.0 (1992)*.xls
xlExcel4Workbook35Excel 版本 4.0 工作簿格式 (1992)*.xlw
xlExcel539Excel 版本 5.0 (1994)*.xls
xlExcel739Excel 95(版本 7.0)*.xls
xlExcel856Excel 97-2003 工作簿*.xls
xlExcel979543Excel 版本 95 和 97*.xls
xlHtml44HTML 格式.htm;.html
xlIntlAddIn26国际外接程序无文件扩展名
xlIntlMacro25国际宏无文件扩展名
xlOpenDocumentSpreadsheet60OpenDocument 电子表格*.ods
xlOpenXMLAddIn55Open XML 外接程序*.xlam
xlOpenXMLStrictWorkbook61 (&H3D)Strict Open XML 文件*.xlsx
xlOpenXMLTemplate54Open XML 模板*.xltx
xlOpenXMLTemplateMacroEnabled53启用 Open XML 模板宏*.xltm
xlOpenXMLWorkbook51Open XML 工作簿*.xlsx
xlOpenXMLWorkbookMacroEnabled52启用 Open XML 工作簿宏*.xlsm
xlSYLK2符号链接格式*.slk
xlTemplate17Excel 模板格式*.xlt
xlTemplate817模板 8*.xlt
xlTextMac19Macintosh 文本*.txt
xlTextMSDOS21MSDOS 文本*.txt
xlTextPrinter36打印机文本*.prn
xlTextWindows20Windows 文本*.txt
xlUnicodeText42Unicode 文本无文件扩展名;*.txt
xlWebArchive45Web 档案.mh;.mhtml
xlWJ2WD114日语 1-2-3*.wj2
xlWJ340日语 1-2-3*.wj3
xlWJ3FJ341日语 1-2-3 格式*.wj3
xlWK15Lotus 1-2-3 格式*.wk1
xlWK1ALL31Lotus 1-2-3 格式*.wk1
xlWK1FMT30Lotus 1-2-3 格式*.wk1
xlWK315Lotus 1-2-3 格式*.wk3
xlWK3FM332Lotus 1-2-3 格式*.wk3
xlWK438Lotus 1-2-3 格式*.wk4
xlWKS4Lotus 1-2-3 格式*.wks
xlWorkbookDefault51默认工作簿*.xlsx
xlWorkbookNormal-4143常规工作簿*.xls
xlWorks2FarEast28Microsoft Works 2.0 两端对齐格式*.wks
xlWQ134Quattro Pro 格式*.wq1
xlXMLSpreadsheet46XML 电子表格*.xml


轉貼至:https://docs.microsoft.com/zh-cn/office/vba/api/excel.xlfileformat

2021年4月20日 星期二

Load a stream containing HTML code into a TWebBrowser

procedure LoadStream(WebBrowser: TWebBrowser; Stream: TStream);
var
  PersistStreamInit: IPersistStreamInit;
  StreamAdapter: IStream;
  MemoryStream: TMemoryStream;
begin
  {Load empty HTML document into Webbrowser to make "Document" a valid HTML document}
  WebBrowser.Navigate('about:blank');
  {wait until finished loading}
  repeat
    Application.ProcessMessages;
    Sleep(0);
  until
    WebBrowser.ReadyState = READYSTATE_COMPLETE;
  {Get IPersistStreamInit - Interface}
  if WebBrowser.Document.QueryInterface(IPersistStreamInit, PersistStreamInit) = S_OK then
  begin
    {Clear document}
    if PersistStreamInit.InitNew = S_OK then
    begin
      {Make local copy of the contents of Stream if you want to use Stream directly,
                        you have to consider, that StreamAdapter will destroy it automatically}
      MemoryStream := TMemoryStream.Create;
      try
        MemoryStream.CopyFrom(Stream, 0);
        MemoryStream.Position := 0;
      except
        MemoryStream.Free;
        raise;
      end;
      {Use Stream-Adapter to get IStream Interface to our stream}
      StreamAdapter := TStreamAdapter.Create(MemoryStream, soOwned);
      {Load data from Stream into WebBrowser}
      PersistStreamInit.Load(StreamAdapter);
    end;
  end;
end;

參考至 http://www.devsuperpage.com/Articles/views/Delphi/Art_1-2146.asp

2021年1月13日 星期三

【Delphi Multi-Device Application】 ListBox 自訂 ListBoxItem

procedure TForm1.FormCreate(Sender: TObject);
begin
  ListBox1.ShowScrollBars := False;
  ListBox1.AniCalculations.Animation := True;
  ListBox1.AniCalculations.Averaging := True;
  ListBox1.AniCalculations.BoundsAnimation := True;
  ListBox1.AniCalculations.TouchTracking := [ttVertical];
end;

procedure TForm1.SpeedButton3Click(Sender: TObject);
var lbItem:TListBoxItem;
  frmItem:TFrame2;
begin
  lbItem := TListBoxItem.Create(Self);
  frmItem := TFrame2.Create(Self);
  frmItem.Parent := lbItem;
  frmItem.Name := 'frmItem_'+FormatDateTime('HHNNSSZZ', Now);
  lbItem.Height := frmItem.Height;
  frmItem.Align := TAlignLayout.alClient;
  lbItem.Parent := ListBox1;
end;

2021年1月12日 星期二

【Delphi Multi-Device Application】 ScrollBox滑動效果設定

  with VertScrollBox do
  begin
    ShowScrollBars := False;
    //
    AniCalculations.BeginUpdate;
    AniCalculations.TouchTracking:=[ttVertical];
    AniCalculations.AutoShowing := True;
    AniCalculations.Animation := True;
    AniCalculations.BoundsAnimation := True;
    AniCalculations.Averaging := True;
    AniCalculations.EndUpdate;
  end;

2021年1月6日 星期三

【Delphi Multi-Device Application】 動態呼叫 日期選擇器

uses FMX.Platform, FMX.Pickers,  FMX.DateTimeCtrls;

procedure TForm1.Button2Click(Sender: TObject);
var
  PickerService: IFMXPickerService;
  FDateTimePicker: TCustomDateTimePicker;
begin
  TPlatformServices.Current.SupportsPlatformService(IFMXPickerService, PickerService);
  FDateTimePicker := PickerService.CreateDateTimePicker;
  FDateTimePicker.Parent := Button2;
  FDateTimePicker.ShowMode := TDatePickerShowMode.psmDate;
  FDateTimePicker.Date := Date;
  FDateTimePicker.TodayDefault := True;
  FDateTimePicker.PreferedDisplayIndex := Screen.DisplayFromPoint(Screen.MousePos).Index;
  FDateTimePicker.OnDateChanged := WhenDateChanged;
  FDateTimePicker.Show;
end;

procedure TForm1.WhenDateChanged(Sender: TObject; const ADate: TDateTime);
begin
  ShowMessage(DateTimeToStr(ADate));
end;

【Delphi Multi-Device Application】 顯示/隱藏 虛擬鍵盤

 uses FMX.VirtualKeyboard, FMX.Platform;

In the .dpr set VKAutoShowMode to Never

begin
  Application.Initialize;
  VKAutoShowMode := TVKAutoShowMode.Never;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end. 

Show soft keyboard on the form (for example on TEdit.OnEnter event):

var
  FService: IFMXVirtualKeyboardService;
begin
  TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(FService));
  if (FService <> nil) then
  begin
    FService.ShowVirtualKeyboard(Edit1);
    Edit1.SetFocus;
  end;
end;

Hide soft keyboard on the form (Edit1 will be still focused with hidden soft keyboard):

var
  FService: IFMXVirtualKeyboardService;
begin
  TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(FService));
  if (FService <> nil) then
  begin
    FService.HideVirtualKeyboard;
    Edit1.SetFocus;
  end;
end;

轉貼至 https://stackoverflow.com/questions/27402101/how-to-hide-and-again-show-soft-keyboard-while-tedit-is-in-focus-delphi-xe7

2020年12月15日 星期二

【Delphi Multi-Device Application】 SQLite掛載行動裝置的設定

我使用的是FDConnection 連接 SQLite,
首先FDConnection.DriverName選擇 SQLite,Params >  Database 選擇已建置好的SQLLite 資料庫

再配合 FDQuery 將資料取出反應在畫面的物件上,基本Application的架構這樣的設定就可以使用,要掛載到行動裝置需要再做以下的設定
Project > Deployment 設定發佈後SQLite的放置目錄,[Remote Path] 填入 assets\internal\ 
  • Remote Path on iOS Device platform: StartUp\Documents\
  • Remote Path on Android platform: assets\internal\

FDConnection BeforeConnection事件,在連線前變更讀取路徑

uses System.IOUtils;

procedure TForm1.FDConnection1BeforeConnect(Sender: TObject);
begin
{$IF DEFINED(iOS) or DEFINED(ANDROID)}
  FDConnection1.Params.Values['Database'] := TPath.Combine(TPath.GetDocumentsPath, 'WorkShifts.db');
{$ENDIF}
end;

資料庫有使用到中文的部份,記得將 FDConnection.Params.StringFormat設定為 stUnicode,才會在行動裝置上正確的顯示。



2020年11月17日 星期二

【Delphi Rx Multi-Device】 Andriod 環境建置

Delphi RX安裝時出現的提示畫面

需要下載 Java Se Development Kit 7

選擇[Y]會開啟Java Download的網頁,網頁自然會優先將最新版本顯示在網頁上,下載最新版本的JDK不會被Delphi套用,必須下載訊息畫面中Java SE Development Kit7的版本,在Java Download網頁我選擇下載的是 Java SE Development Kit 7u80 的版本。

安裝完 Java JDK、Delphi RX後,在Delphi Rx 選單 Tools 點選 Options來設定SDK Manager

Options

SDK Manager會有一組已存在的SDK Version的選項,建議刪除預設的SDK Version。
新增SDK Version設定適應的執行環境




圖中(1)(2)參考範例找到對應的SDK及NDK路徑,圖中(3)會自動帶出 (如果安裝的SDK版本沒有被Delphi接受,不會被自動帶出,即使手動填入也無法完成設定)。

完成SDK Manager設定,即可順利編譯Multi-Device的專案。

編譯後出現 [Exec Error] the command "PATH C:\Program files......的錯誤訊息

複製訊息,剔除訊息左邊第一個雙引號左邊的字串,及訊息最後一個雙引號右邊的字串,貼到 命令提示字元 中執行,結果出現 Could not create the Java Virtual Machine的錯誤

系統內容環境變數 裡新增系統變數



變數名稱 _JAVA_OPTIONS
變數值 -Xmx512m



2020年11月11日 星期三

【Delphi Multi-Device Application】 Menu選單

在畫面放置 [MultiView] ,再放置 [Button] 做事件觸發用,放置 [ShadowEffect][Multiview] 裡可以使 MultiView 有陰影的效果

在 MultiView屬性設定
  MasterButton 指向 Button1
  Mode 設定為 Drawer
MultiView設定

Button.StyleLookup 可以用來設定按鈕上的圖示

如果要做到 Button 觸發時,圖示轉動效果可以在 Button.OnClick 事件處理

--------------------
Button.OnClick
--------------------
  if button1.Tag=1 then
  begin
    Button1.AnimateFloat('RotationAngle', 0, 0.5);
    button1.Tag := 0;
  end
  else
  begin
    Button1.AnimateFloat('RotationAngle', 180, 0.5);
    button1.Tag := 1;
  end;

【Delphi Multi-Device Application】 觸控頁面滑動切換

 放置 [TabControl],並建立二個 [TabItem]TabControl.TabPosition屬性設置為None,如下圖

TabControl設定

放置 [ActionList],產生二個 ChangeTabAction,將Tab屬性分別對應到TabItem1、TabItem2
ActionList設定


放置 [GestureManager]
   TabControl.Touch選項
     GestureManager 指向 GestureManager1,
     Gestures → Standard觸控方向的動作,Left指向ChangeTabAction2,Right指向ChangeTabAction1。




2020年10月31日 星期六

【Delphi Multi-Device Application】 Button.Click 觸發頁面滑動切換

 放置 [TabControl],並建立二個 [TabItem]TabControl.TabPosition屬性設置為None,如下圖

TabControl設定

TabItem1裡放置 [Button1]TabItem2裡放置 [Button2] 做切換頁籤的觸發事件。

---------------------
Button1.OnClick
---------------------
  //滑動切換到第二個頁籤
  TabControl1.SetActiveTabWithTransition(Self.TabItem2, TTabTransition.Slide);

---------------------
Button2.OnClick
---------------------
  //滑動切換回第一個頁籤
  TabControl1.SetActiveTabWithTransition(Self.TabItem1, TTabTransition.Slide, TTabTransitionDirection.Reversed);


2020年9月18日 星期五

同樣是二戰戰敗國,為什麼德國擁有國防軍,而日本只有「自衛隊」

 原文網址:https://kknews.cc/history/rb4y8br.html

同樣是二戰戰敗國,為什麼德國擁有國防軍,而日本只有「自衛隊」

2018-07-26 由 軍林天下 發表于歷史

作為二戰戰敗國,德國和日本都被解除了武裝,照著《開羅宣言》和《波斯坦公告》來講,這兩個國家都不應該再擁有軍隊,然而為何現在德國擁有軍隊,日本卻沒有軍隊呢?

來看德國,德國有軍隊,而且是被歐美等國認可的。戰敗後的德國軍隊就地解散,國土分別被蘇聯和美國占領,分裂為東德和西德。蘇聯和美國本來就不對付,二戰剛結束那邊就開始冷戰。為了一決高下,東德和西德自然成了前沿戰場,蘇聯更是暗自組建東德軍隊。美國也不甘示弱,立即暗示西德也可以擁有自己的軍隊。於是本來就地解散的德國軍隊又回來了,西德第一任總理康拉德·阿登納在萊茵蘭-普法爾茨組建了新西德軍隊,並將軍隊改名為「聯邦國防軍」。

日本沒有軍隊,卻有一個和軍隊差不多意思的自衛隊。日本也是在1945年戰敗後被剝奪了武裝,軍事機構也被解散,美國直接大軍進駐日本。隨後,日本政府頒布《和平憲法》,宣布放棄戰爭放棄武力放棄宣戰權。整個日本幾乎成了美國的「中轉站」。直到韓戰爆發,美國發現日本手頭連拿的出手的警察都沒有,為了保證「中轉站」的「安全」,指示日本組建國家警察預備隊。到了1954年,日本政府受到美國指點,專門頒布了「防衛兩法」,日本自衛隊就出現在大家面前了。

日本自衛隊明面上是日本的警察隊伍,但是時至今日已經成為沒有名分的軍隊。一個警察隊伍,人數已經達到28萬餘人,甚至軍費與英法相當,排世界第五。日本右翼勢力近幾年瘋狂提出修改憲法的要求,出台各種海外派兵法,和美國簽訂安保協議,甚至直接出兵伊拉克、阿富汗。這支不是軍隊的日本自衛隊,在亞洲軍事實力排名相當靠前,比其他國家正規軍規模都要大,裝備、戰鬥力都要強。