Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-02-2005
jymy788 jymy788 is offline
Miembro
 
Registrado: jun 2004
Posts: 120
Poder: 20
jymy788 Va por buen camino
Dbgrid & Memo

Buenas tardes a todos los foreros.

Vamos a ver, antes de nada decir que he estado buscando lo habido y por haber sobre mi problema en los foros y efectivamente, tengo casi todo solucionado pero ahora he llegado a un punto muerto y necesito vuestra ayuda:

Tengo un dbgrid que apunta a una tabla con un campo memo que quiero visualizar sin que salga el típico [MEMO]. Eso lo tengo solucionado, y el botón de cbsEllipsis puesto para que me sace los tres puntitos y habilitar entonces el evento onEditButtonClick. ...

Los tres puntitos esos no abren ningún componente propio del Dbgrid con lo cual, la única opción es poner un dbMemo apuntando al campo (supongo) y visualizarlo o no dependiendo. Pues bien, a mi todo esto me da un error al editar el campo, cuando grabo, de ROWID no válido y no tengo ni idea de por qué es.

Os adjunto el ejemplito tonto (básico) que tengo montado para que le puedan echar un vistazo y así decirme.

Además, he estado trasteando algo con la propiedad PickList del campo en el dbgrid, me puede alguien decir para qué sirve y su funcionamiento?

Gracias de antemano a todos.
Archivos Adjuntos
Tipo de Archivo: zip Blob.zip (7,9 KB, 46 visitas)
Responder Con Cita
  #2  
Antiguo 09-02-2005
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
Hola Jymy!

Revisé el código que adjuntaste, sin embargo no he puedo ayudare a resolver el error que comentas porque en el form tienes una tabla que hace referencia a un Alias y obviamente no adjuntaste las bases de datos.

Espero que no te moleste si publicó parte de tu código de ejemplo, es tan sólo para hacer algunas recomendaciones.

Código Delphi [-]
var
  Form1: TForm1;
  Text : string;
  lst : TStrings;

implementation

{$R *.dfm}

procedure TForm1.Table1LARGOGetText(Sender: TField; var Text: String;
  DisplayText: Boolean);
begin
  Text:= Trim (Sender.asString);
  //lst := TStringList.Create;
  //lst.Add(Sender.asString);
  //DBGrid1.Columns[0].PickList := lst;
end;

procedure TForm1.Table1LARGOSetText(Sender: TField; const Text: String);
begin
  Sender.AsString := Text;
end;

procedure TForm1.DBGrid1EditButtonClick(Sender: TObject);
begin
  //DBGrid1.Columns[0].PickList := lst;
  //DBMemo1.Visible := true;
end;

En primer lugar, es correcto utilizar el evento OnGetText para mostrar el contenido del campo y evitar que aparezca el texto [Memo] en el DBGrid, pero no considero necesario utilizar el evento OnSetText.

Otra recomendación es que para editar el campo memo, utilices otra ventana que se mostrará cuando el usuario pulse sobre botón de edición en la celda del DBGrid.

Por ejemplo en el evento OnEditButtonClick puedes hacer algo como esto:

Código Delphi [-]
procedure TForm1.DBGrid1EditButtonClick(Sender: TObject);
begin
  with (Sender as TDBGrid) do
    if Columns [SelectedIndex].FieldName='LARGO' then
      with TForm2.Create(Self) do
      try
        ShowModal;//Muestra el Form2 que contiene el campo memo
      finally
        Free;
      end;
end;

De esta forma si la columna seleccionada está ligada con el campo que se llama 'LARGO', entonces abres otra ventana (Form2) con el campo memo que quieres editar.

*********************************************************
Por otra parte la propiedad PickList sirve para mostrar una lista desplegable dentro de una celda del DBGrid, es como un ListBox en donde puedes agregar elementos para que el usuario los seleccione al momento de editar la celda.

Un ejemplo:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  DBGrid1.Columns[0].ButtonStyle:=cbsAuto;
  DBGrid1.Columns[0].PickList.Add('Elemento 1');
  DBGrid1.Columns[0].PickList.Add('Elemento 2');
  DBGrid1.Columns[0].PickList.Add('Elemento 3');
end;

Esto mostrará una lista desplegable en la primera columna del DBGrid.

Espero que se haya aclarado algo, un saludo.
Responder Con Cita
  #3  
Antiguo 09-02-2005
jymy788 jymy788 is offline
Miembro
 
Registrado: jun 2004
Posts: 120
Poder: 20
jymy788 Va por buen camino
Gracias pero no me ha ayudado

Te comento.... No adjunté la tabla de la base de datos porque supuse que se la podrían replicar, o crear una nueva, se trata de una tabla de oracle con dos campos, 'corto' (varchar2(80)) y 'largo' (Varchar2(500)).

Mira a ver si ahora puedes replicar el error, haciendo correr el programa please, porque vale, muchas visitas al hilo, pero nadie me ha dado una solución o consejo.

En cuanto a tus anotaciones de tu respuesta, tienes razón en todo. El SetText lo utilizo para hacer pruebas tontas, y lo de sacar una ventanita a parte..... ya sé que es la mejor solución pero si eso se lo explicas tu a mi jefe ok? jejeje. El tiene razón, la verdad y coñas a parte, en este caso nos convendría no tener que sacar una ventanita a parte.

Un saludo.
Responder Con Cita
  #4  
Antiguo 09-02-2005
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
Hola jymy!

Te comentó que efectivamente habia creado una tabla con dos campos para tratar de replicar el error, pero con mi tabla funciona correctamente. Lo único que me brinca un poco es que en las propiedades del campo "LARGO" en la tabla que colocaste en el Form, aparece la clase de campo como [fkInternalCalc] y debería aparecer [fkData].

Bueno ahora que has dado más información trataré de ayudarte a resolverlo, Con respecto al asunto de editar el memo sin abrir otra ventana, en un principio me confundí porque creí que el propósito de colocar el botón de edición en la celda era para abrir el campo por separado. Entonces creo que debo retractarme, este caso si tiene sentido usar OnSetText como lo habias puesto para editar el campo directamente en el DBGrid (una dispulpa por sugerir cambiar algo que era correcto).

Entiendo perfectamente el asunto de los caprichos de los jefes, a mi me ocurre todo el tiempo.

Un saludo y seguimos en contacto.

Última edición por Héctor Randolph fecha: 09-02-2005 a las 16:26:24. Razón: Corregir texto
Responder Con Cita
  #5  
Antiguo 10-02-2005
jymy788 jymy788 is offline
Miembro
 
Registrado: jun 2004
Posts: 120
Poder: 20
jymy788 Va por buen camino
Gracias pero sigo colgado

Buenas de nuevo Héctor.

Gracías por tu respuesta... este componente es una "mierda" para estos casos, después de romperte la cabeza para que no aparezca el horrible [MEMO], y conseguirlo, cuando quieres grabar te da ese error asqueroso e inexplicable....

Además, para terminar de quemarme, aunque da el error de "invalid rowid" el muy capullo del BDE (creo que es el culpable) graba los cambios !!!!!!

En fin, inexplicable, a ver si se te ocurre algo más.

Pd.- Voy a probar con el RXDBGrid (de las rusas) que creo haber leído que solucionan varios problemas con Memos, mientras tanto, lo dicho, cualquier cosa que se te ocurra....

Gracias !!!
Responder Con Cita
  #6  
Antiguo 10-02-2005
jymy788 jymy788 is offline
Miembro
 
Registrado: jun 2004
Posts: 120
Poder: 20
jymy788 Va por buen camino
Casi Conseguido!!!!!!!!!!!!!

CASI CONSEGUIDO!!!!!!!!!!!!!

Buenas a todos los que les interese el problema del mítico 'INVALID COLUMN ROWID'

En esta página http://www.scalabium.com/smdbgrid.htm hay un componente muy chulo que intergra el RXDBGrid y que tiene bastantes mejoras. Pues bien, con este componente sigue dando el error de marras pero si en la tabla, en el evento AfterPost ponemos

table1.Close;
table1.Open;
table1.Refresh;

El índice del rowid vuelve a ser estable !!!!!

Problema solucionado casi porque no sé que tal irá esto con tablas inmensas, si os sirve de referencia con 20000 registros es inmediato.

Un saludo y espero que os sirva todo esto.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 06:32:18.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi