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 13-02-2008
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
Recortar un String

Hola... tengo un pequeño problema

Tengo un Tstringgrid, en donde la columna 2, no quiero que sea mas larga que 50 caracteres. Tengo un codigo que va algo asi.

Código Delphi [-]
if (stringgrid1.Col = 2) then
if length(stringgrid1.Cells[2,stringgrid1.row]) <= 50 then
CharUpperBuff(@Key, 1) else
begin
str:=stringgrid1.Cells[2,stringgrid1.row];
delete(str,51,256);
stringgrid1.Cells[2,stringgrid1.row]:=str;
end;

Pero no funciona... cuando llego al caracter 51 me borra todo el texto

Como lo soluciono??

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

Prueba así:

Código Delphi [-]
if (stringgrid1.Col = 2) then
  if length(stringgrid1.Cells[2, stringgrid1.row]) <= 50 then
    CharUpperBuff(@Key, 1) 
  else
  begin
    str := stringgrid1.Cells[2, stringgrid1.row];
    stringgrid1.Cells[2, stringgrid1.row] := Copy(str, 1, 50);
  end;


Saludos...
Responder Con Cita
  #3  
Antiguo 13-02-2008
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
hola... sigue sin funcionar... el codigo este lo tengo en el evento presskey del stringgrid, pero no funciona.... es decir se borra todo el texto al llegar al caracter 51.

Se podra hacer de otrea manera??
Responder Con Cita
  #4  
Antiguo 13-02-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

Y si haces:

Código Delphi [-]
if (stringgrid1.Col = 2) then
  if length(stringgrid1.Cells[2, stringgrid1.row]) <= 50 then
    CharUpperBuff(@Key, 1) 
  else
    Key := #0
Responder Con Cita
  #5  
Antiguo 13-02-2008
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
tampoco... ya lohabia probado... como el length es igual o mayor a 50... despues de eso se queda pegao... no se puede escribir ni borrar en esa celda....

Alguna otra idea??

muchas gracias por tu tiempo
Responder Con Cita
  #6  
Antiguo 13-02-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Cita:
Empezado por mjjj Ver Mensaje
tampoco... ya lohabia probado... como el length es igual o mayor a 50... despues de eso se queda pegao... no se puede escribir ni borrar en esa celda....

Alguna otra idea??

muchas gracias por tu tiempo
No funciona porque tampoco acpeta el carácter #8, que es el de borrar. Prueba así:

Código Delphi [-]
if (stringgrid1.Col = 2) then
  if length(stringgrid1.Cells[2, stringgrid1.row]) <= 50 then
    CharUpperBuff(@Key, 1) 
  else
    if key>31 then Key := #0;

No aceptará carácteres, pero sí Enter, Retroceso, Tabulación...



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

Pues ya solo te quedaría comprobar que tecla se presionó, si es Backspace o Delete por ejemplo, las dejas pasar tal como vienen, si es letra o número o espacio en blanco, los conviertes en caracter nulo (#0)...

La otra es verificar si entre las propiedades de las columnas se puede especificar la longitud máxima de caracteres que puede contener...


Saludos...
Responder Con Cita
  #8  
Antiguo 14-02-2008
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
gracias ixMike... ahi me funciono... pero surgio otro problema...

si es que pego un string que es mayor que 50 igual me lo escribe...

lo que deberia hacerse... creo yo... es que se deberia cortar si es que el string es mas largo que 50

Alguna idea??

muchas gracias
Responder Con Cita
  #9  
Antiguo 14-02-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
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
  #10  
Antiguo 14-02-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
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
  #11  
Antiguo 14-02-2008
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
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
  #12  
Antiguo 14-02-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
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
  #13  
Antiguo 14-02-2008
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
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
  #14  
Antiguo 14-02-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
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
  #15  
Antiguo 14-02-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
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
  #16  
Antiguo 14-02-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
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
  #17  
Antiguo 15-02-2008
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
muchas gracias a todos... quedo funcionando tal cual queria

saludos
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

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 03:17:42.


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