之前用Access作一个应用,但找不到货币转换成大写人民币的功能(当然可以通过excel 转换,但不在一个应用上,放弃)。以为比较简单,自己试写,谁知用了两个晚上,才基本实现,但没有小数点(元)以下货币的转换。也没有兆的判断。而且对字符的合法性也没有检验。今天有时间,将其完善一下。(可能还会有考虑不周的地方)

 思路:

1、判断是否带有小数点的金额,如果是,就找出小数点所在数据。该位字符不进行转换。

2、小数点前的作为整数位,进行转换。整数位的每一位都有表示金额的级别:拾、佰、仟。而且还有万、亿的级别。

3、小数点后的作为角、分、厘处理。

4、如果有连续的零,只显示一个零。如50006,显示为伍万零陆。如果是发生在拾、佰、仟位,该零还要去掉。

 

 

Code
posted @ 2008-09-26 17:44 步三少 阅读(29) | 评论 (3)编辑

在SysUtils中,trimleft()函数是使用copy()函数来实现。
如果采用pointer来实现,可以如下:

function lefttrim(const s:string):string;
var
   p:pchar;
   i,j:Integer;

begin
   p:=PChar(s);
   i:
=1;
   
while (i<=Length(s)) and (s[i]=' 'do
     
begin
       Inc(p);
       Inc(i);
     
end;
    result:
=p;
end;
posted @ 2008-09-19 23:24 步三少 阅读(13) | 评论 (0)编辑

参考SysUtils单元,自己试了一试写一个lowercase函数。

还是delphi里的函数比较高效。

 

function lower(const s:string):string;
var
  i,len:integer;
  P:pchar;
  ch:char;
begin
  len:
=length(s);
  setlength(result,len);
//必须为result声明一个内存空间,否则p^:=ch;将会报错。因为没有存储的地方
  p:
=pchar(result);//很巧的地方,只要指针顺序为每个空间存储新内容就可以。
  
for i:=1 to len do
  
begin
    ch:
=s[i];//如果不引进一个char类型,则无法使用下面的inc(ch,32),只能使用char(ord(s[i])+32);
   
if (ch>='A'and (ch<='Z'then
    inc(ch,
32);
     p^:
=ch;
    inc(p);
  
end;
end;

总结:

不能直接为指针赋值,必须要为其声明一个空间。

可以:p:=stralloc(len);或者setlength(s,len);p:=pointer(s);顺带与一个变量“挂钩”。

 

posted @ 2008-09-18 20:30 步三少 阅读(14) | 评论 (2)编辑
 1 CREATE TRIGGER tri_ChgXJzt ON dbo.xsjb*** 
 2 FOR UPDATE
 3 AS  insert into  UmlChgXj
 4 (xhjm,xm,xjztdm,sfzh,updatetime,sysuser,hostname,opuser,chgMark)
 5 select xhjm,xm,xjztdm,sfzh,current_timestamp,System_USER,HOST_NAME(), 
 6 user_name(),'Before'from deleted
 7  insert into UmlChgXj
 8 (xhjm,xm,xjztdm,sfzh,updatetime,sysuser,hostname,opuser,chgMark)
 9 select xhjm,xm,xjztdm,sfzh,current_timestamp,System_USER,HOST_NAME(), 
10 user_name(),'After' from inserted
11 
12 
posted @ 2008-09-17 19:46 步三少| 编辑

from :http://delphi.about.com/od/fileio/a/fileof_delphi.htm

如果有一个应用想在硬盘上存储一定的信息,而又不想使用paradox等数据库文件,而且不想用textfile等易让其他人读取的文件进行存储,那怎么办?Delphi可以提供typed files 让你解决这个问题。

一、有关files:Delphi里提供了三种类型的Files,分别是typed / text /untyped。

typed可以存储一些有结构的文件,如integer/double/record等。

text可以存储ASCII字符。并以CR/LF (#13#10)为行结束。

untyped可以存储"least impossible"的结构类型信息。

二、使用typed File.

 

type
  TMember 
= record
    Name : 
string[50];
    eMail : 
string[30];
    Posts : LongInt;
end;

var Members : array[1..50of TMember; 
var
  F : 
file of TMember;

向文件中写数据:

var
  F : 
file of TMember;
  i : integer;
begin
 AssignFile(F,
'members.dat') ;
 Rewrite(F) ;
 
try
  
for j:= 1 to 50 do
   Write (F, Members[j]) ;
 
finally
  CloseFile(F) ;
 
end;
end

读为数据:

 

var
  Member: TMember
  F : 
file of TMember;
begin
 AssignFile(F,
'members.dat') ;
 Reset(F) ;
 
try
  
while not Eof(F) do begin
   Read (F, Member) ;
   
{DoSomethingWithMember;}
  
end;
 
finally
  CloseFile(F) ;
 
end;
end

定位至某一记录:

 

Code

 

更新数据:

procedure ChangeEMail(const RecN : integer; const NewEMail : string) ;
var DummyMember : TMember;
begin
 
{assign, open, exception handling block}
 Seek(F, RecN) ;
 Read(F, DummyMember) ;
 DummyMember.Email :
= NewEMail;
 
{read moves to the next record, we have to
 go back to the original record, then write
}
 Seek(F, RecN) ;
 Write(F, DummyMember) ;
 
{close file}
end;

 

posted @ 2008-09-16 11:57 步三少| 编辑

http://www.cnblogs.com/safezone/articles/1260836.html

 1 function GetComputerNameX: string;
 2 var
 3   i: Cardinal;
 4   cBuff: PChar;
 5 begin
 6   GetMem(cBuff, 128);
 7   i := 128;
 8   GetComputerName(cBuff, i);
 9   Result := StrPas(cBuff);
10 end;
posted @ 2008-09-14 14:00 步三少| 编辑

http://edysoftware.com/word/

http://edysoftware.com/word/source/2008/08/14/delphi-simple-encrypt-and-decrypt.html#more-34

function Decrypt(const S: String): String;
var
I: byte;
t:
string;
begin
for I := 1 to Length(S)div 2 do begin
t:
=t+chr(ord(s[i])-64);
end;
result:
=t;
end;

 

 

function Encrypt(const S: String): String;
Var
I: byte;
t:
string;
begin
for I := 1 to Length(S) do begin
t:
=t+chr(ord(s[i])+64);
end;
result:
=t+t;
end;
posted @ 2008-09-13 15:45 步三少| 编辑

近来在学习字符串的一些操作,对字符串有些认识:

1、字符串在使用时才动态分配的。

2、程序在声明字符串变量时,实际分配的是32位的内存空间的一个指针。该指针指向存储实际字符串的内存地址。当字符串为空时,其指针值为nil。

所以  str:='Borland Delphi';

       sizeof(str);返回的结果将是4,而不是字符串的长度。

3、字符串的内容的内存在堆中分配。(但如果是如str:=Form1.Caption常量,则是在栈中分配)

4、不同的字符串变量,如果是存储一样的内容,则内存中只存储一份内容。字符串变量的地址是一样的,采用引用计数技术。只有改变字符串内容时,才采用copy-on -write技术,分配另一内存进行存储。

5、字符串与一维字符数组很相似。但区别在于字符串的下标是以str[1]开始,而且str[0]是不可访问的。并且以#0结尾。

 

 1procedure TForm2.Button1Click(Sender: TObject);
 2var
 3  a,b,c:string;
 4  p:Pint;
 5  q:Pchar;
 6begin
 7  memo1.Clear;
 8  with memo1.Lines do
 9  begin
10    a:='Delphi';
11    b:='Delphi';
12    c:=a;
13    p:=@a;
14    q:=@a[1];//不能使用q:=@a[0];
15     Add('a''s address:   '+inttostr(integer(@a)));
16     Add('b''s address:   '+inttostr(integer(@b)));
17     Add('c''s address:   '+inttostr(integer(@c)));
18     Add('In a:   '+inttostr(integer(a)));
19     Add('In b:    '+inttostr(integer(b)));
20     Add('In c:    '+inttostr(integer(c)));
21      Add('sizeof a:    '+inttostr(sizeof(a)));
22      add('a''s adress'+inttostr(integer(p)));
23    while q^<>#0 do
24     begin
25      add(q^+'  ;address'+inttostr(integer(q)));
26      inc(q);
27     end;
28  end;//with lines
29end;
30

执行的结果如下:

一个很奇怪的结果是字符串a与b,c的地址竟然不同。如果将q=@a[1];这一语句去掉,则 a,b,c地址是一致的。为什么会改变呢?而且地址是低位的地址(已经不是'Delphi'的地址了)。难道在q=@a[1]时,复制了一份到另一内存空间?如果有哪位大侠知道,请教小弟一声。

从字符指针,查询每个字符的地址可以看到,Delphi2009 的char是unicode的,每个字符占2个字节。

b c 地址一致,是因为他们都指向'Delphi'字符串的堆地址。

posted @ 2008-09-12 23:44 步三少 阅读(19) | 评论 (0)编辑

from http://tech.sina.com.cn/soft/2000-09-27/775.html

第一种方法是利用Time()函数获得当前系统时间,返回结果是TDateTime结构类型的变量。

可以使用:TimeToStr将时间改为字符型。该函数不能用于返回“日期”。
  单独用于返回日期的系统函数是Date。
  那么有什么是既可返回正确的“时分秒”又可返回正确的“年月日”呢? 可以用Now函数,例如:

 

var
  sTime:TDateTime;
  sday:TDatetime;
  mytime:TDateTime;
begin
  sTime:
=Time();
  sday:
=Date ;
  mytime:
=Now;
 
// Caption:=DateToStr(sday)+' '+TimeToStr(sTime);  

  Caption:=DateToStr(mytime)+' '+TimeToStr(mytime);
end;

 

二是使用函数:DecodeDate(Date,wYear,wMonth,wDay);//wYear等为word类型

三、使用API函数GetSystemTime

  用Now返回的日期格式中年只有2位,即2000年显示为00, 这似乎不太令人满意. 此外Now和Time都只能获得精确到秒的时间,为了得到更精确的毫秒级时间,可以使用API函数GetSystemTime,它对应的TSystemTime类型的定义为:
  TSystemTime = record
  wYear: Word;
   wMonth: Word;
  wDayOfWeek: Word;
  wDay: Word;
  wHour: Word;
  wMinute: Word;
  wSecond: Word;
  wMilliseconds: Word;
  end;
  显然,在程序逻辑中还能够方便地使用其结构成?时---各类时间值,因此使用函数GetSystemTime具有很大优越性。但该书中该函数的用法是错误的,通过查阅Windows SDK帮助可知,该函数原型为:
  VOID GetSystemTime(LPSYSTEMTIME lpst),参数指针lpst获取系统时间,因此可如以下程序段实现:
  procedure TForm1.Button3Click(Sender: TObject);
  var
  SysTime: TsystemTime;
  begin
  GetSystemTime(SysTime);
  Caption:=IntToStr(SysTime.wYear)+' '+IntToStr(SysTime.wMonth);
  //if SysTime.wYear>2000 then
  // ......在程序逻辑中利用获取的各类时间值
  end;
  综合以上讨论,获取当前系统时间利用函数GetSystemTime比较方便而且灵活。

posted @ 2008-08-27 09:31 步三少| 编辑

一、使用FileStream

例1、

Code

      qFileStream.Seek(0,   sofromEnd);   
      Buffer   :
=   'I   here   add   a   string';//写入文件的字符串   
      qFileStream.Write(Buffer[
1],   Length(Buffer));//缓冲区首址   AND   写入个数。   
      
//qFileStream.Write(Pchar(Buffer)^,   Length(Buffer));这样也行   
      qFileStream.Free;
//别忘了释放   
  
end;   
    
  
//read   
  
var   
      qFileStream:   TFileStream;   
      buffer:   
string;   
      qFileSize:   Integer;   
  
begin   
      qFileStream   :
=   TFileStream.Create('Test.txt',   fmOpenRead);   
      qFileSize   :
=   qFileStream.Seek(0,   sofromEnd);   
      SetLength(Buffer,   qFileSize);
//设置你要读的字符个数。   
      qFileStream.Seek(
0,   SoFromBeginning);   
      qFileStream.Read(Pchar(Buffer)^,   qFileSize);   
      qFileStream.Free;   
      Memo1.Text   :
=   Buffer;   
  
end;   

 

例子2、

 

Procedure FileCopy( Const sourcefilename, targetfilename: String ); 
Var 
  S, T: TFileStream; 
Begin 
  S :
= TFileStream.Create( sourcefilename, fmOpenRead ); 
try 
  T :
= TFileStream.Create( targetfilename,fmOpenWrite or fmCreate ); 
 
try 
  T.CopyFrom(S, S.Size ) ; 
 
finally 
  T.Free; 
  
end
finally 
  S.Free; 
  
end
End; 

 

 

 

二、使用TextFile

 1.文件变量与文件名关联: 
AssignFile(VarTxt, FileName);
FileName 如果省略路径将默认当前目录。

2.初始化读写有三种方式:
(1) Reset: 只读打开, 指针移到文件头;
(2) Rewrite: 创建新文件并打开, 只写;
(3) Append: 从尾部追加, 指针当然在文件尾。
文件不存在时使用 Reset 或 Append 会引发一个I/O异常。

最后用 CloseFile 关闭文件。  

    ①读取文件内容。在以读的方式打开文件后,可以使用read和readln语句来读取文件内容,其声明代码格式分别为: 
   read和readln的区别为后者在读取数据后,将文件指针移至下一行,上次读取的数据与回车符之间的数据被忽略。
    当读取字符串时,必须用readln过程,否则读完一行数据后,再使用read读取字符串将得到空串。

    当读取整型和实型数据时,文件中的数据用空格分隔,且必须符合数据格式,否则将产生I/O错误。
    在读取文件时,还必须判断文件指针是否已到文件尾部,此时可以用Eof函数进行判断,其声明代码如下:
    function Eof(f):Boolean;
    当文件指针指到尾部时,该函数返回值为true。
    ②向文件写入数据。以写的方式打开文件后,即可向其中写入数据,写人数据使用write和 
      writeln(f,text)
   (4)使用文件变量关闭文件 
      CloseFile(f);
    关闭文件后,系统释放打开文件时使用的资源。特别是写文件时,在调用write和writeln过程时,数据先写入内存缓冲区,只有在缓冲区满或关闭文件时,才把数据真正写入磁盘文件中,因此写完数据后不关闭文件可能丢失数据。

 写文件:


procedure TfrmZcgl.AddToFile(filename, content: string);
var
  strtime:
string;
  textf:TextFile;
begin
  strtime:
=DateToStr(now)+' '+timetostr(now);
  AssignFile(textf,filename);
  
if not FileExists(filename) then
     
begin
      ShowMessage(PChar(filename
+'不存在,创建新文件'));
      Rewrite(textf);
     
end;
  Append(textf);
  writeln(textf,content
+ '        '+strtime);
  CloseFile(textf);

end;

 

 读文件:

 

procedure ReadFile(Sender: TObject);  //读文件
var rText: TextFile;
    tmp:String;
begin
  richedit2.Clear;
//清除原来的内容
  AssignFile(rText, 
'ip.txt');
  reset(rText);
  
while not EOF(rText) do
  
begin
    readln(rText,tmp);
    richedit2.Lines.Add(tmp);
  
end;
  closefile(rText);
end

 

  

posted @ 2008-08-26 23:14 步三少 阅读(174) | 评论 (1)编辑