全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2653
推到 Plurk!
推到 Facebook!

关于FASTREPORT文本框大小的问题

答題得分者是:zxy666666
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-08 07:23:50 IP:222.184.xxx.xxx 未訂閱
主要目的:不让他人在没有软件源程序的情况下直接通过修改FR3文件来修改打印标题。(注:票据打印标题为防他人盗版使用) 构思:在FR3中的标题(memo)中,写变量,就是这个MEMO中的文字是通过变量指定的,而变量是写在软件源程序中的,如果直接在FR3文件中删除或修改文字将导致打印无法进行。缺点:别人将momo调到最小而不删除,然后再写一个MEMO就同样好修改了。对策:限制别人调整MEMO大小。在源程序中要检查MEMO的大小,如大小不对不进行打印,或者直接在源程序中指定MEMO的大小。不知道这样对打印的效率会不会有大影响,如果没有大影响的话就这么做可行吗?检查或指定MEMO大小的代码如何写?谢谢!
------
我的编程起步于ktop,我将永远支持ktop
xxiaowang
中階會員


發表:51
回覆:75
積分:55
註冊:2005-01-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-08 08:48:15 IP:219.133.xxx.xxx 未訂閱
Hi,ntjrr, 检查指定MEMO的代码如下,在fr的BeforePrint事件中: 〔Code〕 procedure TForm1.frReport1BeforePrint(Memo: TStringList; View: TfrView); begin if (view.name='Memo1') then if (Tfrmemoview(view).Prop['Height']<>'22') or (Tfrmemoview(view).Prop['Width']<>'94') or (Tfrmemoview(view).Prop['Visible']<>'True') then begin //show出错误信息 abort; end; end; 〔/Code〕 因我使用的是FR2.5,与FR3会有一点不同,你自己再改一改。 唵嘛呢呗咪吽
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-08 17:51:23 IP:222.184.xxx.xxx 未訂閱
在FR3中该事件是这样写的: procedure TForm1.frxReport1BeforePrint(Sender: TfrxReportComponent ); 我把(Memo: TStringList; View: TfrView);加在后面,或者直接替代,都会在这一行上提示错误,另一种构思行不行的:就是指定大小多少,VISIBLE为TRUE,(其实指定的和设计的是一样),而不去检查,哪种效率高? 發表人 - ntjrr 於 2005/08/08 17:56:17
------
我的编程起步于ktop,我将永远支持ktop
xxiaowang
中階會員


發表:51
回覆:75
積分:55
註冊:2005-01-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-09 08:42:55 IP:219.133.xxx.xxx 未訂閱
Hi,ntjrr,如你所言, 在FR3中该事件是这样写的: procedure TForm1.frxReport1BeforePrint(Sender: TfrxReportComponent ); 我想应该可以这样做的: if (Tfrxview(Sender).Prop['Height']<>'22') 你说的这两种方式都能达到目的。 如果要说效率,究竟是赋值句快,还是判断句快。我想是应该是赋值句。 我曾经试过在Show出报表之前设定上百个分布三十页报表里的Memo与Picture的属性(大小及Memo等),没感觉速度变慢。 唵嘛呢呗咪吽
xxiaowang
中階會員


發表:51
回覆:75
積分:55
註冊:2005-01-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-09 09:03:01 IP:219.133.xxx.xxx 未訂閱
也可以这样写: {code} procedure TForm1.Button1Click(Sender: TObject); var page:Tfrpage; begin frreport1.LoadFromFile('c:\test.frf'); page:=frreport1.Pages[0]; //假设报表在设计状态下只有一页 page.FindObject('Memo1').Prop['Visible']:=true; page.FindObject('Memo1').Prop['Height']:=22; //...... frreport1.ShowReport; end; {/code} 唵嘛呢呗咪吽
xxiaowang
中階會員


發表:51
回覆:75
積分:55
註冊:2005-01-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-09 09:05:39 IP:219.133.xxx.xxx 未訂閱
郁闷,总么老是用不好代码缩排。 (code) (/code) 唵嘛呢呗咪吽
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-09 12:03:08 IP:222.184.xxx.xxx 未訂閱
引言: 郁闷,总么老是用不好代码缩排。 (code) (/code) 唵嘛呢呗咪吽
谢谢前辈的指点,估计3.0版本和您的有一定的差异,加上小弟基本功比较差,所以还是没有成功。关于您所说的CODE问题,你点一下上面的按钮,然后把两个CODE分开来,写在中间就行了,任何符号都不要改动。 谢谢! 發表人 - ntjrr 於 2005/08/09 12:11:17
------
我的编程起步于ktop,我将永远支持ktop
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-08-09 21:26:02 IP:222.184.xxx.xxx 未訂閱
结合了前辈的指点,又查找了一些相关的资料,最终运行成功的代码如下: procedure TForm1.frxReport1BeforePrint(Sender: TfrxReportComponent); var t:TfrxMemoView; begin t := TfrxMemoView(frxReport1.FindObject('Memo17')); t.memo.text:='一二三四五六七'; t.Visible:=true; t.Width:=120; t.Height:=50; t.Left:=100; t.Top:=16; 哪位前辈再帮我查看一下代码有无不妥之处,如果没有不合适的,就写在这里抛砖引玉。谢谢!
------
我的编程起步于ktop,我将永远支持ktop
zxy666666
中階會員


發表:108
回覆:150
積分:86
註冊:2005-01-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-08-10 08:04:31 IP:218.16.xxx.xxx 未訂閱
引言: 郁闷,总么老是用不好代码缩排。 (code) (/code) 唵嘛呢呗咪吽
【code】 代碼 【/code】 請將大括號{}或小括號()分別改為中括號[]即可!
zxy666666
中階會員


發表:108
回覆:150
積分:86
註冊:2005-01-14

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-08-10 08:19:29 IP:218.16.xxx.xxx 未訂閱
引言: 结合了前辈的指点,又查找了一些相关的资料,最终运行成功的代码如下:
procedure TForm1.frxReport1BeforePrint(Sender: TfrxReportComponent);
var
t:TfrxMemoView;
begin
t := TfrxMemoView(frxReport1.FindObject('Memo17'));
t.memo.text:='一二三四五六七';
t.Visible:=true;
t.Width:=120;
t.Height:=50;
t.Left:=100;
t.Top:=16;
哪位前辈再帮我查看一下代码有无不妥之处,如果没有不合适的,就写在这里抛砖引玉。谢谢!
應該沒有問題吧? t := TfrxMemoView(frxReport1.FindObject('Memo17')); 是不是也可以寫成這樣 t := TfrxMemoView(frxReport1.FindComponent('Memo17')); 我覺得你的問題還是直接在打印前用變量指定標題文字,這樣不就很簡單了嗎?
xxiaowang
中階會員


發表:51
回覆:75
積分:55
註冊:2005-01-26

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-08-10 08:24:12 IP:219.133.xxx.xxx 未訂閱
引言: 结合了前辈的指点,又查找了一些相关的资料,最终运行成功的代码如下: procedure TForm1.frxReport1BeforePrint(Sender: TfrxReportComponent); var t:TfrxMemoView; begin t := TfrxMemoView(frxReport1.FindObject('Memo17')); t.memo.text:='一二三四五六七'; t.Visible:=true; t.Width:=120; t.Height:=50; t.Left:=100; t.Top:=16; 哪位前辈再帮我查看一下代码有无不妥之处,如果没有不合适的,就写在这里抛砖引玉。谢谢!
Hi,ntjrr, 我知道在Fr2.5里,onbeforeprint事件是每画一个元件都会触发一次的,fr3.0是不是这样,你写一句showmessage测试一下好了。如果如我所言是每画一个元件都会触发一次的,则你这段代码也会运行N次,效率极低。所以建议加上判断式来判断是否是Memo17,再运行代码;或者干脆将这段代码写在触发打印的Button的Onlick下就好了。 同时谢谢ntjrr、zxy666666告诉我怎样用代码缩排。 唵嘛呢呗咪吽
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-08-10 11:50:17 IP:222.184.xxx.xxx 未訂閱
感谢zxy666666的指点。 更感谢xxiaowang的深入分析,正是如你所言,那段代码要执行N次的,那样效率极低。我最终就决定把那段代码写在打印的BUTTON中的CLICK事件里了,那样的话,只执行一次。谢谢!
------
我的编程起步于ktop,我将永远支持ktop
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-08-10 22:29:39 IP:222.184.xxx.xxx 未訂閱
将这段代码写在触发打印的Button的Onlick下后,程序可以编绎,也没有什么错误提示,但就是设置的值不生效!
------
我的编程起步于ktop,我将永远支持ktop
xxiaowang
中階會員


發表:51
回覆:75
積分:55
註冊:2005-01-26

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-08-11 08:49:26 IP:219.133.xxx.xxx 未訂閱
Hi, ntjrr, 是那些项不生效? 我在fr2.5里测试没有问题。请注意尽寸单位mm与pixels的区别,代码里指定的 长宽高数值单位是pixels,如果你设计报表时指定单位为mm,你代码里指定的pixels值就会换算为mm表示,所以你在inspector里看到是mm值。1mm约等于3.6pixels。 唵嘛呢呗咪吽
系統時間:2024-05-04 22:46:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!