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;


Tchucky

Tchucky

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:

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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar