Ir al contenido


Foto

[RESUELTO] Del indicador a las palabras. (TDbGrid con campos memo)


  • Por favor identifícate para responder
32 respuestas en este tema

#21 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 01 julio 2010 - 09:35

De ése registro (o de los que siguen), siempre se mostrará el texto, no completo sino más bien un extracto de 'n' caracteres que le den una idea de qué contiene el campo.


Pues es que entonces lo solucionas con mi primer recomendación



delphi
  1. procedure TForm1.Table1NotesGetText(Sender: TField; var Text: string;
  2.   DisplayText: Boolean);
  3. begin
  4.   Text := Copy(Table1Notes.AsString, 1, 250); // le asigne 250, pero puede ser el tamaño que se considere adecuado
  5. end;



Solo tendrás que hacer mas ancha la columna del dbgrid para que se vean los caracteres que quieras, lo demás podemos decir que es vanidad.

En éste y otros casos, querido amigo, "el que paga, manda", como en el póker.


:lipsrsealed:

Salud OS

  • 0

#22 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 01 julio 2010 - 09:41

Por eso hablaba yo de un evento de la celda o del TDbGrid. Y como le mencionaba a Fenareth, no es posible hacer más complicada la sentencia SQL que recupera los datos, puesto que le lleva cierta cantidad de tiempo presentarlos y no queremos que tarde más de lo que debe.


Cualquier evento que uses si no tienes el foco en el registro actual, nada se podrá mostrar fuera del dbgrid. O haces una consulta extra ó se tienen que colocan en el registro que se desea ver, yo digo que no hay de otra forma, pero quien soy yo para decir NO se puede :D :D :D

Salud OS
  • 0

#23 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 01 julio 2010 - 11:41

Cualquier evento que uses si no tienes el foco en el registro actual, nada se podrá mostrar fuera del dbgrid. O haces una consulta extra ó se tienen que colocan en el registro que se desea ver, yo digo que no hay de otra forma, pero quien soy yo para decir NO se puede :D :D :D


Podría estar equivocado, pero me ha tocado ver DbGrid's que muestran los memos de los datos añadidos a ellos..., y ése es el efecto que quisiera lograr, ya que no se compraría un paquete de componentes nomás por una rejilla para cumplirle un requerimiento al cliente.

Y como dije, podría estar equivocado.
  • 0

#24 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 01 julio 2010 - 12:36

Podría estar equivocado, pero me ha tocado ver DbGrid's que muestran los memos de los datos añadidos a ellos..., y ése es el efecto que quisiera lograr, ya que no se compraría un paquete de componentes nomás por una rejilla para cumplirle un requerimiento al cliente.


Aquí tienes uno de esos componentes grid que muestran la información no solamente de los campos memo, sino de los campos blob (imagenes por ejemplo).

http://www.scalabium.com/smdbgrid.htm

Anteriormente en este mismo hilo te mencionaron los componentes JEDI por ejemplo.


Ambos de son de libre distribución. Si no quieres instalarlos puedes ver su código fuente para investigar cómo logran el efecto.

Saludos

P.D. Sinceramente yo me tomaría la opción de Egostar. Por más que leo este mensaje no alcanzo a ver cuál es el inconveniente de añadir algunas líneas al Dataset para lograr el mismo efecto.

  • 0

#25 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 01 julio 2010 - 02:52

¿Es esto lo que quieres lograr?

Esta hecho con el enlace que te dio Egostar, de eso ya hace algun tiempo, recuerdo que creé un campo calculado llamado Notas el cual enlacé al campo memo de la bd y use el evento OnGetText. No hay intervencion del usuario.

Archivos adjuntos


  • 0

#26 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 02 julio 2010 - 08:56

aqui te paso un code que te puede servir



delphi
  1. procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field:
  2. TField; State: TGridDrawState);
  3. var
  4.   P  : array [0..50] of char;  //array con el número de caracteres del campo de tipo memo
  5.   BS : tBlobStream;           
  6.   S  : String;
  7. begin
  8.   If Field is TMemoField then
  9.   begin
  10.     with (Sender as TDBGrid).Canvas do
  11.     begin //Table1Notas es el TMemoField
  12.       BS := tBlobStream.Create(Table1Notas, bmRead);
  13.       FillChar(P,SizeOf(P),#0);
  14.       BS.Read(P, 50); //lee 50 caracteres del memo en el blobStream
  15.       BS.Free;
  16.       S := StrPas(P);
  17.       while Pos(#13, S ) > 0 do  //quita el retorno
  18.         S[Pos(#13, S)] := ' ';
  19.       While Pos(#10, S) > 0 do  //la  linea
  20.         S[Pos(#10, S)] := ' ';
  21.       FillRect(Rect);  //limpia la celda
  22.       TextOut(Rect.Left, Rect.Top, S); //llena la celda con los datos del memo
  23.     end;
  24.   end;
  25. end;


  • 0

#27 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 09 julio 2010 - 09:45

Pues tras mucho talachearle (o sea, trabajar arduamente para resolver el problema) quedó por fin listo. Tal vez no sea muy "elegante" la solución, pero a mí me funciona muy bien.

El código:



delphi
  1. procedure TFrmDtllBnsInm.dbgrdBnsInmDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
  2. var
  3.   Rectangulo : TRect;
  4. begin
  5. // 20100708 FEOL Modificada para adaptarse a los cambios realizados, incorporación de
  6. //              negocio-dato propios y recuperación directa de los datos.
  7.   with Sender as TDBGrid do
  8.   begin
  9.     if Column.FieldName = 'CmnBnsMbl' then
  10.     begin
  11.       if dbgrdBnsInm.Columns.Items[1].Field.Value <> '' then
  12.       begin
  13.         Rectangulo := Rect;
  14.         DrawText(Canvas.Handle,
  15.                 PChar(dbgrdBnsInm.Columns.Items[1].Field.AsString),
  16.                 StrLen(PChar(dbgrdBnsInm.Columns.Items[1].Field.AsString)),
  17.                 Rectangulo,
  18.                 DT_EDITCONTROL);
  19.       end;
  20.     end;
  21.   end;
  22. end;


  • 0

#28 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 09 julio 2010 - 09:50

Que tal amigo Felipe.mx, tengo curiosidad de que es lo que hace tu código,  sería mucha molestia (y si puedes) que subieras una imagen del resultado. La verdad que sigo sin haber entendido tu requerimiento, perdón  :embarrassed:

Salud OS
  • 0

#29 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 09 julio 2010 - 09:58

Que tal amigo Felipe.mx, tengo curiosidad de que es lo que hace tu código,  sería mucha molestia (y si puedes) que subieras una imagen del resultado. La verdad que sigo sin haber entendido tu requerimiento, perdón  :embarrassed:

Salud OS


Simple como ésto.

Archivos adjuntos


  • 0

#30 kasluj

kasluj

    Newbie

  • Miembros
  • Pip
  • 2 mensajes

Escrito 09 septiembre 2010 - 07:06

Bueno. no se si sirva de algo, ya que se marco RESUELTO, pero ami no me agrada llenar de declaraciones el dataset, me refiero para el OnGetText, yo creee una unidad y la llame MyDBGrid.pas    :tongue: 

Despues declare esto:



delphi
  1. unit MyDBGrid;
  2.  
  3. interface
  4.  
  5. uses
  6.     Windows, DBGrids, Types, Grids, Controls, Classes, Messages, ADODB, DB,
  7.     StdCtrls, Graphics, Forms, DBCtrls, SysUtils, Variants;
  8.  
  9.  
  10. type TDBGrid = class(DBGrids.TDBgrid)
  11.   protected
  12.   procedure DrawColumnCell(const Rect: TRect; DataCol: Integer;
  13.                             Column: TColumn; State: TGridDrawState); override;
  14.   procedure ColEnter; override;
  15.   procedure DblClick;override;
  16.  
  17.  
  18. end;
  19.  
  20. implementation
  21.  
  22.  
  23.  
  24. Procedure TDBgrid.ColEnter;
  25. begin
  26.   inherited;
  27.   if Self.SelectedField = nil then Exit;
  28.  
  29.   if Self.SelectedField.DataType = ftMemo then
  30.     Self.Options := Self.Options - [dgEditing]
  31.   else
  32.     Self.Options := Self.Options + [dgEditing];
  33. end;
  34.  
  35. Procedure TDBgrid.DrawColumnCell(const Rect: TRect; DataCol: Integer;
  36.                                   Column: TColumn; State: TGridDrawState);
  37. var R :TRect;
  38. var s : String;
  39. begin
  40.  
  41.   inherited;
  42.  
  43.   if Column.Field = nil then Exit;
  44.  
  45.   (*mostramos campo memo*)
  46.   R:=Rect;
  47.   Inc(R.Top ,2);
  48.   Inc(R.Left ,2);
  49.  
  50.  
  51.   if Column.Field.DataType = ftMemo then
  52.   begin
  53.       Self.Canvas.FillRect(Rect);
  54.  
  55.     S := Copy(Column.Field.AsString,1,50);
  56.     S := StringReplace(S, #10, #32,[rfReplaceAll]);
  57.     S := StringReplace(S, #13, #32,[rfReplaceAll]);
  58.  
  59.     DrawText(Self.Canvas.Handle, PChar(S), Length(S),R,DT_END_ELLIPSIS); // para poner trespuntos ....
  60. // si no cabe el string en la celda
  61.   end;
  62.  
  63. end;
  64.  
  65.  
  66. Procedure TDBGrid.DblClick;
  67. var Frm : TForm;
  68. var MM  : TDBMemo;
  69. begin
  70.   inherited;
  71.  
  72. if not Self.DataSource.DataSet.Active then Exit;
  73.  
  74. if Self.DataSource.DataSet.IsEmpty then Exit;
  75.  
  76. if Self.SelectedField = nil then Exit;
  77.  
  78. if Self.DataSource.DataSet.RecordCount <= 0  then Exit;
  79.  
  80.  
  81. if Self.SelectedField.DataType = ftMemo then
  82. begin
  83.     Frm := TForm.Create(nil);
  84.     try
  85.       Frm.Width := 240;
  86.       Frm.Height := 120;
  87.       Frm.BorderStyle := bsToolWindow;
  88.       Frm.Caption := 'Edición';
  89.       MM := TDBMemo.Create(nil);
  90.       try
  91.         MM.Parent := Frm;
  92.         MM.Align := alClient;
  93.         MM.DataSource := Self.DataSource;
  94.         MM.DataField := Self.SelectedField.FieldName;
  95.         Frm.Position :=  poScreenCenter;
  96.         Frm.ShowModal;
  97.         if Self.DataSource.DataSet.State in [dsedit,dsinsert]  then
  98.           Self.DataSource.DataSet.Post;
  99.       finally begin
  100.         MM.Free;
  101.       end;
  102.       end;
  103.     finally begin
  104.       FreeAndNil(Frm);
  105.     end;
  106.     end;
  107. end;
  108.  
  109. end;








Despues  lo coloco en el uses de cada uno de los Forms que deseo y listo.....





delphi
  1. unit Forma1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, ... , MyDBgrid;




Verifica y me...


----------------------------------------------------------------------------------

Ups! se me olvido poner el evento OnDblClick, que sirve para visualizar el campo MEMO en un formulario creado dinámicamente..

  • 0

#31 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 09 septiembre 2010 - 07:35

Buenas,

Bienvenido a los foros kasluj.

Sólo decir que lo que haces tiene un nombre y es "clases interpuestas". Martens lo describe muy bien en uno de sus tricks y lo considero una buena forma de hacer cuando realmente sabes lo que haces :) y hay que prestar especial atención al último apartado, sobre todo cuando dice lo de "....pero teniendo cuidado de ubicarla después de la unidad donde se encuentra la clase original...."

Gracias por el código y la idea

Nos leemos

  • 0

#32 kasluj

kasluj

    Newbie

  • Miembros
  • Pip
  • 2 mensajes

Escrito 09 septiembre 2010 - 08:33

Buenas,

Bienvenido a los foros kasluj.

Sólo decir que lo que haces tiene un nombre y es "clases interpuestas". Martens lo describe muy bien en uno de sus tricks y lo considero una buena forma de hacer cuando realmente sabes lo que haces :) y hay que prestar especial atención al último apartado, sobre todo cuando dice lo de "....pero teniendo cuidado de ubicarla después de la unidad donde se encuentra la clase original...."

Gracias por el código y la idea

Nos leemos



Ohhhh!!  :o  eso es cierto, colocarlo despues del original (si no, pues no sirve).

Como yo uso esta técnica ya casi al final del proyecto, por eso siempre la coloco al final...


Gracias por la bienvenida.    (b)
  • 0

#33 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 09 septiembre 2010 - 05:47

.........y hay que prestar especial atención al último apartado, sobre todo cuando dice lo de "....pero teniendo cuidado de ubicarla después de la unidad donde se encuentra la clase original...."


Pues tiene toda la razón, me acaba de pasar eso mismo que comenta cuestión que me tomo un par de horas en detectar, resulta que al crear un webservice generamos una clase remota donde se incluía una variable de tipo TStringList, al momento de generar la clase desde el WSDL Delphi generó su propia definición de la clase TStringList pero sin ninguna propiedad, ¿que era lo que pasaba?, que al querer trabajar con esa variable, no tenía ninguna propiedad ni método del componente en cuestión.

Investigando encontré que este tipo de variable no es válidad para ser utilizada en un webservice, este asuto data de 2005 donde se recomienda utilizar una variable de tipo widestring.

Salud OS
  • 0




IP.Board spam blocked by CleanTalk.