Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > подобие прогрес бара в консоли


Автор: Volkogriz 10.1.2013, 01:26
Можно ли как-нибудь сделать подобие прогрес бара в консоли?
Например что-нибудь типа:
Код

[**************************]

Искал негдн даже примера элюментарного нет.
Вот в этот код хочу вставить:
Код

function PackDir(ArcName, Path: string; OnWork: TNotifyEvent = nil): byte;
var
  fs: TFileStream;
  cs: TCompressionStream;

function FilesScan(Dir: string): byte;
var
  sr: TSearchRec;
  s:  string;
  ln: byte;
  sz: int64;
  fs: TFileStream;
begin
 SaveLog:= TStringList.Create;
   SaveLog.Add(Rus(DateToStr(Date)));
  result := ERR_OK;
  if FindFirst(Dir + '*.*', faAnyFile, sr) = 0 then
  begin
    repeat
      if sr.Name[1] <> '.' then begin
        if sr.Attr and faDirectory = faDirectory then
        begin
          ln := FilesScan(Dir + sr.Name + '\');
          if result = ERR_OK then result := ln;
        end else
        if (sr.Attr and faArchive) = faArchive then
        begin
          s := Dir + sr.Name;
          try
            fs := TFileStream.Create(s, fmOpenRead or fmShareDenyWrite);
            s := copy(s, Length(path)+1, Length(s));
            writeln(Rus(s+ ' Делаю!Вот Здесь и хотел вставить'));
            ln := Length(s);
            cs.Write(ln, 1);
            cs.Write(s[1], ln);
            sz := fs.Size;
            cs.Write(sz, SizeOf(sz));
            cs.CopyFrom(fs, sz);
            writeln(Rus(s + ' Готово!'));
            SaveLog.Add(Rus(TimeToStr(Time)+' '+ Dir + sr.Name+' -'+ IntToStr(fs.Size)+' byte'));
            fs.Free;
          except
            result := ERR_FILES;
          end;
        end;
      end;
      until FindNext(sr) <> 0;
    FindClose(sr);
  end else result := ERR_NO_FILES;
end;
begin
  if Path[Length(Path)] <> '\' then Path := Path + '\';
  try
    fs := TFileStream.Create(ArcName, fmCreate or fmShareDenyWrite);
    fs.Write(signature[1], Length(signature));
  except
    result := ERR_CREATE_ARC;
    Exit;
  end;
  cs := TCompressionStream.Create(clMax, fs);
  if Assigned(OnWork) then cs.OnProgress := OnWork;
  result := FilesScan(Path);
  cs.Free;
  fs.Free;
  writeln(Rus('Завершино!'));
   SaveLog.Add('end;');
  end;

С уважением,
Volkogriz!

Автор: Alexeis 10.1.2013, 01:45
Т.е. данные должны идти отдельно, а прогресс отдельно?

Добавлено через 1 минуту и 23 секунды
Думаю вот эта функция поможет для перемещения позиции курсора SetConsoleCursorPosition

Автор: Volkogriz 10.1.2013, 01:52
Нет прогресс из работы TFileStream.
Но можно и отдельно, я просто не сталкивался вообще ни когда с этим.
понятия не имею как он в консоле работает smile 

Автор: Alexeis 10.1.2013, 09:00
Я имею ввиду, что в окошке одновременно с прогрессом будет выводиться еще текст или только прогресс? 

Автор: Volkogriz 10.1.2013, 09:48
с текстом, но можно и без)
Мне просто разобраться.
С уважением,
Volkogriz!

Автор: Alexeis 10.1.2013, 11:13
Ну если просто, то выводишь последовательно символы "[" потом "*" и в конце "]" один за другим в строчку. Вот и получается прогресс. 

Код

    Write('[');
    for I := 0 to 50
    do
      begin
         write('*');
         Sleep(100);
      end;
    write(']');
    Sleep(1000);


Автор: Чучмек 10.1.2013, 12:01
Код

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils,windows;

const
  cas1='Готов                                             ';
  cas2='Подождите думаю';

var
 cp: TCoord;
 i:integer;
 s:string;
 sbi:TConsoleScreenBufferInfo;
 os1,os2:string;
 hOut:cardinal;
begin
  { TODO -oUser -cConsole Main : Insert code here }
SetLength(os1,length(cas1));
AnsiToOem(pchar(cas1),pchar(os1));
SetLength(os2,length(cas2));
AnsiToOem(pchar(cas2),pchar(os2));
hOut:=GetStdHandle(STD_OUTPUT_HANDLE);
writeln(os1);
while s<>'exit' do
 begin
 readln(s);
 GetConsoleScreenBufferInfo(hOut,sbi);
 cp.X:=0;
 cp.Y:=0;
 SetConsoleCursorPosition(hOut,cp);
 Write(os2);
 for i:=0 to 10 do
  begin
  sleep(300);
  write('.');
  end;
 cp.X:=0;
 SetConsoleCursorPosition(hOut,cp);
 writeln(os1);
 cp:=sbi.dwCursorPosition;
 SetConsoleCursorPosition(hOut,cp);
 writeln('>'+s);
 end;


end.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)