`
xfei6868
  • 浏览: 69817 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

要在读取文件的时候给个进度条

阅读更多

    “要在读取文件的时候添加一个进度条”,在老板看到我做的东西有麽样了以后,一个新的任务就来了。添加进度条的理由是让人在导入的时候能感觉到导入的进度,这样就不容易让使用者感觉不到什么时候完成,什么时候没有完成。
    想想这个功能的确很有用,恩!这个要做,做了感觉上就不一样了。哈哈!这时候突然发现自己的文件读取的地方就根本不在一个单独的类里,于是要把文件的读取专门的提取出来,这样才能让结构更清晰,更合理些。
    经过自己的一整天的努力,终于写成了这样一个文件的读取单元。



unit Unit_DXF_FileRead;

interface

uses
    SysUtils, StrUtils, ComCtrls;

type
    TDXF_FileRead = class
    private
        //文件
        F: Text;
        ReadedFileSize: Integer;
        wordLn1, wordLn2: String;
        Progress: TProgressBar;
        //获取本次读取的dxf 的组码
        function GetCode(): String;
        //获取本次读取的 dxf 的内容
        function GetCont(): String;
        //获取文件的大小
        function GetFileSize(const FileName: String): LongInt;

    public
        //参数分别是  filePath : 传入的文件全路径,  ImportProgressBar: 界面显示进度条。
        constructor Create(filePath: String; ImportProgressBar: TProgressBar);
        destructor Destroy; override;

        //每次读取两行,分别为dxf的组码和内容
        procedure ReadCodeAndCont();
        
        property ReadCode: String read GetCode;
        property ReadCont: String read GetCont;

    end;

implementation

constructor TDXF_FileRead.Create(filePath: String; ImportProgressBar: TProgressBar);
begin
    Progress := ImportProgressBar;
    Progress.Max := GetFileSize(filePath);

    AssignFile(F, filePath);
    Reset(F);

    if (Progress.Max > 20) then
    begin
        Progress.Step := Progress.Max div 20;
    end;
    ReadedFileSize := 0;
end;

destructor TDXF_FileRead.Destroy();
begin

    CloseFile(F);
    Progress := nil;
    inherited Destroy;
end;

function TDXF_FileRead.GetFileSize(const FileName: String): LongInt;
var
    SearchRec: TSearchRec;
begin
    if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then
        Result := SearchRec.Size
    else
        Result := -1;
end;

procedure TDXF_FileRead.ReadCodeAndCont();
begin
    Readln(F, wordLn1);
    Readln(F, wordLn2);
    Inc(ReadedFileSize, Length(wordln1));
    Inc(ReadedFileSize, Length(wordLn2));
    
    if ((ReadedFileSize div Progress.Step) > 0) then
    begin
        Progress.StepIt();
        Dec(ReadedFileSize, Progress.Step);
    end;

    if (Eof(F)) then
    begin
        wordLn1 := '0';
        wordLn2 := 'EOF';
    end;
end;

    //private
function TDXF_FileRead.GetCode(): String;
begin
    Result := Trim(wordLn1);
end;

function TDXF_FileRead.GetCont(): String;
begin
    Result := Trim(wordLn2);
end;

end.



   诚实而言,GetFileSize函数的实现和关于进度条步进策略都是在网上找到的,感觉都是很好的东西。前两天“师兄”(没有师傅 先这样称呼前来人)看我的这段代码的时候说,你这样做的进度条不精确的,应该在ReadCodeAndCont里用Progress.Position
也就是把

    Inc(ReadedFileSize, Length(wordln1));
    Inc(ReadedFileSize, Length(wordLn2));
    
    if ((ReadedFileSize div Progress.Step) > 0) then
    begin
        Progress.StepIt();
        Dec(ReadedFileSize, Progress.Step);
    end;


换成:

Progress.Position := Progress.Position + Length(wordln1);
Progress.Position := Progress.Position + Length(wordln2);



    他说这样实现的进度条,是非常精确的。想象也是,但是我改过后,看看效果也差不多啊!我决定改回去了,因为我发现速度慢了不少,自己通过比较发现原来4秒钟完成,现在变成了十几秒!我想了一下,在界面上显示的进度条总共才20个格子,而我设定了20步,效果上已经是足够了。我问他们在做导入protel的时候也是这样做的吗?他说是的。我就暗暗想:“难怪这么慢,而且动不动就假死!”。但是他们不会因为我的速度快而去改的,不知道为什么他们老是说不要改,不要改,出问题也是的,再通过一个什么高明的函数,在有问题的地方调用这个函数就是了,整个软件中不知道有多少这样高明的补丁函数了。但是软件还处在没有成熟的阶段
    delphi也是一个很好的面相对象的语言,可惜可以参考的权威的东西实在太少。看到网上说delphi调用类的Destroy的时候,不让直接用.Destroy,而是让用.free()或用FreeAndNil函数。我这样用了,被“师兄”要求改为.Destroy,很不解,但是后来有些明白了,我们的实现里面居然Destroy 都是非override的,虽然都调用了父类的Destroy 。不解中......

分享到:
评论

相关推荐

    c#实现文件读取并显示读取文件进度条

    在C#编程中,实现文件读取并显示读取文件进度条的功能是一项常见的任务,尤其在处理大文件时,为了提供良好的用户体验,进度条是非常重要的。这个功能涉及到多个知识点,包括文件I/O操作、流(Stream)处理、事件...

    c#读取文本文件添加进度条

    读取文本文件添加进度条,对于用户是友好的。难点就是如何获取文本文件的总行数,如果采用逐行读进行计数,当文件很大时,开始读取文件内容之前,用户会等待一段时间,效果不好。本文采用了用文件字节长度,来设置...

    文件复制及进度条 android 文件复制 进度条 progressdialog

    在Android开发中,文件复制和进度条的显示是常见的需求,尤其在移动应用中,用户可能需要将数据从一个位置移动到另一个位置,或者在后台下载文件时展示进度。`ProgressDialog`是Android SDK提供的一种对话框组件,...

    复制文件并带有进度条

    在IT领域,尤其是在软件开发中,"复制文件并带有进度条"是一个常见的需求,尤其是在大量数据传输或长时间操作时,进度条能提供用户友好的体验,让用户了解操作的状态和预计剩余时间。本教程将深入探讨如何实现这个...

    c#实现文件读写并显示读写进度

    本示例着重讲解如何使用C#实现文件的读写,并在读写过程中显示进度条,提升用户体验。 首先,我们需要引入`System.IO`命名空间来处理文件操作,以及`System.Windows.Forms`命名空间来创建进度条控件。以下是一段...

    android 文件上传含进度条

    "android 文件上传含进度条"这个标题恰好揭示了我们要实现的功能:在Android应用中,既要能上传文件,又要能在上传过程中显示进度条,以提升用户体验。 首先,我们需要理解Android的文件操作机制。Android提供了...

    文件复制过程显示进度条

    "文件复制过程显示进度条"这个话题就是关于如何提升用户在进行文件操作时的体验,特别是当涉及大文件复制时,进度条能给用户带来可视化的反馈,让用户了解任务的进展情况,从而增加耐心和信任感。在Windows操作系统...

    java实现大文件上传并有进度条及其代码解析

    总的来说,实现大文件上传并带有进度条的Java应用需要结合文件分块、多线程、异步通信和进度反馈等多个技术点。通过对`UploadBigFile-master`项目代码的分析,你可以更深入地理解这个过程。在实际开发中,还需要注意...

    c# 上传文件进度条

    在.NET C#环境中,创建一个文件上传进度条功能是一项常见的需求,特别是在开发Web应用程序时。这个功能能够提供用户友好的体验,让用户了解文件上传的状态,提高交互性。在这个项目中,我们将探讨如何实现这一功能,...

    批量上传文件带进度条

    在这个场景下,"批量上传文件带进度条"主要涉及的技术点有Java编程语言、多线程、FTP文件传输协议以及用户界面(UI)的设计。 首先,Java是实现这个功能的主要编程语言。Java以其跨平台性和丰富的类库而被广泛使用...

    文件上传加精确进度条

    "文件上传加精确进度条"这个主题聚焦于如何在用户上传文件时提供一个美观且实时的进度指示器,提升用户体验。下面将详细讲解实现这一功能所涉及的技术点、方法以及最佳实践。 首先,我们来看“JS好看的进度条上传...

    swfupload多文件上传带进度条实例

    这个处理器需要读取并保存上传的文件,同时返回确认信息给客户端。 ```csharp public class UploadHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { if (context.Request.Files....

    根据文件大小显示复制进度条

    在文件复制过程中,这个进度条会根据已复制的文件大小与总文件大小的比例进行更新,给用户一个直观的进度指示。 在C#中,我们可以使用`System.Windows.Forms`命名空间中的`ProgressBar`控件来实现这个功能。首先,...

    在复制文件时显示进度条,用线程实现的

    在编程领域,尤其是在进行文件操作时,用户界面的反馈至关重要,比如在复制文件时显示进度条,这可以提升用户体验,让用户了解操作的状态。本话题主要探讨如何利用多线程技术来实现在复制文件过程中显示进度条的功能...

    根据文件大小显示文件复制进度条,源代码

    可以使用`BackgroundWorker`组件或者`Task`类来实现后台操作,并在适当的时候调用`ReportProgress`方法更新进度条: ```csharp BackgroundWorker worker = new BackgroundWorker(); worker....

    复制文件夹带进度条

    标题中的“复制文件夹带进度条”指的是在复制文件或文件夹时,显示一个进度条来指示复制操作的进度。这种功能在用户界面设计中非常重要,因为它提供了可视化的反馈,让用户知道复制过程的状态,增强了用户体验。在...

    Netty 文件上传获取进度条

    服务器端接收这些消息,并在接收到文件数据的同时,计算已接收的数据量和上传进度,然后将这些信息通过WebSocket连接推送给客户端。 NIO(Non-blocking I/O)是Java提供的一种I/O模型,它允许在处理多个连接时避免...

    Qt 复制文件 实现进度条显示

    4. 在一个循环中,读取源文件的数据到缓冲区,然后写入目标文件。每次读取后,更新进度条的值,将其设置为已复制的字节数。 5. 在读取和写入过程中,确保检查是否有错误发生,例如使用`QFile::error()`函数。 6. 当...

    uploaddify+php文件上传,可传多文件以及带进度条

    Uploaddify是一款JavaScript库,主要用于处理文件上传操作,尤其适用于那些希望在用户端显示上传进度条的Web应用。这个系统能够支持多文件同时上传,提升了用户体验,因为用户无需逐个上传文件,而可以一次性选择多...

    ProgressBar读取文件字节流进度条演示

    总的来说,通过结合ProgressBar和TextView,开发者可以在Android应用中创建一个直观的文件读取进度条,提升用户体验。这个过程涉及到对Android控件的理解、文件操作、线程同步以及异常处理等多个知识点,对于Android...

Global site tag (gtag.js) - Google Analytics