Delphi - Capturar cada caracter

 
Vista:
Imágen de perfil de Franklin Granadillo

Capturar cada caracter

Publicado por Franklin Granadillo (17 intervenciones) el 02/04/2007 15:04:31
Tengo un texto de un número inderteminado de caracteres, necesito "capturar" letra por letra, signo por signo, en fin, caracter por caracter. Como especie de máquina de escribir pero al revés.
Eventualmente voy a "pegar" en un RichEdit, el texto que luego deseo extraerle letra por letra incluídos los espacios vacíos''. La idea que manejo es pasarlos a un ListBox.item.add; o sea item por item, que cada caracter del texto en el RichEdit, genere un item en el ListBox.

Muchas Gracias de antemano.

Nota: Trabajo con Delphi7Pro.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Capturar cada caracter

Publicado por BigLuis (713 intervenciones) el 02/04/2007 17:13:42
Con lenght capturas la longitud de la cadena y como esta es un array de caracteres: for I:=0 to lenght(cadena) do
showmessage(cadena[I]);
Suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Capturar cada caracter

Publicado por E.T. (1 intervención) el 02/04/2007 17:55:56
Mencionas que al "revés" o sea ¿del final de la cadena al inicio de ésta?, si es así, es lo que dice BigLuis pero al la inversa

For i:=Lenght(cadena) downto 0 do
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Franklin Granadillo

Item por Item

Publicado por Franklin Granadillo (17 intervenciones) el 03/04/2007 15:21:53
Muy bien, muchas gracias. Así me sirve. Ahora una nueva "tareita", me disculpan pero se muy poco de ObjectPascal. Necesito "aparear" cada items con su respectivo item...

Trataré de hacerlo más gráfico:

ListBox1 ListBox2 ListBox3
======= ======= =======
0 A x
1 B x
2 C x
3 D x
4 E x
5 F x
6 G x
7 H x
. .
. .
. .
n N x

Lo que necesito es que cada vez que escriba, por ejemplo "ABC" en ListBox3 ingresen cada item respectivo de ListBox1, o sea "012".

Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

RE:Item por Item

Publicado por E.T. (1244 intervenciones) el 04/04/2007 17:45:48
Bueno, creo pero no estoy seguro, no puedes sólo escribir en el listbox sino insertar lineas, pero se puede de otra manera, aclarame unas cosas primero:

Los números pertenecen al listbox1??
Las letras al listbox2??
y el resultado pues va en el tres??

esto es cierto??
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Franklin Granadillo

RE:Item por Item

Publicado por Franklin Granadillo (17 intervenciones) el 04/04/2007 20:19:49
Eso es correcto. En realidad quiero hacer especie de traductor, logré que funcione usando Timer. te copio el código fuente:

unit ContraReciprocoFG2007;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls;

type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Enviar: TRadioButton;
Recibir: TRadioButton;
PanelEntrada: TPanel;
lbAlpha: TListBox;
lbNuevo: TListBox;
Entrada: TRichEdit;
Label1: TLabel;
TiempoEnvia: TTimer;
lbVertical: TListBox;
PanelSalida: TPanel;
Salida: TRichEdit;
Label2: TLabel;
Traducir: TButton;
Limpiar: TButton;
Salir: TButton;
Contador: TLabel;
TiempoRecibe: TTimer;
procedure TraducirClick(Sender: TObject);
procedure TiempoEnviaTimer(Sender: TObject);
procedure LimpiarClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure SalirClick(Sender: TObject);
procedure EnviarClick(Sender: TObject);
procedure RecibirClick(Sender: TObject);
procedure TiempoRecibeTimer(Sender: TObject);
procedure ParaEnviar;
procedure ParaRecibir;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
c:integer;
Ruta:string;
hago:string;
implementation

{$R *.dfm}

procedure TForm1.TraducirClick(Sender: TObject);
begin
if hago='Enviar' then ParaEnviar else
if hago='Recibir' then ParaRecibir;
c:=0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Ruta:=ExtractFilePath(Application.ExeName);
hago:='';
c:=0;
end;

procedure TForm1.SalirClick(Sender: TObject);
begin
Application.Terminate;
end;
procedure TForm1.LimpiarClick(Sender: TObject);
begin
Entrada.Clear;
Salida.Clear;
lbVertical.Clear;
Contador.Caption:='0';
TiempoEnvia.Enabled:=False;
TiempoRecibe.Enabled:=False;
end;

procedure TForm1.ParaEnviar;
var i:integer;s:string;
begin
//******
Contador.Caption:='-1';
lbVertical.Clear;
Salida.Clear;
for i:=1 to Length(Entrada.Text) do
begin
s:=Entrada.Text;
lbVertical.Items.Add(s[i]);end;
TiempoEnvia.Enabled:=True;
end;
procedure TForm1.ParaRecibir;
var i:integer;s:string;
begin
Contador.Caption:='-1'; {................}
lbVertical.Clear;
Entrada.Clear;
for i:=1 to Length(Salida.Text) do
begin
s:=Salida.Text;
lbVertical.Items.Add(s[i]);end;
TiempoRecibe.Enabled:=True;
//*******
end;
procedure TForm1.TiempoEnviaTimer(Sender: TObject);
var itV:string[1];itA:integer;
begin
if (c<lbVertical.Items.Count-1) then begin
Contador.Caption:=IntToStr(StrToInt(Contador.Caption)+1);
c:=StrToInt(Contador.Caption);
itV:=lbVertical.Items[c];
itA:=lbAlpha.Items.IndexOf(itV);
//***Controla error
Salida.Text:=Salida.Text+lbNuevo.Items[itA]; end;
if c=lbVertical.Items.Count-1 then begin
TiempoEnvia.Enabled:=False;
ShowMessage('Todo se ha transcrito'); end;
end;

//*********************************************************
procedure TForm1.TiempoRecibeTimer(Sender: TObject);
var itV:string[1];itN:integer;
begin
if (c<lbVertical.Items.Count-1) then begin
Contador.Caption:=IntToStr(StrToInt(Contador.Caption)+1);
c:=StrToInt(Contador.Caption);
itV:=lbVertical.Items[c];
itN:=lbNuevo.Items.IndexOf(itV);
Entrada.Text:=Entrada.Text+lbAlpha.Items[itN];end;
if c=lbVertical.Items.Count-1 then begin
TiempoRecibe.Enabled:=False;
ShowMessage('Todo se ha transcrito'); end;
end;

procedure TForm1.EnviarClick(Sender: TObject);
begin
hago:='Enviar';
Salida.ReadOnly:=True;
Entrada.ReadOnly:=False;
Contador.Caption:='-1';
end;
procedure TForm1.RecibirClick(Sender: TObject);
begin
hago:='Recibir';
Contador.Caption:='-1';
Entrada.ReadOnly:=True;
Salida.ReadOnly:=False;
end;

end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

RE:Item por Item

Publicado por E.T. (1244 intervenciones) el 05/04/2007 00:21:16
Ok, ya lo hice, puedes poner el siguiente código en un botón y hará lo mismo que lo que tu haces en el timer, incluso puesdes quitar el listbox que lleva los numeros y el lbVertical, aunque esto sirve sólo para caracteres sencillos, no para más de uno 'AD' por ejemplo, hace primero A y luego D.

Si lo que quieres es poner palabras en lugar de caracteres en el lbAlpha se necesita un poco más de trabajo, pero así como está hace lo que tu hiciste.

Espero esto te sirva, sino aqui estamos

procedure TForm1.Button1Click(Sender: TObject);
var i:integer; sal:string;
begin
sal:='';
If Recibir.Checked then begin
entrada.Text:='';
for i:=1 to Length(salida.Text) do
sal:=sal+IntToStr(lbalpha.Items.IndexOf(salida.Text[i]));
entrada.Text:=sal
end else begin
salida.Text:='';
for i:=1 to Length(entrada.Text) do
sal:=sal+lbalpha.Items[strtoint(entrada.Text[i])];
salida.Text:=sal;
end;
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Franklin Granadillo

RE:Item por Item

Publicado por Franklin Granadillo (17 intervenciones) el 05/04/2007 22:06:22
Muchas gracias, así funciona y además hay un ahorro considerable de recursos.

Sinceramente agradecido.

FG
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar