Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.04.2011, 22:00
Harima Hario Harima Hario вне форума
Прохожий
 
Регистрация: 28.02.2011
Сообщения: 27
Репутация: 10
По умолчанию Вопрос по ProgressBar

Здравствуйте дорогие форумчане, помогите решить проблему с прогрессбаром.

Есть компонент TMemo который постепенно заполняется следующим текстом:

Цитата:
START-PAGE000000000
STOP--PAGE000004000
PAGE000000000
...
текст
...
PAGE000001000
...
текст
...
...
...
PAGE000003000
...
текст
...
VSE

Объясню что этот текст обозначает:
START-PAGE000000000 - номер первой страницы, выводится сразу.
STOP--PAGE000004000 - номер последней страницы, выводится приблизительно через секунд 10 после вывода START-PAGE.
PAGE000000000 - номер текущей страницы.

То есть в начале выводит общее количество страниц, в данном случае 4, дальше начинает идти текст нумерацией 1, 2, 3 и 4.

Теперь относительно расшифровки нумерации:
Цитата:
PAGE000001000

PAGE 000 001 000
{1=255} {1=1} {всегда 000}

Приведу пример:

PAGE000001000 = PAGE 000 001 000 (Равно 1)
PAGE000256000 = PAGE 000 255 000 (Равно 255)
PAGE001001000 = PAGE 001 001 000 (Равно 255+1=256)

Просто здесь 8 битный формат, и больше 255 в 3 розрядах быть не может...
То есть максимум это P255255000 это равно 65280.

Лучше всего привязатся к формуле:

PAGE 000 001 000
(a) (b) (c)

Реальное число = (a*255)+b

Вот процедуры, в которых я попытался реализовать то, что мне необходимо:
Код:
procedure SetMinMax(s:string);
var tmp,substr:string;
begin
  substr:='START-PAGE';
  if MatchesMask(s,substr+'*') then
  begin
    tmp:=Copy(s,Pos(substr,s)+length(substr),length(s));
    if IsNumber(tmp) then
    begin
      Form1.ProgressBar1.Min:=StrToInt(Copy(tmp,0,3))*255+StrToInt(Copy(tmp,4,3));
    end;
  end;
  substr:='STOP--PAGE';
  if MatchesMask(s,substr+'*') then
  begin
    tmp:=Copy(s,Pos(substr,s)+length(substr),length(s));
    if IsNumber(tmp) then
    begin
      Form1.ProgressBar1.Max:=StrToInt(Copy(tmp,0,3))*255+StrToInt(Copy(tmp,4,3))-1;
    end;
  end;
end;

procedure SetProgress(s:string);
var tmp,substr:string;
begin
  substr:='PAGE';
  if MatchesMask(s,substr+'*') then
  begin
    tmp:=Copy(s,Pos(substr,s)+length(substr),length(s));
    if IsNumber(tmp) then
    begin
      Form1.ProgressBar1.Position:=StrToInt(Copy(tmp,0,3))*255+StrToInt(Copy(tmp,4,3));
    end;
  end;
end;
Ответить с цитированием
  #2  
Старый 10.04.2011, 10:14
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Да зачем-же так сложно?
У вас фиксированные значения в тексте:
START-PAGE000000000
STOP--PAGE000004000
Значит и исходим из этого:
Код:
if Copy(Memo1.Lines.Strings[i],1,10) = 'START-PAGE'
then begin
       s := Memo1.Lines.Strings[i];
       Form1.ProgressBar1.Min := StrToInt(Copy(s,10,6));
       s := Memo1.Lines.Strings[i+1];
       Form1.ProgressBar1.Max := StrToInt(Copy(s,10,6));
       end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 13.04.2011, 00:43
Harima Hario Harima Hario вне форума
Прохожий
 
Регистрация: 28.02.2011
Сообщения: 27
Репутация: 10
По умолчанию

Может и сложно, но как по мне – надежно. Больше кода, меньше – все равно не работает
Ответить с цитированием
  #4  
Старый 13.04.2011, 10:26
Аватар для TOJluK
TOJluK TOJluK вне форума
Местный
 
Регистрация: 25.02.2009
Адрес: Минск
Сообщения: 551
Версия Delphi: 2007
Репутация: 110
По умолчанию

Что- то я ProcessMessages в коде не увидел
Ответить с цитированием
  #5  
Старый 14.04.2011, 23:09
Harima Hario Harima Hario вне форума
Прохожий
 
Регистрация: 28.02.2011
Сообщения: 27
Репутация: 10
По умолчанию

А как в моем случае можно использовать ProcessMessages?
Ответить с цитированием
  #6  
Старый 15.04.2011, 10:04
Assistant Assistant вне форума
Продвинутый
 
Регистрация: 20.02.2011
Адрес: там где правят идиоты
Сообщения: 603
Версия Delphi: 7
Репутация: выкл
По умолчанию

что бы намертво все не висло когда прогресс двигать будете, в цикле нужно вставить:
Код:
Application.ProcessMessages;
__________________
взялся из неоткуда, ничего не прошу, помогаю просто так
ICQ: 593977748 - стучать в случае КРАЙНЕЙ необходимости, ну, или если вы со Ставрополя
Ответить с цитированием
  #7  
Старый 25.04.2011, 22:01
Harima Hario Harima Hario вне форума
Прохожий
 
Регистрация: 28.02.2011
Сообщения: 27
Репутация: 10
По умолчанию

Код:
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
  Str: String;
begin
  ComPort.ReadStr(Str, Count);

  if Copy(str,1,10) = 'START-PAGE' then
  begin
    //s := Form1.Memo.Lines.Strings[i];
    ProgressBar1.Min := StrToInt(Copy(str,10,6));
  end;
  if Copy(str,1,10) = 'STOP--PAGE' then
  begin
    //s := Form1.Memo.Lines.Strings[i+1];
    ProgressBar1.Max := StrToInt(Copy(str,10,6));
  end;
  //SetMinMax(Str);
  //SetProgress(Str);
  if Copy(str,1,4) = 'PAGE' then
  begin
    //s := Form1.Memo.Lines.Strings[i+1];
    ProgressBar1.Position := StrToInt(Copy(str,4,6));
  end;

  Memo.Text := Memo.Text + Str;
  Application.ProcessMessages;
end;

Использовал ProcessMessages в процедуре, увы не помогло… процесс заполнения компонента ТМемо виснит и все, хотя без прогрессбара все отлично работает. Может кто-то оставит номерок ICQ, я скину весь исходник… перерыл все форумы, книги, пока все очень печально.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:14.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter