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

O que há de errado aqui?


ZueRa

Pergunta

procedure TFconsobs.DBGrid1DrawColumnCell(Sender: TObject;

const Rect: TRect; DataCol: Integer; Column: TColumn;

State: TGridDrawState);

var

RectNovo: TRect;

begin

if Column.FieldName = 'Obsregistro' then

begin

if gdSelected in State then

begin

DBGrid1.Canvas.Brush.Color := clHighlight;

DBGrid1.Canvas.Font.Color := clHighlightText;

end;

RectNovo := Rect;

RectNovo.Top := RectNovo.Top + 2;

RectNovo.Left := RectNovo.Left + 2;

DrawText(DBGrid1.Canvas.Handle, PChar(Column.Field.AsString),

Length(Column.Field.AsString), RectNovo,

Align[Column.Alignment]or DT_WORD_ELLIPSIS); // linha 69

end;

end;

Ao compilar está surgindo o erro: "[Error] Uconsobs.pas(69): Array type required".

Não estou entendendo o porque deste.

Alguém pode me ajudar?

Obrigado desde já,

Thiago.

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

5 respostass a esta questão

Posts Recomendados

  • 0

Ele está lhe informando que a array passada como parametro tem que ter um tipo de dados correspondente como retorno.

você está usando o DrawCol....

tente usar este codigo em DrawData...:

with DBGrid1, Canvas, DataSource, DataSet do begin
      if (RecordCount = 0) then Exit; //sai caso não tenha registro algum para desenhar.
      if gdSelected in State then begin
        Brush.Color := corSel; //cor do item selecionado
        Font.Color := $00804000;
      end else begin
        if odd(RecNo) then begin
          Font.Color:= clBlack;
          Brush.Color:= corZebra1; //cor da zebra 1
        end else begin
          Font.Color:= clBlack;
          Brush.Color:= corZebra2; //cor da zebra 2
        end;
      end;
      //essas cores podem ser em $99999999 ou clBlue vinculado
      FillRect(Rect);
      TextOut(Rect.Left+2,Rect.Top,Field.AsString);
    end;

se quiser algo melhor que não seja preciso colocar isso todas as vezes em seu grid, >>> procure por dbzebragrid neste forum, clique em pesquisar no topo e digite dbzebragrid, se não conseguir encontrar ai vai o link

DBZebraGrid

Sendo o seu ancestor o DBGrid, não esqueça.

OK.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Eder, obrigado pela ajuda.

Mas, mesmo assim há um erro.

[Error] Uconsobs.pas(60): Operator not applicable to this operand type

begin
with DBGrid1, Canvas, DataSource, DataSet do begin
      if (RecordCount = 0) then Exit; //sai caso não tenha registro algum para desenhar.
      if gdSelected in State then begin {------------------------------------------------------------------- LINHA 60 }
        Brush.Color := clBlue; //cor do item selecionado
        Font.Color := $00804000;
      end else begin
        if odd(RecNo) then begin
          Font.Color:= clBlack;
          Brush.Color:= clBlue; //cor da zebra 1
        end else begin
          Font.Color:= clBlack;
          Brush.Color:= clBlue; //cor da zebra 2
        end;
      end;
      //essas cores podem ser em $99999999 ou clBlue vinculado
      FillRect(Rect);
      TextOut(Rect.Left+2,Rect.Top,Field.AsString);
    end;
end;

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

  • 0

Olá amigo, consegui resolver.

Fui no FieldsEditor da Table e, adicionei aquele que eu queria obter algo. Após isto fui no evento OnGetText e adicionei o seguinte código:

procedure TDmdados.TmemoinfoObsregistroGetText(Sender: TField;
  var Text: String; DisplayText: Boolean);
  begin
    Text := Copy(Dmdados.Tmemoinfo.FieldByName('Obsregistro').AsString, 1, 50);
  end;

É isto, fica aí a dica pra quem estiver com o mesmo problema ;)

porém, eu ainda gostaria de saber o erro deste código, se puder ajudar, agradeço.

[]s Thiago.

Link para o comentário
Compartilhar em outros sites

  • 0

Eliminando as dúvidas...

procedure TFconsobs.DBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
var
  RectNovo: TRect;
begin
  if Column.FieldName = 'Obsregistro' then
  begin
    if gdSelected in State then
    begin
      DBGrid1.Canvas.Brush.Color := clHighlight;
      DBGrid1.Canvas.Font.Color := clHighlightText;
    end;
    RectNovo := Rect;
    RectNovo.Top := RectNovo.Top + 2;
    RectNovo.Left := RectNovo.Left + 2;
    DrawText(DBGrid1.Canvas.Handle, PChar(Column.Field.AsString),
      Length(Column.Field.AsString), RectNovo,
      Align[Column.Alignment]or DT_WORD_ELLIPSIS); [b]// linha 69[/b]
  end;
end;
Ao compilar está surgindo o erro: "[Error] Uconsobs.pas(69): Array type required". Não estou entendendo o porque deste.
ZueRa, eu lhe perguntaria qual o objectivo do código acima, mas como você já achou a solução, não vou entrar nesta questão. Lembre-se sempre de usar a tag CODE no lugar de QUOTE para mostrar seu código. Veja como fica melhor a visualização do código da forma como está aqui. Quanto ao erro, você deve saber que a função DrawText é uma função da API. Se você pesquisar no help (Windows SDK) verá que o último parâmetro esperado pode ser uma "concatenação" de flags, que são na verdade words com valores binários - cada flag tem um determinado bit ligado (que representa a opção) e por isso utiliza-se do OR (operação binária). Voce não postou a declaração do seu Align, então não dá para saber exatamente como sugerir a correção do erro. A mensagem sugere que você não declarou ele como sendo um array of, visto que você fez uso dele como se o fosse. Então o compilador diz: "requirido tipo array".
Mas, mesmo assim há um erro. [Error] Uconsobs.pas(60): Operator not applicable to this operand type
begin
with DBGrid1, Canvas, DataSource, DataSet do begin
      if (RecordCount = 0) then Exit; //sai caso não tenha registro algum para desenhar.
      if gdSelected in State then begin {------------------------------------------------------------------- LINHA 60 }
        Brush.Color := clBlue; //cor do item selecionado
        Font.Color := $00804000;
      end else begin
        if odd(RecNo) then begin
          Font.Color:= clBlack;
          Brush.Color:= clBlue; //cor da zebra 1
        end else begin
          Font.Color:= clBlack;
          Brush.Color:= clBlue; //cor da zebra 2
        end;
      end;
      //essas cores podem ser em $99999999 ou clBlue vinculado
      FillRect(Rect);
      TextOut(Rect.Left+2,Rect.Top,Field.AsString);
    end;
end;

Aqui o problema está associado ao uso dos objetos utilizados na cláusula with ... do. É uma boa opção para evitar longas linhas no código, mas perde-se um pouco da visibilidade de que propriedade/método pertence a quem.

Observe a linha onde ocorreu o erro; veja que propriedade está sendo usada ali (State). Agora, avalie os objetos colocados na cláusula with; Existem três deles que tem uma propriedade exatamente com este nome, são eles:DBGrid1, DataSource e DataSet.

Então, como pode o compilador ter certeza de qual usar? Ele provavelmente considerou que fosse o do DataSet (último lista, supondo que ele usou o último da pilha), do contrário, DBGrid1 sendo o primeiro, não teria ocorrido o erro.

Então, quando há esta ambiguidade, você deve "esquecer" o with (nesta linha) e preceder a propriedade/método como o nome do objeto que você quer referenciar. Neste caso, na linha onde ocorreu o erro, ela deveria ficar:

if gdSelected in DBGrid1.State then begin

Isto também é válido para funções/variáveis que estejam declaras com o mesmo nome em units diferentes.

Abraços

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,3k
    • Posts
      652,4k
×
×
  • Criar Novo...