Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Dbgrid en Delphi 3 (https://www.clubdelphi.com/foros/showthread.php?t=81666)

dvd2000 05-12-2012 17:53:06

Dbgrid en Delphi 3
 
Hola a todos.
Tengo una aplicación hecha, hace muchisimos años, en Delphi 3. Estoy actualizando el programa, metiendo codigo nuevo, y me gustaría hacer lo siguiente, y después de dar muchas vueltas, no lo he conseguido, a ver si sois tan amables de echarme un cable.

Tengo una base de datos en paradox, y conectada a un DBGrid, uno de los campos es un comentario, y lo que quiero hacer es mientras el usuario teclea el comentario, saber en todo momento cuantos caracteres tiene ese comentario, por si llega a un límite determinado pues abrir otra ventana para que pueda escribir un comentario mayor.

Lo he intentado consultando sobre el registro pero hasta que el usuario no grabe el registro no sabré la nueva longitud, y ya es tarde, debo saberlo antes de que grabe.

Espero que me hayáis entendido. Y gracias anticipada.

dvd2000 06-12-2012 13:26:53

La cuestión es como accedo directamente a lo que se teclea para contar el nº de caracteres, y si llega por ejemplo a 20, pues abro una ventana.

En fin, espero que alguien me oriente como hacerlo.

Saludos.

dec 06-12-2012 14:15:09

Hola,

Lo que se teclea se teclea en algún sitio, es decir, en algún componente tipo "TDbMemo" o algo así. Ahora bien, creo que sería a este componente al que tendrías que "preguntar" por el texto que contenga en un momento dado. El propio componente contará con eventos como "OnKeyPress" que podrán echarte una mano. El caso es que no quiero asegurarlo del todo, porque, lo mío no son las bases de datos y ni los componentes "TDb*", o sea, que, estoy suponiendo que funcionan de forma parecida a los "normales", en lo que toca a acceder a sus propiedades, eventos, etc.

nlsgarcia 06-12-2012 19:38:38

dvd2000,

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, StdCtrls, DBCtrls, DB, ADODB, Mask;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    DBGrid1: TDBGrid;
    Memo1: TMemo;
    DBMemo1: TDBMemo;
    ADOConnection1: TADOConnection;
    ADOTable1: TADOTable;
    DataSource1: TDataSource;
    DBEdit1: TDBEdit;
    procedure DBMemo1KeyPress(Sender: TObject; var Key: Char);
    procedure DBGrid1KeyPress(Sender: TObject; var Key: Char);
    procedure DBEdit1KeyPress(Sender: TObject; var Key: Char);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Memo1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
   MaxLongComment = 30;

var
  Form1: TForm1;
  CountChar : Integer;

implementation

{$R *.dfm}

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
   if (Length(Edit1.Text) >= MaxLongComment) and (Key <> #8) then
   begin
      Key := #0;
      ShowMessage('Máxima longitud alcanzada');
   end
end;

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
   if (Length(Memo1.Text) >= MaxLongComment) and (Key <> #8) then
   begin
      Key := #0;
      ShowMessage('Máxima longitud alcanzada');
   end
end;

procedure TForm1.DBEdit1KeyPress(Sender: TObject; var Key: Char);
begin
   if (Length(DBEdit1.Text) >= MaxLongComment) and (Key <> #8) then
   begin
      Key := #0;
      ShowMessage('Máxima longitud alcanzada');
   end
end;

procedure TForm1.DBMemo1KeyPress(Sender: TObject; var Key: Char);
begin
   if (Length(DBMemo1.Text) >= MaxLongComment) and (Key <> #8) then
   begin
      Key := #0;
      ShowMessage('Máxima longitud alcanzada');
   end
end;

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
   if DBGrid1.Fields[DBGrid1.SelectedIndex]=(DBGrid1.DataSource.DataSet.FieldByName('Author')) then
   begin
      if DBGrid1.Controls[0] is TInPlaceEdit then
      with DBGrid1.Controls[0] as TInPlaceEdit do
      begin
         if (GetTextLen >= MaxLongComment) and (Key <> #8) then
         begin
            Key := #0;
            ShowMessage('Máxima longitud alcanzada');
         end;
      end;
   end;
end;

end.
El código anterior muestra ejemplos de como controlar la longitud de un texto en un control de entrada.

Espero sea útil :)

Nelson.

dvd2000 06-12-2012 20:40:43

Gracias por los aporte.

He probado los siguiente, según indicaciones de nlsgarcia, pero en tiempo de ejecución me sale siguiente error: Access violation at address 040E915 in module prueba.exe. Read of Address 00000008.

procedure TFprincipal.DBDatosKeyPress(Sender: TObject; var Key: Char);
begin
if DBdatos.Fields[DBDatos.SelectedIndex]=
(DBDatos.DataSource.DataSet.FieldByName('Proveedor')) then
begin
if DBDatos.Controls[0] is TInPlaceEdit then
with DBDatos.Controls[0] as TInPlaceEdit do
begin
if (GetTextLen >= 10) and (Key <> #8) then
begin
Key := #0;
ShowMessage('Máxima longitud alcanzada');
end;
end;
end;
end;



No sé donde puede estar el error.

Gracias por vuestro interes.

nlsgarcia 06-12-2012 21:45:03

dvd2000,

Cita:

Empezado por nlsgarcia
El código anterior muestra ejemplos de como controlar la longitud de un texto en un control de entrada.

Cita:

Empezado por dvd2000
En tiempo de ejecución me sale siguiente error: Access violation at address 040E915 in module prueba.exe. Read of Address 00000008.

El ejemplo implementado en Delphi 7 esta en el link: http://terawiki.clubdelphi.com/Delph...Input_Text.rar

La aplicación incluye la BD para que lo pruebes con facilidad.

Espero sea útil :)

Nelson.

dvd2000 08-12-2012 13:48:26

Gracias nlsgracia, ya he visto tu ejemplo y es lo que quiero hacer. Es decir Dbgrid1 de tu ejemplo se comporta como yo quiero que se comporte.

Ahora bien, no sé por que razón a mí me sale el error de : Access violation at address 040E915 in module prueba.exe. Read of Address 00000008.. en la siguiente línea:

if DBgrid1.Controls[0] is TInPlaceEdit then

Justo en ese punto salta el error. Supongo que puede ser por tema de versiones de Delphi, tu lo haces con la 7 y yo estoy con la 3. El compilador no da error, y en ejecución pues sí que me salta este error.

Te agradezco mucho el interés mostrado.

Saludos.


dvd2000 08-12-2012 15:13:08

Por fin, solucionado.

Es curioso, pero de esta forma me da error.

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if DBGrid1.Fields[DBGrid1.SelectedIndex]=(DBGrid1.DataSource.DataSet.FieldByName('Author')) then
begin
if DBGrid1.Controls[0] is TInPlaceEdit then
with DBGrid1.Controls[0] as TInPlaceEdit do
begin
if (GetTextLen >= MaxLongComment) and (Key <> #8) then
begin
Key := #0;
ShowMessage('Máxima longitud alcanzada');
end;
end;
end;
end;



Y de la siguiente forma, funciona:


Columna:=DBrejilla.SelectedIndex; // Averigua numero de columna posicionada.
if columna=1 then
begin
if dbrejilla.Controls[0] is TInPlaceEdit then
with dbrejilla.Controls[0] as TInPlaceEdit do
begin
if (GetTextLen >= 20) and (Key <> #8) then
begin
Key := #0;
ShowMessage('Máxima longitud alcanzada');
end;
end;

end;

Perdon por la indentación, pero no logro que se respete.

Gracias a todos y en especial a nlsgarcia.

Casimiro Notevi 08-12-2012 16:42:12

Recuerda poner los tags al código fuente, ejemplo:



Gracias :)

dvd2000 08-12-2012 17:28:55

He de rectificar. Dicen que es de sabio. La euforia me ha llevado a precipitarme.

Hay algo en mi programa, que no va bien.

Y no sé que es. En tiempo de Ejecucion hay veces que me da el error y otras no. Ya saben el error de "violation....". Así que he tenido que quitar el códigode nlsgarcia y le he buscado una alternativa, no es la que más me gusta pero así va a tener que tirar.

Lo ideal era que al llegar al tope admitido por un campo, se abriera una ventana para que siguiera escribiendo mas aún, pero al final, obligo al usuario a pinchar en un boton para abrir esa ventanita.

Gracias a todos.

nlsgarcia 08-12-2012 18:07:23

dvd2000,

Cita:

Empezado por dvd2000
En tiempo de Ejecucion hay veces que me da el error y otras no

Te comento:

1- Crea un nuevo programa de pruebas y solo coloca el código de control de longitud de texto, el DBgrid, componentes de BD y el código mínimo necesario, la idea es que puedas aislar el error.

2- Haz debug a tu programa, verifica la línea de código que genera el error.

3- ¿Hay algún objeto que utilices y que no estés instanciando correctamente?, ¿Que acción ejecuta el programa antes de la falla?

4- Probastes el ejemplo que te anexe, ¿Como funciona en tu sistema?, recuerda que uso Delphi 7 y componentes ADO en el ejemplo.

5- ¿Que valor tiene Columna:=DBrejilla.SelectedIndex al momento del error?

Quizás el problema sea otro componente que usas en tu aplicación, lo importante es precisar el origen del error, si funciona y a veces falla, ¿Cual es la causa?, toma en cuenta que todas la variables cuentan al momento de analizar un error (Versión de Delphi, Componentes de acceso de datos, BD usada, Versión de OS, Componentes de Terceros, Instancias de Objetos, Condiciones previas al error, Punteros, etc).

Revisa este link:
Cita:

Delphi access violation assigning local variable: http://stackoverflow.com/questions/2...local-variable
Espero sea útil :)

Nelson.

nlsgarcia 08-12-2012 20:36:48

dvd2000,

Revisa este código:
Código Delphi [-]
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
   // Método 2: Funciona correctamente
   if (DBGrid1.SelectedIndex = 1) then
   begin
      if Assigned(DBGrid1.Controls[0]) then
      begin
         if DBGrid1.Controls[0] is TInPlaceEdit then
         with DBGrid1.Controls[0] as TInPlaceEdit do
         begin
            if (GetTextLen >= MaxLongComment) and (Key <> #8) then
            begin
               Key := #0;
               ShowMessage('Máxima longitud alcanzada');
            end;
         end;
      end;
   end;
end;
El ejemplo previo es una variante al código de control de longitud de texto en un control TDBGrid propuesto anteriormente, se excluyen asignaciones a variables y se verifica que el control este asignado antes de realizar ninguna acción. Todo el procesamiento queda circunscrito al control TDBGrid.

La idea es tratar de descartar que el control tenga en algún momento de la ejecución el valor nil y por ello se provoque la excepción. Es una idea, te sugiero probarla en tu aplicación.

Nota: Tanto el código original como la variante funcionan correctamente en mi Sistema (Windows 7 Professional x32 SP1, Delphi 7, Componentes ADO, BD Access).

Espero sea útil :)

Nelson.

dvd2000 09-12-2012 18:05:55

Gracias NlsGarcia, por todas las molestias tomadas. Lo miraré y probaré, lo que me dices, y ya te comentaré algo. En principio como te he comentado, he puesto el botoncito, para no dedicar mas tiempo a esta rutina, ya que me interesa acabarlo lo antes posible. Pero lo retomaré en breve para reestudiar lo que me propones.

Ya te contaré y muchas gracias.


La franja horaria es GMT +2. Ahora son las 19:11:24.

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