delphi总结

来源:互联网 发布:金万维linux 编辑:程序博客网 时间:2024/05/16 11:05

写在前面,以后要天天写blog,记录好的想法和学到的知识,写的同时为了记和思考,也方便以后的回忆和使用,记录了自己时间的花费,让自己趋向于充实。坚持每天要写一篇收获,并分类组织,促使自己有序化。一天可以写多次,可在正文后面加评论补充,也方便同一知识的归类。从今天起改变,我一定要养成每天记日记习惯。

1.delphi动态数组使用:动态数组与结构体指针链表一直是我在delphi中怕用的东西,问刘才发现原来我一直犹豫着不用是因为自己根本就不会用,没有弄清楚想明白基本概念,及时总结验证自己的知识,突然发现自己这块基础知识很差。定义:MyArray=array of DateType定义了一种数组类型,如果array[1...max]则表示静态数组,它的下标范围是定义的任意有序序列如10~N,或a~z等,而动态数组下标范围为0~Count-1,一般动态数组在分配空间时元素个数是确定的N,所以要得到数组元素数就要用这个N内存分配与回收:动态数组分配内存一定要用SetLength(IFrameNodeArray,IFrameHeader.iFrame_Num);1为数组变量名,参2为元素个数(非字节数)释放空间SetLength(InqFileIdxArray,0)。对比结构体指针的内存分配回收pVideoFile := GetMemory(SizeOf(TVideoFileInfo));参数为分配内存的字节数;对应释放FreeMemory(PVideoFileInfo(VideoFileList.Items[i]));或者分配:GetMem(CallBackInfo, SizeOf(TCallBackInfo));,对应freemem。一般情况下尽可能使用结构体变量,要返回指针时可对变量取地址,Result:= @IFrameHeader;而要使用多个结构体变量list时才需要使用指针,分配内存,然后list.add。注意string变量的用法,在结构体中的string需要定义长度

TVideoFileInfo =packed record

    FileName: string[255];

    FileSize: Int64;

  end;否则极易引起内存泄漏。我做的播放器停止播放视频再次打开视频放到第四个文件就报错就因为这个原因

另外delphi记录定义时加上packed关键字可避免操作系统的字节对齐。做播放器时从vob0中文件头读取文件名的方法,因为文件名定义为36bytes,所以要先定义一个fileNamearray[0..35]of char ;然后file.read(fileName,36),最后将name:string)=fileName才真正得到文件的名称,如果直接在read中用string型的name,由于多余字符名字错误。

2.TFileStream:文件流很好用。创建VOBFile := TFileStream.Create(FilePath +'VTS_01_0.VOB', fmOpenRead);如果文件不存在会被其它程序独占使用会失败报错,要新建文件需

 tmpFile := TFileStream.Create(FInqFilePath +FileIdxName, FmCreate);

读写: VOBFile.Read(IFrameHeader, SizeOf(TINQUEST_IFRAME_HEADER));注意参1定义为var buffer,所以必须要传入变量,如果是结构体指针要解引用,动态数组要引用第一个元素,否则因若误传入地址的地址而读数据错误。

VOBFile.Read(IFrameNodeArray[0],IFrameHeader.iFrame_Num * SizeOf(TINQUEST_IFRAME_NODE));

两个文件流之间传送数据

 tmpFile := TFileStream.Create(FAttachmentpath+ FileIdxName, FmCreate);

 tmpFile.CopyFrom(VOBFile,InqFileIdxArray[i].fileLen);

释放文件流对象

 if VOBFile <> nil then

    FreeAndNil(VOBFile);

3.TIniFile方便的记录一些信息,创建:IniFile :=TEncryptIni.Create(FProgramDir + FIniFileName);ConfigIni:= TIniFile.Create(ExtractFilePath(GetApplicationExeName) + 'meraCD.ini');

然后类似可以读取和写入datatimeintegerstring等类型,最后FreeAndNilconfigIni

FInquestName :=IniFile.ReadString('InquestInfo', 'InquestName', '');

FSuspectNo :=IniFile.ReadInteger('InquestInfo', 'SuspectNo', 0);

最后FreeAndNilconfigIni)。

原创粉丝点击