Progress Bar

Delphi

20/07/2003

Alguém pode me ensinar como usar este componente ?? Gostaria de colocá-lo no splash screen do meu programa. Desde já agradeço ...


Glaubergs

Glaubergs

Curtidas 0

Melhor post

Carlos Filho

Carlos Filho

21/07/2003

Vale ressaltar que é obrigatorio o uso do Timer para atualizar o progress bar dentro de uma procedure,atravez de verificação de uma variavel.


Não necessáriamente!
Usando a mesma forma que eu disse, colocando no meio do código incrementadores de ´position´ dentro do procedure não será necessário usar nenhum timer


GOSTEI 1

Mais Respostas

Obubiba

Obubiba

20/07/2003

Você pode utilzar o Componente Timer para trabalhar com a barra de progressão:

Defina o valor da propriedade [i:9d63f39de3]Max[/i:9d63f39de3] para [b:9d63f39de3]10[/b:9d63f39de3] da Progress Bar, e o valor de [i:9d63f39de3]Interval[/i:9d63f39de3] do Timer para [b:9d63f39de3]1000[/b:9d63f39de3], e ponha o código no OnTimer do Timer:

procedure TFormApresentacao.Timer1Timer(Sender: TObject);
begin

if ProgressBar1.Position = 10 then begin
Application.CreateForm(TFormPrincipal, FormPrincipal);
FormApresentacao.Hide;
end
else
ProgressBar1.Position := ProgressBar1.Position +1;

end;


GOSTEI 0
Carlos Filho

Carlos Filho

20/07/2003

Alguém pode me ensinar como usar este componente ?? Gostaria de colocá-lo no splash screen do meu programa. Desde já agradeço ...


Antes de sermos programadores nós somos usuários concorda??
Então PELO AMOR DE DEUS não faça o que o [b:61e0944847]obubiba[/b:61e0944847] disse! Quando eu aprendi a usar gauges e progressbars eu percebi q muitos programadores usavam a ´estratégia´ do timer para dar um pequeno delay na abertura do programa a fim de ser possível ver a animação da barra de progresso sendo preenchida. Mas isso não está certo...

Uma barra de progresso tem como objetivo dar um retorno visual de tempo decorrido em uma operação demorada, e vc deveria usa-la dessa maneira...

Se quiser usar a barra de progresso no splash de seu programa, a maneira mais simples de fazê-lo é a seguinte: conte quantos formulários serão criados automaticamente e configure a propriedade MAX da barra de progresso para esse número de formulários.

No DPR do seu programa, imediatamente abaixo de cada formluário que está sendo automaticamente criado, coloque o incrementador de posição:

ProgressBar1.Position := ProgressBar1.Position + 1;


Como você configurou a pripriedade MAX da barra de progresso como o número de formulários que serão criados, quando o ultimo formlario for criado a barra estará cheia como deve ser e no tempo preciso, de acordo com a velocidade do computador onde o programa está rodando.

É claro que provavelmente você verá a animação de barra de progresso muito rápida, mas pelo menos ela será preenchida de forma verdadeira!

Se seu programa tiver poucos formulários ou se os formlarios que ela tiver forem muito simples a animação será rápida mesmo, até que alguem com um PC não muito bom rode sua aplicação....

Insisto em dizer que essa é a forma mais adequada, mas se quiser ´enganar´ os usuários, pode usar os TIMERS...

Lembre-se que você é um usuário também![/b]


GOSTEI 0
Kroki

Kroki

20/07/2003

Vale ressaltar que é obrigatorio o uso do Timer para atualizar o progress bar dentro de uma procedure,atravez de verificação de uma variavel.


GOSTEI 0
Obubiba

Obubiba

20/07/2003

[b:7df915aac3]Ðerek Wildstar[/b:7df915aac3], não sou ingênuo, sei que componentes visuais deve ser utilzados com cautela e de modo a fazer com que o usuário do sistema não pense que a aplicação está travada durante operações demoradas. Portanto, o código que propus visa apenas demonstrar a utilização do componente em questão.


GOSTEI 0
Afarias

Afarias

20/07/2003

|Vale ressaltar que é obrigatorio o uso do Timer para atualizar o progress
|bar dentro de uma procedure,atravez de verificação de uma variavel.


Más *não* é mesmo.


GOSTEI 0
Kroki

Kroki

20/07/2003

Não entendi oque vc quer dizer,mas se for que não é preciso,então me de uma luz de como posso fazer sem usar o timer,para incrementar o Progress a cada encriptacao de byte;
function EnDecryptString(StrValue : String; Chave: Word) : String;
var
I: Integer;
OutValue : String;
begin
OutValue := ´´;
for I := 1 to Length(StrValue) do
OutValue := OutValue + char(Not(ord(StrValue[I])-Chave));{*aqui}
Result := OutValue;
end;


GOSTEI 0
Glaubergs

Glaubergs

20/07/2003

Olhe o meu caso Derek: tenho um form apenas que abre automaticamente, sendo que ele eh um form que requisita uma senha para acessar o programa. Depois disso abre-se o splash screen e depois o programa ... como usar o ProgressBar da forma que vc disse no meu caso ?


GOSTEI 0
Carlos Filho

Carlos Filho

20/07/2003

[b:d084577955]Ðerek Wildstar[/b:d084577955], não sou ingênuo, sei que componentes visuais deve ser utilzados com cautela e de modo a fazer com que o usuário do sistema não pense que a aplicação está travada durante operações demoradas. Portanto, o código que propus visa apenas demonstrar a utilização do componente em questão.


Entendi...
Por favor me desculpe, não foi minha inteção...
Quem sou eu pra julgar...

Desculpe mesmo...


GOSTEI 0
Carlos Filho

Carlos Filho

20/07/2003

Não entendi oque vc quer dizer,mas se for que não é preciso,então me de uma luz de como posso fazer sem usar o timer,para incrementar o Progress a cada encriptacao de byte; function EnDecryptString(StrValue : String; Chave: Word) : String; var I: Integer; OutValue : String; begin OutValue := ´´; for I := 1 to Length(StrValue) do OutValue := OutValue + char(Not(ord(StrValue[I])-Chave));{*aqui} Result := OutValue; end;


Po cara, acredito que tenha sido desatenção sua!! é muito faácil! Substitua seu código por este:

function EnDecryptString(StrValue : String; Chave: Word) : String;
var
    I: Integer;
    OutValue: String;
begin
    OutValue := ´´;
    ProgressBar1.Max := Length(StrValue);
    for I := 1 to Length(StrValue) do
    begin
        OutValue := OutValue + char(Not(ord(StrValue[I])-Chave));
        Progressbar1.Position := Progressbar1.Position + 1;
    end;
    Result := OutValue;
end;


Quando o processo de encriptação acabar sua barra de progresso estará completamente cheia...

:D


GOSTEI 0
Carlos Filho

Carlos Filho

20/07/2003

Olhe o meu caso Derek: tenho um form apenas que abre automaticamente, sendo que ele eh um form que requisita uma senha para acessar o programa. Depois disso abre-se o splash screen e depois o programa ... como usar o ProgressBar da forma que vc disse no meu caso ?


Hummm nesse caso é dificil dizer pois tenho de saber exatamente o codigo q tem em seu DPR, pois existem varias maneiras de fazer isso...
se puder me mandar,..

mas já vou dizendo que quanto menos formularios sua aplucação tiver, mais rápida será a progressbar e vc quase não a verá enchendo,,,


GOSTEI 0
Kroki

Kroki

20/07/2003

Derek,vc tem certeza que testou o código????????????
Cole e tente executar,na teoria é fácil,mas na pratica...


GOSTEI 0
Afarias

Afarias

20/07/2003

function EnDecryptString(StrValue : String; Chave: Word): String;
var
I: Integer;
OutValue: String;
begin
OutValue := ´´;
for I := 1 to Length(StrValue) do
begin // <-- adicione
OutValue := OutValue + char(Not(ord(StrValue[I])-Chave));{*aqui}
ProgressBar1.Position := ProgressBar1.Position + 1; // <-- adicione
Application.ProcessMessages; // <-- adicione (*)
end; // <-- adicione
Result := OutValue;
end;


O Ðerek Wildstar está certo, só esqueceu da linha (*)

Vc tem q usar o Application.ProcessMessages para dar chance ao Windows ´redesenhar´ a tela e vc poderá VER o barra andar.


T+


GOSTEI 0
Kroki

Kroki

20/07/2003

Ainda acho que vcs não testam oque postam,veja;
Uso o Delphi 7 e mesmo colocando a variavel ´Progressbar1:TProgessbar´não adianta,não funciona.


GOSTEI 0
Afarias

Afarias

20/07/2003

Cara... essa foi demais! Tudo bem, vc tá tirando onda com nossa cara né?? Fala a verdade?? É zona sua com a gente nÉ? :lol:


Em todo caso, se não for...


Meu, o ProgressBar1 é o nome do componente que sei lá q danado vc usa!!! Nem sei se vc usa um TProgressBar!! é só um exemplo!! Mude o nome e o componente para aquele q vc usa!!!


T+


GOSTEI 0
Kroki

Kroki

20/07/2003

To usando o Progressbar,TProgressbar.
Ja falei que o erro não é o componente!Mesmo que o componente esteja correto o Progressbar não funciona.
Faz o seguinte ja que vc ta falando que tou te tirando,posta aqui um link com o Exe e a fonte de um Button e um progress bar (desse código )funcionando pra gente ver.
Alguem aqui,poste que esse esse código adaptado funciona que eu vou ver quem ta errado. :)
Se ninguem postar... :?
Aqui esta a sua idéia;
[url]http://www.projetoarcade.kit.net/dwon/teste.zip[/url]


GOSTEI 0
Carlos Filho

Carlos Filho

20/07/2003

function EnDecryptString(StrValue : String; Chave: Word): String; var I: Integer; OutValue: String; begin OutValue := ´´; for I := 1 to Length(StrValue) do begin // <-- adicione OutValue := OutValue + char(Not(ord(StrValue[I])-Chave));{*aqui} ProgressBar1.Position := ProgressBar1.Position + 1; // <-- adicione Application.ProcessMessages; // <-- adicione (*) end; // <-- adicione Result := OutValue; end; O Ðerek Wildstar está certo, só esqueceu da linha (*) Vc tem q usar o Application.ProcessMessages para dar chance ao Windows ´redesenhar´ a tela e vc poderá VER o barra andar. T+


Exatamente... Desculpe a minha falha!!
hehe

Aliás devo ressaltar que deve-se sempre usar applcation.processmessages dentro de lopps potencialmente demorados...

Além de dar a chance ao Windows processar mensagens de repintura como [b:61e3819396]afarias[/b:61e3819396] disse, ele também serve para permitir que outras partes do seu código continuem funcionando durante o LOOP


GOSTEI 0
Carlos Filho

Carlos Filho

20/07/2003

To usando o Progressbar,TProgressbar. Ja falei que o erro não é o componente!Mesmo que o componente esteja correto o Progressbar não funciona. Faz o seguinte ja que vc ta falando que tou te tirando,posta aqui um link com o Exe e a fonte de um Button e um progress bar (desse código )funcionando pra gente ver. Alguem aqui,poste que esse esse código adaptado funciona que eu vou ver quem ta errado. :) Se ninguem postar... :? Aqui esta a sua idéia; [url]http://www.projetoarcade.kit.net/dwon/teste.zip[/url]


leia tudo!! Pos vale a pena!

Caro amigo kroki descobri o problema no código do ProgressBar...
De início deu o erro que vc disse e eu já estava ficando de queixo caído qdo lembrei de minhas aulas de [b:d11fbe6260]Orientação a Objetos & Herança[/b:d11fbe6260]!!

Na verdade vc fez tudo corretamente! O único erro seu foi ter criado uma função global, isto é, independente de qualquer classe!

Entenda que qdo eu falo aqui CLASSE eu quero dizer FORM!

Resumindo: Vc criou uma função Global dentro da Unit de um FORM.

Perceba o que eu quero dizer...
Ao dar duplo clique em um botão, o delphi automaticamente cria o procedure do evento onClick na parte IMPLEMENTATION da UNIT, não é??

agora observe a estrutura desse procedure que o delphi criou:

procedure TForm1.Button1Click(Sender: TObject);
begin
edit2.Text:=EnDecryptString(edit1.text,200);
end;


Veja acima: Existe uma referência a classe ´dona´ do procedure que nesse caso é TForm1, que é o formulário onde o botão está!

Na parte INTERFACE (parte inicial da unit) encontram-se declarações de todos os objetos ´filhos´ do seu formulário:

unit Unit1;

interface

uses
  bla, bla, bla/

type
  TForm1 = class(TForm)
    Button1: TButton;
    ProgressBar1: TProgressBar;
    Edit1: TEdit;
    Edit2: TEdit;
    CheckBox1: TCheckBox;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
{ Private declarations }
  public
{ Public declarations }
  end;


Perceba que ProgressBar1 está corretamente declarada! Mas como ProgressBar1 pertence a TFORM1 (diz-se que ProgressBar1 é um objeto classeado, pois possui uma classe pai), apenas procedures e funções ´filhas´ de TForm1 poderão acessa-lo. Viu que há uma declaração para o procedure que manipula o click do botão? É exatamente por isso que você pôde usar dentro do procedure uma referencia a um objeto pertencente a TForm1 (edit2), pois ´edit2´ e ´procedure Button1Click´ são filhos de um mesmo pai (TForm1). Procedures e funções filhas de outras classes diferentes de TForm1 também podem acessar objetos filhos de TForm1, desde tais objetos sejam declarados na seção public vista acima.

Bom, chega de papo!

segue abaixo a unit corrijida e fnconando (eu AGARANTIU!). Veja os comentários dentro do código para maiores esclarecimentos:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ProgressBar1: TProgressBar;
    Edit1: TEdit;
    Edit2: TEdit;
    CheckBox1: TCheckBox;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);

//  funções e procedures que pertencem a uma classe pai devem ser 
//  obrigatoriamente declaradas. Como se pode ver abaixo, para se
//  declarar a função, basta copiar a mesma coisa da parte implementation
//  apenas retirando a referencia a classe pai que no caso é TForm1

    function EnDecryptString(StrValue : String; Chave: Word) : String;
  private
{ Private declarations }
  public
{ Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//  Inclua na frente do nome da sua função a referência a classe que ela
//  pertence. Nesse caso a classe pai é TForm1, portanto inclua isso na 
//  frente do nome da função como se vê abaixo...

function TForm1.EnDecryptString(StrValue : String; Chave: Word) : String;
var 
    I: Integer;
    OutValue: String;
begin
    OutValue := ´´;

//  Ao se "classear" a função EnDecryptString, isto é, ao se dizer 
//  explicitamente a qual classe ela pertence, será possível a partir dela
//  acessar todos os outros objetos que pertencem a tal classe. Como
//  ProgressBar1 pertence a TForm1 e a função atual tbm pertence agora,
//  o seu código será perfeitamente compilado!

    ProgressBar1.Max := Length(StrValue);
    for I := 1 to Length(StrValue) do
begin
        OutValue := OutValue + char(Not(ord(StrValue[I])-Chave));
        Progressbar1.Position := Progressbar1.Position + 1;
        Application.ProcessMessages; // <-- adicione (*)  
    end; 
    Result := OutValue; 
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
edit2.Text:=EnDecryptString(edit1.text,200);
end;

end.


Conclusão: Se você ainda não leu a bíblia do Delphi seria bom ler! É realmente muito boa, grande parte do que eu sei vem dela eu recomendo a bíblia sempre. Uns dizem q é complicado, mas é mentira! Se vc comprar o livro, isto é, se vc não o copiar vc podera disfrutar do CD q acompanha o livro. Este CD vem com centenas de exemplos funcionando: vc lê no livro e experimenta no CD!


GOSTEI 0
Kroki

Kroki

20/07/2003

Eu não testei a função ,mas acho que não precisa.
É isso que queria,porque sou novato no Delphi (mas não tão burro assim),por isso não gostei da ´explicação´de outros...
Parabéns,valeu,aprendí mais uma.


GOSTEI 0
Obubiba

Obubiba

20/07/2003

[quote:9ef7971a0f=´Ðerek Wildstar´]

Entendi...
Por favor me desculpe, não foi minha inteção...
Quem sou eu pra julgar...

Desculpe mesmo...[/quote:9ef7971a0f]

Sem problemas, não fiquei ofendido. Você inclusive tocou um um ponto que eu não havia levado em consideração na ânsia de responder o tópico.


GOSTEI 0
Afarias

Afarias

20/07/2003

Grande Ðerek,

Isso q é explicação completa (e boa observação tb, não tinha reparado q se tratava de uma função e não de um método do Form -- não prestei atenção no ´cabeçalho´ da função).

Bom, este casso parece encerrado :-)


Abraço a todos.


GOSTEI 0
Kroki

Kroki

20/07/2003

Derek,pra encerrar de vez,como faço um pequeno Form (acho que vai ser um form)que aparece só na hora do progressbar(sem os botoes de fechar etc)para a visualização do progressbar?


GOSTEI 0
Carlos Filho

Carlos Filho

20/07/2003

Derek,pra encerrar de vez,como faço um pequeno Form (acho que vai ser um form)que aparece só na hora do progressbar(sem os botoes de fechar etc)para a visualização do progressbar?


No momento tenho de sair, mas vou colocar na minha agenda sua requisição
:D

Farei um exemplo e postarei aqui no forum... um exemplo completo!!

Aguarde...


GOSTEI 0
Carlos Filho

Carlos Filho

20/07/2003

Derek,pra encerrar de vez,como faço um pequeno Form (acho que vai ser um form)que aparece só na hora do progressbar(sem os botoes de fechar etc)para a visualização do progressbar?


Como eu havia prometido aqui está o exemplo com o Splsh Screen e a Progress bar...
Façam o download do projeto aqui

[url]http://www.wildstarcorp.kit.net/ExemploSplash.zip[/url]

Antes de ver o código-fonte, execute o programa project1.exe para saber exatamente o que acontece, depois sim, veja o código. Assim é mais fácil de entender..

No código-fonte coloquei comentários na lista TO-DO, portantanto, para ver todos os comentários que eu fiz, no delphi vá no menu view e em seguida clique em TO-DO list, assim vc verá todos os comentários q eu fiz de uma forma fácil, entretanto nada o impede de ver os comentários diretamente no código

PS.: a função ´esperaumpouco´ definida na Unit1 eu criei para ser usada em partes do código, como o oncreate de cada um dos 20 forms, para dar um delay aleatório e permitindo a vc ver o que acontece do contrario seria rápido demais


GOSTEI 0
Dedi

Dedi

20/07/2003

kroke,

Para que a função possa atualizar o objeto ela (a função ) deve pertencer a mesma classe do objeto, no caso (de acordo com a figura )deve pertencer ao Tform1 para isso,antes do nome da função adicione
[color=red:e36803dd97]
function [b:e36803dd97]Tform1.[/b:e36803dd97]EnDecryptString(StrValue : String; Chave: Word): String;[/color:e36803dd97]

Voce deve tambem declarar esta função
[color=red:e36803dd97]
type
TForm1 = class(TForm)
[b:e36803dd97] function EnDecryptString(StrValue : String; Chave: Word): String;[/b:e36803dd97]
private
{ Private declarations }
public
{ Public declarations }
end;[/color:e36803dd97]

feito isso vai funcionar.
obs(Eu testei).


Dedi


GOSTEI 0
Carlos Filho

Carlos Filho

20/07/2003

kroke, Para que a função possa atualizar o objeto ela (a função ) deve pertencer a mesma classe do objeto, no caso (de acordo com a figura )deve pertencer ao Tform1 para isso,antes do nome da função adicione [color=red:ccfde7e71c] function [b:ccfde7e71c]Tform1.[/b:ccfde7e71c]EnDecryptString(StrValue : String; Chave: Word): String;[/color:ccfde7e71c] Voce deve tambem declarar esta função [color=red:ccfde7e71c] type TForm1 = class(TForm) [b:ccfde7e71c] function EnDecryptString(StrValue : String; Chave: Word): String;[/b:ccfde7e71c] private { Private declarations } public { Public declarations } end;[/color:ccfde7e71c] feito isso vai funcionar. obs(Eu testei). Dedi


Hey Dude!
It´s Too Late!

This Thread is over!
All the problems has been solved!

Please see eigth posts above!

See Ya!


GOSTEI 0
Dedi

Dedi

20/07/2003

Friend,

Excuses me I had not noticed the page 2


Dedi


GOSTEI 0
Carlos Filho

Carlos Filho

20/07/2003

Friend, Excuses me I had not noticed the page 2 Dedi


hehe
8)


GOSTEI 0
Anjo Azul

Anjo Azul

20/07/2003

Gostei mesmo, não só do exemplo mas de toda a discussão, isso é ouro para nós iniciantes. (Vou copiar o splash...hehehe) :lol: :oops: :lol:


GOSTEI 0
Fórum Vini

Fórum Vini

20/07/2003

Ainda acho que vcs não testam oque postam,veja; Uso o Delphi 7 e mesmo colocando a variavel ´Progressbar1:TProgessbar´não adianta,não funciona.

Cara, você tem que ter o ProgressBar com o nome de ProgressBar1 no seu formulário, senão nunca vai funcionar!


GOSTEI 0
Kroki

Kroki

20/07/2003

Vini,vc ta atrazado com essa resposta,aconselho a ler todo o tópico.
É CLARO QUE SEI PELO MENOS ISSO!


GOSTEI 0
Afarias

Afarias

20/07/2003

hahahahaha... bota atrazado nisso!! :lol:


GOSTEI 0
Carlos Filho

Carlos Filho

20/07/2003

[quote:77384f3e17=´Anjo Azul´]Gostei mesmo, não só do exemplo mas de toda a discussão, isso é ouro para nós iniciantes. (Vou copiar o splash...hehehe) :lol: :oops: :lol:[/quote:77384f3e17]

Em nome de todos dessa discussão eu agradeço a vc pela preferência! :D
Quem dera todas as discussões desse fórum fossem assim...

Um dia quem sabe eu coloque no ar um Forum q desbanque esse...

(não é impossível!) :D


GOSTEI 0
Kroki

Kroki

20/07/2003

Se precisarem de ajuda com assembler oueletronica,to disponível....
No Delphi não arrisco.
Estou terminando uma HP com alguns tutorias que acho interessante como o formato de arquivo WAV,que alias apanhei muito pra descobrir detalhes interessantes pois oque achei na net explicava a metade do que queria...


GOSTEI 0
Fórum Vini

Fórum Vini

20/07/2003

Foi mal gente, eu não tinha lido a pagina 2...


GOSTEI 0
Carlos Filho

Carlos Filho

20/07/2003

Se precisarem de ajuda com assembler oueletronica,to disponível.... No Delphi não arrisco. Estou terminando uma HP com alguns tutorias que acho interessante como o formato de arquivo WAV,que alias apanhei muito pra descobrir detalhes interessantes pois oque achei na net explicava a metade do que queria...


humm assembler?

legal!
vou visitar seu site...

acho assembler interessante, mesmo que nao tenha tanta utilidade pra programadores de ´alto nível´..

Mas é sempre bom ter uma idéia de todas as linguagens (boas) - Isso exclui vi$ual Basic e A$P

Se tiver tutoriais bem básicos de assembler (bem básicos mesmo, do tipo explicar desde os registradores) me dá o toque!


GOSTEI 0
POSTAR