顯示具有 Delphi 標籤的文章。 顯示所有文章
顯示具有 Delphi 標籤的文章。 顯示所有文章

2019-04-04

WinAPI SetDllDirectory / GetDllDirectory

procedure TForm1.Button1Click(Sender: TObject);
var
  BL: DWORD;
  BF: PWideChar;
begin
  GetMem(BF, sizeof(255));
  SetDllDirectory(PWideChar('C:\\xxx'));
  GetDllDirectory(BL,BF);
  ShowMessage(WideString(BF));
  FreeMem(BF);
end;

2016-02-21

Delphi UTF-8 Conversion Routines

http://docwiki.embarcadero.com/RADStudio/Seattle/en/UTF-8_Conversion_Routines

2016-02-14

dbExpress / dbGO 以TADOConnection / TADODataSet 連結 MS Access 資料庫

ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=資料庫檔案路徑;Mode=Read;Jet OLEDB:Database Password=密碼;';

2016-02-11

以 TPerlRegEx.Replace 替代掉符合樣式的字串

環境:Win7+XE4

uses System.RegularExpressionsCore;
:
procedure TForm1.Button1Click(Sender: TObject);
var
  RE: TPerlRegEx;
  slFile,slTmp: TStringList;
begin
  RE:=TPerlRegEx.Create;
  slFile:=TStringList.Create;
  slTmp:=TStringList.Create;

  slFile.LoadFromFile(FOD1.FileName);
  RE.Subject:=slFile.Text;
  RE.Options:=[preCaseLess];   //忽略大小寫
  slTmp.Delimiter:='|';
  slTmp.Text:=Memo1.Lines.Text;
  RE.RegEx:='([\s|\.|\=|\[])('+slTmp.DelimitedText+')([\s|\.|\]])';

  while RE.MatchAgain do begin
    RE.Replacement:='$1GA00_$2$3';  //也可以 " \ " 替代  " $ " 結果相同
    RE.Replace;
  end;

  FreeAndNil(RE);
  FreeAndNil(slFile);
  FreeAndNil(slTmp);
end;

備註:
TPerlRegEx.ComputeReplacement;   //經樣式運算後的替代字串
TPerlRegEx.MatchedText;                 //符合樣式的字串等同 TPerlRegEx.Groups[0]
TPerlRegEx.Replacement:='';            //經運算後似乎無法讓Replace再利用,所以看使用狀況必須重覆執行

2016-01-25

清除record的方法

TRecord = record
  a: String;
  b: String;
end;

sRecord:=Default(TRecord)

2015-02-21

Delphi 讀取證券交易所股票資訊JSON格式

環境:

  • Win7
  • Delphi XE4

uses IdHTTP, Data.DBXJSON;
...
...


procedure TForm1.Button1Click(Sender: TObject);
var
  H: TIdHTTP;
  JSON: String;
  JO: TJSONObject;
  JV: TJSONValue;
  JP: TJSONPair;
begin
  H:=TIdHTTP.Create(nil);
  H.Request.UserAgent:='Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)';
  JSON:=H.Get('http://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=tse_3673.tw');
  JO := TJSONObject.ParseJSONValue(JSON) as TJSONObject;
  JP := JO.Get(0);
  ShowMessage(JP.ToString);
  ShowMessage(JP.JsonString.Value);
  JV:=(JP.JsonValue as TJSONArray).Get(0);
  ShowMessage((JV as TJSONObject).Get('n').JsonValue.Value);
  FreeAndNil(JO);
  FreeAndNil(H);
end;


2015-02-11

一次清除 GroupBox 裡所有 CheckBox.Checked 狀態

procedure TMainForm.btnClearClick(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to GB2.ControlCount-1 do
    if GB2.Controls[i].ClassNameIs('TCheckBox') then
      TCheckBox(Gb2.Controls[i]).Checked:=False;
end;

2015-02-09

動態設定 FastReport frxReport 資料來源

procedure setRepDataSource;
var
  DB : TfrxADODatabase;
  Query: TfrxADOQuery;
begin
  with Main.frxReport1 do begin
    DB := TfrxADODatabase(FindObject('ADODatabase1'));
    DB.Connected := False;
    DB.DatabaseName := DM.ADOC1.ConnectionString;
    DB.Connected := True;

    Query := TfrxADOQuery(FindObject('ADOQuery1'));
    Query.Close;
    Query.SQL.Text:=DM.ADODataSet1.CommandText;
    Query.Open;
  end;
end;

2015-02-07

Delphi MainMenu 字型放大及Menu Checked 提示圖示不見解決方法

Delphi 預設 Menu 字型大小為8,想把它放大為12只要2個步驟即可:
  1. 在Project Source 中加上 Screen.MenuFont.Size:=12; 
  2. MainMenu -> OwnerDraw -> True
Menu字型放大後,點選MenuItem後若有設Checked屬性,會發現無法正常顯示提示圖示,原先想以ImageList顯示圖示為解決方案,後來發現只要加入ImageList並指定給MainMenu後即可解決這個問題,不必載入Bitmap icon也可正常運作:
  1. 加入 ImageList
  2. MainMenu -> Images -> ImageList1

2014-08-27

Indy IdUDPServer/IdUDPClient 接收傳送中文字

透過 Indy 套件的 IdUDPServer / IdUDPClient 收發訊息時,英文基本上一定是沒啥問題,但遇到傳送中文訊息,以Indy的預設編碼傳送後接收顯示為亂碼,很明顯是編碼出了狀況,測試的環境為Win7 + XE4,TextEncoding的功能參數必須 uses IdGlobal 才會正常,最初測試時試了半天找不到正確的參數,只好去 IdGlobal.pas 翻一下,找到這個:

















在使用 IdUDPServer / IdUDPClient 收發時,下列兩種方式都可以正常傳送顯示中文,以IdUDPClient為例,IdUDPServer 也適用:

測試環境:

  • Windows 7
  • Delphi XE4 測試版


uses IdGlobal;

..............

IdUDPClient1.Send(Edit1.Text, IndyTextEncoding_UTF8);

or

GIdDefaultTextEncoding := encUTF8;
IdUDPClient1.Send(Edit1.Text);


2014-06-12

Delphi XE? + dbexpress + sqlite3

這兩天空檔在弄個股票資訊蒐集的小工具當練功,想到要用sqlite來當資料庫,以SimpleDataSet來連接sqlite,但在開發階段Connection enable時老是會跳出"sqlite3.dll not found"的錯誤訊息,而且sqlite3.dll已放置在source code目錄下當然也放在win32/debug和win32/release目錄下,還是會出現一樣的錯誤,不過如果直接以執行檔的方式運行後再連接sqlite就可以,看樣子開發階段應該在某個地方也要放才對。
去問了大神找到這篇,原來這兩個地方也要擺,真的有效。

  1. 32bit 的sqlite3.dll 通常放在 C:\Windows\SysWOW64
  2. 64bit 的sqlite3.dll 就放在 C:\Windows\system32

2013-10-01

幫DBNavigator功能按鈕新增文字說明

Delphi裡的DBNavigator在資料庫程式中是常用的物件,但是預設只有圖示而沒有文字說明,雖然可以使用Hint,但使用上還有覺得少了些什麼,在網路上找了些資料並試作並把部份重點節錄下來。

環境:Win7 + Delphi XE4 試用版

uses
   Vcl.Buttons;

type
  TMyNavigator = class(TDBNavigator);

procedure TForm1.FormCreate(Sender: TObject);

const
   Captions: array[TNavigateBtn] of string = ('第一筆', '上一筆', '下一筆',
       '最後一筆', '插入', '刪除', '編輯', '儲存', '取消', '刷新', '確認更新', '取消更新');
var
   btn: TNavigateBtn;
begin
   for btn := low(TNavigateBtn) to high(TNavigateBtn) do
   with TMyNavigator(DBNavigator1).Buttons[btn] do
   begin
      Layout:=blGlyphTop;
      Caption:=Captions[btn];
   end;
end;

成果:


2012-07-29

Delphi URL轉換

透過Delphi來取得連結時通常會出現兩種格式:

1. mms%3a%2f%2fwms.media.hinet.net%2fkapok%2fFartytail%2fFartytail_1_1200k.wmv%3fhichA209DCC4-886C-4786-9227-3FC3BA059785

2. mms://wms.media.hinet.net/kapok/Fartytail/Fartytail_1_600k.wmv?hichA209DCC4-886C-4786-9227-3FC3BA059785


為了將 1 、2 的格式互換,除了自行處理外,Delphi也提供其他的選擇:

  1. Indy IdURI
    uses IdURI;
    ...
    S := TIdURI.URLEncode(str);
    S := TIdURI.URLDecode(str);
  2. HTTPApp.pas
    uses HTTPApp;
    ...
    S := HTTPEncode(str);
    S := HTTPDecode(str);

2012-01-15

Delphi7 Lite

在網路上找東找西時,看到了這個東東[Delphi7 Lite],甚至 Embarcadero.Delphi.XE2.Lite 都也有。就去載了D7LiteFullEdition來踹踹看和CD安裝有和差別,載下來也不過7xMbyte,從資料來看除了已加入一些patch外也再加入一些加強版的套件,裝完後給我的感覺就是一個加強版的D7,接著再把常用的Component裝起來,和安裝版沒什麼差別也沒有異樣,把之前寫的Code拿來重編也都正常無誤。
會看到它是為了找看看在Delphi上是否有支援Hash這個東東,因為在Perl上常用到也覺得粉好用,是的找到了在IniFiles裡有個THashedStringList可以做得到,而彼岸的網友也把THashedStringList和TStringList做了效能上的比較他使用的環境是D7.2+XPSp2,這個D7.2引起我的興趣,因為好像沒聽過有出7.2版,挖著挖著連D7.3版都出現了。從一開始的新鮮到後來的佩服,佩服他們對於某些東西的深度了解並實行。現在常找到的技術文章有極大多數都是彼岸的大作,這樣的情況其實已經持續了多年,這岸的我們應該要警惕。

2012-01-09

Delphi XE2 UTF8測試

由於Delphi7不支援UTF8,造成程式中對於UTF8字元處理及顯示上的不便,因而興起測試一下目前新版本的支援度如何。在測試前先在網路上看一下網友使用的狀況,其中看到一條消息就是XE2已經有內建支援Regular Expressions了,真是讓人高興啊!!


目標主要測試TMemo、TComboBox、TiniFiles及RegularExpressions對UTF8的支援度。有畫面有真象。測試的過程有發現一些事,應該不算新鮮事應該也許早在Delphi2009就支援了。
  1. 一開始當然是先編個最基礎的空AP玩玩,看完真的很大便,Debug版要6M,找了半天弄個了Release版也要1.5M,哇~真是粉大~~,可能剛從D7過來的關係不太適應。
  2. TEncoding,使用TMemo和TStrings讀寫檔案時,可指定寫入檔案的編碼如:TEncoding.UTF8,預設好像是TEncoding.ANSI,問了一下G大好像在Delphi2007就支援了,也有看到用Delphi2009寫的Code。這樣就不必每次要先準備好對的格式的文字檔來stand by了。
    Ex:
    Memo1.Lines.SaveToFile('xx.ini',TEncoding.UTF8);
    -參考資料
  3. TIniFile差點讓人從椅子上掉下來,一開始使用D7慣用的語法去開*.ini,慘了讀不出UTF8格式的,但是ANSI的卻可以。心裡幹譙一陣嘀咕著要改怎不全部一起改咧?後來想想那麼大的公司應該沒那麼笨吧?
    開始到程式安裝的地方把Inifiles*.*的檔案挖出來,找到"System.IniFiles.pas",到裡面去找TEncoding這key word,還好讓我在TMemIniFile class找到。使用方式和TIniFile一樣,只是在宣告時要把TIniFile改宣告TMemIniFile就可以指定TEncoding.UTF8了。
    Ex:
    oIni: TMemIniFile;
    oIni:=TMemIniFile.Create('.\xx.ini',TEncoding.UTF8);
    -參考資料
  4. Regular Expressions是最讓人喜出望外的,在其他部份測試完要進行RE的部份時,正不知如何下手就直接問G大吧,結果找到[Embarcadero原廠資料],原來XE2的RE是承自於TPerlRegEx,讓原先的TPerlRegEx的user可以完全無痛更換開發環境,而且直接支援UTF8String解決了原先D7+TPerlRegEx對UTF8的處理問題。
    既然可以直接使用TPerlRegEx就不作他想了,使用上必須宣告uses System.RegularExpressionsCore,不可宣告uses RegularExpressions。在實際使用上目前發現有一點和D7版的不同,原本熟悉的SubExpressions[n]不見了,取而代之的是Groups[n],至於其他像replace、split有沒差異?因為少用就沒測了。
    Ex:
    uses System.RegularExpressionsCore;
    oRE: TPerlRegEx;
    -參考資料
其他XE2還有些特異功能像FireMonkey、跨Mac、支援x64等,因為沒環境就先不測了。
結論:綜合以上各點已滿足自己小小的需求,讓人粉想換個開發環境,唯一的缺憾就剩執行檔吃了歐羅肥的問題了。


2012-01-08

Delphi7上Unicode的問題

Delphi7是我慣用的開發工具,之前完全不考慮更換版本的最大原因就是新的版本真的是越來越肥了,重點讓人最不爽的是會在系統上裝一堆不曉得用不用得上的東東,就像MS的VisualStudio一樣。

這次在改寫[EzNetRadio]時加入了一個新平台[Now.in],在Web上的編碼UTF-8已是主流,HichannelNow.in皆然,不過Hichannel站台名稱上不會使用特殊字元所以在轉換及顯示上不會有問題,反之Now.in則不然,使用者強調的個人化造成站台名稱格式大相逕庭,而且有為數不少ANSI無法顯示的特殊字元,因此興起將EzNetRadio增加支援Unicode的功能。

Delphi7在Object、procedure及function的使用上,皆以AnsiString、String為主,但是Unicode的處理都必須使用WideString。在EzNetRadio中有使用到IniFile、MainMenu、PopupMenu及站台資料快速截取的靈魂TPerRegEx都必須要支援WideString及WideStringList包括Delphi7內建的字串處理函式,麻煩大了。

TntUnicodeComponents解決了*.ini上Unicode字元顯示在MainMenu及ComboBox的問題,支援WideString的IniFiles也在網上找到解決方案WideIniFiles,至於TPerlRegEx踹了半天都解決不了就只有先放棄了。

Delphi7在Unicode上是有一些解決方案,但還是缺東缺西的,像我這樣玩票的開發人員要自行開發或修改元件還是免了,因為頭髮會掉更多。

把花了一天做的測試弄個Sample以免下次又要重來。

下載Sample.zip

2012-01-02

多物件procedure共用-以Button為例

物件procedure共用在網路上有找到兩種方法:
第一種方法,只要把Button的OnClick方法指向Sample1Click即可,但是第2種方法除了必須指向Sample2Click之外,還必須設定各Button的tag屬性,以tag作為判斷的區別,目前使用上傾向第2種方法。

procedure TForm1.Sample1Click(Sender: TObject);
begin
  if Sender = Button1 then ShowMessage('Sample1-Button1')
  else if Sender = Button2 then ShowMessage('Sample1-Button2');
end;

procedure TForm1.Sample2Click(Sender: TObject);
begin
  case TComponent(Sender).Tag of
    1: ShowMessage('Sample2-Button3');
    2: ShowMessage('Sample2-Button4');
  end;
end;

Delphi ComboBox AutoComplete

在Delphi7的ComboBox,可以透過鍵盤輸入中文或英文達到快速尋找的目的,但是如果要透過程式達到一樣的效果,可以如下方式達成:

環境:Delphi7

ComboBox1.ItemIndex:=ComboBox1.Perform(CB_FINDSTRING, -1, LongInt(PChar('要找的字')));

2011-09-05

[EzWord]背英文單字的小工具

[EzWord]一支幫助自己蒐集英文生字和複習的小程式。
版本更新:2011-11-09
它是一支中介程式,將指定的字彙導向Dr.eye譯典通線上辭典進行查詢並播放語音檔,以下為基本功能:
  1. 英文單字查詢
  2. 英文生字蒐集
  3. 英文單字語音撥放
  4. 英文單字輪播
字彙檔格式:
字彙檔格式以","逗號為分隔符號,可參照檔案"高中7000字.txt"。

英文生字蒐集功能說明:
EzWord蒐集英文生字的功能使用時,請勾選程式畫面上的選項後,將單字、短句或文章反白選取進行複製(Ctrl+C)後,EzWord會以"空白"為分隔符號,將單字依序列表於字彙區。
列表後可選取不要的單字,按"Delete"鍵直接刪除,若要編輯單字,請儲存檔案後直接編輯文字檔。

目前已知的Bug:
  1. 部份單字因網路下載的問題,造成語音會無法播放,可拉長等待時間或以手動的方式自行點選"擴音器"的Icon進行手動播放。
版權宣告:
  1. Dr.eye譯典通線上辭典為英業達股份有限公司版權所有。
  2. 本程式歡迎有需要的朋友自行取用、拷貝及散佈,但禁止以本程式進行商業行為。
  3. 本程式因使用到Dr.eye譯典通線上辭典,若英業達公司對於本程式使用線上查詢的行為提出異議,本人將刪除本程式下載連結,也請各位自行刪除本程式。


















2011/12/16 修正語音播放、生字蒐集存檔的問題並增加音量調整功能。

2014/07/06 dr.eye網站改版修正。

下載EzWord_20140706

2011-08-23

Sqlite上的truncate table

最近採用Sqlite開發些小工具,目前使用的狀況相當的良好,SQL語法的相容度也不錯,目前除了truncate table這個指令不相容外其他的指令還沒遇到無法執行的狀況,雖然truncate table沒法度用,不過一定有類似的指令可完成相同的工作,經過爬文和測試後,確認下列語法可完成相同的目的,"delete from TableName"。