Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-12-2005
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 19
amadis Va por buen camino
saber que tecla se presiona despues de X tecla

Buenas compañeros!!

A ver si me pueden ayudar y si se puede hacer esto.

Estoy tratando de hacer algo que dentro de un EDIT en el evento on key press me pase a mayuscula la primera letra de cada palabra (que seraan nombres de personas).

Para la primera letra precionada en el edit no hay problema pero por ej para la segunda palabra se me quemaron los papeles.

Como hago para hacer UPPER(key) del key que se preciona luego de un ESPACIO. ¿me explico? esa seria la solucion. Pero no encuentro como hacerlo.

Con una variable global almaceno la posicion del cursor en cada tecleo para ubicar luego la letra en mayuscula donde corresponde pero como le indico quequiero la letra siguiente del espacio?


Muchas Gracias
Responder Con Cita
  #2  
Antiguo 20-12-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
¿Fijándote si el caracter anterior a la posición actual es un espacio?, o si es la primer posición del edit....
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 20-12-2005
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola, yo tambien necesito lo mismo estube haciendo pruebas y llegue hasta aqui si encuentras una mejor manera de hacerlo por favor me avisas.


Código Delphi [-]
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
   edit:String;
   letra,posi:Integer;
begin
    edit:=edit1.Text;
    IF edit<>'' THEN
    begin
       letra:=ord(edit[length(edit)-1]);
       IF letra=32 THEN
       begin
          posi:=length(edit);
          edit[posi]:= UpCase(edit[posi]);
       end;
    end;
    edit1.Text:=edit;
    edit1.SelStart:=length(edit1.Text);
end;
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #4  
Antiguo 20-12-2005
jjfgg jjfgg is offline
Registrado
 
Registrado: dic 2005
Posts: 2
Poder: 0
jjfgg Va por buen camino
Una mejor forma y más sencilla es:

Código Delphi [-]
uses
  StrUtils;
 
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if (Edit1.SelStart = 0)   // primera posición
    or (Edit1.Text[ Edit1.SelStart ] in WordDelimiters) then // posición anterior es un separador de palabras
    Key := UpCase(Key);
end;

WordDelimiters es una constante definida en StrUtils y contiene no sólo espacios sino otros caracteres que funcionan como separadores de palabras. De esta forma el código también funcionará al ingresar comas, puntos, etc. y no sólo espacios.

Otra versión más completa del código anterior, que revisa si se insertó un espacio en el texto y cambia la siguiente a mayúsculas es:
Código Delphi [-]
uses
  StrUtils;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
  S: string;
  ss: Integer;
begin
  if (Edit1.SelStart = 0)   // primera posición
    or (Edit1.Text[ Edit1.SelStart ] in WordDelimiters) then // posición anterior es un separador de palabras
    Key := UpCase(Key);

  if ((Length(Edit1.Text)>Edit1.SelStart) // revisa si se inserta
      and (Key in WordDelimiters)) then // un delimitador de palabras
  begin
    S := Edit1.Text; // copia el contenido del edit para modificarlo
    S[ Edit1.SelStart + 1] := UpCase(S[ Edit1.SelStart + 1 ]); // convierte el siguiente caracter en mayuscula
    ss := Edit1.SelStart; // Guarda la posición del cursor
    Edit1.Text := S;  // Cambia el texto
    Edit1.SelStart := ss // Coloca el cursor de regreso en su posición
                         // esto es porque al sustituir la cadena
                         // el cursor se mueve a la primera posición
  end
end;
Responder Con Cita
  #5  
Antiguo 20-12-2005
Avatar de Ohcan
[Ohcan] Ohcan is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: Madrid (España)
Posts: 119
Poder: 20
Ohcan Va por buen camino
Cita:
Empezado por jjfgg
Código Delphi [-]
  //[...]
  Key := UpCase(Key);
  //[...]
¡UpCase!
J***r no lo encontraba por ninguna parte...
Gracias... me había picado (y atascado) con este hilo...
__________________
La violencia es el último recurso del incompetente. (Salvor Hardin)
Responder Con Cita
  #6  
Antiguo 20-12-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Cita:
Empezado por jjfgg
Una mejor forma y más sencilla es:

Código Delphi [-]
uses
  StrUtils;
 
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if (Edit1.SelStart = 0)   // primera posición
    or (Edit1.Text[ Edit1.SelStart ] in WordDelimiters) then // posición anterior es un separador de palabras
    Key := UpCase(Key);
end;
Como quisquilloso que pretendo ser... Si SelStart es cero y se intenta acceder a la segunda comprobación (Edit1.Text[ Edit1.SelStart ]... recordemos que el string empieza en el índice 1, y estamos accediendo al cero ==> Access violation

Esto dependerá tambien de si tenemos marcada la casilla "Complete Boolean Eval" (evaluación perezosa) del compilador. Si no la tenemos marcada, nunca nos dará error, ya que cuando el índice sea cero, ya es true, y no comprueba lo demás, y cuando sea distinto de cero, no tendremos problemas al evaluar la segunda condición.

ea, ya que he soltado mi rollo, me voy .

saludos

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 20-12-2005
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Muchas gracias jjfgg ya sabia que habia una mejor forma
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #8  
Antiguo 04-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Se que llego un par de años tarde...
Cita:
Empezado por Lepe Ver Mensaje
Como quisquilloso que pretendo ser... Si SelStart es cero y se intenta acceder a la segunda comprobación (Edit1.Text[ Edit1.SelStart ]... recordemos que el string empieza en el índice 1, y estamos accediendo al cero ==> Access violation

Esto dependerá tambien de si tenemos marcada la casilla "Complete Boolean Eval"
Delphi, por defecto, está configurado para realizar el "short circuit" de las operaciones booleanas, por lo que hay poco por que preocuparse.
Supongo que si alguien ha cambiado el valor de dicha opción, sabe lo que hace.
No es que la aclaración de Lepe esté de mas... pero la gran mayoría ha vivido ignorando este hecho..

Finalmente, a "Complete Boolean Eval" yo le llamaría "evaluación no perezosa".

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #9  
Antiguo 04-01-2008
Avatar de elcolo83
elcolo83 elcolo83 is offline
Miembro
 
Registrado: feb 2007
Ubicación: Argentina
Posts: 65
Poder: 18
elcolo83 Va por buen camino
añadiendo al codigo de jjfgg...
Código Delphi [-]
uses
  StrUtils;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
  S: string;
  ss: Integer;
begin
  if (Edit1.SelStart = 0)   // primera posición
    or (Edit1.Text[ Edit1.SelStart ] in WordDelimiters) then // posición anterior es un separador de palabras
    Key := UpCase(Key);

  if ((Length(Edit1.Text)>Edit1.SelStart) // revisa si se inserta
      and (Key in WordDelimiters)) then // un delimitador de palabras
  begin
    S := Edit1.Text; // copia el contenido del edit para modificarlo
    S[ Edit1.SelStart + 1] := UpCase(S[ Edit1.SelStart + 1 ]); // convierte el siguiente caracter en mayuscula
    ss := Edit1.SelStart; // Guarda la posición del cursor
    Edit1.Text := S;  // Cambia el texto
    Edit1.SelStart := ss // Coloca el cursor de regreso en su posición
                         // esto es porque al sustituir la cadena
                         // el cursor se mueve a la primera posición
  end
end;

POdriamos agregarle un if en caso que un caracter sea borrado corrija el texto, entonces agregamos este codigo en el evento OnKeyUp

Código Delphi [-]

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var ss: integer;
    k: char;
begin
if ((key = 8) or (key = 46)) then    //Si preciona la tecla back o sup
    begin
      edit1.SelLength:= 1;
      ss := Edit1.SelStart;
      caption:= edit1.SelText;
      edit1.SelText:= Lowercase(edit1.SelText);
      edit1.SelLength:= 1;
      edit1.SelStart:= ss;

      k:= char(key);
      if (Edit1.Text[ Edit1.SelStart ] = ' ') then
        begin
          k:= #0;
          Edit1KeyPress(Sender, K);
        end;
    end;
end;
Responder Con Cita
  #10  
Antiguo 04-01-2008
adfa adfa is offline
Miembro
 
Registrado: may 2003
Ubicación: Montevideo-Uruguay
Posts: 119
Poder: 21
adfa Va por buen camino
Cita:
Empezado por jachguate Ver Mensaje
Finalmente, a "Complete Boolean Eval" yo le llamaría "evaluación no perezosa".
Pues para mi esta bueno, no creo que sea perezosa si no un poco más optima; los basic no la tenía y te obligaban a anidar ifs, por suerte Delphi y Java si la tenían.

Saludos
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
pulsar una tecla ercrizeporta Varios 1 28-09-2006 18:31:52
Saber si una tecla esta pulsada? fefe13 Varios 9 02-02-2006 19:06:56
Saber cuando se pulsa la tecla Enter D@byt Varios 2 25-05-2005 18:21:52
Tecla PetSis y tecla Inter Tomás Windows 0 24-04-2004 15:20:19
TECLA F1 o F10 andrestsas Varios 2 03-08-2003 18:44:11


La franja horaria es GMT +2. Ahora son las 01:15:30.


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