2007年5月31日 星期四

TQRExpr不累加!

TQRExpr 的 Properties 下的 ResetAfterPrint 設成 True ,則 可計算 Group 的小計。

2007年5月28日 星期一

delphi控制Excel(一)

內容來源:雨轩客的博客网_你的博客网

use ComObj,Excel97

首先创建 Excel 对象,使用ComObj:
var ExcelID: Variant;

ExcelID := CreateOleObject( ’Excel.Application’ );

1) 显示当前窗口:ExcelID.Visible := True;

2) 更改 Excel 标题栏: ExcelID.Caption := ’应用程序调用 Microsoft Excel’;

3) 添加新工作簿: ExcelID.WorkBooks.Add;
MsExcel.WorkBooks.Add(xlWBatWorkSheet);//增加一個WorkBook並且有一個Sheet
MSExcel.WorkBooks[1].Sheets.Add(,,17,xlWorkSheet)//在此WorkBook內在增加17個Sheet
Sheets :=XLApp.WorkBooks[1].Sheets;//指定Sheets為第一個WorkBook內的 SheetsSheets.Item[1].Name :='該Sheet的名稱';//指定此Sheets內的第一個Sheet名稱

4) 打开已存在的工作簿: ExcelID.WorkBooks.Open( ’C:\Excel\Demo.xls’ );

5) 设置第2个工作表为活动工作表: ExcelID.WorkSheets[2].Activate;
或 ExcelID.WorksSheets[ ’Sheet2’ ].Activate;

6) 给单元格赋值: ExcelID.Cells[1,4].value := ’第一行第四列’;

7) 设置指定列的宽度(单位:字符个数),以第一列为例: ExcelID.ActiveSheet.Column[1].ColumnsWidth := 5;

8) 设置指定行的高度(单位:磅)(1磅=0.035厘米),以第二行为例: ExcelID.ActiveSheet.Rows[2].RowHeight := 1/0.035; // 1厘米

9) 在第8行之前插入分页符: ExcelID.WorkSheets[1].Rows.PageBreak := 1;

10) 在第8列之前删除分页符: ExcelID.ActiveSheet.Columns[4].PageBreak := 0;

11) 指定边框线宽度: ExcelID.ActiveSheet.Range[ ’B3:D4’ ].Borders[2].Weight := 3;
1-左 2-右 3-顶 4-底 5-斜( \ ) 6-斜( / )

12) 清除第一行第四列单元格公式: ExcelID.ActiveSheet.Cells[1,4].ClearContents;

13) 设置第一行字体属性:
ExcelID.ActiveSheet.Rows[1].Font.Name := ’隶书’;
ExcelID.ActiveSheet.Rows[1].Font.Color := clBlue;
ExcelID.ActiveSheet.Rows[1].Font.Bold := True;
ExcelID.ActiveSheet.Rows[1].Font.UnderLine := True;

14) 进行页面设置:
a.页眉: ExcelID.ActiveSheet.PageSetup.CenterHeader := ’报表演示’;
b.页脚: ExcelID.ActiveSheet.PageSetup.CenterFooter := ’第&P页’;
c.页眉到顶端边距2cm: ExcelID.ActiveSheet.PageSetup.HeaderMargin := 2/0.035;
d.页脚到底端边距3cm: ExcelID.ActiveSheet.PageSetup.HeaderMargin := 3/0.035;
e.顶边距2cm: ExcelID.ActiveSheet.PageSetup.TopMargin := 2/0.035;
f.底边距2cm: ExcelID.ActiveSheet.PageSetup.BottomMargin := 2/0.035;
g.左边距2cm: ExcelID.ActiveSheet.PageSetup.LeftMargin := 2/0.035;
h.右边距2cm: ExcelID.ActiveSheet.PageSetup.RightMargin := 2/0.035;
i.页面水平居中: ExcelID.ActiveSheet.PageSetup.CenterHorizontally := 2/0.035;
j.页面垂直居中: ExcelID.ActiveSheet.PageSetup.CenterVertically := 2/0.035;
k.打印单元格网线: ExcelID.ActiveSheet.PageSetup.PrintGridLines := True;

15) 拷贝操作:
a.拷贝整个工作表: ExcelID.ActiveSheet.Used.Range.Copy;
b.拷贝指定区域: ExcelID.ActiveSheet.Range[ ’A1:E2’ ].Copy;
c.从A1位置开始粘贴: ExcelID.ActiveSheet.Range.[ ’A1’ ].PasteSpecial;
d.从文件尾部开始粘贴: ExcelID.ActiveSheet.Range.PasteSpecial;

16) 插入一行或一列:
a. ExcelID.ActiveSheet.Rows[2].Insert;
b. ExcelID.ActiveSheet.Columns[1].Insert;

17) 删除一行或一列:
a. ExcelID.ActiveSheet.Rows[2].Delete;
b. ExcelID.ActiveSheet.Columns[1].Delete;

18) 打印预览工作表: ExcelID.ActiveSheet.PrintPreview;

19) 打印输出工作表: ExcelID.ActiveSheet.PrintOut;

20) 工作表保存:
if not ExcelID.ActiveWorkBook.Saved then
ExcelID.ActiveSheet.PrintPreview;

21) 工作表另存为: ExcelID.SaveAs( ’C:\Excel\Demo1.xls’ );

22) 放弃存盘: ExcelID.ActiveWorkBook.Saved := True;

23) 关闭工作簿: ExcelID.WorkBooks.Close;

24) 退出 Excel: ExcelID.Quit;

25)释放VARIANT变量:EX:ExcelApp:=Unassigned;

知道一個excel檔內有多少個WorkSheet
XLAPP.WorkBooks[n].Sheets.Count

知道該Sheet的名稱
XLAPP.WorkBooks[n].Sheets[n].Name

打开第2个工作表
ExcelApp.Worksheets[2].activate;

打开名为第四章的工作表
ExcelApp.WorkSheets['第四章'].activate;

用CreateOleObject方法对WORD文件进行操作

http://www.programfan.com/article/showarticle.asp?id=2759

使用CreateOleObject方法对WORD文档操作具有先天所具备的优势,与delphi所提供的那些控件方式的访问相比,CreateOleObject方法距离WORD核心的操作“更近”,因为它直接使用OFFICE所提供的VBA语言对WORD文档的操作进行编程。

这个程序很简单,在页面上放置了一个edit和一个button,每单击一次按钮,就会自动把edit中的内容添加在后台中的word文档中,程序关闭时文件自动保存在当前程序的主目录中。

unit main;
interface

//如果要使用CreateOleObject的办法对WORD文档进行操作,应该在uses Comobj和WordXP
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Comobj, WordXP, Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
//全域變數
FWord: Variant;
FDoc: Variant;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
FWord.Selection.TypeParagraph;
FWord.Selection.TypeText(Text := form1.Edit1.Text);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
//首先创建对象,如果出现异常就作出提示
try
FWord := CreateOleObject('Word.Application');

//WORD程序的执行是否可见,值为False时程序在后台执行
FWord.Visible := False;
except
ShowMessage('创建word对象失败!');
Exit;
end;

//先在打开的Word中创建一个新的页面,然后在其中键入"Hello,"+回车+"World!"
try
FDoc := FWord.Documents.Add;
FWord.Selection.TypeText(Text := 'Hello,');
FWord.Selection.TypeParagraph;
FWord.Selection.TypeText(Text := 'World! ');
except
on e: Exception do
ShowMessage(e.Message);
end;
end;

//在程序关闭时把文件内容保存到当前目录中,并以test.doc命名,同时关闭WORD程序
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FDoc.SaveAs(ExtractFilePath(application.ExeName) +'test.doc');
FWord.Quit;
FWord := Unassigned;
end;

end.

2007年5月24日 星期四

WinXP 預約關機指令

在 開始-->執行 打指令
15分鐘=900s
半小時=1800s

shutdown -s -t 3600 (一小時後)
shutdown -s -t 7200 (二小時後)
shutdown -s -t 10800 (三小時後)
....
shutdown -a (取消關機)

2007年5月23日 星期三

二數相除取整數問題

為何,229.5\8.5 會等於28,而不是27?

Ans:
在執行整數除法運算之前,這種數值運算式必須是 Byte、Integer 或是 Long運算式(都是整數的),任何的小數部分都會被刪除。所以運算式會變成 229\8 =28

2007年5月22日 星期二

Exit與Abort的差別!

Abort:引起意外的放棄處理
Exit:立即從目前的語法中退出

如:ADO 元件,在Edit時,會先跑Before Edit Function ,Edit後會跑 After Edit Function ,若在Before Edit寫Abort,則不會跑After Edit,但若在Before Edit寫Exit,則只會跳出Before Edit,還是會跑After Edit。

2007年5月11日 星期五

Application中有 Thread 無法清除的問題!

通常會寫 Application.Terminate;
把它改成 ExitProcess(0);
這樣若Application 中有執行 Thread 時,才會一併清除

在windows下的排程工作設定php網頁自動執行

控制台->排定的工作->新增排定的工作->瀏覽(找出php.exe 如(c:\php\php.exe))->設定好後,按右鍵(內容)->執行那加上要跑的程式(EX:
C:\PHP\php.exe "C:\Inetpub\wwwroot\shopping\sendmail.php")








2007年5月10日 星期四

SQL Server Management studio 連接不同PORT的方法

使用『SQL Server Configuration Manager』

1. 在「SQL Server Configuration Manager」中,展開 [SQL Native Client 組態],以滑鼠右鍵按一下 [別名],然後按一下 [新增別名]。
2. 在 [別名名稱] 中,輸入別名的名稱。EX: TESTDB
3. 在 [伺服器] 中,輸入伺服器的名稱或 IP 位址。EX:127.0.0.1
4. 在 [通訊協定] 中,選取用於此別名的通訊協定。通常都選TCP/IP
5. 在 [通訊埠編號],輸入PORT號。EX:14330






然後在『SQL Server Management Studio』在連接伺服器名稱那邊輸入,TESTDB 就可以連到14330PORT的資料庫了



參考http://msdn2.microsoft.com/zh-cn/library/ms181035.aspx

在 SQL 中空白字元的問題

在 MS SQL 中,空白字元在【某些的字串函數或比較式】執行結果會與預期的不一樣。
例如:
空白和空字串
IF ( ' ' = '' )
print '相等'
else
print '不相等'
==> 相等

print Len(' ')
==> 0

print Len('123 ')
==> 3
Len 函數會自動將字尾的空白去掉

print Len(' 123')
==>4
Len 函數會計算前面的空白

Q: 那如果要真的求出字串 '123 ' ,長度為 5 ,指令該用什麼??
A: 後面有空白的字元長度,要求出實際長度,不可以使用 Len ,要使用 DataLength 求出【位元組】的長度


※特別注意:DataLength 是求出位元組,所以
當碰上中文字時,每一個字的長度皆為 2
當型態為:nvarchar、nchar 時,不管英文、符號,長度皆為 2當型態為:varchar、char 時,英文、符號的長度皆為 1


EX:
Declare @sWideString nvarchar(20) -- Unicode
Declare @sString varchar(20) -- 一般字元

Set @sWideString = '我是中文字加 ABC '
Set @sString = '我是中文字加 ABC '

print Len(@sWideString) -- 長度 10 (因為 Len 指令會將尾端的空白去掉)
print Len(@sString) -- 長度 10 (因為 Len 指令會將尾端的空白去掉)

print DataLength(@sWideString) -- 長度 26
print DataLength(@sString) -- 長度 19

2007年5月9日 星期三

Locate 用法的討論

TTable.Locate(const KeyFields:string; const KeyValues:Variant; Options:TLocateOptions): Boolean;
中的 TLocateOptions的
loCaseInsensitive 表示搜尋時忽略大小寫
loPartialKey 表示搜尋時只須開頭值吻合

用 Locate 方法找資料時, 可以選擇要或不要第三個參數
第三參數如果是空集合, 那表示找到的資料必須大小寫與資料長度均相等, 也就是完全相等的方式搜尋資料

ex:
假定 Table1 為
cu_no cu_name
AMKB 王大同
ACJC 金士欽
BDFD 林火金

1.若 sTest 為 'AMKB':
Table1.Locate('cu_no', sTest, []) ==> 當然可以找到

2.若 sTest 為 'AC':
Table1.Locate('cu_no', sTest, []) ==> 找不到
Table1.Locate('cu_no', sTest, [loPartialKey])
==> 找到 'ACJC 金士欽' 這筆記錄.
因為集合中有 loPartialKey 這個項目, 此時, 'AC' 相同於 'ACJC'
的開頭兩個字元, 即使兩者長度不等, 也算找到
3.若 sTest 為 'ac':
Table1.Locate('cu_no', sTest, [loPartialKey])
==> 找不到, 因為區分大小寫之故, 所以 'AC' 雖開頭相同於'ACJC',
也不能算作符合條件.
Table1.Locate('cu_no', sTest, [loCaseInsensitive, loPartialKey])
==> 找到 ACJC 金士欽 這筆記錄.
此時不再區分大小寫了. 可以順利找到接近的資料
4.Table1.Locate('cu_no;cu_name', VarArrayOf(['ac','金']), [loCaseInsensitive, loPartialKey])
==> 找到 ACJC 金士欽 這筆記錄.
1.搜尋值採用Variants,使得搜尋條件可指定不同的資料型態.
2.字串內指定多欄位,以分號隔離各項目.
3.利用VarArrayOf函數,傳入多個搜尋值.

AJAX 解決中文亂碼!

參考來源:http://www.real-blog.com/programming/217

用 AJAX 讀取一個中文頁面時,很多時會出現亂碼,因為 XMLHTTP 處理返回的 responseText 時,會用 UTF-8 編碼解讀,如果頁面送出的文件是 UTF-8 編碼便沒有問題,但如果所使用用的是 BIG5 或者 GB 編碼,就會出現亂碼情況。

解決方法是在送出的頁面加一個 HTTP Header 指定所使用的編碼,方法為:
PHP: header("Content-Type:text/html;charset=BIG5");
ASP: Response.Charset=”BIG5″
JSP: response.setHeader("Charset","BIG5");

windows 2000 網路時間校對

因為網路時間校對XP之後才有支援
如果用2000的話需要透過指令才能完成

net time /setsntp:time.stdtime.gov.tw
w32tm -once

2007年5月7日 星期一

排程磁碟重組

如果用平常的磁碟重組方式,沒有辦法做到排程的方式
但在XP之後MicroSoft有內建一個工具 Defrag.exe

Windows Disk Defragmenter
Copyright (c) 2001 Microsoft Corp. and Executive Software International, Inc.

使用方法:Defrag.exe [-a] [-f] [-v] [-?]
volume 磁碟機代號或掛接點 (d: 或 d:\vol\mountpoint)
-a 只分析
-f 即使可用空間太低也要強制磁碟重組。
-v 詳細資訊輸出
-? 顯示這個說明文字。
把它加入排程去執行就可以了

EX:
C:\Documents and Settings\Administrator>defrag e: -v

參考文件
http://support.microsoft.com/kb/314848/zh-tw
http://support.microsoft.com/kb/283080/zh-tw

2007年5月6日 星期日

Vista安裝IIS7

內容來源: http://www.xujiwei.cn/blog/article.asp?id=633

Windows Vista中IIS7是默认不安装的,所以在安装完Windows Vista之后如果需要安装IIS7的话,就要自己动手了。安装的步骤为:开始》控制面板》程序》打开或关闭Windows功能》Internet信息服务。IIS7安装时需要注意的是,如果需要ASP、ASP.NET等的支持,是需要把功能模块给装上的,默认是不安装的。

免費防毒軟體-AntiVir

AntiVir : http://www.free-av.com/

安裝教學 : http://b2ddoc.tnc.edu.tw/yh/antivir-ez/

更新無廣告 : http://tonychou.blogspot.com/2007/03/avira-antivir-personaledition-classic.html

2007年5月4日 星期五

Flash相關網站

軟體大學 : http://www.twisu.com.tw/

有很多flash source從list進去可以看到範例,並在左下有Download fla 可下載參考
http://www.senocular.com/flash/source.php