文档库 最新最全的文档下载
当前位置:文档库 › Delphi 的内存操作函数

Delphi 的内存操作函数

Delphi 的内存操作函数
Delphi 的内存操作函数

Delphi 的内存操作函数

马上能想到的函数有:

GetMem

AllocMem

ReallocMem

FreeMem

GetMemory

ReallocMemory

FreeMemory

New

Dispose

NewStr

DisposeStr

StrNew

StrAlloc

StrDispose

GlobalAllocPtr

GlobalFreePtr

WideStrAlloc

AnsiStrAlloc

StrDispose

Move

MoveMemory

CopyMemory

ZeroMemory

FillMemory

FillChar

StrBufSize

给字符指针(PChar、PWideChar、PAnsiChar)分配内存, 最佳选择是: StrAlloc.

StrAlloc 虽然最终也是调用了GetMem, 但StrAlloc 会在指针前面添加Delphi 需要的4 个管理字节(记录长度).

StrAlloc 分配的内存, 用StrDispose 释放, 用StrBufSize 获取大小.

用FreeMem 释放可以吗? 这样会少释放4 个字节.

这种类型的指针一般用于API 函数的参数, 譬如获取窗口标题:

var

p: PChar;

begin

p := StrAlloc(256);

GetWindowText(Handle, p, StrBufSize(p));

ShowMessage(p); {Form1}

StrDispose(p);

end;

StrAlloc 根据不同的参数(PWideChar、PAnsiChar)分别重载调用了WideStrAlloc、AnsiStrAlloc, 所以我们也可以直接使用这两个函数(这也需要用StrDispose 释放), 不过使用它们的必要性不大; 用StrAlloc 指定好参数类型即可.

给字符指针分配内存其他方法也挺方便, 譬如:

//获取 WINDOWS 所在目录

var

buf: array[0..MAX_PATH] of Char;

begin

GetWindowsDirectory(buf, Length(buf));

ShowMessage(buf); {C:\WINDOWS}

end;

数组的内存不是我们自己申请的, 系统会自动释放; 记住: 只要是手动申请的内存一定要手动释放.

我们给字符指针申请内存主要是为了在API 中接受数据, 如果我们要直接赋给常量值, 系统会自动分配内存的, 譬如:

var

p: PChar;

begin

p := '万一的 Delphi 博客';

ShowMessage(p); {万一的 Delphi 博客}

end;

当然我们也可以用这种办法申请内存, 就是笨了点, 譬如:

//获取系统目录

var

p: PChar;

begin

p := PChar(StringOfChar(Char(0), 256)); {反复一个空字符 256 次成一个字符串, 然后转为 PChar}

GetSystemDirectory(p, StrBufSize(p));

ShowMessage(p); {C:\WINDOWS\system32}

end;

如果在API 函数需要的字符指针是为了输入, 当然也不需要申请内存, 譬如:

//设置窗口标题

var

p: PChar;

begin

p := '窗口新标题';

SetWindowText(Handle, p);

end;

//也可以直接给常量

begin

MessageBox(Handle, '提示信息', '标题', MB_OK);

end;

//如果是给字符串的变量或常量, 则需要转换一下

var

str: string;

begin

str := '万一的 Delphi 博客';

TextOut(Canvas.Handle, 10, 10, PChar(str), Length(str));

{在窗体上输出文字, 此代码不能在 OnCreate 事件中}

end;

跑题了...到现在已用到了StrAlloc、StrDispose、WideStrAlloc、AnsiStrAlloc、StrBufSize 几个函数.

还有NewStr、DisposeStr、StrNew、StrDispose 也貌似有点关系.

先说NewStr 和DisposeStr(它们是一对);

NewStr 是根据AnsiString 再新建一个PAnsiString, 不过这是为兼容而存在的, Delphi 已不提倡使用了.

不再提倡使用的函数都缀以deprecated 标识, 并在代码提示中用灰色显示.

其实用@ 即可获取字符串指针, 当然根本用不着它们.

还有个StrNew; StrNew 可以再制一个相同的字符指针, 譬如:

var

p1,p2: PChar;

begin

p1 := 'Delphi';

p2 := StrNew(p1);

ShowMessageFmt('%s, %s', [p1, p2]); {Delphi, Delphi}

p1 := '2009';

ShowMessageFmt('%s, %s', [p1, p2]); {2009, Delphi}

StrDispose(p2); {释放自己申请的}

end;

不过StrNew 存在的意义也不大, 我们可以更简单地完成上面的操作:

var

p1,p2: PChar;

begin

p1 := 'Delphi';

p2 := p1;

ShowMessageFmt('%s, %s', [p1, p2]); {Delphi, Delphi}

p1 := '2009';

ShowMessageFmt('%s, %s', [p1, p2]); {2009, Delphi}

end;

说来说去, 好像只有StrAlloc 是我们值得我们记忆的?

还有一对非常重要的相关函数: GlobalAllocPtr、GlobalFreePtr; 它们的功能是上面这些都不可替代的!

GlobalAllocPtr 和GlobalFreePtr 是对系统函数: GlobalAlloc、GlobalFree 的简化, 之所以说它们重要, 只是因为它们可以跨进程操作; 不过GlobalAllocPtr 是给无类型指针(Pointer)分配内存, 当然就不仅仅用于字符指针了. 还是到后面专题再做例子吧.

静态数组, 在声明时就分配好内存了, 譬如:

var

arr1: array[0..255] of Char;

arr2: array[0..255] of Integer;

begin

ShowMessageFmt('数组大小分别是: %d、%d', [SizeOf(arr1), SizeOf(arr2)]);

{数组大小分别是: 512、1024}

end;

对静态数组指针, 虽然在声明之处并没有分配内存, 但这个指针应该分配多少内存是有定数的.

这种情况, 我们应该用New 和Dispose 来分配与释放内存. 譬如:

type

TArr1 = array[0..255] of Char;

TArr2 = array[0..255] of Integer;

var

arr1: ^TArr1;

arr2: ^TArr2;

begin

New(arr1);

New(arr2);

arr1^ := '万一的 Delphi 博客';

ShowMessageFmt('%s%s', [arr1^[0], arr1^[1]]); {万一}

// ShowMessageFmt('%s%s', [arr1[0], arr1[1]]); {这样也可以} arr2[Low(arr2^)] := Low(Integer); {第一个元素赋最小值}

arr2[High(arr2^)] := MaxInt; {第一个元素赋最大值}

ShowMessageFmt('%d, %d', [arr2[0], arr2[255]]);

{-2147483648, 2147483647}

Dispose(arr1);

Dispose(arr2);

end;

//变通一下, 再做一遍这个例子:

type

TArr1 = array[0..255] of Char;

TArr2 = array[0..255] of Integer;

PArr1 = ^TArr1;

PArr2 = ^TArr2;

var

arr1: PArr1;

arr2: PArr2;

begin

New(arr1);

New(arr2);

arr1^ := '万一的 Delphi 博客';

ShowMessageFmt('%s%s', [arr1[0], arr1[1]]);

arr2[Low(arr2^)] := Low(Integer);

arr2[High(arr2^)] := MaxInt;

ShowMessageFmt('%d, %d', [arr2[0], arr2[255]]);

{-2147483648, 2147483647}

Dispose(arr1);

Dispose(arr2);

end;

给已知大小的指针分配内存应该用New, 上面的例子是关于静态数组指针的, 后面要提到的结构体(记录)的指针也是如此.

New 的本质也函数调用GetMem, 但不需要我们指定大小了.

但这对动态数组就不合适了, 不过给动态数组分配内存SetLength 应该足够了, 譬如:

var

arr: array of Integer;

begin

SetLength(arr, 3);

arr[0] := Random(100);

arr[1] := Random(100);

arr[2] := Random(100);

ShowMessageFmt('%d,%d,%d', [arr[0],arr[1],arr[2]]); {0,3,86}

end;

那怎么给动态数组的指针分配内存呢? 其实动态数组变量本身就是个指针, 就不要绕来绕去再给它弄指针了.

不过有一个理念还是满重要的, 那就是我们可以把一个无类型指针转换为动态数组类型, 譬如:

TArr = array of Integer;

var

p: Pointer;

begin

GetMem(p, 3 * SizeOf(Integer)); {分配能容纳 3 个 Integer 的空间}

{这和 3 个元素的 TArr 的大小是一样的, 但使用时需要进行类型转换}

TArr(p)[0] := Random(100);

TArr(p)[1] := Random(100);

TArr(p)[2] := Random(100);

ShowMessageFmt('%d,%d,%d', [TArr(p)[0], TArr(p)[1],

TArr(p)[2]]); {0,3,86}

FreeMem(p);

end;

这里用到了GetMem 和FreeMem, 对分配无类型指针这是比较常用的; 对其他类型的指针它可以, 但不见得是最好的方案, 譬如:

//获取窗口标题(显然不如用前面说过的 StrAlloc 更好)

var

p: Pointer;

begin

GetMem(p, 256);

GetWindowText(Handle, p, 256);

ShowMessage(PChar(p)); {Form1}

FreeMem(p);

end;

应该提倡用GetMemory 和FreeMemory 代替GetMem、FreeMem, 譬如:

var

p: Pointer;

p := GetMemory(256);

GetWindowText(Handle, p, 256);

ShowMessage(PChar(p)); {Form1}

FreeMemory(p);

end;

先总结下:

New 是给已知大小的指针分配内存;

GetMem 主要是给无类型指针分配内存;

尽量使用GetMemory 来代替GetMem.

还有个AllocMem 和它们又有什么区别呢?

AllocMem 分配内存后会同时初始化(为空), GetMem 则不会, 先验证下:

var

p1,p2: Pointer;

begin

p1 := AllocMem(256);

ShowMessage(PChar(p1)); {这里会显示为空}

FreeMemory(p1);

p2 := GetMemory(256);

ShowMessage(PChar(p2)); {这里会显示一些垃圾数据, 内容取决与在分配以前该地址的内容}

FreeMemory(p2);

end;

关于FreeMemory 与FreeMem 的区别:

1、FreeMemory 会检查是否为nil 再FreeMem, 这有点类似: Free 与Destroy;

2、FreeMem 还有个默认参数可以指定要释放的内存大小, 不指定就全部释放(没必要只释放一部分吧);

3、New 对应的Dispose 也可以用FreeMem 或FreeMemory 代替.

尽量使用FreeMemory 来释放GetMem、GetMemory、AllocMem、ReallocMem、ReallocMemory 分配的内存.

ReallocMem、ReallocMemory 是在已分配的内存的基础上重新分配内存, 它俩差不多ReallocMemory 比ReallocMem 多一个nil 判断, 尽量使用ReallocMemory 吧. 譬如:

type

TArr = array[0..MaxListSize] of Char;

PArr = ^TArr;

var

arr: PArr;

i: Integer;

begin

arr := GetMemory(5);

for i := 0to4do arr[i] := Chr(65+i);

ShowMessage(PChar(arr)); {ABCDE}

arr := ReallocMemory(arr, 26);

ShowMessage(PChar(arr)); {ABCDE}

for i := 0to25do arr[i] := Chr(65+i);

ShowMessage(PChar(arr)); {ABCDEFGHIJKLMNOPQRSTUVWXYZ} end;

注意上面这个例子中TArr 类型, 它被定义成一个足够大的数组; 这种数组留出了足够的可能性, 但一般不会全部用到.

我们一般只使用这种数组的指针, 否则一初始化将会内存不足而当机.

即便是使用其指针, 也不能用New 一次行初始化; 应该用GetMem、GetMemory、AllocMem、ReallocMem、ReallocMemory 等用多少申请多少.

需要注意的是, 重新分配内存也可能是越分越少; 如果越分越大应该可以保证以前数据的存在.

这在VCL 中TList 类用到的理念.

如果你在心里上接受不了那么大一个数组(其实没事, 一个指针才多大? 我们只使用其指针), 也可以这样:

type

TArr = array[0..0] of Char;

PArr = ^TArr;

var

arr: PArr;

i: Integer;

begin

arr := GetMemory(5);

for i := 0to4do arr[i] := Chr(65+i);

ShowMessage(PChar(arr)); {ABCDE}

arr := ReallocMemory(arr, 26);

ShowMessage(PChar(arr)); {ABCDE}

for i := 0to25do arr[i] := Chr(65+i);

ShowMessage(PChar(arr)); {ABCDEFGHIJKLMNOPQRSTUVWXYZ} end;

这好像又让人费解, 只有一个元素的数组能干什么?

应该这样理解: 仅仅这一个元素就足够指示数据的起始点和数据元素的大小和规律了.

另外的SysGetMem、SysFreeMem、SysAllocMem、SysReallocMem 四个函数, 应该是上面这些函数的底层实现, 在使用Delphi 默认内存管理器的情况下, 我们还是不要直接使用它们.

使用结构或结构数组, 一般是不需要主动分配内存的, 譬如:

var

pts: TPoint;

begin

pts.X := 1;

pts.Y := 2;

ShowMessageFmt('%d,%d', [pts.X, pts.Y]); {1,2}

end;

//结构数组:

var

Arr: array[0..2] of TPoint;

i: Integer;

begin

for i := 0to Length(Arr) - 1do

begin

Arr[i].X := i;

Arr[i].Y := Trunc(Sqr(i));

end;

ShowMessageFmt('%d,%d', [Arr[High(Arr)].X,

Arr[High(Arr)].Y]); {2,4}

end;

但在很多时候, 一些参数是结构指针; 特别是在接受数据时, 一般需要手动分配内存. 如果只使用一个单结构指针, 用New 分配内存是最合适的, 譬如:

var

p: PPoint; {这是点结构 TPoint 的指针, 系统早定义好的}

begin

New(p);

// p^.X := 1; p^.Y := 2; {或者写成下面这样}

p.X := 1; p.Y := 2;

ShowMessageFmt('%d,%d', [p.X, p.Y]);

Dispose(p);

end;

更多时候, 我们需要给一个结构指针分配更多容量; GetMem 可以很容易地完成这个任务, 关键是如何访问. 譬如:

var

p: PPoint;

begin

p := GetMemory(4 * SizeOf(TPoint)); {分配能容纳 4 个 TPoint

结构的内存}

{下面的代码访问了第一个结构, 其他 3 个怎么访问呢?}

p.X := 1; p.Y := 11;

ShowMessageFmt('%d,%d', [p.X, p.Y]); {1,11}

FreeMemory(p);

end;

//访问给结构指针分配的其他元素:

var

p: PPoint;

buf: array[0..255] of Char;

begin

p := GetMemory(4 * SizeOf(TPoint)); {分配能容纳 4 个 TPoint

结构的内存}

p.X := 1; p.Y := 11;

Inc(p); {指向第二个结构}

p.X := 2; p.Y := 22;

Inc(p); {指向第三个结构}

p.X := 3; p.Y := 33;

Inc(p); {指向第四个结构}

p.X := 4; p.Y := 44;

{既然用了 Inc, 那么在释放或使用前, 必须把指针退回到起始点!}

Dec(p, 3);

{读出看看; 注意这里的 wvsprintf 也是格式化函数, 有时它更方便}

wvsprintf(buf, '%d,%d; %d,%d; %d,%d; %d,%d', PChar(p)); ShowMessage(buf); {1,11; 2,22; 3,33; 4,44}

FreeMemory(p);

end;

如上的操作简直太残忍了, 幸亏数据少; 其实这种情况应该用数组, 这里提供一种更巧妙

的办法- 转换(为数组类型):

var

p: PPoint;

i: Integer;

buf: array[0..255] of Char;

type

ArrPoint = array of TPoint; {用于转换的自定义类型}

begin

p := GetMemory(4 * SizeOf(TPoint));

for i := 0to3do

begin

ArrPoint(p)[i].X := i;

ArrPoint(p)[i].Y := i * i;

end;

wvsprintf(buf, '%d,%d; %d,%d; %d,%d; %d,%d', PChar(p)); ShowMessage(buf); {0,0; 1,1; 2,4; 3,9}

FreeMemory(p);

end;

FillMemory、ZeroMemory 一目了然的两个函数, 但其实它们都是调用了FillChar;

清空不过就是填充空字符(#0: 编号为0 的字符), 说来说去是一回事.

为了下面的测试, 先写一个以十六进制方式查看内存的函数:

function GetMemBytes(var X; size: Integer): string;

var

pb: PByte;

i: Integer;

begin

pb := PByte(X);

for i := 0to size - 1do

begin

Result := Result + IntToHex(pb^, 2) + #32;

Inc(pb);

end;

end; {GetMemBytes end}

//测试:

var

p1: PAnsiChar;

p2: PWideChar;

s1: AnsiString;

s2: UnicodeString;

begin

p1 := 'ABCD';

p2 := 'ABCD';

s1 := 'ABCD';

s2 := 'ABCD';

ShowMessage(GetMemBytes(p1,4)); {41 42 43 44}

ShowMessage(GetMemBytes(p2,8)); {41 00 42 00 43 00 44 00} ShowMessage(GetMemBytes(s1,4)); {41 42 43 44}

ShowMessage(GetMemBytes(s2,8)); {41 00 42 00 43 00 44 00} end;

测试FillMemory、ZeroMemory、FillChar 三个填充函数:

const

num = 10;

var

p: PChar;

begin

p := StrAlloc(num);

ShowMessage(GetMemBytes(p, num)); {从结果看出 StrAlloc 没有初始化内存}

FillMemory(p, num, Byte('A'));

ShowMessage(GetMemBytes(p, num)); {41 41 41 41 41 41 41 41 41 41}

ZeroMemory(p, num);

ShowMessage(GetMemBytes(p, num)); {00 00 00 00 00 00 00 00 00 00}

FillChar(p^, num, 'B');

ShowMessage(GetMemBytes(p, num)); {42 42 42 42 42 42 42 42 42 42}

StrDispose(p);

end;

此时, 我想到一个问题:

GetMem 和GetMemory 没有初始化内存; AllocMem 会初始化内存为空, 那么ReallocMem、ReallocMemory 会不会初始化内存?

测试一下(结果是没有初始化):

{测试1}

var

p: Pointer;

begin

p := GetMemory(3);

ShowMessage(GetMemBytes(p, 3));

ReallocMem(p, 10);

ShowMessage(GetMemBytes(p, 10)); {没有初始化}

FreeMemory(p);

end;

{测试2}

var

p: Pointer;

begin

p := AllocMem(3);

ShowMessage(GetMemBytes(p, 3));

ReallocMem(p, 10);

ShowMessage(GetMemBytes(p, 10)); {没有初始化}

FreeMemory(p);

end;

另外: FillMemory、ZeroMemory 的操作对象是指针, 而FillChar 的操作对象则是实体.

MoveMemory、CopyMemory 的功能是一模一样的, 都是复制内存, 都是调用Move 过程;

MoveMemory、CopyMemory 操作指针; Move 操作实体.

还要注意, 它们的参数位置不一样!

举例:

{例1}

var

buf1,buf2: array[0..9] of AnsiChar; begin

buf1 := '0123456789';

buf2 := 'abcdefghij';

Move(buf2[2], buf1[4], 5);

ShowMessage(buf1); {0123cdefg9}

ShowMessage(buf2); {abcdefghij} end;

{例2}

var

buf1,buf2: array[0..9] of AnsiChar; begin

buf1 := '0123456789';

buf2 := 'abcdefghij';

CopyMemory(@buf2[2], @buf1[4], 5);

ShowMessage(buf1); {0123456789}

ShowMessage(buf2); {ab45678hij} end;

{例3}

var

s1,s2: TStringStream; {两个字符串流} begin

s1 := TStringStream.Create;

s2 := TStringStream.Create;

{向第一个字符串流写入}

s1.WriteString('万一的 Delphi 博客');

ShowMessage(s1.DataString); {万一的 Delphi 博客}

{设置第二个字符串流的大小}

s2.SetSize(6);

{从第一个流复制到第二个流}

CopyMemory(s2.Memory, s1.Memory, s2.Size);

ShowMessage(s2.DataString); {万一的}

s1.Free;

s2.Free;

end;

这里仅仅是为了测试, 如果真的使用TMemoryStream、TStringStream 等流类, 它们自身提供的复制操作更方便.

Delphi 为我们提供了三个方便的函数:

GlobalAllocPtr {简化自 API 的 GlobalAlloc}

GlobalReAllocPtr {简化自 API 的 GlobalReAlloc}

GlobalFreePtr {简化自 API 的 GlobalFree}

读写本程序以外的数据时可以使用它们, 很方便, 譬如:

p := GlobalAllocPtr(0, Len); {分配}

p := GlobalReAllocPtr(p, Len, 0); {重分配}

GlobalFreePtr(p); {释放}

注意GlobalAllocPtr 的第一个参数和GlobalReAllocPtr 的最后一个参数, 上面给的都

是0;

这两个参数的意义是一样的, 规范一点应该写成GMEM_FIXED (表示分配固定内存), 常用的参数还有:

GMEM_MOVEABLE {分配可移动内存}

GMEM_ZEROINIT {同时清空内存}

GHND {分配可移动内存同时清空}

GPTR {分配固定内存同时清空}

参数还有很多, 和相应的API 函数的参数是一致的.

下面的例子并没有使用进程以外的对象, 可以把Memo1.Handle 换做外部的其他文本容器(譬如记事本)试一试:

代码文件:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Memo1: TMemo;

Button1: TButton;

Button2: TButton;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var

p: Pointer;

Len: Integer;

begin

Len := 6+1; {假如想要读出 6 个字符, 要留出结束的空字符}

p := GlobalAllocPtr(0, Len*2); {分配内存 Len*2 是针对双字节字符}

SendMessage(Memo1.Handle, WM_GETTEXT, Len, Cardinal(p)); ShowMessage(PChar(p)); {CodeGe}

GlobalFreePtr(p);

end;

procedure TForm1.Button2Click(Sender: TObject);

var

p: Pointer;

Len: Integer;

begin

Len := 6+1; {假如想要读出 6 个字符, 要流出结束的空字符}

p := GlobalAllocPtr(0, Len*2); {分配内存 Len*2 是针对双字节字符}

SendMessage(Memo1.Handle, WM_GETTEXT, Len, Cardinal(p)); ShowMessage(PChar(p)); {CodeGe}

{在上一例的基础上继续, 先获取实际长度}

Len := SendMessage(Memo1.Handle, WM_GETTEXTLENGTH, 0, 0); Len := (Len + 1) * 2;

p := GlobalReAllocPtr(p, Len, GHND); {重新分配内存}

SendMessage(Memo1.Handle, WM_GETTEXT, Len, Cardinal(p));

excel表格的各函数常用函数

excel表格的各函数的基本操作 常用函数如下: 1、SUM()求和、总分函数 例:=SUM(B2:B5) 2、A VERAGE()求平均函数 例:=A VERAGE(B2:B5) 3、MIN()求最小值函数 例:=MIN(B2:B5) 4、MAX()求最大值函数 例:=MAX(B2:B5) 5、COUNTIF()求条件统计函数( 例:=COUNTIF(B7:B33,“>=90”) 6、COUNT()求统计函数 例:=COUNT(B7:B33) 7、IF()求逻辑函数 例:=IF(G7>=90,“优秀”,IF(G7>=80,“良好”,IF(G7)>=70,“中等”,IF(AND(G7<70,G7>0),“差生”,“没参考”)))) 8、RANK()求名次函数 例:=RANK(G7,$G$7:$G$33) 9、NOW()求电脑现在日期 例:=NOW() 10、求“性别”函数 例:=IF(MOD(MID(B6,15,1),2)=0,"女","男") 11、求“出生日期”函数 例:=CONCATENA TE(MID(B6,7,2),"-",MID(B6,9,2),"-",MID(B6,11,2)) 12、求“年龄”、“工龄”函数 例:=DATEDIF(E6,NOW(),"Y") 13、求“等级”函数 例:=IF(C6="基础班","入门级",IF(OR(C6="AUTOCAD班",C6="PHOTOSHOP",C6="CORELDRAW"),"平面设计级",IF(C6="综合班","综合办公应用级",IF(C6="OFFICE套班","办公应用级","网络设计级")))) 14、SUNIF()条件求和函数(根据指定的条件求和) 例:=SUMIF(B7:B33,">=100") 例:=SUMIF(C7:C36,"=人事",D7:D36)

04 FunCode C 开发常用API

FunCode C开发常用API C语言标准库函数 在实验中,我们需要用到一些C语言标准库函数,主要用于字符串处理,获得随机值,处理数学函数等。 Math.h 函数原型功能与返回值参数说明与应用举例 public static double atan2( double y, double x );返回两点之间的正 切值 x:点的x坐标 y:点的y坐标 float ftan = atan2((fMouseY-fY),(fMouseX-fX)); float sqrt( float x ); 功能:计算平方根 返回值:x的平方根 sqrt(9) = 3 Stdio.h 函数原型功能与返回值参数说明与应用举例 int sprintf( char *buffer, const char *format, [ argument] … ); 把格式化的数据写 入某个字符串缓冲 区。 返回值:字符串长 度(strlen) buffer:char型指针,指向将要写入的 字符串的缓冲区。 format:char型指针,指向的内存里面 存放的将要格式字符串。 [argument]...:可选参数,可以是任何类 型的数据。 sprintf(szUfoName,"ufo_%d_%d", iLoop, iTotalUfoCount ); String.h 函数原型功能与返回值参数说明与应用举例 extern char *strstr( char *str1, char *str2 );找出str2字符串 在str1字符串中 第一次出现的位置 (不包括str2的 串结束符)。 返回值:返回该位 置的指针,如找不 到,返回空指针。 strstr(szName, “feichong”) != NULL 说明szName中包含feichong 可以用来判断前一个字符串包含后面 一个字符串 extern int strcmp( const char *s1, const char * s2 );比较字符串s1和 s2。 当s1

Delphi函数清单

[标准函数和过程] 首部 procedure Abort;$[SysUtils 功能引起放弃的意外处理。 说明不显示任何错误信息。 首部 function Abs(N: ): ;$[System 功能返回参数N的绝对值。 说明函数结果与参数有相同类型,参数可以是整型也可以是浮点型。 ## Abs(-12) = 12;Abs(-12.03) = 12.03 首部 procedure AddExitProc(Proc: TProcedure);$[SysUtils 功能将旧版本某一过程添加到当前版本运行的库的结束过程表中。 说明只能向下兼容,不能用在当前使用版本的 首部 function Addr(X): Pointer;$[System 功能返回指定对象的内存地址。 说明地址运算符 @ 可以产生与Addr相同的结果。 首部 procedure AddTerminateProc(TermProc: TTerminateProc);$[SysUtils 功能将一过程添加到运行时库的终止过程表中。 说明 Delphi 在程序结束时将终止该程序的全部进程,可以终止的进程都放在终止过程表中,程序通过结束终止过程表所有的进程来实现终止全部进程的目的。 首部 function AdjustLineBreaks(const S: string): string;$[SysUtils 功能将给定字符串的行分隔符调整为Cr/Lf序列。 说明 首部 function AllocMem(Size: Cardinal): Pointer;$[SysUtils 功能在堆栈上分配给定大小为 Size字节的块,即在内存里开辟Size 大小的空间。 说明 Cardinal 0..4294967295 32位无符号整数 首部 function AnsiCompareFileName(const S1, S2: string): Integer;$[SysUtils 功能比较两个文件名的大小。不区分大小写。 说明条件返回值 S1 > S2 | > 0 S1 < S2 | < 0 S1 = S2 | = 0 首部 function AnsiCompareStr(const S1, S2: string): Integer;$[SysUtils 功能比较两个字符串的大小。要区分大小写。 说明参见AnsiCompareFileName。 首部 function AnsiCompareText(const S1, S2: string): Integer;$[SysUtils 功能返回两个字符串是否相同的状态。不区分大小写。 说明参见AnsiCompareFileName。 首部 function AnsiExtractQuotedStr(var Src: PChar; Quote: Char):string;$[SysUtils 功能将引用字串转换成结束引语返回。 说明函数支持多字节字符系统[MBCS]。 首部 function AnsiLastChar(const S: string): PChar;$[SysUtils 功能取参数S的最后一个字符,并转换成以null结束的字符串指针返回。 说明 ##AnsiLastChar(‘Sysoft’) = {‘t\0’}; 首部 function AnsiLowerCase(const S: string): string;$[SysUtils 功能将字符串S转换为小写返回。 说明函数支持多字节字符系统[MBCS]。 首部 function AnsiLowerCaseFileName(const S: string): string;$[SysUtils 功能将文件名S转换成小写返回 说明函数支持多字节字符系统[MBCS]。 首部 function AnsiPos(const Substr, S: string): Integer; $[SysUtils 功能返回子串Substr出现在主串S中的第一个位置。 说明 首部 function AnsiQuotedStr(const S: string; Quote: Char): string; $[SysUtils 功能返回引用字串的译文 说明 首部 function AnsiStrComp(S1, S2: PChar): Integer; $[SysUtils 功能比较两个指针字符串的大小。要区分大小写。 说明参见AnsiCompareFileName。

Delphi如何使用基本的绘图函数绘制统计图

一个windows自带的画图工具是无论如何也不能满足我们的画图需要的,很多效果都需要我们在另外的工具中来实现。这些高级的功能是如何实现的呢,如何操纵一些基本的属性和函数,让它们最终能作出我们想要的效果呢?这里我们以绘制统计图来说明这些问题。 解决思路―― 这里,我们暂且先撇开具体的问题,综合地一下讨论画图的问题。 画图工具是基本元素的具体实现,对于我们初学者来说,还是有很好的参考价值的,在delphi 5中有一个自带的工程例子“……Borland\Delphi5\Demos\Doc\Graphex”,这个例子可以实现一些基本的绘图功能。对这个例子多加修改,一定会有所收获的。这里就不列出它的详细代码了,有心的读者可以自己找到这个例子。我这里只是想综合地讨论这方面的问题。使用DELPHI编写绘图软件的灵魂就在于操作画布,画笔和刷子,尽可能地挖掘它们的属性和相关参数的设置。 (一)画布 画布,画笔和刷子之间的关系很明了.其实,画笔和刷子都是画布的一个属性.而画布也只是TForm,TImage,TShape等组件对象的一个属性,专门负责与图象相关的信息打交道.它的主要作用可以概括如下几点: 1.指定使用画笔,刷子和字体的使用类型; 2.绘制和填充指定形状的线或图形; 3.修饰和改变图象; 画布的主要属性有: Brush--指定填充图形和背景的样式 CanvasOrientation--指定画布的定位类型,有coLeftToRight, coRightToLeft两个属性; ClipRect--指定剪切矩形的边界; CopyMode--指定图形图象的复制模式; Font--指定画布上使用的字体; Handle--为画布指定窗口GDI对象的设备描述表; LockCount--指定画布被别的线程锁定的次数; Pen--指定画布上使用的画笔,具体见下面描述; PenPos--指定画笔当前的位置; Pixels--指定当前剪切矩形的象素颜色; TextFlags--指定字体在画布上的显示方式,有ETO_CLIPPED,ETO_OPAQUE,ETO_RTLREADING,ETO_GL YPH_INDEX,ETO_IGNORELANGUAGE,ETO_NUMERICSLOCALETO_NUMERIC SLATIN等值可选; 画布相关的API函数及其注释如下: Arc--按指定方式画一条弧; BrushCopy--把位图复制到指定的画布的矩形中,用画布刷子颜色替换位图的颜色; Chord--按指定方式画弦; CopyRect--从一个矩形区域复制部分图象到另一个矩形区域; Draw--用指定参数在指定位置画图; DrawFocusRect--按指定焦点风格,通过异或操作来绘制一焦点矩形; Ellipse--按指定参数画一椭圆; FillRect--按指定的刷子填充一矩形; FloodFill--使用当前选定的刷子填充指定设备描述表中的一块区域;

常用MFC和API函数

常用MFC和API函数 索引 CArchive类:用于二进制保存档案 CBitmap类:封装Windows的图形设备接口(GDI)位图 CBrush类:封装图形设备接口(GDI)中的画刷 CButton类:提供Windows按钮控件的功能 CByteArray类:该类支持动态的字节数组 CCmdUI类:该类仅用于ON_UPDATE_COMMAND_UI处理函数中 CColorDialog类:封装标准颜色对话框 CDC类:定义设备环境对象类 CDialog类:所有对话框(模态或非模态)的基类 CDocument类:提供用户定义的文档类的基本功能 CEdit类:是一个用于编辑控件的类 CFile类:该类是基本文件类的基类 CFileDialog类:封装了打开和保存文件的标准对话框 CFindReplaceDialog类:封装了标准查找/替换对话框 CFont类:封装了Windows图形设备接口(GDI)中的字体对象 CFontDialog类:封装了字体选择对话框 CGdiObject类:GDI绘图工具的基类 CIPAddressCtrl类:提供了IP地址控件的功能 CImageList类:管理大小相同的图标或位图集 CMenu类:封装应用程序菜单栏和弹出式菜单 CPen类:封装了Windows图形设备接口(GDI)中的画笔对象 CPoint类:操作CPoint和POINT结构 CRect类:封装了一个矩形区域及相关操作 CRgn类:封装用于操作窗口中的椭圆、多边形或者不规则区域的GDI区域 CSize类:用于表示相对坐标或位置 CSpinButtonCtrl类:旋转控件Spin的控制类 CStatusBar类:状态栏窗口的基类 CString类:处理字符串 CStringList类:支持CString对象的列表 CWinApp类:派生的程序对象的基类 CWnd类:提供所有窗口类的基本函数 API函数 CArchive类:用于二进制保存档案 CArchive::CArchive 建立一个CArchive对象 CArchive(CFile* pFile,UINT nMode,int nBufSize=4096,void* lpBuf=NULL); 参数:pFile 指向CFile对象的指针,这个CFile对象是数据的最终源或目的;nMode是标志,取值为CArchive::load时,从文档中加载数据(要求CFile读许可),取值为CArchive::store时,将数据存入文档(要求CFile写许可);nBufSize 指定内部文件缓冲区的大小(按字节计); lpBuf 指向大小为nBufSize的缓冲区,若未指定,则从局部堆中分配一缓冲区,

delphi自定义函数收集1

本文包含以下自定义函数: 1、Base64编码函数。 2、Base64解码函数。 3、截取汉字子串函数,防止出现半个汉字现象。 4、人民币小写转换为大写函数。 1、Base64编码函数。 //Base64编码函数 function Base64Encode(InputData: string): string; //; Var OutputData: String const Base64TableLength = 64; Base64Table: string[Base64TableLength] = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+*'; Pad = '='; var i: integer; CurrentB, PrevB: byte; c: byte; s: char; InputLength: integer; OutputData: string; FilterDecodeInput: Boolean; function ValueToCharacter(value: byte; var character: char): Boolean; //****************************************************************** // 将一个在0..Base64TableLength-1区间内的值,转换为与Base64编码相对应 // 的字符来表示,如果转换成功则返回True //****************************************************************** begin result := true; if (value > Base64TableLength - 1) then result := false else character := Base64Table[value + 1]; end; begin FilterDecodeInput := true; OutputData := ''; InputLength := Length(InputData); i := 1;

excel函数公式图文说明教程

excel函数公式实例教程 excel教程珍藏版,简单明了,包你学会,欢迎转载! 教程在陆续上传添加中,敬请期待! 1、PERCENTILE函数实例:求百分比数值点 Excel中PERCENTILE函数实例:求百分 比数值点 [日期:2010-08-09] 来源:IT部落窝作者:IT部落窝阅读:8560次[字体:大中小] Excel中PERCENTILE函数的用法是:返回区域中数值的第 K 个百分点的值。 PERCENTILE函数实例:求百分比数值点 下面是IT部落窝某几天的一个流量表,详见下图。现在要统计出90%、80%、70%、60%、50%对应的百分比数值点。我们使用PERCENTILE函数设计公式来求取。 操作步骤如下:

第一步,选中B17单元格,输入公式:=PERCENTILE(C2:C14,0.9),确定,得到90%处的对应的百分比数值点。 第二步,选中B18单元格,输入公式:=PERCENTILE(C2:C14,0.8),确定,得到80%处的对应的百分比数值点。 第三步,选中B19单元格,输入公式:=PERCENTILE(C2:C14,0.7),确定,得到70%处的对应的百分比数值点。 第四步,选中B20单元格,输入公式:=PERCENTILE(C2:C14,0.6),确定,得到60%处的对应的百分比数值点。 第五步,选中B21单元格,输入公式:=PERCENTILE(C2:C14,0.5),确定,得到50%处的对应的百分比数值点。 2、frequency函数实例:统计一组数据出现的次数

frequency函数实例:统计一组数据出 现的次数 [日期:2010-08-06] 来源:IT部落窝作者:IT部落窝阅读:5390次[字体:大中小] 下表中统计了公司员工被投诉的记录。问题是统计出指定的员工编号被投诉的出现次数。 我们使用excel中frequency函数可以实现出现次数统计。frequency函数用于计算数值在某个区域内的出现频率次数,然后返回一个垂直数组。 操作步骤如下: 首先在C列建立需要参与统计投诉出现次数的员工编号,然后选中D5:D8单元格区域,在编辑栏输入公式:=FREQUENCY(B2:B11,C5:C8),然后按下“Ctrl+Shift+Enter”组合键,即可一次性统计出各个编号在B2:B11单元格区域中出现的次数。 3、frequency函数用法介绍 Excel中frequency函数用法介绍 [日期:2010-08-06] 来源:IT部落窝作者:IT部落窝阅读:6622次[字体:大中小]

delphi数学模块函数、过程大全

function ArcCos(const X : Extended) : Extended; overload; function ArcCos(const X : Double) : Double; overload; function ArcCos(const X : Single) : Single; overload; function ArcSin(const X : Extended) : Extended; overload; function ArcSin(const X : Double) : Double; overload; function ArcSin(const X : Single) : Single; overload; function ArcTan2(const Y, X: Extended): Extended; procedure SinCos(const Theta: Extended; var Sin, Cos: Extended) register; function Tan(const X: Extended): Extended; function Cotan(const X: Extended): Extended; { 1 / tan(X), X <> 0 } function Secant(const X: Extended): Extended; { 1 / cos(X) } function Cosecant(const X: Extended): Extended; { 1 / sin(X) } function Hypot(const X, Y: Extended): Extended; { Sqrt(X**2 + Y**2) } function RadToDeg(const Radians: Extended): Extended; inline; { Degrees := Radians * 180 / PI } function RadToGrad(const Radians: Extended): Extended; inline; { Grads := Radians * 200 / PI } function RadToCycle(const Radians: Extended): Extended; inline; { Cycles := Radians / 2PI } function DegToRad(const Degrees: Extended): Extended; inline; { Radians := Degrees * PI / 180} function DegToGrad(const Degrees: Extended): Extended; function DegToCycle(const Degrees: Extended): Extended; function GradToRad(const Grads: Extended): Extended; inline; { Radians := Grads * PI / 200 } function GradToDeg(const Grads: Extended): Extended; function GradToCycle(const Grads: Extended): Extended; function CycleToRad(const Cycles: Extended): Extended; inline; { Radians := Cycles * 2PI } function CycleToDeg(const Cycles: Extended): Extended; function CycleToGrad(const Cycles: Extended): Extended; { Hyperbolic functions and inverses } function Cot(const X: Extended): Extended; inline; { alias for Cotan } function Sec(const X: Extended): Extended; inline; { alias for Secant } function Csc(const X: Extended): Extended; inline; { alias for Cosecant } function Cosh(const X: Extended): Extended; function Sinh(const X: Extended): Extended; function Tanh(const X: Extended): Extended; function CotH(const X: Extended): Extended; inline; function SecH(const X: Extended): Extended; inline; function CscH(const X: Extended): Extended; inline; function ArcCot(const X: Extended): Extended; { IN: X <> 0 } function ArcSec(const X: Extended): Extended; { IN: X <> 0 } function ArcCsc(const X: Extended): Extended; { IN: X <> 0 } function ArcCosh(const X: Extended): Extended; { IN: X >= 1 } function ArcSinh(const X: Extended): Extended;

常用API函数参数

常用API函数参数5 ImmIsIME 函数功能: 判断指定的句柄是否为IME; 函数原型: BOOL ImmIsIME( HKL hKL ); 参数hKL: 待检查的键盘布局句柄; 返回值: 函数调用成功返回1,失败返回0. 速查信息: Windows NT: 要求4.0或更高版本 Windows: 要求Windows 95 或更高. Windows CE:不支持. Header: 声明在imm.h. Import Library: imm32.lib. Windows XP没有自带五笔型输入法,这对五笔型用户而言无疑是个大大的遗憾。网上的五笔型输入法虽然种类很多,也不乏优秀的版本,但一方面有些版本是共享软件需要注册,另一方面也许很多五笔型输入法的老用户最习惯用的还是老牌的“王码五笔型输入法86/98版”。 微软的Office XP软件中包含了这个老牌的五笔型输入法,但如果用户并不使用Office XP中的任何组件,仅仅是为了使用“王码五笔型输入法”而运行Office XP安装程序,就显的有些小题大做了,更不用说是某些零时在外面用公用电脑而又想用五笔型输入法的情况。于是网上出现了很多简化的安装方法,大体上可以分为三个步骤: 拷贝输入法文件(从Of还是9x/ME。示例代码fice XP光盘中或已经安装了“王码五笔型输入法”的电脑中提取) 增加注册表项 重启后通过控制面板添加输入法

整个过程中拷贝输入法文件和增加注册表项可以用批处理和导入注册表文件来简化操作,但必须重启计算机才能在控制面板里添加输入法,这同样让使用者觉得比较烦琐。那么作为一个编程爱好者能不能通过写个小程序来实现在不重新启动计算机的情况下全自动的安装“王码五笔型输入法”呢(也就是即装即用)?答案是肯定的!因为微软的Office XP 安装程序做到了,这就表示微软肯定留有一个专门用来安装输入法的接口,一般来说应该是一系列API函数。 经过一番摸索,笔者在MSDN里找到了这个可以用来安装输入法的API:ImmInstallIME()。Ok,现在我们就开始利用这个API来实现自己的“王码五笔型输入法”全自动安装程序。 一、准备素材 我们先试着从Office XP光盘中提取“王码五笔型输入法”的输入法文件。通过Windows 的查找功能在Office XP的第一张安装盘中查找与“WINWB”相关的文件,在OFFICE1.CAB 中找到了一下14个文件:WINWB86.CHM.*、https://www.wendangku.net/doc/d117240798.html,T.*、WINWB86.HLP.*、WINWB86A.IME.*、WINWB86A.MB.*、WINWB86W.IME.*、WINWB86W.MB.*、WINWB98.CHM.*、https://www.wendangku.net/doc/d117240798.html,T.*、WINWB98.HLP.*、WINWB98A.IME.*、WINWB98A.MB.*、WINWB98W.IME.*、WINWB98W.MB.*,其中*是很长的一串由字母、数字和下滑线组成的序列(个人认为应该是微软为了校验文件内容的正确性而加上的内容为该文件效验码的后缀吧)。去掉这个长长的后缀,可以看到5 种类型的文件。很明显,*.CHM、*.CNT和*.HLP是五笔型输入法的帮助文件,*.MB是码表文件,而*.IME是主要的输入法文件。其中*.IME和*.MB有文件名部分以A结尾和以W结尾两个版本,经过笔者试验证实了它们分别是ANSI和UNICODE两种版本的输入法文件。文件名部分以A结尾的文件适用于Windows 9x,以W结尾的文件适用于NT系列Windows系统。 提取了输入法文件后必须让安装程序针对不同版本的操作系统将它们拷贝到正确的目录,以便调用API来进行输入法安装。笔者分别在安装了Office XP中自带的“王码五笔型输入法”的Windows 98SE和Windows XP操作系统中查找以上文件,发现帮助文件都存放在WINDOWSHELP目录中(这里假设Windows系统都安装在WINDOWS目录)。而主要的输入法文件(*.IME)和码表文件(*.MB)在Windows 9x下存放于WINDOWSSYSTEM目录中,在NT系列Windows系统中存放于WINDOWSSYSTEM32目录中。 二、相关API函数 素材的准备工作已经完成,现在我们来看一下代码编写过程中需要用到的4个主要的API函数。 2.1 GetVersion 函数原型:

DELPHI常用函数说明

一、数据类型转换函数1 在我们编写程序当中,根据不同情况,会使用到多种数据类型。当要对不同的类型进行操作时,必须要将不同的类型转换成同样的类型。因此熟练地掌握数据类型的转换是非常重要的。 1.FloatToStr 功能说明:该函数用于将“浮点型”转换成“字符型”。 参考实例: Edit1.Text := FloatToStr(1.981); 2.IntToStr 功能说明:该函数用于将“整数型”转换成“字符型”。 参考实例: S := IntToStr(10);(注:S为String类型变量。) 3.IntToHex 功能说明:该函数用于将“十进制”转换成“十进制”。该函数有二个参数1。第一个参数为要转换的十进制数据,第二个参数是指定使用多少位来显示十六进制数据。 参考实例: Edit1.Text := IntToHex('100', 2);

执行结果,Edit1.Text等于64。 注意:Delphi没有提供专门的“十六进制”转换为“十进制”的函数。使用StrToInt函数可以实现这个功能。具体代码是:I := StrToInt('S\' + '64'); 这时I等于100。加上一个'S\'即可将“十六进制”转换为“十进制”。 4.StrToInt 功能说明:该函数用于将“字符型”转换成“整数型”。 参考实例: I := StrToInt('100'); 注意:不能转换如StrToInt('ab')或StrToInt('好')这样的类型,因为他们并不存在数字型。 5.StrToFloat 功能说明:该函数用于将“字符型”转换成“浮点型”。 参考实例: N := StrToFloat(Edit1.Text); 注意:Edit1.Text中的内容为1.981(凡在Edit 控件中显示的文本均为字符串)。N为Double类型,用于保存转换后的浮点型数据。

API函数手册

POSTEK PPLⅠAPI函数手册 G Series 条码标签打印机 Version 2.00 深圳市博思得通信发展有限公司 二○○四年

API函数库文件说明 名称:CDFPSK.dll 中文版本编号:1.X.X.X 英文版本编号:2.X.X.X 版权所有:?2004深圳市博思得通信发展有限公司。保留所有权利。 用途 本API函数库为深圳市博思得通信发展有限公司条码标签打印机的用户提供一组命令,为他们编写基于Windows9X,NT,2000,XP等操作系统的应用程序提供便利。 本API函数库仅支持本公司产品。 缩略语对照 PPLⅠ:深圳市博思得通信发展有限公司的第一套打印机编程语言(Printer Porgram Language Ⅰ)。 API:应用程序编程接口(Application Program Interface)。 Dots:像素(pixel)是一种计算机科学技术尺寸单位,原指电视图像成像的最小单位,在打印机领域表示打印机的最小打印成像单位:1dot等于一英寸除以打印机的最大分辨率。 - 对于203DPI的打印机来说, 1dot = 25.4mm/203 = 0.125mm(1dot = 1000 / 203 = 5mil); - 对于300DPI的打印机来说, 1dot = 25.4mm/300 = 0.085mm(1dot = 1000 / 300 = 3mil)。 TrueType Font:是基于Windows操作系统使用,可装卸的字体。 - 已经安装的TrueType Font,都可以被本函数使用。 使用前须知 字符串 * 字符串以双引号(“)作为起始和结束标记; *

Delphi函数大全

Delphi函数大全 首部function Languages: TLanguages; $[ 功能返回系统语言对象 说明通过此函数可以得到系统的语言环境 参考type 例子 12a12c12a12c. 参考 例子:= IsValidIdent; ━━━━━━━━━━━━━━━━━━━━━ 首部function IntToStr(Value: Integer): string; overload; $[ 首部function IntToStr(Value: Int64): string; overload; $[ 功能返回整数Value转换成字符串 说明Format('%d', [Value]) 参考function 例子:= IntToStr; ━━━━━━━━━━━━━━━━━━━━━ 首部function IntToHex(V alue: Integer; Digits: Integer): string; overload; $[ 首部function IntToHex(V alue: Int64; Digits: Integer): string; overload; $[ 功能返回整数Value转换成十六进制表现结果;Format('%.*x', [Digits, Value]) 说明参数Digits指定字符最小宽度;最小宽度不足时将用0填充 参考function 例子:= IntToHex, ; ━━━━━━━━━━━━━━━━━━━━━ 首部function StrToInt(const S: string): Integer; $[ 功能返回字符串S转换成整数 说明字符串非整数表达时将引起异常 参考procedure 例子:= StrToInt; ━━━━━━━━━━━━━━━━━━━━━ 首部function StrToIntDef(const S: string; Default: Integer): Integer; $[ 功能返回字符串S转换成整数 说明字符串非整数表达时则返回默认值Default 参考procedure 例子:= StrToIntDef, 0); ━━━━━━━━━━━━━━━━━━━━━ 首部function TryStrToInt(const S: string; out Value: Integer): Boolean; $[ 功能返回字符串S转换成整数V alue是否成功 说明字符串非整数表达时返回False并且Value将输出为0 参考procedure 例子 ..);打开失败则返回负数 参考function

API函数大全

? 1. API之网络函数 ? ?WNetAddConnection 创建同一个网络资源的永久性连接 ? ?WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseEnum 结束一次枚举操作 WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接 WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接 WNetEnumResource 枚举网络资源 WNetGetConnection 获取本地或已连接的一个资源的网络名称 WNetGetLastError 获取网络错误的扩展错误信息 WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC (统一命名规范)名称 WNetGetUser 获取一个网络资源用以连接的名字 WNetOpenEnum 启动对网络资源进行枚举的过程 ? ? 2. API之消息函数 ?BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置 GetMessageTime 取得消息队列中上一条消息处理完毕时的时间 PostMessage 将一条消息投递到指定窗口的消息队列 PostThreadMessage 将一条消息投递给应用程序 RegisterWindowMessage 获取分配给一个字串标识符的消息编号 ReplyMessage 答复一个消息 SendMessage 调用一个窗口的窗口函数,将一条消息发给那个窗口 SendMessageCallback 将一条消息发给窗口 SendMessageTimeout 向窗口发送一条消息 SendNotifyMessage 向窗口发送一条消息 ? 3. API之文件处理函数 ?CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等 CompareFileTime 对比两个文件的时间 CopyFile 复制文件 CreateDirectory 创建一个新目录 CreateFile 打开和创建文件、管道、邮槽、通信服务、设备以及控制台CreateFileMapping 创建一个新的文件映射对象 DeleteFile 删除指定文件 DeviceIoControl 对设备执行指定的操作

EXCEL公式手册

这个东西其实是公司一个很老的培训资料,内容非常简单,说白了就是把Excel里按F1打开帮助都能找到的东西贴出来而已。这个东西的唯一价值,只是告诉你这些公式你可能会用得到,所以老手就不必看了,也不必喷了。我在原文的基础上添加了AVERAGEIF、AVERAGEIFS、SUMIFS、COUNTIFS和IFERROR函数(适用于2007以上版本)。 Contents Chapter 0:Updates内容更新 0.1 AVERAGEIF 0.2 AVERAGEIFS、SUMIFS、COUNTIFS 0.3 IFERROR Chapter 1:Text Functions文本函数 1.1 Concatenate 1.2 Exact 1.3 Upper 1.4 Lower 1.5 Left 1.6 Right 1.7 Len 1.8 Trim 1.9 Text 1.10 Substitute Chapter 2:LOOKUP查询函数 2.1 HLookup 2.2 VLookup 2.3 Lookup Chapter 3:Date and Time日期与时间函数 3.1 Today 3.2 Year

3.4 Day 3.5 Date 3.6 Time 3.7 Hour 3.8 Minute 3.9 Second Chapter 4:Math数学函数4.1 ABS 4.2 INT 4.3 PRODUCT 4.4 MOD 4.5 Rand 4.6 ROUND 4.7 ROUNDUP 4.8 ROUNDDOWN 4.9 SumIF 4.10 SumProduct 4.11 Trunc Chapter 5:Logical逻辑函数5.1 And 5.2 Not 5.3 Or 5.4 True 5.5 False 5.6 If Chapter 6:Financial财务函数6.1 PMT

《Delphi参考手册》

《Delphi参考手册》 ===========================================================================名称类型说明 --------------------------------------------------------------------------- Abort函数引起放弃的意外处理 Abs函数绝对值函数 AddExitProc函数将一过程添加到运行时库的结束过程表中 Addr函数返回指定对象的地址 AdjustLineBreaks函数将给定字符串的行分隔符调整为CR/LF序列Align属性使控件位于窗口某部分 Alignment属性控件标签的文字位置 AllocMem函数在堆栈上分配给定大小的块 AllowGrayed属性允许一个灰度选择 AnsiCompareStr函数比较字符串(区分大小写)AnsiCompareText函数比较字符串(不区分大小写)AnsiLowerCase函数将字符转换为小写 AnsiUpperCase函数将字符转换为大写 Append函数以附加的方式打开已有的文件 ArcTan函数余切函数 AssignFile函数给文件变量赋一外部文件名 Assigned函数测试函数或过程变量是否为空 AutoSize属性自动控制标签的大小 BackgroundColor属性背景色 BeginThread函数以适当的方式建立用于内存管理的线程BevelInner属性控件方框的内框方式 BevelOuter属性控件方框的外框方式 BevelWidth属性控件方框的外框宽度 BlockRead函数读一个或多个记录到变量中 BlockWrite函数从变量中写一个或多个记录 BorderStyle属性边界类型 BorderWidth属性边界宽度 Break命令终止for、while、repeat循环语句 Brush属性画刷 Caption属性标签文字的内容 ChangeFileExt函数改变文件的后缀 ChDir函数改变当前目录 Checked属性确定复选框选中状态 Chr函数返回指定序数的字符 CloseFile命令关闭打开的文件 Color属性标签的颜色 Columns属性显示的列数 CompareStr函数比较字符串(区分大小写) Concat函数合并字符串

(DELPHI)API函数大全

(DELPHI)API函数大全 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConnection3 创建同一个网络资源的连接WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseEnum 结束一次枚举操作 WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接WNetEnumResource 枚举网络资源 WNetGetConnection 获取本地或已连接的一个资源的网络名称WNetGetLastError 获取网络错误的扩展错误信息WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC (统一命名规范)名称 WNetGetUser 获取一个网络资源用以连接的名字 WNetOpenEnum 启动对网络资源进行枚举的过程 2. API之消息函数 BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置GetMessageTime 取得消息队列中上一条消息处理完毕时的时间PostMessage 将一条消息投递到指定窗口的消息队列PostThreadMessage 将一条消息投递给应用程序RegisterWindowMessage 获取分配给一个字串标识符的消息编号ReplyMessage 答复一个消息 SendMessage 调用一个窗口的窗口函数,将一条消息发给那个窗口SendMessageCallback 将一条消息发给窗口 SendMessageTimeout 向窗口发送一条消息 SendNotifyMessage 向窗口发送一条消息 3. API之文件处理函数 CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等 CompareFileTime 对比两个文件的时间 CopyFile 复制文件 CreateDirectory 创建一个新目录 CreateFile 打开和创建文件、管道、邮槽、通信服务、设备以及控制台CreateFileMapping 创建一个新的文件映射对象 DeleteFile 删除指定文件

相关文档