Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   saber que tecla se presiona despues de X tecla (https://www.clubdelphi.com/foros/showthread.php?t=28448)

amadis 20-12-2005 13:55:48

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

delphi.com.ar 20-12-2005 14:33:55

¿Fijándote si el caracter anterior a la posición actual es un espacio?, o si es la primer posición del edit....

Caro 20-12-2005 16:40:18

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;

jjfgg 20-12-2005 18:12:57

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;

Ohcan 20-12-2005 18:18:09

Cita:

Empezado por jjfgg
Código Delphi [-]
  //[...]
  Key := UpCase(Key);
  //[...]

¡UpCase!
J***r :D:D:D no lo encontraba por ninguna parte...
:D Gracias... me había picado (y atascado) con este hilo...

Lepe 20-12-2005 18:48:36

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

Caro 20-12-2005 21:09:28

Muchas gracias jjfgg ya sabia que habia una mejor forma

jachguate 04-01-2008 08:15:59

Se que llego un par de años tarde... :D
Cita:

Empezado por Lepe (Mensaje 122283)
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.. :D

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

Hasta luego.

;)

elcolo83 04-01-2008 12:03:57

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;

adfa 04-01-2008 13:16:35

Cita:

Empezado por jachguate (Mensaje 255921)
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


La franja horaria es GMT +2. Ahora son las 17:33:36.

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