ZueRa Postado Março 7, 2009 Denunciar Share Postado Março 7, 2009 (editado) 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 Março 7, 2009 por ZueRa Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Eder Moraes Postado Março 7, 2009 Denunciar Share Postado Março 7, 2009 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 linkDBZebraGridSendo o seu ancestor o DBGrid, não esqueça.OK. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 ZueRa Postado Março 8, 2009 Autor Denunciar Share Postado Março 8, 2009 (editado) Olá Eder, obrigado pela ajuda.Mas, mesmo assim há um erro.[Error] Uconsobs.pas(60): Operator not applicable to this operand typebegin 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 Março 8, 2009 por ZueRa Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 ZueRa Postado Março 8, 2009 Autor Denunciar Share Postado Março 8, 2009 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Março 9, 2009 Denunciar Share Postado Março 9, 2009 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 beginIsto também é válido para funções/variáveis que estejam declaras com o mesmo nome em units diferentes.Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 ZueRa Postado Março 10, 2009 Autor Denunciar Share Postado Março 10, 2009 Obrigado pela explicação Micheus, valeu.Sobre o objetivo de eu ter perguntado sobre o código é o seguinte:retirar o (MEMO) que aparece no DBGrid quando se faz uma consulta.Abraço! Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
ZueRa
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 ZueRaLink para o comentário
Compartilhar em outros sites
5 respostass a esta questão
Posts Recomendados
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.