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 12-05-2005
Luli Luli is offline
Miembro
 
Registrado: oct 2004
Posts: 76
Poder: 20
Luli Va por buen camino
Lightbulb Ayuda con tipos de datos

hola, ¿qué tal? yo otra vez acudo a ustedes porque tengo un problemita, bueno un problema y éste me provocó una duda.

En el programa en el que estoy trabajando, obtengo información de un TMemo, guardo todo lo que se escribió en él, en una variable de tipo string, a esta variable la llamé auxi. Más adelante necesito trabajar con los caracteres contenidos en auxi y se me ocurrió que podría hacer auxi[x] por ejemplo, es decir, declarar a auxi: string[30], algo asi pero me salen errores y supongo que es porque a veces la manejo solo como auxi y a veces como auxi[i] y no sé si se puede convertir de alguna manera el tipo de dato para que se pueda manejar de ambas formas porque necesito manipular los caracteres guardados en auxi de uno por uno ....

Si no es posible hacer la conversión, me gustaria que me explicaran la diferencia entre un dato string y uno string[a] porque ese concepto no me queda claro.

Me gustaria mucho que me ayudaran a resolver mi problema, si no se puede hacer la conversión, o algo que me permita hacer lo que necesito, entonces no sé si se pueda hacer que guarde la información del TMemo en una variable de tipo string[i].

De antemano muchas gracias
Responder Con Cita
  #2  
Antiguo 12-05-2005
S.M.S. S.M.S. is offline
Miembro
 
Registrado: jun 2003
Ubicación: España
Posts: 56
Poder: 21
S.M.S. Va por buen camino
Cita:
Empezado por Luli
En el programa en el que estoy trabajando, obtengo información de un TMemo, guardo todo lo que se escribió en él, en una variable de tipo string, a esta variable la llamé auxi. Más adelante necesito trabajar con los caracteres contenidos en auxi y se me ocurrió que podría hacer auxi[x] por ejemplo, es decir, declarar a auxi: string[30]
Creo que tu problema está en que declaras dos veces la variable auxi, una vez como
Código Delphi [-]
var auxi: string;
y otra
Código Delphi [-]
var auxi: string [30];
¿cierto?

Saludos.
Responder Con Cita
  #3  
Antiguo 12-05-2005
Luli Luli is offline
Miembro
 
Registrado: oct 2004
Posts: 76
Poder: 20
Luli Va por buen camino
Hola, gracias por responder. En realidad estoy declarando la variable solo una vez, auxi:string[30], pero la uso de las dos formas, es lo que quiero saber, si hay diferencia y cual es.
Responder Con Cita
  #4  
Antiguo 12-05-2005
S.M.S. S.M.S. is offline
Miembro
 
Registrado: jun 2003
Ubicación: España
Posts: 56
Poder: 21
S.M.S. Va por buen camino
La difrencia está en que con auxi:string[30] limitas la variable a un máximo de 30 caracteres.

Saludos.
Responder Con Cita
  #5  
Antiguo 12-05-2005
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
Lo que pasa que auxi[x] es un array, que porq te da error?? a menos que digas cual es el error y en que linea te da lo demas seria tratar de adivinar, para hacer lo que quieres tienes la funcion copy(auxi, x, y) donde "x" es el numero de caracter que quieres leer y "y" es la cantidad que deseas leer a partir de ese caracter.
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #6  
Antiguo 13-05-2005
Luli Luli is offline
Miembro
 
Registrado: oct 2004
Posts: 76
Poder: 20
Luli Va por buen camino
Lightbulb

Hola, gracias por contestar. Me fué de gran utilidad la función copy(source,x,y) porque asi puedo manipular caracter por caracter, pero ahora cuando voy a hacerlo me manda otro error. Es que tengo que comparar si un caracter es igual a ' " ' y si no es igual guardo el caracter en una variable que tengo de tipo string, pero ahi es donde tengo problemas, me dice que no puedo hacerlo porque una es de tipo char y la otra de tipo string y no entiendo supuestamente las dos son string, entonces porque me dice eso. Si me aclararan la duda se los agradecería mucho...
Responder Con Cita
  #7  
Antiguo 13-05-2005
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
lo que pasa es que esa funcion copy devuelve es un valor char

no tengo delphi a mano pero de pronto y esto te funciona:

Código Delphi [-]
if trim(copy(source, x, y)) = "" then
   //lo que quieras

en caso extremo

Código Delphi [-]
if trim(str(copy(source, x, y))) = "" then
   //lo que quieras

te digo que de pronto ni compile, pero por intentar nada se pierde, recuerda lo hice sin delphi asi q disculpa cualquier error
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #8  
Antiguo 13-05-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
A mi me parece que ambos se están confundiendo y se están yendo por una camino equivocado e innecesario.

Cualquier string, sea dinámico o estático, puede accederse caracter por caracter como si fuera un arreglo- que no lo es.

Código Delphi [-]
var
  S: String;
  T: String[30];

begin
  S := 'Club';
  T := 'Delphi';

  ShowMessage(S[3] + T[5]); // mostrará 'uh'
end;

Sólamente hay que tener cuidado en que los índices no excedan los límites (desde 1 hasta la longitud del string), incluso en los string dinámicos. En el ejemplo no se puede acceder a S[100] por ejemplo. Al menos no de manera segura ya que se exponen a una violación de acceso. En el caso de strings estáticos no podrán exceder del límite declarado (30 en este caso) y en los dinámicos no podrán exceder de lo que actualmente contenga el string (en este caso 4 letras) a no ser que explícitamente se le asigne una longitud:

Código Delphi [-]
SetLength(S, 100);

Abandonar la idea original de acceder de esta forma a los caracteres individuales del string no me parece correcto ya que es mucho más eficiente esto si se requiere tratar los caracteres individualmente que haciendo uso de la función Copy para acceder a cada caracter.

Por otro lado, la función Copy regresa un string, no un caracter, puesto que sirve para tomar porciones de una cadena y no sólo caracteres individuales.

Creo que lo mejor sería que Luli especificara cuáles son los errores que le salen ya que hasta ahora aún no lo ha hecho.

// Saludos
Responder Con Cita
  #9  
Antiguo 14-05-2005
Luli Luli is offline
Miembro
 
Registrado: oct 2004
Posts: 76
Poder: 20
Luli Va por buen camino
Lightbulb

Hola, muchas gracias por contestar, la verdad si, no he especificado los errores, bueno lo primero, lo de que no podía manipular caracter por caracter del string es cierto, vamos, no sabía como hacerlo por eso pregunté, lo que yo hacía era algo así: tengo una variable tipo string llamada cadena, bueno en esa guardo todo lo que escribí en un TMemo y ahora tengo que manipular el primer caracter de cadena, entonces escribí,

Código PHP:
if (cadena[i]='"'then begin
    comilla
//función si es comilla el primer caracter
end
y nada, cuando compilaba no me mandaba errores pero cuando lo quise correr me mandaba un mensaje de error, lo que decía la verdad no me acuerdo bien, era algo asi de que no se puede escribir en 0ax56h etc, una localidad de memoria supongo, ese era el error y fue cuando me sugirieron lo de la función copy que me funcionó bien para lo que quería pero después algo sucedió porque como me devuelve un caracter, pensé que a la variable donde se iba a guardar podia ser de tipo string pero al compilar me decía algo asi: "incompatible char and string" y por eso pregunté nuevamente.

Ahora lo que hice es que en donde se va guardando el caracter que me da el resultado de la función copy, es un arreglo y asi ya no me sale el error de incompatible char and string, tambien pensé que es mucha complicación para algo que parece tan sencillo, no tanto si llegara hasta ahí, sino porque después necesité que cuando lo que se escribe en el TMemo fuera una variable, (es decir solo letras sin comillas que le precedieran) la busque en una tabla de variables que ya existe en el programa y entonces como el dato que se va a buscar esta en un arreglo, hice de todo lo que se me ocurrió hasta que al parecer lo logré, pero si se me hace que sería más sencillo si pudiera manipular directamente un elemento x de un string, asi que si alguien conoce o supone que error estaba cometiendo le agradecería que me lo hiciera saber, sale? muchas gracias por el tiempo, hasta pronto
Responder Con Cita
  #10  
Antiguo 14-05-2005
Luli Luli is offline
Miembro
 
Registrado: oct 2004
Posts: 76
Poder: 20
Luli Va por buen camino
Lightbulb Corrección

Hola, mil disculpas, es que cuando vi lo que escribí me di cuenta de un error en el codigo, esa no es la parte en donde me da el error, es aqui:

Código PHP:
(if cadena[i]='"'then begin
     i
:=i+1;
     while(
cadena[i]<>'"') do begin
 
        guarda_variable
[j]:= cadena[i]; //linea donde esta mi duda
        
j:=j+1;
        
i:=i+1;
     
end;
    
end
siendo cadena y guarda_variable de tipo string... gracias
Responder Con Cita
  #11  
Antiguo 14-05-2005
Elfoscuro Elfoscuro is offline
Miembro
 
Registrado: mar 2005
Posts: 59
Poder: 20
Elfoscuro Va por buen camino
Lo primero deberías de poner los límites del bucle para que veamos por donde te mueves. Yo para los strings te aconsejo que controles el tope " length (variable)-1", ya que si la cadena mide 10 char y te vas a mirar el 11 te dará error. En un bucle for, para recorrer la cadena usa:

Código Delphi [-]
for f:=0 to length(cadena)-1 do
begin
end;
Otra cosa. No le pongas límite a la cadena. Declaralá como:

Código Delphi [-]
var cadena:string;

y no como

Código Delphi [-]
var cadena: string[30];

Piensa en las string como en lo que son, arrays dinámicos.

Más cosas. La línea:

Código Delphi [-]
guarda_variable[j]:= cadena[i]; 

la verdad, me da yuyu. Pienso que sería mejor así:

Código Delphi [-]
guarda_variable:=guarda_variable+cadena[i]; 

Antes del bucle inicializaría a '' la variable guarda_variable y pasaría de la variable j. Ten en cuenta que según tú lo haces, si la cadena mide 0 caracteres, en el primer paso del bucle while ya estás intentando llegar al caracter 1, con lo que peta.

Veo que no estás controlando la salida del bucle para cuando llegues a fin de cadena. Sobre todo, mirate ésto y lo anterior, que me parece que es donde te está petando.

Un consejo "cutre" pero funcional. Si no ves mentalmente lo que está pasando, haz lo que hago yo. Pon la siguiente línea dentro del while:

Código Delphi [-]
showmessage(inttostr(i)+' '+guarda_variable+' '+cadena[i]);

Te lo puedes decorar a tu gusto, pero así consigues ver en cada paso el valor de cada variable. A mi me ayuda mucho, y la verdad, me resulta más cómodo que el depurador.

Saludos del elfo
Responder Con Cita
  #12  
Antiguo 14-05-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Yo creo que el problema es lo que te mencioné antes. Tienes que cuidar los rangos de los índices. En el ciclo while los índices i, j van aumentando siempre sin que verifiques si ya te pasaste de la longitud de la cadena. Por ejemplo, si encuentra la doble comilla al final de la cadena en la comparación antes del ciclo entonces ya no puedes acceder al siguiente caracter. O si en el ciclo el primer caracter distinto de doble comilla es el último de la cadena también vas a tener problemas.

// Saludos
Responder Con Cita
  #13  
Antiguo 15-05-2005
Luli Luli is offline
Miembro
 
Registrado: oct 2004
Posts: 76
Poder: 20
Luli Va por buen camino
Hola, muchas gracias por responder mis preguntas, tomaré en cuenta todas las sugerencias y los ejemplos, seguramente me serán de utilidad, nos vemos pronto por aqui...
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


La franja horaria es GMT +2. Ahora son las 14:55:12.


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