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 01-03-2015
CM6ISG CM6ISG is offline
Registrado
NULL
 
Registrado: feb 2015
Posts: 4
Poder: 0
CM6ISG Va por buen camino
¿Cómo cortar cadenas en Delphi 7?

Tengo en una variable con unas cadenas que me entrega el radio de una sola vez y quiero dividir esa cadena, en 5 cadenas y cada cadena tenerla en una nueva variable.
Esta lista de cadena la veo en un Memo
#PO0
#SQS
#EM0
#FT0715000
#FR0711200

Ahora La variable Str tengo esta cadena #PO0 #SQS #EM0 #FT0715000 #FR0711200
Entre cada cadena hay un cambio de línea y un enter, eso lo veo con un monitor de puerto es decir el radio me envía
#PO0#13#10
#SQS#13#10
Lo que necesito hacer es cortar la cadena en 5 y pasarla a 5 variables, es decir
Variables Power, SQ, Modo, FTX y FRX y en ese proceso quitarle el sino de numero (#) de las 3 primera variables y de las dos ultima quitarle (#FT y #FR) que viene delante.
Una ves hecho esto con las tres primeras variable la usare para: ejemplo

Código Delphi [-]
If Power = 'PO0' Then Begin Label7.Visible := True; end;


Con las dos ultima pasarla a un edit: Edit1.Text := Edit1.Text + FTX;
Ahora ajunto la última idea que estuve probando que me funciona en parte, pero no sé como asignar el resultado a las 5 nuevas variables



Código Delphi [-]
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
 var Str: String;
 lCampos : TStringList; i: integer;
 begin 
ComPort.ReadStr(Str, Count);
Memo.Text := Memo.Text + Str; 
lCampos := TStringList.Create; 
ExtractStrings(['#'], [' '], PChar(Str),
lCampos); for i := 0 to lCampos.Count-1 do
 Begin 
ShowMessage(lCampos[i]);
 end;

De esta manera logro obtener que me muestre 5 mensajes así: PO0 SQS EM0 FT0715000 FR0711200 solo me faltaría quitarle a la dos ultima de FR y FT el numero es variable pero siempre tendrá es formato de 7 caracteres.

¿Como pudiera pasar ese resultado a las 5 variables? que les comente, o si pueden decirme otra manera de lograr lo que quiero. Muchas gracias de antemano..

Última edición por CM6ISG fecha: 01-03-2015 a las 04:16:58. Razón: Correcion de Etiqueta
Responder Con Cita
  #2  
Antiguo 01-03-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola CM6ISG y bienvenido a Club Delphi

Como es costumbre con los nuevos integrantes te invitamos a leer nuestra guía de estilo.

Si interpreté bién tu consulta podes hacer:
Código Delphi [-]
procedure ...
const
  DLM = #13#10;
var
  Str: string;
  ix: Integer;
  lCampos: TStrings;
begin
  Str:= '#PO0' + DLM + '#SQS' + DLM + '#EM0' + DLM + '#FT0715000' + DLM + '#FR0711200';
  lCampos:= TStringList.Create;
  try
    ExtractStrings(['#'],[' '], PChar(Str), lCampos);

    ix:= lCampos.Count-1;
    lCampos[ix-1]:= Copy(lCampos[ix-1], 3, MaxInt);
    lCampos[ix]  := Copy(lCampos[ix]  , 3, MaxInt);
    ShowMessage(lCampos.Text);
  finally
    lCampos.Free;
  end;
end;
Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 01-03-2015
CM6ISG CM6ISG is offline
Registrado
NULL
 
Registrado: feb 2015
Posts: 4
Poder: 0
CM6ISG Va por buen camino
Hola Necesito ayuda con Cortar Cadenas en Delphi 7.

Gracias colega por tu respuesta, tan rápido.
Mas meno esa sería la idea pero deja hacerte más precisiones de lo que quiero lograr,
Mira yo estoy usado CportLib y el me devuelve a través del puerto Serial una Variable Str con una cadena de caracteres de mi Radio de HF esa cadena tiene esta estructura vista en un memo
#PO0
#SQS
#EM0
#FT0715000
#FR0711200

Y en un Edit se vería así #PO0#SQS#EM0#FT0715000#FR0711200

Lo que necesito es separar esta cadena en 5 cadenas y asignarla a 5 nuevas variables para de ahí seguir yo con el resto de la programación.

Ahora #POX #SQX #EMX #FTXXXXXXX #FRXXXXXXX fíjate en el detalle te puse (X) ese dato varia en depende de la frecuencia del radio, modo potencia, etc.

Lo otro seria como cambio ShowMessage(lCampos.Text); en su lugar necesito 5 variables con cada una de sus cadenas.
Ejemplo:

Power:=(‘POX’)
Qsl:=(‘SQX’)
Modo:=(‘EMX’)
FTX:=(‘XXXXXXX’)
FTR:=(‘XXXXXXX’)

Muchas gracias de antemanos

Última edición por CM6ISG fecha: 01-03-2015 a las 23:26:18. Razón: Rectificado el texto
Responder Con Cita
  #4  
Antiguo 02-03-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
CM6ISG,

Cita:
Empezado por CM6ISG
...estoy usado CportLib y el me devuelve a través del puerto Serial una Variable Str...tiene esta estructura... #PO0#SQS#EM0#FT0715000#FR0711200...necesito es separar esta cadena en 5 cadenas y asignarla a 5 nuevas variables...


Revisa este código:
Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
   CRLF = #13#10;
   Output_CportLib = '#PO0' + CRLF + '#SQS' + CRLF + '#EM0' + CRLF + '#FT0715000' + CRLF + '#FR0711200' + CRLF;

var
   StrList : TStringList;
   Power, Qsl, Modo, FTX, FTR : String;

begin

   StrList := TStringList.Create;

   ExtractStrings(['#'], [], PChar(Output_CportLib), StrList);

   Power := StrList[0];
   Qsl := StrList[1];
   Modo := StrList[2];
   FTX := Copy(StrList[3],3,Length(StrList[3]));
   FTR := Copy(StrList[4],3,Length(StrList[4]));

   Memo1.Text := Output_CportLib;
   Edit1.Text := Output_CportLib;

   Edit2.Text := Power;
   Edit3.Text := Qsl;
   Edit4.Text := Modo;
   Edit5.Text := FTX;
   Edit6.Text := FTR;

   StrList.Free;

end;

end.
El código anterior en Delphi 7 sobre Windows 7 Professional x32, Simula la lectura de un puerto serial separando la misma en 5 variables y visualizando esta por diferentes medios, como se muestra en la siguiente imagen:



Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 02-03-2015 a las 01:52:21.
Responder Con Cita
  #5  
Antiguo 02-03-2015
CM6ISG CM6ISG is offline
Registrado
NULL
 
Registrado: feb 2015
Posts: 4
Poder: 0
CM6ISG Va por buen camino
Hola Necesito ayuda con Cortar Cadenas en Delphi 7

Saludos: Gracias por acudir en mi ayudad, hice la simulación y todo perfecto, exactamente eso es lo que necesito hacer. Pero cuando fui a implementarlo entre las propiedades y funciones del ComPort que tengo no encuentro (Output_CportLib), la versión que tengo es ComPort Library ver. 2.64, estoy usado Delphi 7, Windows 7 Professional x32
Use ComPort1.ReadStr, que la que he probado y me funciona,
A la hora de compilar me da el siguiente error

Project Catsimulado.exe raised exception class EStringListError with message ‘List index out bounds (1)’. Process stopped. Use Step or run to continue.
no logro determinar donde esta el error.

Código Delphi [-]
unit simulacion;      
 interface       uses     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,     Dialogs, StdCtrls, CPort;
type   
  TForm1 = class(TForm)  
 Memo1: TMemo;
 Edit1: TEdit;
 Edit2: TEdit;
 Edit3: TEdit;
 Edit4: TEdit;
 Edit5: TEdit;  
 Edit6: TEdit;
 Label1: TLabel; 
 Label2: TLabel;
 Label3: TLabel;
 Label4: TLabel; 
 Label5: TLabel;
 Label6: TLabel; 
 Label7: TLabel;
 Button1: TButton; 
 ComPort1: TComPort;

  procedure ComPort1RxChar(Sender: TObject; Count: Integer);
  private       { Private declarations }     
  public       { Public declarations } 
  end;    

 var     
 Form1: TForm1;      
 implementation
   {$R *.dfm} 
 procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);

 var      
StrList: TStringList;
Power, Qsl, Modo, FTX, FTR, Str : String;   

    begin
   ComPort1.ReadStr(Str, Count);
   StrList := TStringList.Create;  
   ExtractStrings(['#'], [], PChar(Str), StrList);   
   
   Power := StrList[0];      
   Qsl := StrList[1]; 
   Modo := StrList[2];  
   FTX := Copy(StrList[3],3,Length(StrList[3]));  
   FTR := Copy(StrList[4],3,Length(StrList[4]));      
   Memo1.Text := Str;
   Edit1.Text := Str;
   Edit2.Text := Power;   
   Edit3.Text := Qsl;   
   Edit4.Text := Modo;    
   Edit5.Text := FTX;  
   Edit6.Text := FTR;    
   StrList.Free;  
   end;   
end.

Gracias colega por tu respuesta, tan rápido.
Imágenes Adjuntas
Tipo de Archivo: jpg Error.JPG (23,3 KB, 4 visitas)

Última edición por CM6ISG fecha: 02-03-2015 a las 06:15:22. Razón: Arreglando etiquetas
Responder Con Cita
  #6  
Antiguo 02-03-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.
Cita:
Empezado por CM6ISG Ver Mensaje
...
Ahora #POX #SQX #EMX #FTXXXXXXX #FRXXXXXXX fíjate en el detalle te puse (X) ese dato varia en depende de la frecuencia del radio, modo potencia, etc.

Lo otro seria como cambio ShowMessage(lCampos.Text); en su lugar necesito 5 variables con cada una de sus cadenas.
Ejemplo:

Power:=(‘POX’)
Qsl:=(‘SQX’)
Modo:=(‘EMX’)
FTX:=(‘XXXXXXX’)
FTR:=(‘XXXXXXX’)
Si deseas incluir las cadenas 'FT' y 'FR', sólo tenes que cambiar el valor de inicio en la función Copy. Y para pasar a variables asignar los valores del StringList:
Código Delphi [-]
...
    ix:= lCampos.Count-1;
 
    // Incluir 'FT' y 'FR'
    lCampos[ix-1]:= Copy(lCampos[ix-1], 1, MaxInt);
    lCampos[ix]  := Copy(lCampos[ix]  , 1, MaxInt);

    // Asignar a variables independientes
    Power:= lCampos[0];
    Qsl  := LCampos[1];
    Modo := lCampos[2];
    FTX  := lCampos[3];
    FTR  := lCampos[4];  
 ...
Pero si es factible la reutilización de esas variables tal vez te convenga encapsularlas en un registro. Eso te permitiría enviar todos los valores en un solo parámetro, como por ejemplo:
Código Delphi [-]
...
type
  TPortValues = record
    Power: string;
    Qsl  : string;
    Modo : string;
    FTX  : string;
    FTR  : string;
  end;

procedure ShowValues(TS: TStrings; pv: TPortValues);
begin
  TS.Add(pv.Power);
  TS.Add(pv.Qsl);
  TS.Add(pv.Modo);
  TS.Add(pv.FTX);
  TS.Add(pv.FTR);
end;

procedure TForm1.Button1Click(Sender: TObject);
const
  DLM = #13#10;
var
  Str: string;
  ix: Integer;
  lCampos: TStrings;
  pv: TPortValues;
begin
  Str:= '#PO0' + DLM + '#SQS' + DLM + '#EM0' + DLM + '#FT0715000' + DLM + '#FR0711200';
  lCampos:= TStringList.Create;
  try
    ExtractStrings(['#'],[' '], PChar(Str), lCampos);

    ix:= lCampos.Count-1;
    lCampos[ix-1]:= Copy(lCampos[ix-1], 1, MaxInt);
    lCampos[ix]  := Copy(lCampos[ix]  , 1, MaxInt);

    pv.Power:= lCampos[0];
    pv.Qsl  := LCampos[1];
    pv.Modo := lCampos[2];
    pv.FTX  := lCampos[3];
    pv.FTR  := lCampos[4];

    ShowValues(ListBox1.Items, pv);
  finally
    lCampos.Free;
  end;
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 02-03-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola CM6ISG.
Cita:
Empezado por CM6ISG Ver Mensaje
...
A la hora de compilar me da el siguiente error

Project Catsimulado.exe raised exception class EStringListError with message ‘List index out bounds (1)’. Process stopped. Use Step or run to continue.
El error que mencionas es debido a que intentas acceder a una posición inexistente de la lista. Es muy probable que sea debido a un cambio en el formato de la línea recibida y no contemplado en el caso que has planteado.

Lo primero es ver que valor contiene la cadena, Str, que obtuviste en la línea
Código Delphi [-]
  ComPort1.ReadStr(Str, Count);
eso lo podes hacer con un simple ShowMessage.

Lo segundo y principal es verificar que no estes indizando posiciones inexistentes, eso lo podes verificar del siguiente modo:
Código Delphi [-]
...
  ExtractStrings(['#'], [], PChar(Str), lCampos);
  ShowMessage(IntToStr(lCampos.Count-1));
Si el valor mostrado es menor a 4, valor que utilizas en la línea:
Código Delphi [-]
 FTR := Copy(StrList[4],3,Length(StrList[4]));
se producirá ese error. Si es menor a 3 será en la anterior y así sucesivamente.

Un caso que produciría el error que mencionas se puede ver en este ejemplo:
Código Delphi [-]
  Str:= '#PO0' + #13#10 + '#SQS' + #13#10 + '#EM0' + #13#10 + '#FT0715000';
Como surge a simple vista luego de
Código Delphi [-]
  ExtractStrings(['#'],[' '], PChar(Str), lCampos);
obtendremos 4 cadenas que serán agregadas en el TStringList en las posiciónes 0,1,2,3; cuando hagas referencia a lCampos[4]... Piff !!!

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #8  
Antiguo 02-03-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
CM6ISG,

Cita:
Empezado por CM6ISG
...cuando fui a implementarlo entre las propiedades y funciones del ComPort que tengo no encuentro (Output_CportLib)...Use ComPort1.ReadStr, que la que he probado y me funciona...
Cita:
Empezado por CM6ISG
...A la hora de compilar me da el siguiente error : Project Catsimulado.exe raised exception class EStringListError with message ‘List index out bounds (1)’. Process stopped. Use Step or run to continue...


Te comento:

1- Output_CportLib es una constante creada para simular la lectura de un Puerto Serial, no forma parte de la librería ComPort Library.

2- Para resolver el error List index out bounds, te sugiero hacer un debug de tu aplicación y seguir las indicaciones del Msg #7.

Espero sea útil

Nelson.
Responder Con Cita
  #9  
Antiguo 10-03-2015
CM6ISG CM6ISG is offline
Registrado
NULL
 
Registrado: feb 2015
Posts: 4
Poder: 0
CM6ISG Va por buen camino
Saludos, disculpen por la demora en responder, es que he estado corto de tiempo.

bueno hise las prueba que me recomendaron ya que no logro que me funcione, aclaro que tampoco so muy esperto en programacion y estoy muy agradecido de ustedes por su efuerso

aqui va el codio que tengo montado ahora y debajo adjunto foto de los resultado espero que me puedan ayudar en esto Gracias una ves mas...


Código Delphi [-]
unit simulacion;
 interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls, CPort;

  type 
 TForm1 = class(TForm)  
 Memo1: TMemo;
 Edit1: TEdit;
 Edit2: TEdit;
 Edit3: TEdit;
 Edit4: TEdit;
 Edit5: TEdit;  
 Edit6: TEdit;  
 Label1: TLabel;   
 Label2: TLabel; 
 Label3: TLabel;  
 Label4: TLabel;
 Label5: TLabel; 
 Label6: TLabel;  
 Label7: TLabel;   
 Button1: TButton;    
 ComPort1: TComPort;    
 procedure ComPort1RxChar(Sender: TObject; Count: Integer);   
 private     { Private declarations }   
 public     { Public declarations }   
 end;  
 var  

 Form1: TForm1;  
 implementation  
{$R *.dfm}  

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);   

var    
StrList: TStringList; 
Power, Qsl, Cadena, Modo, FTX, FTR, Str : String;  

begin    
ComPort1.ReadStr(Str, Count);   
Cadena:= cadena + Str;    
Memo1.Text:= Str;    
Edit1.Text:= edit1.Text + cadena;
StrList := TStringList.Create;
ExtractStrings(['#'], [ ], PChar(Str), StrList);
ShowMessage(StrList.Text); 


 {Power := StrList[0];
  Qsl := StrList[1];   
  Modo := StrList[2];   
  FTX := Copy(StrList[3],3,Length(StrList[3])); 
  FTR := Copy(StrList[4],3,Length(StrList[4]));    
  Memo1.Text := Str;    
  Edit1.Text := Str;     
  Edit2.Text := Power;    
  Edit3.Text := Qsl;    
  Edit4.Text := Modo;    
  Edit5.Text := FTX;    
  Edit6.Text := FTR; }     
  StrList.Free;    

end;  
end.
Imágenes Adjuntas
Tipo de Archivo: jpg primera ventana.JPG (28,4 KB, 3 visitas)
Tipo de Archivo: jpg Segunda Ventana.JPG (35,3 KB, 6 visitas)

Última edición por CM6ISG fecha: 10-03-2015 a las 00:55:04. Razón: Arreglando Etiqueta codigo
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
como puedo cortar un string? avrils Varios 2 07-03-2011 22:24:12
¿Como puedo cortar el form show? silvana Varios 1 05-08-2008 15:30:29
Cortar cadenas por la derecha VRO Varios 4 22-09-2004 16:30:38
Como cortar filtrado miguelb Varios 4 28-11-2003 17:02:57
como cortar texto de un edit superhopi Impresión 1 10-06-2003 13:03:03


La franja horaria es GMT +2. Ahora son las 19:38:13.


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