Delphi Note

1、触发器的使用。

源数据库:

名称:info

字段:iddnameeagesexcitydepartmentposition

目标数据库:

名称:leave

字段:iddnameetype

1、 修改操作。(原代码)

CREATE TRIGGER test_upd on  info

FOR UPDATE

AS

 if update(namee)

 update leave

 set leave.namee=i.namee

 from inserted i

 where leave.idd=i.idd

2、 删除操作。(原代码)

CREATE TRIGGER test_del on  [info]

FOR DELETE

AS

declare @id char(10)

select @id= idd from deleted

delete from leave where idd=@id

3、 插入操作。(原代码)

CREATE TRIGGER test_INS ON info

FOR INSERT

AS

insert into leave

(idd,namee)

SELECT i.idd,i.namee FROM inserted i

2ADO的认识

Microsoft的数据存取技术演变:

1、 ODBC仅支持关系数据库,以及传统的数据库类型,无法符合日渐复杂的数据存取应用,也无法让脚本语言使用,。

2、 DAOMicrosoft为能让程序员存取Access数据库,产生了DAOData Access Object),能够存取Xbase的数据库及Excel文件,并且结ODBC存取关系数据库。但去目的是存取Access数据库,因此只对Access数据库非常有效率,先已处于维护状态。

3、 RDO由于DAO在结合ODBC存取关系数据库时表现的不好,所以Microsoft推出了RDO,不过目前也逐渐被放弃了。

4、 OLEDB是很底层化的,使用复杂的,可以存取传统的关系数据库、Excel文件、EmailInternet/Intranet上的电子签名信息。

5、 ADO成功的封装了OLE-DB的大部分功能,可以让应用程序或WEB应用程序存取各种不通的数据源。大大简化了数据存取工作。

3TdatabaseTUpdateSql组件的作用。

       TdatabaseBDEQueryTable连接的中间通道。这样程序修改时,只要修改Datebase的属性就可以了。通过其Database的属性设定公用的别名。

       TupdateSql是用来进行网络数据库数据的修改。Query1.Applyupdates;Query1.CommitUpdates;另外,被修改的Server端数据库表要有key

4、开发Activex控件。

<>转换ActiveX控件

第一步 选择菜单FileNew项,出现项目对话框,选择Activex页,选择ActiveX Control

第二步 在出现的向导对话框(ActiveX Control Wizard)中,从控件列表中选择转换的控件。

第三步 注册ActiveX。选择菜单RunRegister ActiveX Server。即生成一个OCX文件,存储于当前路径。

第四步 Web配置选项。选择菜单ProjectWeb deploymentOption。设定路径。

第五步 生成HTML文档。选择菜单ProjectWeb Deploy。然后,在HTML dir所指示的目录下,外面可以看到HTML文件已经生成。

<>开发新的ActiveX控件

第一步 建立一个ActiveX Form。选择菜单FileNew,出现项目对话框,选择Activex页,选择ActiveForm

第二步 ActiveForm Wizard对话框中输入各种名称。

第三步 ActiveX Wizard上,加入控件,譬如加入一个Button、一个Image组件,在buttonOnClick事件中,有如下的处理:

            Image1.Canvas.Ellipse(0,0,Image1.Width,Image1.Height);

第四步 编译。按Ctrl+F9组合健,或选择ProjiectCompileFormProj1

第五步 注册ActiveX,生成OCX文件,选择菜单RunRegister ActiveX Server

第六步 Web配置选项。选择菜单ProjectWeb Deploy

第七步 生成HTML文档。选择菜单ProjectWeb Deploy

 

 

5、恢复SQL.mdf.log文件。

EXEC sp_attach_db @dbname = N'AAA', //AAA为要建立的数据库名

   @filename1 = N'c:"ooo"aaa.mdf',

@filename2 = N'c:"ooo"aaa_log.ldf'

6bmpjpg的转换和数据库中bmpjpg格式图形的存储。

Demo1

var blobstream:tblobstream;
    filestream:tfilestream;
begin
  table1.insert;
blobstream:=table1.createblobstream(table1.fieldbyname('picture'),bmreadwrite);
filestream:=tfilestream.create('d:"picture.jpg',fmread);
  blobstream.copyfrom(filestream,filestream.size);
  table1.post;
要是想保存
var blobstream:tblobstream;
    filestream:tfilestream;
begin
  blobstream:=table1.createblobstream(table1.fieldbyname('picture'),bmread);
  filestream:=tfilestream.create('d:"picture.jpg',fmcreate or fmwrite);
  filestream.copyfrom(filestream,filestream.size);
就可以了,加分吧

 

demo2

var
bs: TBlobStream;
begin
bs:=Table1.FieldByName('c1').CreateBlobStream(
Table1.FieldByName('c1'), bmWrite);
Graphic.SaveToStream(bs);
end;

 

7、控制EXCEL

全面控制 Excel
首先创建 Excel 对象,使用ComObj:
var ExcelID: Variant;
ExcelID := CreateOleObject( 'Excel.Application' );
1) 显示当前窗口:
ExcelID.Visible := True;
2) 更改 Excel 标题栏:
ExcelID.Caption := '应用程序调用 Microsoft Excel';
3) 添加新工作簿:
ExcelID.WorkBooks.Add;
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.Columns[1].ColumnsWidth := 5;
8) 设置指定行的高度(单位:磅)(1磅=0.035厘米),以第二行为例:
ExcelID.ActiveSheet.Rows[2].RowHeight := 1/0.035; // 1厘米
9) 在第8行之前插入分页符:
ExcelID.WorkSheets[1].Rows[8].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;

8、将EXCEL表中的数据导入到库中

 

程序中实现的办法:

如何将Excel文件中的数据倒入Delphi本地库(Paradox)?[2000-04-26]
label PH;
var
msexcel : olevariant;
wbook, wsheet : olevariant;
i,j : integer;
temp : string;
...
begin
MsExcel := CreateOleObject('Excel.Application');
WBook := MsExcel.Application;
WBook.Visible := False;
wbook.workbooks.Open('c:"xxxx.xls');//
打开Excel文档
WSheet := WBook.ActiveSheet;
for i := 1 to WSheet.Rows.count - 1 do
begin
Table1.Append;            //Paradox,其它表当然也可以了
for j := 1 to WSheet.Columns.Count do
begin
temp := wsheet.cells[i, j].value;
if Trim(temp) = '' then    //如果为空则跳出循环,当然,
// 也可以是其它条件
goto PH;
Table1.Fields[j - 1].AsString := temp;
end;
PH:
if Trim(wsheet.cells[i, 1].Value) = '' then break;//跳出循环
end;
...
WBook.SaveAs('c:"xxxx.xls');
MsExcel.quit;
end;
注意:Tabel1的字段数要大于要倒入的Excel文档的列数

 

9、取得字段的属性

找了一些以前写过的代码 :
var fType :TfieldType;
    strType :String;
Adotable1.Fields[0].DataSize 得到 宽度  !
fType :=AdoTable1.Fields[0].Dataset 用于得到field的类型,这个结果不是string,你要自己去转换:
Case fType  of
     ftWideString : strType:='Text';
     ftDate: strType :='Date';
     ftString :strType :='Text';
     ftBoolean:strType :='Boolean';
     ftMemo :strType :='memo';
     ftSmallint :strType:='Integer' ;
     ftUnknown :strType:='Unknown';
end;
另外还有一种 :
var
    i:Integer;
    FieldType:String;

    case varastype(ADOTable1.Fields[i].DataType,varInteger) of
        24: FieldType:='字符型';
        16: FieldType:='备注型';
        3 : FieldType:='数值型';
        11: FieldType:='日期时间型';
        8 : FieldType:='货币型';
        14: FieldType:='自动编号型';
        5 : FieldType:='逻辑型';
        15: FieldType:='OLE对象型';
    end;

10、在query中检索记录

     if query1.Locate('ID','A001',[loCaseInsensitive])then begin

        showmessage('有重复记录。');

注意lacate执行后会将Query的属性置回到readonly状态。

所以query1.Edit要放在locate后。

 

11、把程序加进windows的“启动”中

 

 

procedure TFrmAbout.WriteRegAutoRun(FileName:string);   
var
 Regf:TRegistry;
begin
 Regf:=TRegistry.Create;
 Regf.RootKey:=HKEY_LOCAL_MACHINE;
 
 if Length(FileName)>0 then
   try
    RegF.OpenKey('SOFTWARE"Microsoft"Windows"CurrentVersion"Run',false);
    RegF.WriteString('YourProgram',FileName);
   except
   end;
 RegF.CloseKey;
 RegF.Free;

end;

 

十二、控制Word

启动Word时用如下代码:
begin
try
Wordapplication.Connect;
except
MessageDlg('Word may not be installed', mtError, [mbOk], 0);
Abort;
end;
Wordapplication.Visible := True;
WordApplication.Caption := 'Delphi automation';
end;
Word打开一个指定的文件,需要先放置OpenDialog,然后调用WordApplication.Documents.Open
var
ItemIndex :OleVariant;
FileName, ConfirmConversions, ReadOnly, AddToRecentFiles,
PasswordDocument, PasswordTemplate, Revert,
WritePasswordDocument, WritePasswordTemplate, Format: OleVariant;
begin
if not dlgOpen.Execute then
Exit;

{Open document}
FileName := dlgOpen.FileName;
ConfirmConversions := False;
ReadOnly := False;
AddToRecentFiles := False;
PasswordDocument := '';
PasswordTemplate := '';
Revert := True;
WritePasswordDocument := '';
WritePasswordTemplate := '';
Format := wdOpenFormatDocument;

WordApplication.Documents.Open( FileName, ConfirmConversions,
ReadOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate,
Revert, WritePasswordDocument, WritePasswordTemplate, Format );

{Assign WordDocument component}
ItemIndex := 1;
WordDocument.ConnectTo(WordApplication.Documents.Item(ItemIndex));

{Turn Spell checking of because it takes a long time if enabled and slows down Winword}
WordApplication.Options.CheckSpellingAsYouType := False;
WordApplication.Options.CheckGrammarAsYouType := False;
end;

 

判断Word是否运行

先在Form上添加一个Server组件中的WordApplication,命名为WordApplication1,然后在"关闭WORD"按扭中输入如下代码:
var
    SaveChanges, OriginalFormat, RouteDocument: OleVariant;
begin
    SaveChanges := WdDoNotSaveChanges;
    OriginalFormat := UnAssigned;
    RouteDocument := UnAssigned;
    try
        WordApplication1.Quit(SaveChanges, OriginalFormat, RouteDocument);
        WordApplication1.Disconnect;
    except
    on E: Exception do
        begin
            Showmessage(E.Message);
            WordApplication1.Disconnect;
        end;
    end;
end;
准成,当然了,请按实际情况修改 SaveChanges, OriginalFormat, RouteDocument的内容.

 

如何输出到Word

如果用的是MICROSOFT 旗下的数据库管理系统生成的表例如*.DBF等,可以通过OLE技术直接在WORD文档中显示完整的数据表。
如果用PARADOX表,可以用下面的方法:
var
  msword:variant;
begin
  try
    msword:=createoleobject('word.basic');
    msword.filenew;
    msword.appshow;
    table1.disablecontrols;
    try
      bookmark:=table1.getbookmark;
      try
        msword.bold;
        msword.insert('
报表标题'#13#10);
        msword.insert('字段名1'+#9+....+'字段名n'#13#10);
        table1.first;
        while not table1.eof do
          begin
            msword.insert(table1.fieldbyname(字段名1).asstring+#9+.....+table1.fieldbyname(字段名n).asstring+#13#10);
            msword.next;
          end;
         finally
           table1.gotobookmark(bookmark);
           table1.freebookmark(bookmark);
         end;
       finally
         table1.enablecontrols;
        end;
    except
       showmessage('
没有发现WORD,请安装!');
    end;
end;
//OLE服务器WORD启动后自动写了一个制表文件,此时只要选择全部数据(除标题),然后选插入表格即可作出WORD报表。
//如果有其他好方法请与我联系。
//我想解决的是在程序中自动画出表格。

 

 

控制Word

var
tbl : Table;
i,j:integer;
un_Var,ex_Var,cnt_Var:OleVariant;
row_num,col_num:integer;
st:string;
begin
    // Word中新建一个文档,并添加文本,然后设置粗体和字体大小
    WordApplication1.Connect;
    WordApplication1.Visible := True;
    WordApplication1.Documents.Add(EmptyParam,EmptyParam);
    WordDocument1.Connect;
    WordApplication1.ActiveWindow.View.Type_:= wdNormalView;
    WordApplication1.Selection.Font.Name :='黑体';
    WordApplication1.Selection.Font.Size := 16;
    WordApplication1.Selection.ParagraphFormat.Alignment := wdAlignParagraphCenter;
    WordApplication1.Selection.TypeText('昆明市土地信息系统表格输出');
    WordApplication1.Selection.TypeParagraph;
    WordApplication1.Selection.TypeParagraph;
    WordApplication1.Selection.Font.Name :=  '宋体';
    WordApplication1.Selection.Font.Size :=12;
    WordApplication1.Selection.ParagraphFormat.Alignment := wdAlignParagraphRight;
    WordApplication1.Selection.TypeText('日期'+formatdatetime('yyyy""mm""dd""',now));
    WordApplication1.Selection.TypeParagraph;
    WordApplication1.Selection.TypeParagraph;//回车
    WordApplication1.Selection.ParagraphFormat.Alignment := wdAlignParagraphLeft;
    row_num:=table1.RecordCount;
    col_num:=table1.Fields.Count;
    tbl := WordApplication1.ActiveDocument.Tables.Add(WordApplication1.Selection.Range,row_num+1,Col_num);
    un_Var:=wdCharacter;
    cnt_Var:=1;
    ex_Var:=wdMove;
    table1.First;
    for j := 0 to Col_num-1 do    //标题
    begin
            st:=table1.Fields.Fields[j].FieldName;
            WordApplication1.Selection.TypeText(st);
            WordApplication1.Selection.MoveRight(un_Var,cnt_Var,ex_Var);
    end;
    for i := 0 to row_num-1 do    //
    begin
        for j := 0 to Col_num-1 do    //
        begin
            st:=table1.Fields.Fields[j].AsString;
            WordApplication1.Selection.TypeText(st);
            WordApplication1.Selection.MoveRight(un_Var,cnt_Var,ex_Var);
        end;
        WordApplication1.Selection.MoveRight(un_Var,cnt_Var,ex_Var);
        table1.next;
    end;
    WordApplication1.Selection.TypeText('制表人:阎磊');
    WordApplication1.Selection.TypeParagraph;
end;

 

 

可以参考以下代码:
procedure PrintReport4(DSR, AJXZ, CFSJ, JBAQ: PChar); stdcall;
var
 Word, Doc, Fields:OleVariant;
begin
 Word:=CreateOleObject('Word.Application');
 
 Word.Visible:=True;
 
 Word.Documents.Add('C:"Customs"案件呈报表');
 Doc := Word.ActiveDocument;
 
 Fields := Doc.FormFields;
 Fields.Item('DSR').Result := String(DSR);
 Fields.Item('AJXZ').Result := String(AJXZ);
 Fields.Item('CFSJ').Result := String(CFSJ);
 Fields.Item('JBAQ').Result := String(JBAQ);
end;
 
其中案件呈报表就是word模版文件。

 

 

打开WORD文档的一段程序
uses ComObj ;
procedure TForm1.Button1Click(Sender: TObject);
var
 vWord,vDoc,vRange : Variant ;
 sText,sReplace : string ;
 lReturn : Boolean ;
begin
  sText := 'ABCDEFG' ; //原文字串
 sReplace := 'GFEDCBA' ; //新字串
 vWord := CreateOleObject('Word.Application') ;//创建Word线程
 try
    //打开要操作的文件
    vDoc := vWord.Documents.Open('C:"My Documents"AAAc.Doc');
    vDoc.Select ; //选取中整个文档
    vRange := vDoc.Range ; //替换范围
    lReturn := True ;
    while lReturn do
    begin //找到并替代成功则返回 True    共11个参数
      lReturn := vDoc.Range.Find.Execute(sText,,,,,,,,,sReplace,True) ;
    end ;
 finally
    vDoc.Close(True) ; //关闭文并保存
    vWord.Quit(False) ; //退出Word
 end ;
end;
Delphi 3 下通过。
 
 
 
控制WORD文档的一段程序
unit Unit1;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,OleCtnrs,ComObj;
 
type
    TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    ED_WenHao: TEdit;
    ED_BiaoTi: TEdit;
    ED_ShouWenDanWei: TEdit;
    ED_ZhenWen: TMemo;
    ED_FaWenDanWei: TEdit;
    Btn_PrintToWord: TButton;
    Btn_Quit: TButton;
    procedure Btn_PrintToWordClick(Sender: TObject);
    procedure Btn_QuitClick(Sender: TObject);
    private
        { Private declarations }
    public
        { Public declarations }
end;
 
var
    Form1: TForm1;
 
implementation
 
{$R *.DFM}
 
//开始:数据发送到 word事件
procedure TForm1.Btn_PrintToWordClick(Sender: TObject);
vAR
    VarWord: Variant;// 创建 WORD时所用
begin
    try
        // 1. 建立 OleObject,连接 word97
        VarWord:=CreateOleObject('word.basic');
        // 2. 建立 Word97的新文件
        VarWord.FileNew;
        // 3. 设置 Word97的基本状态
        VarWord.ViewZoom75; //设置显示比例为 75%
        VarWord.ViewPage; //改为页面显示方式
        // 4. 将当前数据控件上的信息发送至 Word97
        // 4.1 发送文号数据
        VarWord.CenterPara; //居中
        Varword.font('宋体 '); //设置字体
        VarWord.FontSize(14); //设置字号
        varword.insert(#13+#13+ ED_WenHao.Text+#13+#13+#13);
        // 4.2 发送标题数据
        VarWord.font('黑体 ');
        VarWord.Fontsize(16);
        VarWord.insert( ED_BiaoTi.text+#13);
        // 4.3 发送收文单位数据
        VarWord.LeftPara; //左对齐
        VarWord.Font('宋体 ');
        VarWord.fontSize(14);
        VarWord.Insert(#13+ ED_ShouWenDanWei.Text+': '+#13);
        // 4.5 发送正文数据
        VarWord.fontSize(14);
        VarWord.Insert( ED_ZhenWen.Text+#13);
       // 4.6 发送发文单位数据
        VarWord.RightPara; //右对齐
        VarWord.fontSize(14);
        VarWord.Insert( ED_FaWenDanWei.Text+#13);
        // 5 最后设置
        VarWord.StartOfdocument; //到文首
        VarWord.AppMaxiMize; //设置窗口最大化
        VarWord.AppShow; //显示应用程序
    except
        showmessage('运行 Microsoft Word 失败! ');
    end; //end of try
end;
//end:数据发送到 word事件
 
 
//开始:窗口关闭事件
procedure TForm1.Btn_QuitClick(Sender: TObject);
begin
        close;
end;
//End:窗口关闭事件
 
end.
// 这是主程序的尾部

 

 

 

!我保证你们看到以下的用法一定爽歪歪了!!!
这可是我三天工作的结果。唔。。。
---看最后终结者office。
--------------------------------
如果你们用的office97的server控件,那么用office2000时就要把server上的控件换掉。
做法:
1。在Componet里打开Install Packages.....
2.去掉borland sample automation server components
3.在project中点input type Library....
4.点add加入office2000的类库。(在Microsoft Office/office目录下的)
5。反正是什么Excel9.olb , Msword9.olb 和那些*.olb的东东,有excel的,word的,等。。。
6。palette page:改为servers(因为以前的office的控件完完了)
7。点install就好了。
这样office2000的问题我想应解决了。(如果你用的是什么word.application或excel.application 的控件的话)。
-----------
我的建议:
    先用上面一的方法,再用comobj对象。
use comobj, excel_tlb; //excel_tlb 是新excel控件的pas文件,你把新控件放在窗体上看它用的哪个.pas就好了,当然下面要把这个控件去掉。因为comobj不用这个控件。只用这个.pas如excel_tlb中的函数。
var xl:variant;
在事件里写:
xl:=createoleobject('Excel.Application');
 
然后打开excel或word录一个宏命令,并打开宏命令考入代码。
----以下是宏录下来的宏。
 workbooks.add
 Range("C5:D7").Select
    Sheets("Sheet2").Select
    ActiveWindow.SelectedSheets.Delete
    Charts.Add
    ActiveChart.ChartType = xlColumnClustered
    ActiveChart.SetSourceData Source:=Sheets("Sheet3").Range("A1")
    ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet3"
-------
现在把它改为以下:
 xl.workbooks.add;
 xl.workbooks.add('d:"test.xls');
 xl.Range['C5:D7'].Select;
 xl.Sheets['Sheet2'].Select;
 xl.ActiveWindow.SelectedSheets.Delete;
 xl.Charts.Add;
 xl.ActiveChart.ChartType := xlColumnClustered;
 xl.ActiveChart.Location(xlLocationAsObject,'Sheet3');
现在运行一下,我保证你们爽歪歪!
看到规律了吗?
前面加上对象名,()改[],= 改:=,有参数时直接用,后加; 。哈哈,满意了吧,
用office的宏命令可是不用你去想编程的,全是手动。这样少写了一大堆代码。
 
bbcoll 如有不明白的朋友讨论可:bbcoll@china.com
 

 

 

、存入
 procedure TForm1.Button1Click(Sender: TObject);
var
 CurST:TStringStream;
 Filename:string;
begin
 if OpenDialog1.Execute then
 begin
   Filename:=OpenDialog1.FileName;
   wordOleContainer.CreateObjectFromFile(FileName, False);
   CurST := tstringstream.create('');
   wordOleContainer.savetostream(CurST);
   ADOTable1.Append;
   ADOTable1.FieldByName('doc').AsVariant:=CurST.datastring;
   ADOTable1.Post;
   CurST.free;
   wordOleContainer.DestroyObject;
 end; }
end;
 
//读出
procedure TForm1.BitBtn1Click(Sender: TObject);
var
    CurItemStream:TStringStream;
   CurItem:Variant;
begin
     CurItem:=aDOTable1.FieldByName('doc').AsVariant;
     CurItemStream:= TStringstream.create(CurItem);
     CurItemStream.position:=0;
    wordOleContainer.loadfromstream(CurItemStream);
     CurItemStream.free;
     wordOleContainer.SaveAsDocument('temp.rtf');
     wordOleContainer.DestroyObject;
     sleep(5000);
     richedit1.lines.loadfromfile('temp.rtf');//此处读出rtf可能是乱码,请查看delphi
   //richedit demo

end;

 

sql server中用image或是text字段都行,可以保存任何文件类型,读出时还可以改名
procedure TForm1.Button1Click(Sender: TObject);//保存文件
var str:Tmemorystream;
begin
str:=Tmemorystream.Create;
str.LoadFromFile('f:"page.doc');
str.Position:=0;
adoquery1.Append;
Tblobfield(adoquery1.FieldByName('tt')).loadfromstream(str);
try
adoquery1.Post;
finally
str.Free;
end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);//读取文件
var str:Tmemorystream;
begin
str:=Tmemorystream.Create;
str.Position:=0;
Tblobfield(adoquery1.FieldByName('tt')).savetostream(str);
str.SaveToFile('F:"page.doc');
str.Free;
end;

 

 

 

WORD中制定字符替换成数据库中数据时报错 ( 积分:50, 回复:

to lq123:
while not Query1.eof do
begin
i:=i+1;
FindText1 := '<Name'+inttostr(i)+'>';
FindText2 := '<pm'+inttostr(i)+'>';
FindText3 := '<fcon'+inttostr(i)+'>';
FindText4 := '<pcon'+inttostr(i)+'>';
FindText5 := '<rem'+inttostr(i)+'>';
 
ReplaceWith1 := Query1.fieldbyname('project_name').asstring;
ReplaceWith2 := Query1.fieldbyname('name').asstring;
ReplaceWith3 := Query1.fieldbyname('fcontent').asstring;
ReplaceWith5 := Query1.fieldbyname('remark').asstring;
 
Query2.Close ;
Query2.ParamByName ('MProject_id2').asstring:=Query1.fieldbyname('project_id2').asstring;
Query2.ParamByName ('M_date').asstring:=FormatDateTime('yyyy"/"mm"/"dd',DateTimePicker2.date);
Query2.Open ;
ReplaceWith4 := Query2.fieldbyname('pcontent').asstring;
 
Qstaff.Close ;
Qstaff.ParamByName ('MProject_id2').asstring:=Query1.fieldbyname('project_id2').asstring;
Qstaff.ParamByName ('M_serial').asstring:=Query1.fieldbyname('serial').asstring;
Qstaff.Open ;
j:=0;
if Qstaff.RecordCount <>0 then
while not Qstaff.Eof do
begin
j:=j+1;
find1:='<n'+inttostr(i)+inttostr(j)+'>';
find2:='<t'+inttostr(i)+inttostr(j)+'>';
rep1:=Qstaff.fieldbyname('name').asstring;
rep2:=Qstaff.fieldbyname('opinion').asstring;
 
WordDocument1.Range.Find.Execute( Find1, MatchCase, MatchWholeWord,
MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward,
Wrap, Format, Rep1, Replace );
 
WordDocument1.Range.Find.Execute( Find2, MatchCase, MatchWholeWord,
MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward,
Wrap, Format, Rep2, Replace );
 
Qstaff.Next ;
end;
WordDocument1.Range.Find.Execute( FindText1, MatchCase, MatchWholeWord,
MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward,
Wrap, Format, ReplaceWith1, Replace );
 
WordDocument1.Range.Find.Execute( FindText2, MatchCase, MatchWholeWord,
MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward,
Wrap, Format, ReplaceWith2, Replace );
 
WordDocument1.Range.Find.Execute( FindText3, MatchCase, MatchWholeWord,
MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward,
Wrap, Format, ReplaceWith3, Replace );
 
WordDocument1.Range.Find.Execute( FindText4, MatchCase, MatchWholeWord,
MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward,
Wrap, Format, ReplaceWith4, Replace );
 
WordDocument1.Range.Find.Execute( FindText5, MatchCase, MatchWholeWord,
MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward,
Wrap, Format, ReplaceWith5, Replace );
 
Query1.Next ;
end;
 
Fsumdoc_imp.Close ;
label2.Caption  :='';
end;

 

以下为例:
1、在WORD中插入书签名为“MM”;
2、在程序中定义 bookmark1:OLEVariant;
   在FORM上添加WORDAPPLICATION,WORDDOCUMENT
   指定打开WORD文档;假设一个MEMO字段名为“MM1”,
var tmpstring:String;
...
tmpstring:=table1.fieldbyname('MM1').AsString;
BookMark1:='addr';
try
WordApp.ActiveDocument.Bookmarks.Item(BookMark1).Range.InsertAfter(tmpstring);
except
end;

 

 

VB中使用方法如下:下例在活动文档中查找所有“hi”并将其替换为“hello”

Set myRange = ActiveDocument.Content
myRange.Find.Execute FindText:="hi", ReplaceWith:="hello", Replace:=wdReplaceAll
 
delphi5.0中find.execute的定义和参数说明如下:
function Execute(var FindText: OleVariant; var MatchCase: OleVariant;
                  var MatchWholeWord: OleVariant; var MatchWildcards: OleVariant;
                  var MatchSoundsLike: OleVariant; var MatchAllWordForms: OleVariant;
                  var Forward: OleVariant; var Wrap: OleVariant; var Format: OleVariant;
                  var ReplaceWith: OleVariant; var Replace: OleVariant): WordBool; safecall;
 
FindText   1、要搜索的文字。用空字符串(“”),将只搜索格式。
              指定相应的字符代码,可以搜索特殊的字符。例如,
             “ ^p”相对于一个段落标记,而“ ^t”相对于制表符。
              有关可用的特殊字符的列表,请参阅可进行查找和替换
              操作的特殊字符与文档元素示例。
           2、如果 MatchWildcards 为 True,则可以包含通配符,
              以及其他高级搜索条件。例如,“ *(ing) ” 将查
              找以“ing”结尾的所有单词。详细内容,请参阅通配符搜索示例。
           3、要搜索符号字符,可键入一个“ ^ ”符号,一个零(0),然后是
              符号字符的代码。例如,在 Windows 中,“ ^0151”对应于一个长
              破折号
MatchCase        如果查找区分大小写,则本参数为 True。相应于“编辑”菜单
                “查找并替换”对话框中的“区分大小写”复选框。
MatchWholeWord   如果只查找整个单词而不是单词的一部分,则本参数为 True。相
                 应于“编辑”菜单“查找并替换”对话框中的“全字匹配”复选框。
MatchWildcards   如果查找文字包含特殊的搜索操作符,则本参数为 True。相应于
                 “编辑”菜单“查找并替换”对话框中的“使用通配符”复选框。
MatchSoundsLike 如果查找包括与查找文字发音相近的单词,则本参数为 True。
                 相应于“编辑”菜单“查找并替换”对话框中的“同音”复选框。
MatchAllWordForms 如果查找文字的所有形式(例如,“ sit” 将包含“sitting”
                   和“sat”),则本参数为 True。相应于“编辑”菜单“查找并
                   替换”对话框中的“查找单词的各种形式”复选框。
Forward            如果向下(向文档尾部)搜索,则本参数为 True。
Wrap               如果从不是文档开头的地方开始搜索,并且达到文档尾部时
                  (如 Forward 设置为 False,则相反),本参数控制接下来的操作。
                   当在所选内容或范围中没有找到搜索文字时,本参数也控制接下来
                   的操作。可以是下列 WdFindWrap 常量之一:
 常量                                    说明
wdFindAsk                 在搜索完所选内容或者范围之后,Word 显示一条消息,询问是否搜
                  索文档的其他部分。
wdFindContinue   在到达搜索范围的开始或者结尾时,继续进行查找操作。
wdFindStop       在到达搜索范围的开始或者结尾时,停止进行查找操作。
Format            如果本参数为 True,则查找带格式的文本或者只查找格式
                  而不查找文本。
ReplaceWith       替换文字。要删除由 Find 参数指定的文字,可使用空字符串
                 (“”)。与 Find 参数相似,本参数也可以指定特殊的字符和
                  高级搜索条件。要指定一个图形对象或者其他非文本项作为替换
                 内容,可将这些项放到剪贴板上,然后将 ReplaceWith 指定为“ ^c”。
Replace          指定执行替换的次数:一次、所有或者不替换。可以是下列
                 WdReplace 常量之一:wdReplaceAll、wdReplaceNone 或 wdReplaceOne。

 

 

OLEdbgrid内容输出到excel

简单,方法如下:
procedure CopyDbDataToExcel(Target:TDbgid);
var
 iCount,jCount:Integer;
 XLApp:Variant;
 Sheet: Variant;
 Target:TDBGrid;
begin
 Screen.Cursor := crHourGlass;
 if not VarIsEmpty(XLApp) then
 begin
    XLApp.DisplayAlerts := False;
    XLApp.Quit;
    VarClear(XLApp);
 end;
 //通过ole创建Excel对象 
  Try
    XLApp := CreateOleObject('Excel.Application');
 Except
    Screen.Cursor := crDefault;
    Exit;
 end;
 
  XLApp.WorkBooks.Add[XLWBatWorksheet];
 XLApp.WorkBooks[1].WorkSheets[1].Name := '测试工作薄';
 Sheet := XLApp.Workbooks[1].WorkSheets['测试工作薄'] ;
 if Not Target.DataSource.DataSet.Active then
 begin
    Screen.Cursor := crDefault;
    Exit;
 end;
 Target.DataSource.DataSet.first;
 
  for iCount := 0 to Target.Columns.Count -1 do
 begin
        Sheet.cells[1 ,iCount+1] := Target.Columns.Items[iCount].Title.Caption;
 end;
 jCount:=1;
 While Not Target.DataSource.DataSet.Eof do
 begin
     for iCount := 0 to Target.Columns.Count -1 do
     begin
        Sheet.cells[jCount+1 ,iCount+1] := Target.Columns.Items[iCount].Field.AsString;
     end;
     Inc(jCount);
     Target.DataSource.DataSet.Next;
 end;
 XlApp.Visible := True;
 Screen.Cursor := crDefault;
end;

                              

 

 

word:=createoleobject('word.application');
 word.visible:=true;
 word.documents.open('e:"abc.doc',false);
 word.activedocument.range(0,0);
 word.activedocument.tables.add(word.activedocument.range,2,3);
 word.activedocument.sellection.insertrowsbelow(1);

 

 

 

 

十三、抓屏幕图像,保存为内存流


全局变量
memoryStream:TMemoryStream;
memoryStream:=TMemoryStream.create;
}

var
image:Timage;
jpgstream:TJPEGImage;
ss:tcanvas;

begin
ss:=tcanvas.Create;
ss.Handle:=getdc(0);
image:=timage.Create(self);
image.width:=Screen.width;
image.Height:=screen.Height ;
image.picture.bitmap.PixelFormat:= pf16bit;
bitblt(image.canvas.handle,0,0,image.width,image.height,ss.handle,0,0,srccopy);

{大大的BMP
image.picture.bitmap.SaveToStream(memoryStream);
}

{无损压缩BMP //uses Zlib.pas
//先定义变量count,DestStream,SourceStream
image.picture.bitmap.SaveToStream(memoryStream);
Count:=memoryStream.Size;
DestStream:=TMemoryStream.Create;
//压缩方式:clnone,clfastest,cldefault,clmax
SourceStream:=TCompressionStream.Create(cldefault, DestStream);
try
memoryStream.SaveToStream(SourceStream);
SourceStream.Free;
memoryStream.Clear;
memoryStream.WriteBuffer(Count, SizeOf(Count));
memoryStream.CopyFrom(DestStream, 0);
finally
DestStream.Free;
end;
}
{还原BMP //uses Zlib.pas
//先定义变量count,buffer,DestStream,SourceStream
//memoryStream是压缩的BMP
memoryStream.ReadBuffer(Count, SizeOf(Count));
GetMem(Buffer, Count);
DestStream:=TMemoryStream.Create;
SourceStream:=TDecompressionStream.Create(memoryStream);
Try
SourceStream.ReadBuffer(Buffer^, Count);
  DestStream.WriteBuffer(Buffer^, Count);
  DestStream.Position:=0;
  image.Picture.Bitmap.LoadFromStream(DestStream);
finally
FreeMem(Buffer);
DestStream.Free;
end;
}

{JPG //uses jpeg
jpgstream:= TJPEGImage.Create;
jpgstream.Assign(image.picture.bitmap);
jpgstream.CompressionQuality:=50;//压缩质量
jpgstream.Compress;
jpgstream.SaveToStream(memoryStream);//保存为JPG
//使用JPG image.Picture.Assign(jpgstream);
jpgstream.free;
}

ReleaseDC(0,ss.Handle);
image.free;

{发送内存流...}
end;

 

我用的是内存流和timer实现连续抓图!但速度并不行!
这是我的程序
var
DC: HDC;
Canvas: TCanvas;
MyBitmap: TBitmap;
aPicture : TPicture;
jpg:tjpegimage;
begin
DC := GetDC(0);
mybitmap:=tbitmap.Create;
canvas:=tcanvas.Create;
Canvas.Handle := DC;
with Screen do
begin
MyBitmap.Width := Width;
MyBitmap.Height := Height;
Application.ProcessMessages;
MyBitmap.Canvas.CopyRect(Rect(0, 0, Width, Height), Canvas,
Rect(0, 0, Width, Height));
end;
jpg:=tjpegimage.Create ;
aPicture:= TPicture.Create;
apicture.Bitmap:=mybitmap;
Application.ProcessMessages;
jpg.Assign(apicture.Bitmap);
TempStream[zuatu] := TMemoryStream.Create;
Application.ProcessMessages;
jpg.SaveToStream(TempStream[zuatu]);
ReleaseDC(0, DC);
mybitmap.free;
canvas.Free;
jpg.Free;
apicture.Free ;
zuatu:=zuatu-1;
if zuatu<1 then

十四、实现Word文档中表格的替换

var

 itemindex,mystart,myend:OleVariant;

 AData : THandle;

 APalette: HPALETTE;

 MyFormat : Word;

begin

 try

    //把剖面图发送到剪贴板,设定句柄。

    TempProfile1.Picture.SaveToClipboardFormat(MyFormat,AData,APalette);

    ClipBoard.SetAsHandle(MyFormat,AData);

 finally

   WordDocument1.Paragraphs.Item(21).Range.paste;//粘贴到Word文档中。

 

Dbimage的粘贴方法参见delphidemoactivex目录下。

 

小弟收集了些windows消息的用法,特与大家共享,由于水平有限,望各位高手能指出错误提出更多的关于windows消息的用法,重金酬献¥¥¥

消息,就是指Wi n d o w s发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变
窗口尺寸、按下键盘上的一个键都会使Wi n d o w s发送一个消息给应用程序。
消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,
对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做T M s g,它
在Wi n d o w s单元中是这样声明的:
t y p e
TMsg = packed record
hwnd: HWND; / /窗口句柄
message: UINT; / /消息常量标识符
wParam: WPA R A M ; // 32位消息的特定附加信息
lParam: LPA R A M ; // 32位消息的特定附加信息
time: DWORD; / /消息创建时的时间
pt: TPoint; / /消息创建时的鼠标位置
e n d ;
消息中有什么?
是否觉得一个消息记录中的信息像希腊语一样?如果是这样,那么看一看下面的解释:
hwnd 32位的窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可
视对象的句柄(窗口、对话框、按钮、编辑框等)。
message 用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也
可以是自定义的常量。
wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。
lParam 通常是一个指向内存中数据的指针。由于W P a r a m、l P a r a m和P o i n t e r都是3 2位的,
因此,它们之间可以相互转换。
    WM_NULL             = $0000;
 WM_CREATE           = $0001;
应用程序创建一个窗口
 WM_DESTROY          = $0002;
一个窗口被销毁
 WM_MOVE             = $0003;
移动一个窗口
 WM_SIZE             = $0005;
改变一个窗口的大小
 WM_ACTIVATE         = $0006;
一个窗口被激活或失去激活状态;
 WM_SETFOCUS         = $0007;
获得焦点后
 WM_KILLFOCUS        = $0008;
失去焦点
 WM_ENABLE           = $000A;
改变enable状态
 WM_SETREDRAW        = $000B;
设置窗口是否能重画 
  WM_SETTEXT          = $000C;
 应用程序发送此消息来设置一个窗口的文本
 WM_GETTEXT          = $000D;
 应用程序发送此消息来复制对应窗口的文本到缓冲区
 WM_GETTEXTLENGTH    = $000E;
得到与一个窗口有关的文本的长度(不包含空字符)
 WM_PAINT            = $000F;
要求一个窗口重画自己
 WM_CLOSE            = $0010;
当一个窗口或应用程序要关闭时发送一个信号
 WM_QUERYENDSESSION = $0011;
当用户选择结束对话框或程序自己调用ExitWindows函数
 WM_QUIT             = $0012;
用来结束程序运行或当程序调用postquitmessage函数 
  WM_QUERYOPEN        = $0013;
 当用户窗口恢复以前的大小位置时,把此消息发送给某个图标
 WM_ERASEBKGND       = $0014;
 当窗口背景必须被擦除时(例在窗口改变大小时)
 WM_SYSCOLORCHANGE   = $0015;
 当系统颜色改变时,发送此消息给所有顶级窗口
 WM_ENDSESSION       = $0016;
 当系统进程发出WM_QUERYENDSESSION消息后,此消息发送给应用程序,
通知它对话是否结束
 WM_SYSTEMERROR      = $0017;
 WM_SHOWWINDOW       = $0018;
 当隐藏或显示窗口是发送此消息给这个窗口
 WM_ACTIVATEAPP      = $001C;
发此消息给应用程序哪个窗口是激活的,哪个是非激活的;
 WM_FONTCHANGE       = $001D;
当系统的字体资源库变化时发送此消息给所有顶级窗口
 WM_TIMECHANGE       = $001E;
 当系统的时间变化时发送此消息给所有顶级窗口
 WM_CANCELMODE       = $001F;
 发送此消息来取消某种正在进行的摸态(操作)
 WM_SETCURSOR        = $0020;
 如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口
 WM_MOUSEACTIVATE    = $0021;
 当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口
 WM_CHILDACTIVATE    = $0022;
发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小
 WM_QUEUESYNC        = $0023;
 此消息由基于计算机的训练程序发送,通过WH_JOURNALPALYBACK的hook程序
分离出用户输入消息
 WM_GETMINMAXINFO    = $0024;
此消息发送给窗口当它将要改变大小或位置;
 WM_PAINTICON        = $0026;
 发送给最小化窗口当它图标将要被重画
 WM_ICONERASEBKGND   = $0027;
 此消息发送给某个最小化窗口,仅当它在画图标前它的背景必须被重画
 WM_NEXTDLGCTL       = $0028;
 发送此消息给一个对话框程序去更改焦点位置
 WM_SPOOLERSTATUS    = $002A;
 每当打印管理列队增加或减少一条作业时发出此消息 
  WM_DRAWITEM         = $002B;
 当button,combobox,listbox,menu的可视外观改变时发送
此消息给这些空件的所有者
 WM_MEASUREITEM      = $002C;
 当button, combo box, list box, list view control, or menu item 被创建时
发送此消息给控件的所有者
 WM_DELETEITEM       = $002D;
 当the list box 或 combo box 被销毁 或 当 某些项被删除通过LB_DELETESTRING, LB_RESETCONTENT, CB_DELETESTRING, or CB_RESETCONTENT 消息
 WM_VKEYTOITEM       = $002E;
此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息 
  WM_CHARTOITEM       = $002F;
此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息 
  WM_SETFONT          = $0030;
当绘制文本时程序发送此消息得到控件要用的颜色 
  WM_GETFONT          = $0031;
 应用程序发送此消息得到当前控件绘制文本的字体
 WM_SETHOTKEY        = $0032;
 应用程序发送此消息让一个窗口与一个热键相关连
 WM_GETHOTKEY        = $0033;
 应用程序发送此消息来判断热键与某个窗口是否有关联
 WM_QUERYDRAGICON    = $0037;
此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,应用程序能
返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标
 WM_COMPAREITEM      = $0039;
发送此消息来判定combobox或listbox新增加的项的相对位置
 WM_GETOBJECT        = $003D;
 WM_COMPACTING       = $0041;
显示内存已经很少了
 WM_WINDOWPOSCHANGING = $0046;
发送此消息给那个窗口的大小和位置将要被改变时,来调用setwindowpos函数或其它窗口管理函数
 WM_WINDOWPOSCHANGED = $0047;
发送此消息给那个窗口的大小和位置已经被改变时,来调用setwindowpos函数或其它窗口管理函数
 WM_POWER            = $0048;(适用于16位的windows)
当系统将要进入暂停状态时发送此消息
 WM_COPYDATA         = $004A;
当一个应用程序传递数据给另一个应用程序时发送此消息
 WM_CANCELJOURNAL    = $004B;
当某个用户取消程序日志激活状态,提交此消息给程序
 WM_NOTIFY           = $004E;
当某个控件的某个事件已经发生或这个控件需要得到一些信息时,发送此消息给它的父窗口
 WM_INPUTLANGCHANGEREQUEST = $0050;
当用户选择某种输入语言,或输入语言的热键改变
 WM_INPUTLANGCHANGE = $0051;
当平台现场已经被改变后发送此消息给受影响的最顶级窗口
 WM_TCARD            = $0052;
当程序已经初始化windows帮助例程时发送此消息给应用程序
 WM_HELP             = $0053;
此消息显示用户按下了F1,如果某个菜单是激活的,就发送此消息个此窗口关联的菜单,否则就
发送给有焦点的窗口,如果当前都没有焦点,就把此消息发送给当前激活的窗口
 WM_USERCHANGED      = $0054;
当用户已经登入或退出后发送此消息给所有的窗口,当用户登入或退出时系统更新用户的具体
设置信息,在用户更新设置时系统马上发送此消息;
 WM_NOTIFYFORMAT     = $0055;
公用控件,自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是UNICODE结构
在WM_NOTIFY消息,使用此控件能使某个控件与它的父控件之间进行相互通信
 WM_CONTEXTMENU      = $007B;
当用户某个窗口中点击了一下右键就发送此消息给这个窗口
 WM_STYLECHANGING    = $007C;
当调用SETWINDOWLONG函数将要改变一个或多个 窗口的风格时发送此消息给那个窗口
 WM_STYLECHANGED     = $007D;
当调用SETWINDOWLONG函数一个或多个 窗口的风格后发送此消息给那个窗口
 WM_DISPLAYCHANGE    = $007E;
当显示器的分辨率改变后发送此消息给所有的窗口
 WM_GETICON          = $007F;
此消息发送给某个窗口来返回与某个窗口有关连的大图标或小图标的句柄;
 WM_SETICON          = $0080;
程序发送此消息让一个新的大图标或小图标与某个窗口关联;
 WM_NCCREATE         = $0081;
当某个窗口第一次被创建时,此消息在WM_CREATE消息发送前发送;
 WM_NCDESTROY        = $0082;
此消息通知某个窗口,非客户区正在销毁
 WM_NCCALCSIZE       = $0083;
当某个窗口的客户区域必须被核算时发送此消息
 WM_NCHITTEST        = $0084;//移动鼠标,按住或释放鼠标时发生
 WM_NCPAINT          = $0085;
程序发送此消息给某个窗口当它(窗口)的框架必须被绘制时;
 WM_NCACTIVATE       = $0086;
此消息发送给某个窗口 仅当它的非客户区需要被改变来显示是激活还是非激活状态;
 WM_GETDLGCODE       = $0087;
发送此消息给某个与对话框程序关联的控件,widdows控制方位键和TAB键使输入进入此控件
通过响应WM_GETDLGCODE消息,应用程序可以把他当成一个特殊的输入控件并能处理它
 WM_NCMOUSEMOVE      = $00A0;
当光标在一个窗口的非客户区内移动时发送此消息给这个窗口      //非客户区为:窗体的标题栏及窗                                                                     
                                                              的边框体
 WM_NCLBUTTONDOWN    = $00A1;
当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息
 WM_NCLBUTTONUP      = $00A2;
当用户释放鼠标左键同时光标某个窗口在非客户区十发送此消息;
 WM_NCLBUTTONDBLCLK = $00A3;
当用户双击鼠标左键同时光标某个窗口在非客户区十发送此消息
 WM_NCRBUTTONDOWN    = $00A4;
当用户按下鼠标右键同时光标又在窗口的非客户区时发送此消息
 WM_NCRBUTTONUP      = $00A5;
当用户释放鼠标右键同时光标又在窗口的非客户区时发送此消息
 WM_NCRBUTTONDBLCLK = $00A6;
当用户双击鼠标右键同时光标某个窗口在非客户区十发送此消息
 WM_NCMBUTTONDOWN    = $00A7;
当用户按下鼠标中键同时光标又在窗口的非客户区时发送此消息
 WM_NCMBUTTONUP      = $00A8;
当用户释放鼠标中键同时光标又在窗口的非客户区时发送此消息
 WM_NCMBUTTONDBLCLK = $00A9;
当用户双击鼠标中键同时光标又在窗口的非客户区时发送此消息
 WM_KEYFIRST         = $0100;
 WM_KEYDOWN          = $0100;      
 //按下一个键
 WM_KEYUP            = $0101;      
 //释放一个键
 WM_CHAR             = $0102;      
 //按下某键,并已发出WM_KEYDOWN,                                              WM_KEYUP消息
 WM_DEADCHAR         = $0103;
当用translatemessage函数翻译WM_KEYUP消息时发送此消息给拥有焦点的窗口
 WM_SYSKEYDOWN       = $0104;
当用户按住ALT键同时按下其它键时提交此消息给拥有焦点的窗口;
 WM_SYSKEYUP         = $0105;
当用户释放一个键同时ALT 键还按着时提交此消息给拥有焦点的窗口
 WM_SYSCHAR          = $0106;
当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后提交此消息给拥有焦点的窗口
 WM_SYSDEADCHAR      = $0107;
当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后发送此消息给拥有焦点的窗口
 WM_KEYLAST          = $0108;
 WM_INITDIALOG       = $0110;
在一个对话框程序被显示前发送此消息给它,通常用此消息初始化控件和执行其它任务
 WM_COMMAND          = $0111;
当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个快捷键被翻译
 WM_SYSCOMMAND       = $0112;
当用户选择窗口菜单的一条命令或当用户选择最大化或最小化时那个窗口会收到此消息
 WM_TIMER            = $0113;                //发生了定时器事件
 WM_HSCROLL          = $0114;
当一个窗口标准水平滚动条产生一个滚动事件时发送此消息给那个窗口,也发送给拥有它的控件
 WM_VSCROLL          = $0115;
当一个窗口标准垂直滚动条产生一个滚动事件时发送此消息给那个窗口也,发送给拥有它的控件 WM_INITMENU         = $0116;
当一个菜单将要被激活时发送此消息,它发生在用户菜单条中的某项或按下某个菜单键,它允许
程序在显示前更改菜单
 WM_INITMENUPOPUP    = $0117;
当一个下拉菜单或子菜单将要被激活时发送此消息,它允许程序在它显示前更改菜单,而不要
改变全部 
 WM_MENUSELECT       = $011F;
当用户选择一条菜单项时发送此消息给菜单的所有者(一般是窗口)
 WM_MENUCHAR         = $0120;
当菜单已被激活用户按下了某个键(不同于加速键),发送此消息给菜单的所有者;
 WM_ENTERIDLE        = $0121;
当一个模态对话框或菜单进入空载状态时发送此消息给它的所有者,一个模态对话框或菜单进入空载状态就是在处理完一条或几条先前的消息后没有消息它的列队中等待
 WM_MENURBUTTONUP    = $0122;
 WM_MENUDRAG         = $0123;
 WM_MENUGETOBJECT    = $0124;
 WM_UNINITMENUPOPUP = $0125;
 WM_MENUCOMMAND      = $0126;
 WM_CHANGEUISTATE    = $0127;
 WM_UPDATEUISTATE    = $0128;
 WM_QUERYUISTATE     = $0129; 
  WM_CTLCOLORMSGBOX   = $0132;
在windows绘制消息框前发送此消息给消息框的所有者窗口,通过响应这条消息,所有者窗口可以
通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色
 WM_CTLCOLOREDIT     = $0133;
当一个编辑型控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以
通过使用给定的相关显示设备的句柄来设置编辑框的文本和背景颜色
 WM_CTLCOLORLISTBOX = $0134;
当一个列表框控件将要被绘制前发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以
通过使用给定的相关显示设备的句柄来设置列表框的文本和背景颜色 
 WM_CTLCOLORBTN      = $0135;
当一个按钮控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以
通过使用给定的相关显示设备的句柄来设置按纽的文本和背景颜色
 WM_CTLCOLORDLG      = $0136;
当一个对话框控件将要被绘制前发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以
通过使用给定的相关显示设备的句柄来设置对话框的文本背景颜色
 WM_CTLCOLORSCROLLBAR= $0137;
当一个滚动条控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以
通过使用给定的相关显示设备的句柄来设置滚动条的背景颜色
 WM_CTLCOLORSTATIC   = $0138;   
当一个静态控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以
通过使用给定的相关显示设备的句柄来设置静态控件的文本和背景颜色
   WM_MOUSEFIRST       = $0200;
 WM_MOUSEMOVE        = $0200; 
                   // 移动鼠标
 WM_LBUTTONDOWN      = $0201; //按下鼠标左键
 WM_LBUTTONUP        = $0202; //释放鼠标左键
 WM_LBUTTONDBLCLK    = $0203;//双击鼠标左键
 WM_RBUTTONDOWN      = $0204; //按下鼠标右键
 WM_RBUTTONUP        = $0205; //释放鼠标右键
 WM_RBUTTONDBLCLK    = $0206;//双击鼠标右键
 WM_MBUTTONDOWN      = $0207; //按下鼠标中键 
  WM_MBUTTONUP        = $0208; //释放鼠标中键
 WM_MBUTTONDBLCLK    = $0209; //双击鼠标中键
 WM_MOUSEWHEEL       = $020A;
当鼠标轮子转动时发送此消息个当前有焦点的控件
 WM_MOUSELAST        = $020A;
 WM_PARENTNOTIFY     = $0210;
当MDI子窗口被创建或被销毁,或用户按了一下鼠标键而光标在子窗口上时发送此消息给它的父窗口
 WM_ENTERMENULOOP    = $0211;
发送此消息通知应用程序的主窗口that已经进入了菜单循环模式
 WM_EXITMENULOOP     = $0212;
发送此消息通知应用程序的主窗口that已退出了菜单循环模式
 WM_NEXTMENU         = $0213;
 WM_SIZING           = 532;
当用户正在调整窗口大小时发送此消息给窗口;通过此消息应用程序可以监视窗口大小和位置
也可以修改他们
 WM_CAPTURECHANGED   = 533;
发送此消息 给窗口当它失去捕获的鼠标时;
 WM_MOVING           = 534;
当用户在移动窗口时发送此消息,通过此消息应用程序可以监视窗口大小和位置
也可以修改他们;
 WM_POWERBROADCAST   = 536;
此消息发送给应用程序来通知它有关电源管理事件;
 WM_DEVICECHANGE     = 537;
当设备的硬件配置改变时发送此消息给应用程序或设备驱动程序
 WM_IME_STARTCOMPOSITION        = $010D;
 WM_IME_ENDCOMPOSITION          = $010E;
 WM_IME_COMPOSITION             = $010F;
 WM_IME_KEYLAST                 = $010F;
 WM_IME_SETCONTEXT              = $0281;
 WM_IME_NOTIFY                  = $0282;
 WM_IME_CONTROL                 = $0283;
 WM_IME_COMPOSITIONFULL         = $0284;
 WM_IME_SELECT                  = $0285;
 WM_IME_CHAR                    = $0286;
 WM_IME_REQUEST                 = $0288;
 WM_IME_KEYDOWN                 = $0290;
 WM_IME_KEYUP                   = $0291;
 WM_MDICREATE        = $0220;
应用程序发送此消息给多文档的客户窗口来创建一个MDI 子窗口
 WM_MDIDESTROY       = $0221;
应用程序发送此消息给多文档的客户窗口来关闭一个MDI 子窗口
 WM_MDIACTIVATE      = $0222;
应用程序发送此消息给多文档的客户窗口通知客户窗口激活另一个MDI子窗口,当客户窗口收到
此消息后,它发出WM_MDIACTIVE消息给MDI子窗口(未激活)激活它;
 WM_MDIRESTORE       = $0223;
程序 发送此消息给MDI客户窗口让子窗口从最大最小化恢复到原来大小
 WM_MDINEXT          = $0224;
程序 发送此消息给MDI客户窗口激活下一个或前一个窗口
 WM_MDIMAXIMIZE      = $0225;
程序发送此消息给MDI客户窗口来最大化一个MDI子窗口;
 WM_MDITILE          = $0226;
程序 发送此消息给MDI客户窗口以平铺方式重新排列所有MDI子窗口
 WM_MDICASCADE       = $0227;
程序 发送此消息给MDI客户窗口以层叠方式重新排列所有MDI子窗口
 WM_MDIICONARRANGE   = $0228;
程序 发送此消息给MDI客户窗口重新排列所有最小化的MDI子窗口
 WM_MDIGETACTIVE     = $0229;
程序 发送此消息给MDI客户窗口来找到激活的子窗口的句柄
 WM_MDISETMENU       = $0230;
程序 发送此消息给MDI客户窗口用MDI菜单代替子窗口的菜单
 WM_ENTERSIZEMOVE    = $0231;
 WM_EXITSIZEMOVE     = $0232;
 WM_DROPFILES        = $0233;
 WM_MDIREFRESHMENU   = $0234;
 WM_MOUSEHOVER       = $02A1;
 WM_MOUSELEAVE       = $02A3;
 WM_CUT              = $0300;
程序发送此消息给一个编辑框或combobox来删除当前选择的文本
 WM_COPY             = $0301;
程序发送此消息给一个编辑框或combobox来复制当前选择的文本到剪贴板
 WM_PASTE            = $0302;
程序发送此消息给editcontrol或combobox从剪贴板中得到数据
 WM_CLEAR            = $0303;
程序发送此消息给editcontrol或combobox清除当前选择的内容;
 WM_UNDO             = $0304;
程序发送此消息给editcontrol或combobox撤消最后一次操作
 WM_RENDERFORMAT     = $0305
 
 WM_RENDERALLFORMATS = $0306;
 WM_DESTROYCLIPBOARD = $0307;
当调用ENPTYCLIPBOARD函数时 发送此消息给剪贴板的所有者
 WM_DRAWCLIPBOARD    = $0308;
当剪贴板的内容变化时发送此消息给剪贴板观察链的第一个窗口;它允许用剪贴板观察窗口来
显示剪贴板的新内容;
 WM_PAINTCLIPBOARD   = $0309;
当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区需要重画;
 WM_VSCROLLCLIPBOARD = $030A;
 WM_SIZECLIPBOARD    = $030B;
当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区域的大小已经改变是此消息通过剪贴板观察窗口发送给剪贴板的所有者;
 WM_ASKCBFORMATNAME = $030C;
通过剪贴板观察窗口发送此消息给剪贴板的所有者来请求一个CF_OWNERDISPLAY格式的剪贴板的名字
 WM_CHANGECBCHAIN    = $030D;
当一个窗口从剪贴板观察链中移去时发送此消息给剪贴板观察链的第一个窗口;
 WM_HSCROLLCLIPBOARD = $030E; 
此消息通过一个剪贴板观察窗口发送给剪贴板的所有者 ;它发生在当剪贴板包含CFOWNERDISPALY格式的数据并且有个事件在剪贴板观察窗的水平滚动条上;所有者应滚动剪贴板图象并更新滚动条的值;
 WM_QUERYNEWPALETTE = $030F;
此消息发送给将要收到焦点的窗口,此消息能使窗口在收到焦点时同时有机会实现他的逻辑调色板
 WM_PALETTEISCHANGING= $0310;
当一个应用程序正要实现它的逻辑调色板时发此消息通知所有的应用程序
 WM_PALETTECHANGED   = $0311;
此消息在一个拥有焦点的窗口实现它的逻辑调色板后发送此消息给所有顶级并重叠的窗口,以此
来改变系统调色板 
  WM_HOTKEY           = $0312;
当用户按下由REGISTERHOTKEY函数注册的热键时提交此消息
 WM_PRINT            = 791;
应用程序发送此消息仅当WINDOWS或其它应用程序发出一个请求要求绘制一个应用程序的一部分;
 WM_PRINTCLIENT      = 792;
 WM_HANDHELDFIRST    = 856;
 WM_HANDHELDLAST     = 863;
 WM_PENWINFIRST      = $0380;
 WM_PENWINLAST       = $038F;
 WM_COALESCE_FIRST   = $0390;
 WM_COALESCE_LAST    = $039F;
 WM_DDE_FIRST        = $03E0;
 WM_DDE_INITIATE     = WM_DDE_FIRST + 0;
一个DDE客户程序提交此消息开始一个与服务器程序的会话来响应那个指定的程序和主题名;
 WM_DDE_TERMINATE    = WM_DDE_FIRST + 1;
一个DDE应用程序(无论是客户还是服务器)提交此消息来终止一个会话;
 WM_DDE_ADVISE       = WM_DDE_FIRST + 2;
一个DDE客户程序提交此消息给一个DDE服务程序来请求服务器每当数据项改变时更新它
 WM_DDE_UNADVISE     = WM_DDE_FIRST + 3;
一个DDE客户程序通过此消息通知一个DDE服务程序不更新指定的项或一个特殊的剪贴板格式的项
 WM_DDE_ACK          = WM_DDE_FIRST + 4;
此消息通知一个DDE(动态数据交换)程序已收到并正在处理WM_DDE_POKE, WM_DDE_EXECUTE, WM_DDE_DATA, WM_DDE_ADVISE, WM_DDE_UNADVISE, or WM_DDE_INITIAT消息
 WM_DDE_DATA         = WM_DDE_FIRST + 5;
一个DDE服务程序提交此消息给DDE客户程序来传递个一数据项给客户或通知客户的一条可用数据项
 WM_DDE_REQUEST      = WM_DDE_FIRST + 6;
一个DDE客户程序提交此消息给一个DDE服务程序来请求一个数据项的值;
 WM_DDE_POKE         = WM_DDE_FIRST + 7;
一个DDE客户程序提交此消息给一个DDE服务程序,客户使用此消息来请求服务器接收一个未经同意的数据项;服务器通过答复WM_DDE_ACK消息提示是否它接收这个数据项;
 WM_DDE_EXECUTE      = WM_DDE_FIRST + 8;
一个DDE客户程序提交此消息给一个DDE服务程序来发送一个字符串给服务器让它象串行命令一样被处理,服务器通过提交WM_DDE_ACK消息来作回应;
 WM_DDE_LAST         = WM_DDE_FIRST + 8;
 WM_APP = $8000;
 WM_USER             = $0400;
此消息能帮助应用程序自定义私有消息;
/////////////////////////////////////////////////////////////////////
通知消息(Notification message)是指这样一种消息,一个窗口内的子控件发生了一些事情,需要通
知父窗口。通知消息只适用于标准的窗口控件如按钮、列表框、组合框、编辑框,以及Windows 95公
共控件如树状视图、列表视图等。例如,单击或双击一个控件、在控件中选择部分文本、操作控件的
滚动条都会产生通知消息。 
     按扭
B N _ C L I C K E D                        //用户单击了按钮
B N _ D I S A B L E                        //按钮被禁止
B N _ D O U B L E C L I C K E D    //用户双击了按钮
B N _ H I L I T E                         //用户加亮了按钮
B N _ PA I N T按钮应当重画
B N _ U N H I L I T E加亮应当去掉
组合框
C B N _ C L O S E U P组合框的列表框被关闭
C B N _ D B L C L K用户双击了一个字符串
C B N _ D R O P D O W N组合框的列表框被拉出
C B N _ E D I T C H A N G E用户修改了编辑框中的文本
C B N _ E D I T U P D AT E编辑框内的文本即将更新
C B N _ E R R S PA C E组合框内存不足
C B N _ K I L L F O C U S组合框失去输入焦点
C B N _ S E L C H A N G E在组合框中选择了一项
C B N _ S E L E N D C A N C E L用户的选择应当被取消
C B N _ S E L E N D O K用户的选择是合法的
C B N _ S E T F O C U S组合框获得输入焦点
编辑框
E N _ C H A N G E编辑框中的文本己更新
E N _ E R R S PA C E编辑框内存不足
E N _ H S C R O L L用户点击了水平滚动条
E N _ K I L L F O C U S编辑框正在失去输入焦点
E N _ M A X T E X T插入的内容被截断
E N _ S E T F O C U S编辑框获得输入焦点
E N _ U P D AT E编辑框中的文本将要更新
E N _ V S C R O L L用户点击了垂直滚动条消息含义
列表框
L B N _ D B L C L K用户双击了一项
L B N _ E R R S PA C E列表框内存不够
L B N _ K I L L F O C U S列表框正在失去输入焦点
L B N _ S E L C A N C E L选择被取消
L B N _ S E L C H A N G E选择了另一项
L B N _ S E T F O C U S列表框获得输入焦点
本人能力有限,如有不当之处,还望高手多多指教;baoxf1025@163.com

 

 

Tchart属性描述

Nseries需比较的数据项的个数
  Nvalues每个数据项中的子项目数
  TitleDlg图表的标题设置对话框
  AdmDlg图表构件绘图区上下左右边缘处注解设置对话框
  FontDlg注解文字字体设置
  BorderStyle图表构件的边框风格
  Height、Width、Top、Left这四项设置图表构件在窗体中的位置及大小
  BottomGap、TopGap、LeftGap、RightGap这四项设置图表构件绘图区的位置及大小
  ChartType、pThpe、Style这三项设置图表构件及绘图区的类型与风格
  Chart3D用以设置是否以三维形式显示数据
  ViewRot3D设置观察三维图示的视角
  WallWidth设置三维图示中X、Y、Z三壁的厚度
  LinebkColor、LineColor、LineStyle、LineWidth设置线条的颜色和风格
  PointType设置数据点的形状、类型
  RGB3DBK、RGB2DBK、RGBBK、RGBBarHorz设置2/3维图示中背景色
  Cursor设置绘图区光标形状
  Decimals设置图表中数据显示的小数位数
  Stacked设置图表中数据的归一化方式
  Grid、VertGridGap设置坐标系的背景网格线
  在制作同时比较多组数据的图表时,还需要设置以下属性:
  FixedGap每个数据项之间间隔
  ThisPoint数据项的次序
  ThisSerie每个数据项中子数据项的次序
  ThisBkColor、ThisColor颜色设置
  余下的Visible、Hint、HelpContext、Name、Tag等属性与其它构件相同,不再赘述。
下面对CustTool、ToolBar、PalleteBar、PatternBar几个关于图表中工具条设置的属性
作简单介绍。PalleteBar设为True时生成的图表带有颜色设置工具条,即可在浏览图表
时改变数据项颜色以适应不同视觉需求。
  PatternBar设为True时生成的图表带有图案设置工具条,作用同上。
  ToolBar设为True时生成的图表带有一个功能
  强大的工具条,其上加速键能完成的功能有:从数据文件读入比较数据、输出数据到
数据文件、图表打印、在直方图/饼图/离散点图/曲线拟合图之间切换、2/3维切换、改变
视角、以表格方式浏览、修改数据等等。丰富的功能节省了程序员的开发时间,使用极为
方便(工具条上每个加速键都有Hint提示)。
  CustTool在该属性里可以设置需要使用的功能项,Delphi自动去除未选取的加速键。
到目前为止,读者对ChartFx构件的属性已有了一定的了解,可以设计较为复杂的图表了,
但还不能真正制作实用的图表,因为我们还未介绍如何初始化数据。同时读者可能还发现
了这么个问题:当数据较多以致构件空间容纳不下怎么办?我们举一实例来说明这两个问
题。假定某校要比较全校40个班级某一学期班平均成绩,40个班的平均分和名称(实验班、
初一(2)等)分别存放在两个数组Data[39]、Class Name[39]中。在窗体FormCreat事
件中加入以下代码:
  For i:=0 to 39 Do Begin
  ChartFx 1.OpenData[COD-VALUES]:=makelong(1,40);
  With ChartFx1 Do Begin
  ThisSerie:=0;
  Value[i]:=Data[i];
  Legend[i]:=ClassName[i];
  CloseData[COD-VALUES]:=0;
  End;
  End;
  按F9执行,我们发现图表并未显示全部40个数据,而是在绘图区下方出现了滚行条,
滚动此条就可以浏览全部数据,Delphi轻松地解决了这个问题。在绘图区的右方则出现了
一个注解框,显示每个数据项编号所对应的班级名称。
        若设置ChartType为Bar,则每个数据项都用一个有一定高度(此高度由初始化数
据及归一化方式决定)的彩色矩形条来表示。用鼠标双击矩形条即显示对应数据,显示方

式由DblClkDlg和RigClkDlg设定。

 

十五sharp画图

unit RotShp;
 
interface
 
uses
 Windows, Messages, SysUtils, Classes,
 Graphics, Controls, Forms, Dialogs,
 ExtCtrls;
 
type
 TRotateShape = class(TShape)
 private
    FAngle: Integer;
    FShapeWidth: Integer;
    FShapeHeight: Integer;
    procedure SetAngle(Value: Integer);
    procedure SetShapeHeight(const Value: Integer);
    procedure SetShapeWidth(const Value: Integer);
 protected
    procedure Paint; override;
 public
    constructor Create(AOwner: TComponent); override;
 published
    property ShapeWidth: Integer read FShapeWidth write SetShapeWidth;
    property ShapeHeight: Integer read FShapeHeight write SetShapeHeight;
    property Angle: Integer read FAngle write SetAngle;
 end;
 
procedure Register;
 
implementation
 
uses
 Math;
 
procedure Register;
begin
 RegisterComponents('Samples', [TRotateShape]);
end;
 
{ TRotateShape }
 
const
 MinDist = 30;
 
type
 TDblPoint = record
    x, y: Extended;
 end;
 
function DblPoint(x, y: Extended): TDblPoint;
begin
 Result.x := x;
 Result.y := y;
end;
 
constructor TRotateShape.Create(AOwner: TComponent);
begin
 inherited;
 FShapeWidth := Width;
 FShapeHeight := Height;
 FAngle := 0;
end;
 
procedure TRotateShape.Paint;
var
 p: array of TPoint;
 fp: array of TDblPoint;
 Cnt, i: Integer;
 Len, Alpha, Pho, Theta, a, b, x, y: Extended;
begin
 x := Width * 0.5;
 y := Height * 0.5;
 a := FShapeWidth * 0.5;
 b := FShapeHeight * 0.5;
 if Shape in [stSquare, stRoundSquare, stCircle] then
    if a < b then b := a
    else a := b;
 case Shape of
    stRectangle, stSquare:
      begin
        SetLength(fp, 4);
        fp[0] := DblPoint(-a, -b);
        fp[1] := DblPoint( a, -b);
        fp[2] := DblPoint( a, b);
        fp[3] := DblPoint(-a, b);
      end;
    stRoundRect, stRoundSquare:
      if (FShapeWidth <= 25) or (FShapeHeight <= 25) then begin
        SetLength(fp, 4);
        fp[0] := DblPoint(-a, -b);
        fp[1] := DblPoint( a, -b);
        fp[2] := DblPoint( a, b);
        fp[3] := DblPoint(-a, b);
      end else begin
        SetLength(fp, 16);
        fp[0] := DblPoint(-a + 5, -b);
        fp[1] := DblPoint(a - 5, -b);
        fp[2] := DblPoint(a - 5 + Cos(DegToRad(300)) * 5,
            -b + 5 + Sin(DegToRad(300)) * 5);
        fp[3] := DblPoint(a - 5 + Cos(DegToRad(330)) * 5,
            -b + 5 + Sin(DegToRad(330)) * 5);
        fp[4] := DblPoint(a, -b + 5);
        fp[5] := DblPoint(a, b - 5);
        fp[6] := DblPoint(a - 5 + Cos(DegToRad(30)) * 5,
            b - 5 + Sin(DegToRad(30)) * 5);
        fp[7] := DblPoint(a - 5 + Cos(DegToRad(60)) * 5,
            b - 5 + Sin(DegToRad(60)) * 5);
        fp[8] := DblPoint(a - 5, b);
        fp[9] := DblPoint(-a + 5, b);
        fp[10] := DblPoint(-a + 5 + Cos(DegToRad(120)) * 5,
            b - 5 + Sin(DegToRad(120)) * 5);
        fp[11] := DblPoint(-a + 5 + Cos(DegToRad(150)) * 5,
            b - 5 + Sin(DegToRad(150)) * 5);
        fp[12] := DblPoint(-a, b - 5);
        fp[13] := DblPoint(-a, -b + 5);
        fp[14] := DblPoint(-a + 5 + Cos(DegToRad(210)) * 5,
            -b + 5 + Sin(DegToRad(210)) * 5);
        fp[15] := DblPoint(-a + 5 + Cos(DegToRad(240)) * 5,
            -b + 5 + Sin(DegToRad(240)) * 5);
      end;
    stEllipse, stCircle:
      begin
        Len := Pi * a * b;
        Cnt := Round(Len / MinDist);
        SetLength(fp, Cnt);
        for i := 0 to Cnt - 1 do begin
          Alpha := i * 2 * Pi / Cnt;
          fp[i] := DblPoint(a * Cos(Alpha), b * Sin(Alpha));
        end;
      end;
 end;
 SetLength(p, Length(fp));
 Alpha := DegToRad(FAngle);
 for i := Low(fp) to High(fp) do begin
    Pho := Sqrt(Sqr(fp[i].x) + Sqr(fp[i].y));
    Theta := ArcTan2(fp[i].y, fp[i].x) + Alpha;
    p[i] := Point(Round(x + Pho * Cos(Theta)), Round(y + Pho * Sin(Theta)));
 end;
 Canvas.Pen := Pen;
 Canvas.Brush := Brush;
 Canvas.Polygon(p);
end;
 
procedure TRotateShape.SetAngle(Value: Integer);
begin
 Value := Value mod 360;
 if FAngle <> Value then begin
    FAngle := Value;
    Invalidate;
 end;
end;
 
procedure TRotateShape.SetShapeHeight(const Value: Integer);
begin
 if FShapeHeight <> Value then begin
    FShapeHeight := Value;
    Invalidate;
 end;
end;
 
procedure TRotateShape.SetShapeWidth(const Value: Integer);
begin
 if FShapeWidth <> Value then begin
    FShapeWidth := Value;
    Invalidate;
 end;
end;
 
end.

十六 控件添加

问题:加入控件问题 ( 积分:200, 回复:3, 阅读:94 )
分类:控件 - 开发 ( 版主:cAkk, amo )

来自:xtdragon, 时间:2001-4-14 10:35:00, ID502395

[显示:小字体 | 大字体]

 我有一段代码:
    unit WPanel;
 
interface
 
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ExtCtrls,Menus;
 
type
 TWPanel = class(TPanel)
 private
   { Private declarations }
    FTPanel:TPanel;
    FAPanel:TPanel;
 protected
    { Protected declarations }
 public
    { Public declarations }
    Constructor Create(AOwner:TComponent);override;
    Destructor Destroy;override;
    procedure FTPanelClick(Sender:TObject);
    procedure Change(Sender:TObject);
    class procedure mnuPPClear(mnuPP:TPopupMenu);
    procedure onPopup(mnuPP:TPopupMenu);
    procedure PanelMouseDown(Sender:TObject;Button:TMouseButton;
                     Shift:TShiftState;X,Y:Integer);
    class procedure DeleteAllShapes(ParentControl : TWinControl);
 published
    { Published declarations }
     end;
    Var
      mnuPP:TPopupMenu;
 
 
implementation
 
 
 
Constructor TWpanel.Create(AOwner:TComponent);
 begin
 inherited Create(AOwner);
   BevelInner:=bvLowered;
   BevelWidth:=2;
   Height:=235;
   Width:=94;
   FTPanel:=TPanel.Create(Self);
   FTPanel.Parent:=TWpanel(Self);
   FTPanel.Height:=25;
   FTPanel.Align:=altop;
   FTPanel.onClick:=FTPanelClick;
   TPanel(Self).onMouseDown:=PanelMouseDown;
 
   end;
 
 Destructor TWPanel.Destroy;
 begin
 inherited Destroy;
 end;
 
 
 class procedure TWPanel.DeleteAllShapes(ParentControl : TWinControl);
 var
    i : Integer;
begin {DeleteAllShapes}
 // Delete controls from ParentControl
 i := 0;
 
 while i < ParentControl.ControlCount do begin
    if ParentControl.Controls[i] is TWPanel then begin
      ParentControl.Controls[i].Free;
      // Note that there is no need to increment the counter, because the
      // next component (if any) will now be at the same position in Controls[]
    end else begin
      Inc(i);
    end;
 end;
end; {DeleteAllShapes}
 
 class procedure TWPanel.mnuPPClear(mnuPP:TPopupMenu);
 var
 i:integer;
 begin
 for i:=mnuPP.Items.Count-1 DownTo 0 do
 mnuPP.Items[i].Free;
 end;
 
 procedure TWPanel.PanelMouseDown(Sender:TObject;Button:TMouseButton;
                     Shift:TShiftState;X,Y:Integer);
 
 var
 p,q:TPoint;
 begin
 {Selected:=True;}
 {ReleaseCapture;
 perform(WM_SysCommand,$F012,0);}
 if (Button in [mbRight]) then
   begin
    mnuPPClear(mnuPP);
    onPopup(mnuPP);
    P.x:=x;
    p.y:=y;
    q:=ClientToScreen(P);
   mnuPP.Popup(q.x,q.y);
    exit;
    end;
 end;
 
 
 procedure TWPanel.FTPanelClick(Sender:TObject);
 var
   s:string;
 begin
   if inputQuery('机架名输入','请输入机架名',s) then
    FTPanel.Caption:=s;
    end;
 
   procedure TWPanel.onPopup(mnuPP:TPopupMenu);
 var
 mp:TMenuItem;
   begin
   mp:=TMenuItem.Create(Self);
   mp.Caption:='增加机框';
   mp.onClick:=Change;
   mnuPP.Items.Add(mp);
   end;
 
 procedure TWPanel.Change(Sender:TObject);
 begin
    {if tmenuitem(sender).Caption='增加机框' then
    begin }
    FAPanel:=TPanel.Create(self);
    FAPanel.Align:=alBottom;
    FAPanel.Caption:='仙桃';
    FAPanel.Height:=70;
    FAPanel.Parent:=TWPanel(self);
 {end;}
 end;
 
 
procedure RegisterStorageClasses;
begin {RegisterStorageClasses}
 RegisterClasses([TWPanel]);
end; {RegisterStorageClasses}
 
initialization
 RegisterStorageClasses;
 mnuPP:=TPopupMenu.Create(Application);
end.
 
 
   unit Unit1;
 
interface
 
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, Menus, ExtCtrls;
 
type
 TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    PopupMenu1: TPopupMenu;
    add1: TMenuItem;
    ScrollBox1: TScrollBox;
    Panel1: TPanel;
    
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button1Click(Sender: TObject);
    
  private
    { Private declarations }
 public
    { Public declarations }
 end;
 
var
 Form1: TForm1;
 
implementation
    uses wpanel;
{$R *.DFM}
 
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 with twpanel.Create(self) do
 begin
   left:=x;
   top:=y;
   parent:=form1;
   end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 edit1.text:=inttostr(form1.componentcount);
 
 
end;
end.
 在FORM1中动态建立一个TWPANEL后,窗体的控件数增加一个,但是用弹出菜单建立一个
TPANEL后,TPANEL。PARENT:=TWPANEL(SELF),窗体的控件数并不增加。请问这个问题
应该如何解决。

十七、隐性的的产生Form,并且在Form上添加组件。

        MYform:Tform;

      MyApp: TWordApplication;

     MyDoc: TWordDocument;

begin

Myform:=Tform.create(application);

     MyApp:=TWordApplication.Create(MyForm); 

 MyDoc:=TWordDocument.Create(MyForm);