![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте дорогие форумчане, помогите решить проблему с прогрессбаром.
Есть компонент TMemo который постепенно заполняется следующим текстом: Цитата:
Объясню что этот текст обозначает: START-PAGE000000000 - номер первой страницы, выводится сразу. STOP--PAGE000004000 - номер последней страницы, выводится приблизительно через секунд 10 после вывода START-PAGE. PAGE000000000 - номер текущей страницы. То есть в начале выводит общее количество страниц, в данном случае 4, дальше начинает идти текст нумерацией 1, 2, 3 и 4. Теперь относительно расшифровки нумерации: Цитата:
Вот процедуры, в которых я попытался реализовать то, что мне необходимо: Код:
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
|
||||
|
||||
|
Да зачем-же так сложно?
У вас фиксированные значения в тексте: 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
|
|||
|
|||
|
Может и сложно, но как по мне – надежно. Больше кода, меньше – все равно не работает
![]() |
|
#4
|
||||
|
||||
|
Что- то я ProcessMessages в коде не увидел
|
|
#5
|
|||
|
|||
|
А как в моем случае можно использовать ProcessMessages?
|
|
#6
|
|||
|
|||
|
что бы намертво все не висло когда прогресс двигать будете, в цикле нужно вставить:
Код:
Application.ProcessMessages; |
|
#7
|
|||
|
|||
|
Код:
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, я скину весь исходник… перерыл все форумы, книги, пока все очень печально. |