Fastreport 如何使用外部(自訂)函數 |
尚未結案
|
g9221712
高階會員 發表:145 回覆:344 積分:162 註冊:2006-07-06 發送簡訊給我 |
Fastreport 如何使用外部(自訂)函數
各位前輩及版主大大: 因為在Fastreport找不到StringToColor函數可以使用,我詢問原廠支援 不過原廠回應: =========================================================================== You can add your function so: procedure TForm1.FormCreate(Sender: TObject); begin frxReport1.AddFunction('function MyFunc(s:String):string'); frxReport1.ShowReport(); end; function TForm1.frxReport1UserFunction(const MethodName: String; var Params: Variant): Variant; begin if MethodName = 'MYFUNC' then Result := UPPERCASE(Params[0]); end; =========================================================================== 我實際使用 In the Form Code: frxReport1.AddFunction('function StringToColor(s:String):TColor'); self.frxReport1.LoadFromFile('report\ShowEdit_N.fr3'); Self.frxReport1.ShowReport(True); Self.frxReport1.Clear; In the Report Code: procedure MasterData1OnBeforePrint(Sender: TfrxComponent); BEGIN if length( begin M1.font.color:=clwhite; // Hide Value end else begin M1.font.color:=StringToColor(trim( end; END; 不知道錯誤在哪!
------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」 程式寫的越久,卻發現自己越來越不會寫程式! |
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
試試把
frxReport1.AddFunction('function StringToColor(s:String):TColor'); self.frxReport1.LoadFromFile('report\ShowEdit_N.fr3'); 這兩行前後順序換掉 我試下面程式碼是可以的 function TForm1.MyFunc(s1,s2: String): string; begin Result:=s1 s2; end; function TForm1.frxReport1UserFunction(const MethodName: String; var Params: Variant): Variant; begin if MethodName = 'MYFUNC' then Result := MyFunc(Params[0], Params[1]); end; procedure TForm1.Button1Click(Sender: TObject); begin frxReport1.AddFunction('function MyFunc(s1,s2: String): string;'); frxReport1.ShowReport(); end; 報表 procedure frxReport1OnStartReport(Sender: TfrxComponent); begin Memo1.Text:=MYFUNC('2','1'); end; |
g9221712
高階會員 發表:145 回覆:344 積分:162 註冊:2006-07-06 發送簡訊給我 |
|
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
當我直接用StringToColor函式試您的程式,確實發生型態無法轉換錯誤(我不知道這問題出在那兒,也許FastReport在橋接Variant或接function返回值出錯,不過這我要花點時程追source看是不是?),後來我想想,直接再包一層,試出來結果如下
function TForm1.MyFunc(param: String): TColor; begin Result:=StringToColor(param); end; function TForm1.frxReport1UserFunction(const MethodName: String; var Params: Variant): Variant; begin if MethodName = 'MYFUNC' then Result := MyFunc(Params[0]); end; procedure TForm1.Button1Click(Sender: TObject); begin ClientDataSet1.Close; ClientDataSet1.CreateDataSet; ClientDataSet1.Append; ClientDataSet1ColorStyle.Value:='clRed'; ClientDataSet1.Append; ClientDataSet1ColorStyle.Value:=''; ClientDataSet1.Append; ClientDataSet1ColorStyle.Value:='clGreen'; frxReport1.AddFunction('function MyFunc(param: String): TColor'); frxReport1.ShowReport(); end; 報表 procedure MasterData1OnBeforePrint(Sender: TfrxComponent); begin if Length([frxDBDataset1."ColorStyle"])>0 then Memo1.Font.Color:=MyFunc([frxDBDataset1."ColorStyle"]); end; ']'需替換成'<' |
g9221712
高階會員 發表:145 回覆:344 積分:162 註冊:2006-07-06 發送簡訊給我 |
pedro756901前輩:
感謝您不斷的回應和測試,真是很感謝您! 我自己測試的結果,我本來以為是Null問題,所以我將欄位內Null的部份都填入空白字串,但是我發現 好像情況不是如此,也就是並非是Null值引起的,我後來直接改程式如下: if length( begin M1.font.color:=clwhite; // Hide Value end else begin // showmessage( // M1.font.color:=StringToColor(trim( M1.font.color:=StringToColor('clblack'); end; 我直接帶入值,但是我發現一樣會引起型別轉換的錯誤,不知道是什麼原因,請前輩提示!
------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」 程式寫的越久,卻發現自己越來越不會寫程式! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |