problema ao exibir os dados no dbgrid inseridos por uma memo

Delphi

20/09/2012

Olá amigos..

Tenho um botão cadastrar que está funcionando,no form cadastrar tem uma memo que recebe registro de atendimento
no form consultar aparecem todos os dados na dbgrid menos os dados da memo. Na coluna regidtrosup que é da memo aparece só escrito (memo)
Não sei como corrigir este erro.

procedure Tfrmsuporteteccons.DBGridDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
var R : TRect;
begin
R:=Rect;
Dec(R.Bottom,2);
    if Column.Field=DM.ADOQuerySqlconstec.FieldByName(''descricaosup'') then
      begin
        if not (gdSelected in State) then
           DBGrid.Canvas.FillRect(Rect);
           DBGrid.Canvas.TextRect(R,R.Left,R.Top,
           DM.ADOQuerySqlconstec.FieldByName(''descricaosup'').AsString);
        end;
      end;
end.


Coloquei este codigo no evento da dbgrid mas não funcionou agradeço a quem possa ajudar
Mauricio Nicoli

Mauricio Nicoli

Curtidas 0

Respostas

Claudia Nogueira

Claudia Nogueira

20/09/2012

Olá amigos..

Tenho um botão cadastrar que está funcionando,no form cadastrar tem uma memo que recebe registro de atendimento
no form consultar aparecem todos os dados na dbgrid menos os dados da memo. Na coluna regidtrosup que é da memo aparece só escrito (memo)
Não sei como corrigir este erro.

procedure Tfrmsuporteteccons.DBGridDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
var R : TRect;
begin
R:=Rect;
Dec(R.Bottom,2);
    if Column.Field=DM.ADOQuerySqlconstec.FieldByName(''descricaosup'') then
      begin
        if not (gdSelected in State) then
           DBGrid.Canvas.FillRect(Rect);
           DBGrid.Canvas.TextRect(R,R.Left,R.Top,
           DM.ADOQuerySqlconstec.FieldByName(''descricaosup'').AsString);
        end;
      end;
end.


Coloquei este codigo no evento da dbgrid mas não funcionou agradeço a quem possa ajudar


Eu não faria dessa forma, eu colocaria na sentença SQL que busca os dados no banco um comando pra converter o blob em string pra uma determinada quantidade de caracteres e aí ligaria o campo do grid a esse field.
Exemplo:
SELECT CAST(SUBSTRING(campo FROM 1 FOR 1000) AS VARCHAR(100)) campo FROM tabela
GOSTEI 0
Mauricio Nicoli

Mauricio Nicoli

20/09/2012

eu não entendi muito bem seu código..tentei dessa forma..

private
    function MostraMemo(Dts: TDatasource; Dbg: TDBGrid; Fld: TField): Boolean;
    { Private declarations }
...

procedure Tfrmsuporteteccons.DBGridCellClick(Column: TColumn);
begin
   MostraMemo(DBGrid.DataSourceconstec, DBGrid, DBGrid.SelectedField);
end;

function Tfrmsuporteteccons.MostraMemo(Dts: TDataSourceconstec;
  Dbg: TDBGrid; Fld: TField): Boolean;
var
  Frm: TForm;
  Ret: Boolean;
  Mem: TDBMemo;
begin
  Ret := False;
  if Dts.DataSet.RecordCount > 0 then
     if Dbg.SelectedField = Fld then begin
        Ret := True;
        Frm := TForm.Create(nil);

        try
          Frm.Width       := 240;
          Frm.Height      := 120;
          Frm.Top         := Mouse.CursorPos.Y;
          Frm.Left        := Mouse.CursorPos.X;
          Frm.BorderStyle := bsToolWindow;
          Frm.Caption     := Fld.DisplayLabel;
          Mem := TDBMemo.Create(nil);
          try
            Mem.Parent     := Frm;
            Mem.Align      := alClient;
            Mem.DataSourceconstec := Dts;
            Mem.DataField  := Fld.FieldName;
            Mem.ReadOnly   := True;
            Mem.ScrollBars := ssVertical;
            Frm.ShowModal;
          finally
            Mem.Free;
          end;
        finally
          Frm.Free;
        end;
     end;
   Result := Ret;
end;

end;


criei uma função para exibir numa janela as informações da dbgrid inseridas pela memo..

só que tá erro na linha..[b]function MostraMemo(Dts: TDatasource; Dbg: TDBGrid; Fld: TField): Boolean;[/b]

diz que o TDatasource não está identificado..mas este componente eu coloquei num DM e não no form..
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

20/09/2012

Dá uma olhada nesse exemplo [url]http://www.cdnweb.com.br/tutorial_memo.rar[/url].
GOSTEI 0
Mauricio Nicoli

Mauricio Nicoli

20/09/2012

gostei muito do seu exemplo..

mas tem como usar o Datasource e o ClientDataSet dentro de um DM e incluir neste exemplo?
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

20/09/2012

gostei muito do seu exemplo..

mas tem como usar o Datasource e o ClientDataSet dentro de um DM e incluir neste exemplo?


É só colocar os componentes no DM, depois referenciar ele no form. Aí você liga o DBGrid no DataSource que está no DM.
GOSTEI 0
Mauricio Nicoli

Mauricio Nicoli

20/09/2012

tentei fazer isso sabe..mas não deu..sei que talvez esteja abusando um pouco..mas poderia dar uma olhada no meu código..
unit Unit10;

interface

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

type
  Tfrmsuporteteccons = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    btnpesquisar: TButton;
    DBGrid: TDBGrid;
    ComboBoxpesq: TComboBox;
    btnpesqreg: TButton;
    btnfechar: TButton;
    procedure btnfecharClick(Sender: TObject);
    procedure btnpesquisarClick(Sender: TObject);
    procedure btnpesqregClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure DBGridCellClick(Column: TColumn);
  private
    function MostraMemo(Dts: TDataSource; Dbg: TDBGrid; Fld: TField): Boolean;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmsuporteteccons: Tfrmsuporteteccons;

implementation

uses Unit6;

{$R *.dfm}

procedure Tfrmsuporteteccons.btnfecharClick(Sender: TObject);
begin
  close;
end;

procedure Tfrmsuporteteccons.btnpesquisarClick(Sender: TObject);
begin
 DM.ClientDataSetconstec.close;
 DM.ADOQuerySQLconstec.SQL.CLEAR;
 DM.ADOQuerySQLconstec.SQL.ADD('select codatend, filial,setor, nomepc, ip, datasup, nomefunc, descricaosup from suportetecnico where filial like :filial');
 DM.ADOQuerySQLconstec.Parameters.ParamByName('filial').Value:= comboboxpesq.text + '%';
 DM.ClientDataSetconstec.Open;
end;

procedure Tfrmsuporteteccons.btnpesqregClick(Sender: TObject);
begin
     DM.ClientDataSetconstec.close;
     DM.ADOQuerySqlconstec.Close; // fecha o query
     DM.ADOQuerySqlconstec.SQL.Clear; // apaga conteúdo da propriedade Sql
     // adiciona o comando SQL
     DM.ADOQuerySqlconstec.SQL.Add('SELECT * FROM suportetecnico');
     DM.ADOQuerySqlconstec.Open; // executa o query
     DM.ClientDataSetconstec.open;
end;

procedure Tfrmsuporteteccons.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  DM.ClientDataSetconstec.Close;
end;

procedure Tfrmsuporteteccons.DBGridCellClick(Column: TColumn);
begin
   MostraMemo(DBGrid.DataSourceconstec, DBGrid, DBGrid.SelectedField);
end;

function Tfrmsuporteteccons.MostraMemo(Dts: TDataSource;
  Dbg: TDBGrid; Fld: TField): Boolean;
var
  Frm: TForm;
  Ret: Boolean;
  Mem: TDBMemo;
begin
  Ret := False;
  if Dts.DataSet.RecordCount > 0 then
     if Dbg.SelectedField = Fld then begin
        Ret := True;
        Frm := TForm.Create(nil);

        try
          Frm.Width       := 240;
          Frm.Height      := 120;
          Frm.Top         := Mouse.CursorPos.Y;
          Frm.Left        := Mouse.CursorPos.X;
          Frm.BorderStyle := bsToolWindow;
          Frm.Caption     := Fld.DisplayLabel;
          Mem := TDBMemo.Create(nil);
          try
            Mem.Parent     := Frm;
            Mem.Align      := alClient;
            Mem.DataSourceconstec := Dts;
            Mem.DataField  := Fld.FieldName;
            Mem.ReadOnly   := True;
            Mem.ScrollBars := ssVertical;
            Frm.ShowModal;
          finally
            Mem.Free;
          end;
        finally
          Frm.Free;
        end;
     end;
   Result := Ret;
end;

end;

end.

a referencia que você fala é no uses? se eu coloco tipo
[code]
function MostraMemo(Dts: TDataSourceconstec; Dbg: TDBGrid; Fld: TField): Boolean; dá erro..
ou
function MostraMemo(Dts: DM.DataSourceconstec; Dbg: TDBGrid; Fld: TField): Boolean; dá erro também

preciso de um auxilio melhor se puder ajudar..

grato
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

20/09/2012

Quando falo referenciar quero dizer no Uses mesmo, então se o arquivo do DM for Unit6 aí já está referenciado. Se seu DataSource está no DM, você vai na propriedade DataSource do DBGrid e liga ele diretamente no DataSource que está no DM. Só isso já basta e a função é desse jeito mesmo:

function MostraMemo(Dts: TDataSource; Dbg: TDBGrid; Fld: TField): Boolean;


Se não funcionar, qual erro está dando?

Fiz o exemplo usando DataModule. Dá uma olhada.

[url]http://www.cdnweb.com.br/tutorial_memo.rar[/url]
GOSTEI 0
Mauricio Nicoli

Mauricio Nicoli

20/09/2012

assim..eu olhei seu exmplo..testei aqui e funcionou..

só que neste exemplo o datasource e o ClientDataSet estão no form e o meu está num DM.

antes de tentar arrumar esta questão da memo exibir um texto em uma janela eu tinha testado o meu
dbgrid e ele mostrava todos os campos menos o da memo que só aparecia escrito memo e não fazia nada..
ou seja, minhas conexões funcionam..só que ao inserir o código da função 'mostrarmemo' do exemplo que me enviou

dá o seguinte erro

[b]"o cursor para no TDatasource da função depois da palavra "private" e diz pas.24 "Undeclared identifier: TDatasource"
pas.24 "Undeclared identifier: TField"
[/b]
GOSTEI 0
Mauricio Nicoli

Mauricio Nicoli

20/09/2012

No caso no meu Datasource o nome dele no DM e Datasourceconstec e está ligado ao dbgrid via propriedade do datasource..
DM.Datasourceconstec ..isso tá certinho.
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

20/09/2012

No caso no meu Datasource o nome dele no DM e Datasourceconstec e está ligado ao dbgrid via propriedade do datasource..
DM.Datasourceconstec ..isso tá certinho.


Eu refiz o exemlo usando DataModule, por isso te passei o link novamente.
GOSTEI 0
Mauricio Nicoli

Mauricio Nicoli

20/09/2012

agradeço pela ajuda..
mas consegui fazer de outra maneira ao invés de usar uma memo pra descição usei um edit mesmo..

é que to com pouco tempo pra terminar o tcc e não posso mais perder tempo..

eu abri o arquivo que vc me mandou e funcionou..

tentei fazer o mesmo no meu trabalho e não deu..porque eu não sei..

mas agradeço pela ajuda..se eu tivesse mais tempo para descobrir o erro e arrumar eu com certeza usaria sei modelo

Grato..
GOSTEI 0
POSTAR