Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-02-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 22
keyboy Va por buen camino
Te propongo una alternativa que cubriría todos los casos.

En el formulario donde tienes el StringGrid, coloca esta declaración:

Código Delphi [-]
type
  TStringGrid = class(Grids.TStringGrid)
  protected
    function GetEditLimit: Integer; override;
  end;

  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

Esto define una clase derivada de TStringGrid que se llama igual. Al colocarla antes de la declaración del formulario, logras que el StringGrid que ahí tienes, sea ahora de la nueva clase.

En dicha nueva clase, lo que hacemos es redefinir el método virtual GetEditLimit. Este método indica cuál es el máximo número de caracteres que acepta una celda del grid. El método original simplemente regresa 0, indicando que no hay límite. Nosotros podemos definirlo para dar distintos valores, según las circunstancias:

Código Delphi [-]
function TStringGrid.GetEditLimit: Integer;
begin
  // Si estamos en la columna 2 ...
  if Col = 2 then
    Result := 50
  else
    Result := inherited GetEditLimit;
end;

Bye
Responder Con Cita
  #2  
Antiguo 14-02-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 22
keyboy Va por buen camino
Por cierto, veo que usas el evento KeyPress para convertir a mayúsculas el texto que se escribe. Pero ya entrados en gastos, puedes añadir un método más a la nueva clase:

Código Delphi [-]
  TStringGrid = class(Grids.TStringGrid)
  protected
    function GetEditLimit: Integer; override;
    function CreateEditor: TInplaceEdit; override;
  end;

CreateEditor es el encargado de crear el objeto TEdit que se usa para editar el contenido de una celda. Puedes aprovechar el momento en que se crea para establecer su propiedad CharCase:

Código Delphi [-]
type
  TExInplaceEdit = class(Grids.TInplaceEdit);

function TStringGrid.CreateEditor: TInplaceEdit;
begin
  // Creamos el objeto original
  Result := inherited CreateEditor;

  // Ponemos el objeto creado en mayúsculas
  TExInplaceEdit(Result).CharCase := ecUpperCase;
end;

Lo del TExInplaceEdit es un truco para poder acceder a la propiedad CharCase del TInplaceEdit, ya que está protegida y no puede usarse directamente.

Con esto te ahorras ya todo el evento KeyPress.

Bye

Última edición por keyboy fecha: 14-02-2008 a las 02:50:53.
Responder Con Cita
  #3  
Antiguo 14-02-2008
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 20
mjjj Va por buen camino
muchas gracias por tu tiempo.... pero tengo un problema me tira un error que dice asi:

[Pascal Error] U_NVAOC.pas(17): E2065 Unsatisfied forward or external declaration: 'TStringGrid.GetEditLimit'

en la linea de "function GetEditLimit: Integer; override;"

en que parte pongo el resto del codigo que me recomendaste?

Código Delphi [-]
function TStringGrid.CreateEditor: TInplaceEdit;
begin
  // Creamos el objeto original
  Result := inherited CreateEditor;

  // Ponemos el objeto creado en mayúsculas  TExInplaceEdit(Result).CharCase := ecUpperCase;
end;

gracias
Responder Con Cita
  #4  
Antiguo 14-02-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 22
keyboy Va por buen camino
Te la pongo más fácil:

Crea una nueva unidad, ExStringGrid.pas, con el siguiente código:

Código Delphi [-]
unit ExStringGrid;

interface

uses
  StdCtrls, Grids;

type
  TStringGrid = class(Grids.TStringGrid)
  protected
    function GetEditLimit: Integer; override;
    function CreateEditor: TInplaceEdit; override;
  end;

implementation

type
  TExInplaceEdit = class(Grids.TInplaceEdit);

{ TStringGrid }

function TStringGrid.CreateEditor: TInplaceEdit;
begin
  // Creamos el objeto original
  Result := inherited CreateEditor;

  // Ponemos el objeto creado en mayúsculas
  TExInplaceEdit(Result).CharCase := ecUpperCase;
end;

function TStringGrid.GetEditLimit: Integer;
begin
  // Si estamos en la columna 2 ...
  if Col = 2 then
    Result := 5
  else
    Result := inherited GetEditLimit;
end;

end.

que incluye toda la implementación de la clase derivada.

Luego, en tu formulario principal (o donde tengas el StringGrid), incluye la unidad:

Código Delphi [-]
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, ExStringGrid;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

El único requisito es que ExStringGrid debe aparecer después de la unidad Grids, de lo contrario no funciona.

Bye
Responder Con Cita
  #5  
Antiguo 14-02-2008
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 20
mjjj Va por buen camino
gracias keyboy... funciono perfecto, pero ahora surgio otro problema...

justamente no se puede ingresar mas caracteres definidos, ya se tipenando o tratando con copy paste.... pero si es que utilizo otra forma de llenar esta columna si se puede... utilizando este codigo:

Código Delphi [-]
stringgrid1.Cells[2,stringgrid1.rowcount-1]:=ibquery2.FieldByName('nom_insum').AsString;

Como puedo restringir esto tambien??

De ante mano muchas gracias....

Saludos
Responder Con Cita
  #6  
Antiguo 14-02-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 24
ixMike Va por buen camino
Cita:
Empezado por mjjj Ver Mensaje
gracias keyboy... funciono perfecto, pero ahora surgio otro problema...

justamente no se puede ingresar mas caracteres definidos, ya se tipenando o tratando con copy paste.... pero si es que utilizo otra forma de llenar esta columna si se puede... utilizando este codigo:

Código Delphi [-]stringgrid1.Cells[2,stringgrid1.rowcount-1]:=ibquery2.FieldByName('nom_insum').AsString;


Como puedo restringir esto tambien??

De ante mano muchas gracias....

Saludos
¡¡Si esa es la forma más fácil de controlarlo!! ya que le pasas el dato, pásaselo con longitud 50

Si ya se diera el caso que no sabes cómo...

Código Delphi [-]
stringgrid1.Cells[2,stringgrid1.rowcount-1]:=Copy(ibquery2.FieldByName('nom_insum').AsString, 1, 50);

Salu2
Responder Con Cita
  #7  
Antiguo 14-02-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 26
maeyanes Va por buen camino
Hola...

Para eso mejor hazlo como te indique en mi primera respuesta...

Código Delphi [-]
stringgrid1.Cells[2,stringgrid1.rowcount-1] := Copy(ibquery2.FieldByName('nom_insum').AsString, 1, 50);


Saludos...

Edit: Vaya, me ganaron la respuesta xDDDD
Responder Con Cita
  #8  
Antiguo 14-02-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 24
ixMike Va por buen camino
Cita:
Empezado por maeyanes Ver Mensaje
Edit: Vaya, me ganaron la respuesta xDDDD
para destacar hay que ser veloz cual rayo!!! o conseguir uno de esos despertadores/avisadores que tienen los moderadores
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
recortar imagen kapullok_2006 Gráficos 3 12-11-2007 18:39:29
recortar una foto kapullok_2006 Gráficos 1 27-03-2007 12:45:25
como recortar caracteres... alexander66 Varios 2 17-11-2006 19:06:43
Recortar Imagen fmtidona Gráficos 2 26-09-2005 19:18:20
Rectángulo para recortar imagen JAV Gráficos 3 05-07-2005 10:08:23


La franja horaria es GMT +2. Ahora son las 16:13:03.


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