Fórum PQ não aparece nada no StatusBar #329570
16/09/2006
0
Olá pessoal to usando um StatusBar para mostrar a data, e o usuario logado e os hint so q num ta parecendo nada o código é esse q to usando...
procedure TFORMPRINCIPAL.barraDrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
var
nrdia: Integer;
diasemana: array[1..7] of String;
meses: array[1..12] of String;
dia, mes, ano: Word;
begin
diasemana[1]:=´Domingo´;
diasemana[2]:=´Segunda´;
diasemana[3]:=´Terça´;
diasemana[4]:=´Quarta´;
diasemana[5]:=´Quinta´;
diasemana[6]:=´Sexta´;
diasemana[7]:=´Sábado´;
meses[1] :=´Janeiro´;
meses[2] :=´Fevereiro´;
meses[3] :=´Março´;
meses[4] :=´Abril´;
meses[5] :=´Maio´;
meses[6] :=´Junho´;
meses[7] :=´Julho´;
meses[8] :=´Agosto´;
meses[9] :=´Setembro´;
meses[10] :=´Outubro´;
meses[11] :=´Novembro´;
meses[12] :=´Dezembro´;
DecodeDate(DATE,ano,mes,dia);
nrdia:= DayOfWeek(DATE);
with Barra.Canvas do
begin
FillRect(Rect);
Font.Name := ´Arial´;
Font.Color := clNavy;
//Font.Style := [FsBold];
ImageList1.Draw(Barra.Canvas,Rect.Left+5,Rect.Top+1,Panel.Index);
if Panel.Index = 0 then //Data
TextOut(Rect.Left + 25, Rect.Top + 1,diasemana[nrdia]+´, ´+INTTOSTR(dia)+´ de ´+meses[mes]+´ de ´+INTTOSTR(ano));
if Panel.Index = 1 then //USuario
TextOut(Rect.Left + 25, Rect.Top + 1,UpperCase(FORMACESSO.DBLookupComboBox1USUARIOS.text));
// if Panel.Index = 2 then //Hint
// TextOut(Rect.Left + 25, Rect.Top + 1,Application.Hint);
end;
end;
procedure TFORMPRINCIPAL.barraDrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
var
nrdia: Integer;
diasemana: array[1..7] of String;
meses: array[1..12] of String;
dia, mes, ano: Word;
begin
diasemana[1]:=´Domingo´;
diasemana[2]:=´Segunda´;
diasemana[3]:=´Terça´;
diasemana[4]:=´Quarta´;
diasemana[5]:=´Quinta´;
diasemana[6]:=´Sexta´;
diasemana[7]:=´Sábado´;
meses[1] :=´Janeiro´;
meses[2] :=´Fevereiro´;
meses[3] :=´Março´;
meses[4] :=´Abril´;
meses[5] :=´Maio´;
meses[6] :=´Junho´;
meses[7] :=´Julho´;
meses[8] :=´Agosto´;
meses[9] :=´Setembro´;
meses[10] :=´Outubro´;
meses[11] :=´Novembro´;
meses[12] :=´Dezembro´;
DecodeDate(DATE,ano,mes,dia);
nrdia:= DayOfWeek(DATE);
with Barra.Canvas do
begin
FillRect(Rect);
Font.Name := ´Arial´;
Font.Color := clNavy;
//Font.Style := [FsBold];
ImageList1.Draw(Barra.Canvas,Rect.Left+5,Rect.Top+1,Panel.Index);
if Panel.Index = 0 then //Data
TextOut(Rect.Left + 25, Rect.Top + 1,diasemana[nrdia]+´, ´+INTTOSTR(dia)+´ de ´+meses[mes]+´ de ´+INTTOSTR(ano));
if Panel.Index = 1 then //USuario
TextOut(Rect.Left + 25, Rect.Top + 1,UpperCase(FORMACESSO.DBLookupComboBox1USUARIOS.text));
// if Panel.Index = 2 then //Hint
// TextOut(Rect.Left + 25, Rect.Top + 1,Application.Hint);
end;
end;
Tchucky
Curtir tópico
+ 0
Responder
Posts
17/09/2006
Michael
Para que o evento [b:da48d1c478]OnDrawPanel [/b:da48d1c478]da classe [b:da48d1c478]TStatusBar [/b:da48d1c478]seja disparado, deve-se ter ao menos um painel com a propriedade [b:da48d1c478]Style [/b:da48d1c478]configurada como [b:da48d1c478]psOwnerDraw[/b:da48d1c478]. Provavelmente foi isso que vc esqueceu de fazer em cada painel da sua barra de status.
Porém, vc não deveria executar este código dentro do evento [b:da48d1c478]OnDrawPanel[/b:da48d1c478]. Lá devem apenas existir os tratamentos para mudar a apresentação dos painéis, e não a definição do que deve ou não ser escrito dentro deles. Veja como melhor as coisas:
1) Configure o texto de cada painel em outro lugar, como em um evento de inicialização, ou no evento [b:da48d1c478]OnTimer [/b:da48d1c478]de um [b:da48d1c478]Timer[/b:da48d1c478], se vc quiser que a data seja apresentada em tempo real. Para isso, simplesmente configure a propriedade [b:da48d1c478]Text [/b:da48d1c478]de cada painel para o texto desejado:
Note que eu usei as funções [b:da48d1c478]DayOf[/b:da48d1c478], [b:da48d1c478]MonthOf [/b:da48d1c478]e [b:da48d1c478]YearOf[/b:da48d1c478] (unit [b:da48d1c478]DateUtils[/b:da48d1c478]), para pegar os números do dia, do mês e do ano, respectivamente, e os arrays globais [b:da48d1c478]LongDayNames [/b:da48d1c478]e [b:da48d1c478]LongMonthNames [/b:da48d1c478]para pegar os nomes dos dias da semana e dos meses, nessa ordem. Esses arrays utilizam o idioma definido na opção ´Configurações regionais´ no Painel de controle. Desta forma evita-se ter que criá-los manualmente.
2) No evento [b:da48d1c478]OnDrawPanel[/b:da48d1c478], escreva apenas este código:
Muito mais simples e legível não? ;-)
3) Por fim, para exibir o hint corrente da aplicação, altere a propriedade [b:da48d1c478]AutoHint [/b:da48d1c478]da barra de status para [b:da48d1c478]True[/b:da48d1c478], e implemente seu evento [b:da48d1c478]OnHint [/b:da48d1c478]para:
Compilei este código apenas mentalmente, mas acredito que funcione.
[]´s
Porém, vc não deveria executar este código dentro do evento [b:da48d1c478]OnDrawPanel[/b:da48d1c478]. Lá devem apenas existir os tratamentos para mudar a apresentação dos painéis, e não a definição do que deve ou não ser escrito dentro deles. Veja como melhor as coisas:
1) Configure o texto de cada painel em outro lugar, como em um evento de inicialização, ou no evento [b:da48d1c478]OnTimer [/b:da48d1c478]de um [b:da48d1c478]Timer[/b:da48d1c478], se vc quiser que a data seja apresentada em tempo real. Para isso, simplesmente configure a propriedade [b:da48d1c478]Text [/b:da48d1c478]de cada painel para o texto desejado:
Barra.Panels[0].Text := LongDayNames[DayOfWeek(Now)] + ´, ´ + IntToStr(DayOf(Now)) + ´ de ´ + LongMonthNames[MonthOf(Now)] + ´ de ´ + IntToStr(YearOf(Now))); Barra.Panels[1].Text := UpperCase(FORMACESSO.DBLookupComboBox1USUARIOS.text);
Note que eu usei as funções [b:da48d1c478]DayOf[/b:da48d1c478], [b:da48d1c478]MonthOf [/b:da48d1c478]e [b:da48d1c478]YearOf[/b:da48d1c478] (unit [b:da48d1c478]DateUtils[/b:da48d1c478]), para pegar os números do dia, do mês e do ano, respectivamente, e os arrays globais [b:da48d1c478]LongDayNames [/b:da48d1c478]e [b:da48d1c478]LongMonthNames [/b:da48d1c478]para pegar os nomes dos dias da semana e dos meses, nessa ordem. Esses arrays utilizam o idioma definido na opção ´Configurações regionais´ no Painel de controle. Desta forma evita-se ter que criá-los manualmente.
2) No evento [b:da48d1c478]OnDrawPanel[/b:da48d1c478], escreva apenas este código:
procedure TFORMPRINCIPAL.barraDrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect); begin with Barra.Canvas do begin Font.Name := ´Arial´; Font.Color := clNavy; FillRect(Rect); ImageList.Draw(Barra.Canvas, Rect.Left + 5, Rect.Top + 1, Panel.Index); TextOut(Rect.Left + 25, Rect.Top + 1, Panel.Text); end; end;
Muito mais simples e legível não? ;-)
3) Por fim, para exibir o hint corrente da aplicação, altere a propriedade [b:da48d1c478]AutoHint [/b:da48d1c478]da barra de status para [b:da48d1c478]True[/b:da48d1c478], e implemente seu evento [b:da48d1c478]OnHint [/b:da48d1c478]para:
Barra.Panels[2].Text := Application.Hint;
Compilei este código apenas mentalmente, mas acredito que funcione.
[]´s
Responder
Gostei + 0
17/09/2006
Tchucky
Obrigado Michael dessa forma q vc falo é bem mais facil e usa menos código eu testei aqui e ficou legal....
mas eu dei uam ativada na proriedade UseSystemFont para ver c acontecia aguma coisa e as coisa apareu tudo srrssr é cada coisas q deixa a gente doido...
mas muito obrigado pela vlw
mas eu dei uam ativada na proriedade UseSystemFont para ver c acontecia aguma coisa e as coisa apareu tudo srrssr é cada coisas q deixa a gente doido...
mas muito obrigado pela vlw
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)