Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ¿Cómo cortar cadenas en Delphi 7? (https://www.clubdelphi.com/foros/showthread.php?t=87814)

CM6ISG 01-03-2015 04:01:45

¿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..

ecfisa 01-03-2015 09:35:52

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 :)

CM6ISG 01-03-2015 23:23:07

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

nlsgarcia 02-03-2015 01:35:59

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...

:rolleyes:

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.

CM6ISG 02-03-2015 06:06:50

Hola Necesito ayuda con Cortar Cadenas en Delphi 7
 
1 Archivos Adjunto(s)
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.

ecfisa 02-03-2015 06:22:38

Hola.
Cita:

Empezado por CM6ISG (Mensaje 489514)
...
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 :)

ecfisa 02-03-2015 09:05:25

Hola CM6ISG.
Cita:

Empezado por CM6ISG (Mensaje 489519)
...
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 :)

nlsgarcia 02-03-2015 15:08:51

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...

:rolleyes:

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.

CM6ISG 10-03-2015 00:47:32

2 Archivos Adjunto(s)
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.


La franja horaria es GMT +2. Ahora son las 09:27: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