Ir para conteúdo
Fórum Script Brasil
  • 0

[Dúvida] TProgressBar Property out of range


Rmpjunior

Pergunta

Fala Galera,

Estou desenvolvendo uma aplicação que checa uns endereços hexadecimais, em uma range definida por mim. Mas preciso que esse processo de checagem tivesse uma progressbar. Imaginei que usando o primeiro adress da range como min e o ultimo como max, e usando o adress que está sendo checado como progress, iria funcionar, mas está dando esse erro:

TProgressBar property out of range

Lembrando que eu estou usando uma função para converter hex para integer, e está funcionando, pois já comparei com o resultado da calculadora. Parece que a progressbar não aceita números tão grandes. Há uma solução usando a própria progressbar ou precisarei de outro componente?

Desde já obrigado.

Link para o comentário
Compartilhar em outros sites

15 respostass a esta questão

Posts Recomendados

  • 0

Me informei e o progress bar só aceita valores do tamanho de um campo integer, ou seja de -2147483648 até 2147483647, no entanto se estiver usando um while recomendo que sete o min para 0 e 100 e vá incrementando o progress bar até terminar a query....

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

var
  min, max : Int64;
begin
  // Set the minimum and maximum values of this data type
  min := Low(Int64);
  max := High(Int64);
  ShowMessage('Min int64 value = '+IntToStr(min));
  ShowMessage('Max int64 value = '+IntToStr(max));
end;
resultado: Min int64 value = -9223372036854775808 Max int64 value = 9223372036854775807 OBS: usando Int64 voce conseguiria abranger os valores em hexadecimal entretanto o gauge suporta de 1 a 2147483647 então dentro do exemplo que voce passou:
procedure TForm1.Button1Click(Sender: TObject);
var Max, Min : int64; i : integer;
begin
  Max := 292030848;
  Min := 11680980;

  Gauge1.MaxValue := Max;
  Gauge1.MinValue := Min;

  for i := min to max do
     begin
        Gauge1.Progress := i;
     end

end;

Veja que os valores para Max e Min usando int64 poderiam chegar a

Min int64 value = -9223372036854775808

Max int64 value = 9223372036854775807

entretanto o gauge chegaria apenas a 2147483647

Solução: a diferença de Max e Min deve estar dentro do range do gauge .. se extrapolar a idéia mais simples seria fazer uma divisão

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado pela bela resposta Jhonas !

Eu num vou nem tentar fazer essa da diferença do min e do max, até porque a range padrão, é o "full scan", 00000000 até 7fffffff.

Uma divisão também é complicada, porque os adress são sempre variáveis.

Vou continuar procrando, se alguém puder ter uma melhor dica, agradeço.

Link para o comentário
Compartilhar em outros sites

  • 0

A idéia é simples ... coverta o Hexadecimal ( Max ) e o hexadecimal ( Min ) em int64

faça a diferença do Max menos o Min ... se o resultado estiver dentro do range do gauge voce usa

se a diferença estiver fora, voce faz uma divisão sucessiva por algum numero até que o resultado fique dentro do range

Só testando para saber o resultado

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Bem Jhonas, to meio com sono, mas fiz o basico que você falou, o Edit2 tem o 1º adress já convertido e o Edit3 tem o último adress já convertido.

if strtoint(floattostr(strtoint(Edit3.Text)-strtoint(Edit2.Text)))<=2147483647 then begin
ProgressBar1.MinValue:=strtoint(Edit2.Text);
ProgressBar1.MaxValue:=strtoint(Edit3.Text);
end
else begin
while not strtoint(floattostr(strtoint(Edit3.Text)-strtoint(Edit2.Text)))<=2147483647 do
begin
Edit2.Text:=floattostr(strtoint(Edit2.Text)/100);
Edit3.Text:=floattostr(strtoint(Edit3.Text)/100);
end;
end;
Mas ainda está dando o erro:
Value must be between -2147483647 and 99.

Talvez seja o sono, que eu tenha moscado em algo ai, vou dormir, amanhã eu vejo isso novamente.

Desde já muito obrigado pela atenção.

@Edit

A ProgressBar1 ali é uma Gauge ;)

Editado por Rmpjunior
Link para o comentário
Compartilhar em outros sites

  • 0

O Erro: Value must be between -2147483647 and 99.

Valor deve estar entre -2147483647 e 99.

realmente voce fez alguma coisa errada no código ....

Estou desenvolvendo uma aplicação que checa uns endereços hexadecimais, em uma range definida por mim.

coloque um exemplo real dessa chegagem

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Esse ultimo erro é simples :P.

if strtoint(floattostr(strtoint(Edit3.Text)-strtoint(Edit2.Text)))<=2147483647 then begin
ProgressBar1.MinValue:=strtoint(Edit2.Text); // você esta setando primeiramente o valor minimo, que no momento é superior ao valor maximo que ainda não foi setado.
ProgressBar1.MaxValue:=strtoint(Edit3.Text);
end
else begin
while not strtoint(floattostr(strtoint(Edit3.Text)-strtoint(Edit2.Text)))<=2147483647 do
begin
Edit2.Text:=floattostr(strtoint(Edit2.Text)/100);
Edit3.Text:=floattostr(strtoint(Edit3.Text)/100);
end;
end;
---
if strtoint(floattostr(strtoint(Edit3.Text)-strtoint(Edit2.Text)))<=2147483647 then begin
ProgressBar1.MaxValue:=strtoint(Edit3.Text); // é só setar o maximo primeiro
ProgressBar1.MinValue:=strtoint(Edit2.Text);
end
else begin
while not strtoint(floattostr(strtoint(Edit3.Text)-strtoint(Edit2.Text)))<=2147483647 do
begin
Edit2.Text:=floattostr(strtoint(Edit2.Text)/100);
Edit3.Text:=floattostr(strtoint(Edit3.Text)/100);
end;
end;

Editado por Pr.wap
Link para o comentário
Compartilhar em outros sites

  • 0

Valeu Pr.wap! Não deu mais o erro, mas a ProgressBar carrega muito rápido, o que pode ser?

no código "for.." eu uso isso para determinar a position da progress:

ProgressBar1.Position:=Hextoint(inttostr(adress));
Aonde adress é a variavel que uso no "for..". Jhonas, é uma DLL injetada em uma aplicação, e lista os adress que tem um value determinado pelo usuario, só que como o scan pode demorar, eu queria colocar uma progressbar. @Edit Coloquei um Edit pra mostrar qual adress tá sendo checado, e ele já começa checando um valor muito alto, não entendo. Essa é a function HexToInt:
Function HexToInt(const HexStr: string): longint;
var iNdx: integer;
cTmp: Char;

begin
Result := 0;
for iNdx := 1 to Length(HexStr) do
begin
cTmp := HexStr[iNdx];
case cTmp of
'0'..'9': Result := 16 * Result + (Ord(cTmp) - $30);
'A'..'F': Result := 16 * Result + (Ord(cTmp) - $37);
'a'..'f': Result := 16 * Result + (Ord(cTmp) - $57);
else
raise EConvertError.Create('Illegal character in hex string');
end;
end;
end;

@Edit2

Se puder me add no MSN..: rmpjunior@hotmail.com

Editado por Rmpjunior
Link para o comentário
Compartilhar em outros sites

  • 0

Coloquei um Edit pra mostrar qual adress tá sendo checado, e ele já começa checando um valor muito alto, não entendo.
Como voce não postou o código que está utilizando para fazer a leitura dos endereços, procure entender a lógica e aplicar as modificações necessarias ao seu código
Function HexToInt(const HexStr: string): longint;
var iNdx: integer;
    cTmp: Char;
begin
  result := 0;
  for iNdx := 1 to Length(HexStr) do
     begin
        cTmp := HexStr[iNdx];
        case cTmp of
        '0'..'9': Result := 16 * Result + (Ord(cTmp) - $30);
        'A'..'F': Result := 16 * Result + (Ord(cTmp) - $37);
        'a'..'f': Result := 16 * Result + (Ord(cTmp) - $57);
        else
        raise EConvertError.Create('Illegal character in hex string');
        end;
      end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var Max , Min : Int64; i, adress : integer; a: string;
begin
   Max := HexToInt('11680980');
   Min := HexToInt('00C9AEBA');

   Gauge1.MaxValue := Max;
   Gauge1.MinValue := Min;

   if Max - Min <= 2147483647 then
      begin
         for i := min to max do
            begin
               if (Hextoint(inttostr(adress)) >= min)  and  (Hextoint(inttostr(adress)) <= max)then
                  Gauge1.Progress:= i;
            end;
         Gauge1.Progress := 0;
      end
   else
      begin
         // Se a diferença estrapolou  2147483647 

         Max := Max div 16; 
         Min := Min div 16;

         for i := min to max do
            begin
               Gauge1.Progress := i;
            end;
         Gauge1.Progress := 0;
      end;


end;

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...