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;