Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Descomponer cadena @String (https://www.clubdelphi.com/foros/showthread.php?t=66118)

Alejo15x 03-02-2010 03:06:02

Descomponer cadena @String
 
Hola.

Estoy desarrollando algo asi como un bot, bueno...

Tengo un ListBox, en el cual al dar a un boton se agrega los siguientes parametros:

Código Delphi [-]
a.Items.Add('Ground: ('+IntToStr(TPlayer.Create.Position.X)+' '+IntToStr(TPlayer.Create.Position.Y)+' '+IntToStr(TPlayer.Create.Position.Z)+')');


TPlayer es una class la cual lee un entero de una aplicaciòn.
El resultado seria por ejemplo:

Código Delphi [-]
Ground: (32000 32000 7)


Hay tengo los 3 parametros, ahora nesecito acceder a ellos:
Código Delphi [-]
var X, Y, Z : integer; sTipo : string; begin

Escribirle al sTipo donde esta el "Ground", al X, Y, Z, a dentro de los parentesis (X Y Z).

Código Delphi [-]
sTipo (X Y Z)


Bueno, creo que se podria usar un "case" o algo para verificar si "Ground" es ground, y despues escribir en X, Y, Z las X, Y, Z obtenidas en la cadena.

Aquì os dejo un ejemplo en LUA, para que me entiendan mejor. ( Quiero explicar que tengo TDAH alto, y la verdad por eso seme dificulta un monton explicarme, pero si entiendo la programacion ).

Código:

DecodeParam(ListBox.Items[i])
ListBox.Selected.ToString().Split (sTipo (lb1), X (lb2), Y (lb3), Z (lb4))if sTipo = "Groung" then Client.Escribir(X @X, Y @Y, Z @Y) End

Un saludote! Y espero me resuelvan la dudita!

duilioisola 03-02-2010 13:50:16

Creo entender que tu problema es recibir una cadena y averiguar cuales son los tres valores, separados por espacios.

Código Delphi [-]
procedure RecibeDato(aDato : string)
var
   Posicion : integer;
   sAux : string;
   sTipo : string;
   x,y,x : integer;
begin
   sAux := aDato;  //Trabajo con un auxiliar por si necesito aDato mas adelante en el procedimiento

   Posicion := Pos ('(',sAux); // Busco la posicion del parentesis
   sTipo := copy (sAux,1,Posicion); //copia desde el principio hasta x caracteres
   sAux := copy (sAux,Posicio+1,Length(sAux)) // obtengo el resto del dato

   Posicion := Pos (' ',sAux); // Busco la posicion del primer espacio
   x := StrToInt( copy (sAux,1,Posicion) );
   sAux := copy (sAux,Posicio+1,Length(sAux)) // obtengo el resto del dato

   Posicion := Pos (' ',sAux); // Busco la posicion del primer espacio
   y := StrToInt( copy (sAux,1,Posicion) );
   sAux := copy (sAux,Posicio+1,Length(sAux)) // obtengo el resto del dato

   Posicion := Pos (')',sAux); // Busco la posicion del parentesis que cierra
   z := StrToInt( copy (sAux,1,Posicion) );
   sAux := copy (sAux,Posicio+1,Length(sAux)) // obtengo el resto del dato

   [...]
end;

delphi.com.ar 03-02-2010 15:32:25

Vas a terminar en un gran case, donde vas a necesitar interpretar primero cual es el método, a partir de allí sabes cuantos parámetros puedes recibir y debes hacer un split de sus parámetros y terminar ejecutando tu código según ellos, si falta o sobra uno producir un error.
Para hacer un Split, te recomiendo ver: ParseText, o leer la ayuda de la propiedad CommaText de la case TStrings, o la función ExtractStrings.

Saludos!

Alejo15x 04-02-2010 03:23:21

Resuelto!

Gracias al duilioisola ese tambien funciona!
Pero este es mas facil:

function MySplit(source : string; delimiter : string): TStringList;
var i : integer;
s : string;
arrString: TStringList;
begin
arrString := TStringList.Create;
s := '';
i := 1;
repeat
begin
if Copy(source,i,Length(delimiter)) <> delimiter then
begin
s := s + Copy(source,i,1);
i := i + 1;
end
else
begin
arrString.Add(s);
s := '';
i := i + Length(delimiter);
end;
end
until i > Length(source);
if s <> '' then arrString.Add(s);
result := arrString;
end;

Código Delphi [-]
var
  arrWaypoint: TStringList;
  sList,Waypoint,sMode: string;
  posX,posY,posZ: string;
begin
  Waypoint := "Ground (1000 1450 7)"; 
 
  arrWaypoint := MySplit(Waypoint," ");
 
  sMode:= arrWaypoint.Strings[0]; // Returns "Ground"
 
  arrWaypoint := MySplit(Waypoint, "("); // These two lines are removing the brackets and "Ground" ...
  arrWaypoint := MySplit(arrWaypoint.Strings[1], ")"); // Only leaving "1000 1450 7"
 
  sList := arrWaypoint.Strings[0]; // = "1000 1450 7"
 
  arrWaypoint := MySplit(sList , " ");
 
  posX := arrWaypoint.Strings[0]; // 1000
  posY := arrWaypoint.Strings[1]; // 1450
  posZ := arrWaypoint.Strings[2]; // 7
end;


La franja horaria es GMT +2. Ahora son las 05:06:15.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi