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

2015年12月10日 星期四

Delphi XE8 TFDMemTable的複製

Delphi XE8 內鍵了FireDAC,裡面有一個組件是 TFDMemTable
用起來和TClientDataSet中不多

如果要複製資料到另一個FDMemTable可以用
 
function TForm1.CopyFD(mt: TFDMemTable): TFDMemTable;
begin
  Result := TFDMemTable.Create(nil);
  Result.Data := mt.Data;
end;
相當的簡單

2012年2月9日 星期四

Delphi 元件設計注意事項

原本是要繼承TPopupMenu的元件,
功能是會產生Grid常用的一些功能
(如:匯出)
第一步當然是在Create時產生需要的TMenuItem

constructor TSmfCxGridPopupMenu.Create(AOwner: TComponent);
begin
inherited;
_CreateMenuItem(); //產生menuitem
end;

結果執行時間竟然會發現menuitem會重覆出現兩次,
百思不得其解。

經過無數Debug發現,原在設計時期,拉元件到Form時會呼叫一次Create
然後Delphi就很熱心的把Create之後的狀態存在DFM

結果就造成執行時,元件Create後,又會載入DFM的狀態
形成MenuItem重覆

解決方法就是設計時期不呼叫CreateMenuItem();

constructor TSmfCxGridPopupMenu.Create(AOwner: TComponent);
begin
inherited;
// 確定在 Run Time 時才有作用,不然會重覆
if not (csDesigning in ComponentState) then _CreateMenuItem();
end;

DevExpress 6.x 新版 Drag a column header here to group by that column 中文化

稍為追了一下code
新版修改變簡單了
打開 cxGridStrs.pas
裡面就是串字對應的文字
修改

scxGridGroupByBoxCaption = '《托曳欄位至此可群組化》';//'Drag a column header here to group by that column';

即可。

其它中文化方式都差不多

2011年12月12日 星期一

Delphi 泛型轉字串

最近在用泛型寫一些東西,痴心妄想需要以下功能

TTest
<T>.ToString; //不能編譯哦!
begin
Result := f.ToString;
end;

看了半天沒有很好的解決方案
唯一的方式只有這樣
TToString<T> = reference to function(const AValue: T): string;

procedure TForm2.Button1Click(Sender: TObject);
var
gen
: TGenContainer<Integer>;
begin
gen
:= TGenContainer<Integer>.Create(
function(const AValue: Integer): string
begin
Result := IntToStr(AValue);
end);
end;

也就是說必需在傳入一個函式。
這樣有點麻煩就是

2011年3月23日 星期三

Delphi TNotifyEvent用參數的問題

本來以為用若名函數可以搞定:
//以下方法不能編譯過
Button1.OnClick := procedure( sender : tobject ) begin
//...code
end;

結果不能通過。
後來找了好久才發現另外一個妙招,Delphi舊版的也可以用

procedure Click(Self : TObject; Sender: TObject);
var lv : TLvItem;
begin
lv := TLvItem(Self);
//.....code..
end;

function _CreateMenuItem(lv : TLvItem):TMenuItem;
var Meth: TMethod;
begin
Meth.Data := lv;
Meth.Code := @Click;
Result.OnClick := TNotifyEvent(Meth);
end;

2010年3月23日 星期二

Delphi TDictionary 用法


var
aDic : TDictionary;
aEnum : TDictionary.TPairEnumerator;
begin
aEnum := aDic.GetEnumerator;
while (aEnum.MoveNext) do
begin
Memo1.Items.Add(aEnum.Current.Key + ' : ' + IntToStr(aEnum.Current.Value));
end;

方法二

var kvp : TPait<integer,string>
begin
for kvp in FList do begin
//kvp.....
end;
end;

DevExpress 3.22 Drag a column header here to group by that column 中文化

為了這行找了好多資料。
後來還是自己修改原始碼
在 dxDBGrid.pas 2714行

FText := ' ' + sdxPanelText;

改成

case GetSystemDefaultLangID of
2052 : begin //簡體
FText := ' ' + '▲嶺雄戲弇祫森褫郪趙◎';
end;
1028 : begin
FText := ' ' + '《拖曳欄位至此可群組化》';
end;
else begin
FText := ' ' + sdxPanelText;
end;
end;

這樣就支持 簡繁體的顯示嘍!

2009年9月21日 星期一

Delphi 2010 的FastReport 4安裝

把Delphi 2010裝上去看了一下,第一步當然要先評估常用的元件裝上去的可能性,
下載了新版的FastReport 4,發現FastReport的老問題-中文的Desgn畫面會變亂碼


研究了老半天發現recompile產出的四個.pas跟本就是亂碼。



知道問題後就很簡單啦,到Res的Taiwan發現有四個有對應到檔名的.xml,
然內容轉一下在貼上,重編譯就解決啦...

註:此方法在Delphi 2007 執行時期一樣是亂碼,可能是文件的編碼問題,修改
frxRes.pas
412行 原UTF8Decode拿掉
Self.AddW(Items[idx].Prop['Name'], (AnsiString(frxXMLToStr(Items[idx].Prop['Text']))));







方式2 : 新的FR4 有熱心網友提供 UTF8 的frcc.exe
不管Delphi 2007 or 2010,拿來重新產生語言檔就可以,然後出來的.pas
copy to Source目錄,不然設計時期會有亂碼




Memo中文丟失的問題

1.改用RichEdit

2.

這個類持久化函數改了一下去掉了Utf8的轉換部份,就把問題切底解決了.

frxUnicodeUtils單元下:
把TWideStrings類的ReadDataW和WriteDataW函數中關於Utf8的轉換去掉

具體是:

ReadDataW:
//Add(Utf8Decode(Reader.ReadString));
Add(Reader.ReadString);

WriteDataW:
//Writer.WriteString(Utf8Encode(Get(I)));
Writer.WriteString(Get(I));