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 02-03-2008
RdlP RdlP is offline
Registrado
 
Registrado: mar 2008
Posts: 2
Poder: 0
RdlP Va por buen camino
Funciones sobre String

Hola, buenas, soy nuevo y ya me leí la Guía de estilo.

Mi duda es si en Delphi 7 existe alguna función que dada una cadena tipo "hola" te devuelva los X caracteres de la izquierda o de la derecha.

Por ejemplo: Derecha(hola,2) devolvería "la", ¿existe? y si no ¿como lo podría hacer?

Gracias
Responder Con Cita
  #2  
Antiguo 02-03-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Hola. Bienvenido, y bien por leerte la guía

Puedes utilizar la función Copy.

Cita:
Empezado por Ayuda de Delphi
The Copy function returns a substring of a string.

S is a string-type expression. Index and Count are integer-type expressions. Copy returns a string containing Count characters starting at S[Index].

If Index is larger than the length of S, Copy returns an empty string.

If Count specifies more characters than are available, the only the characters from S[Index] to the end of S are returned.

Combinada con la función Length. Algo así:

Código Delphi [-]
function Izquierda(const S: String; Count: Integer): String;
begin
Result:=Copy(S, 1, Count);
end;

function Derecha(const S: String; Count: Integer): String;
begin
Result:=Copy(S, Length(S)-Count, Count);
end;


Nota: la función "Izquierda" la puedes sustituir por la misma función Copy.


Salu2
Responder Con Cita
  #3  
Antiguo 02-03-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Lamento darte una mala noticia ixMike, acabas de reinventar la rueda. Existe la función LeftStr y RightStr, ambas declaras en la unit StrUtils.

Al menos desde la versión 6 están disponibles, desconozco si están en la 4 o 3, pero en la 7 seguro.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #4  
Antiguo 02-03-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Cita:
Empezado por Delphius Ver Mensaje
ixMike, acabas de reinventar la rueda.
No sería la primera vez . De hecho, hasta pensé en poner un post acerca de ello.

...¡ni se te ocurra robarme la idea, ¿eh?!
Responder Con Cita
  #5  
Antiguo 02-03-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por ixMike Ver Mensaje
No sería la primera vez . De hecho, hasta pensé en poner un post acerca de ello.

...¡ni se te ocurra robarme la idea, ¿eh?!
Querrás decir que tu me la quieres robar, porque en varias ocasiones he abierto post en donde tras una serie de mensajes terminaba descubriendo que la rueda existía.

No te preocupes, no eres el único que sufre de eso... yo lo vivo casi a diario.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #6  
Antiguo 02-03-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Cita:
Empezado por Delphius Ver Mensaje
No te preocupes, no eres el único que sufre de eso...
¿Sufrir? ¡A mí me encanta! Por dos motivos:

-Demuestra originalidad, y capacidad para desarrollar un algoritmo.
-Me gusta "ahorrar" en uses

Ah!, y esto demuestra otra cosa: hilo desvirtuado (a partir de ahora, "h.d." ó "+1" después del saludo)


Salu2.

[h.d.]
(+1)
Responder Con Cita
  #7  
Antiguo 02-03-2008
RdlP RdlP is offline
Registrado
 
Registrado: mar 2008
Posts: 2
Poder: 0
RdlP Va por buen camino
Muchas gracias por cotnestar, he probado las funciones "LeftStr" y "RightStr" lugo pruebo la de Copy que ahora no tengo mucho tiempo.
Yo en un principio había pensado en algo así, pero ahora me doy cuenta que está mal jejeun bucle for, (para la funcion derecha un bucle for normal de 1 hasta la lonitud y para la funcion izquierda un bucle for que vaya desde la longitud de la cadena hasta la primera posición) pero me estoy dando cuenta que no funcionaría

Gracias
Responder Con Cita
  #8  
Antiguo 02-03-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por RdlP Ver Mensaje
Muchas gracias por cotnestar, he probado las funciones "LeftStr" y "RightStr" lugo pruebo la de Copy que ahora no tengo mucho tiempo.
RdlP y ixMike,
De hecho, tanto LefrStr como RightStr usan a Copy para devolver el resultado. Es más, la declaración de ixMike es una copia de dichas funciones.

¿Para que usar Copy si ya se cuenta con la función adecuada? (*)
Funciona, no hay que hacer pruebas, realmente funciona.

(*) A menos claro, que quieras evitarse el uso de la unidad StrUtils.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #9  
Antiguo 02-03-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Cita:
Empezado por Delphius Ver Mensaje
(*) A menos claro, que quieras evitarse el uso de la unidad StrUtils.
Para mí es un buen motivo
Responder Con Cita
  #10  
Antiguo 02-03-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por ixMike Ver Mensaje
Para mí es un buen motivo
¡Jo'er! Si evitar escribir el nombre de una unidad es motivo para no usar sus funciones, de ahora en adelante no me ducharé para evitar el esfuerzo de abrir la llave del agua.
Responder Con Cita
  #11  
Antiguo 02-03-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
No es por esfuerzo, amigo Al, es por el tamaño resultante del ejecutable
Responder Con Cita
  #12  
Antiguo 02-03-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por ixMike Ver Mensaje
No es por esfuerzo, amigo Al, es por el tamaño resultante del ejecutable
Vamos! ¿Que tanto puede aumentar el añadir una unit? Es cierto que se deben eliminar las units que no se usan... pero por una unit no hay lio.

Saludos,

PD: Por cierto, muy buena frase Al, me recuerda que tengo que dar vuelta el calzoncillo
PD: Hilo desvirtuado. +1
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #13  
Antiguo 02-03-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Cita:
Empezado por Delphius Ver Mensaje
Vamos! ¿Que tanto puede aumentar el añadir una unit?
¡Nada! aquí a ahorrar hasta el último byte!!! ¿Cómo, que el contador va de 1 a 100 y utilizas integer?!!! ¡¡¡si tienes el tipo byteeeeeee!

[h.d. +1]
Responder Con Cita
  #14  
Antiguo 03-03-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

De hecho, en cualquier procesador de 32 bits es más eficiente un contador Integer que Byte. A no ser que se trate de una aplicación cuyo uso de memoria sea un factor ultra súper crítico, dudo mucho que valga la pena "ahorrar" tres bytes a cambio de darle más trabajo al procesador, además de volver más lento el código.

En cuanto a lo del tamaño del programa, haz una prueba y dinos cuántos bytes adicionales toma el ejecutable al usar LeftStr en lugar de Copy. En muchos casos la diferencia es 0 (sobre todo si se trata de una aplicación que incluye formularios).

Cabe recordar que el compilador NO incluye todas las funciones de una unidad referida a través de un Uses, sólo las que el programa utilice (algo que hace todo buen compilador, Delphi no es Cuic Basic ).

Un abrazo.

Al.
Responder Con Cita
  #15  
Antiguo 03-03-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Desconocía el dato acerca de byte-integer, pero tengo comprobado que mi Delphi 3 genera ejecutables del mismo tamaño (variación en pocos bytes) si utilizo sólo IntToStr y StrToInt de SysUtils, que si utilizo muchas funciones más. Ahora, si la quito, me ahorro 50KBs. Es más, la pongo, sin usar nada de ella, y al quitarla, ¡me ahorro 50KBs!

Por supuesto, no estoy hablando de aplicaciones con formularios (si ahí me pudiera ahorrar Graphics )
Responder Con Cita
  #16  
Antiguo 03-03-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por ixMike Ver Mensaje
...SysUtils...si la quito, me ahorro 50KBs. Es más, la pongo, sin usar nada de ella, y al quitarla, ¡me ahorro 50KBs!...
Habría que revisar a detalle el programa y los fuentes de Delphi 3 (hace como siete años que no lo uso), pero muy probablemente se debe a que la unidad SysUtils lleva a cabo código de inicialización, en la SysUtils.pas de Delphi 7 dicho código es:

Código Delphi [-]
initialization
  if ModuleIsCpp then HexDisplayPrefix := '0x';
  InitExceptions;

{$IFDEF LINUX}
  SafeCallErrorProc := @SafeCallError;
  ExitProcessProc := PropagateSignals;

  CheckLocale;
{$ENDIF}

{$IFDEF MSWINDOWS}
  InitPlatformId;
  InitDriveSpacePtr;
{$ENDIF}
  GetFormatSettings; { Win implementation uses platform id }

Debe considerarse que siempre será compilado el código de inicialización que tengan todas las unidades referidas a través de cláusulas Uses.

Saludos.

Al.
Responder Con Cita
  #17  
Antiguo 03-03-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por Al González Ver Mensaje
Cabe recordar que el compilador NO incluye todas las funciones de una unidad referida a través de un Uses, sólo las que el programa utilice (algo que hace todo buen compilador, Delphi no es Cuic Basic ).

Un abrazo.

Al.
Algo de eso había leido en algún lado, no recuerdo bien si fue en la Cara Oculta o si fue algún comentario en los foros, muy posiblemente tuyo.

Si tengo un vago recuerdo de que mientras tengamos units en el uses el compilador las "explora"... ¿a eso te refieres cuando dices esto?:

Cita:
Empezado por Al González Ver Mensaje
Habría que revisar a detalle el programa y los fuentes de Delphi 3 (hace como siete años que no lo uso), pero muy probablemente se debe a que la unidad SysUtils lleva a cabo código de inicialización, en la SysUtils.pas de Delphi 7 dicho código es:

Código Delphi [-]initialization if ModuleIsCpp then HexDisplayPrefix := '0x';
InitExceptions;

{$IFDEF LINUX} SafeCallErrorProc := @SafeCallError; ExitProcessProc := PropagateSignals; CheckLocale; {$ENDIF} {$IFDEF MSWINDOWS} InitPlatformId; InitDriveSpacePtr; {$ENDIF} GetFormatSettings; { Win implementation uses platform id }


Debe considerarse que siempre será compilado el código de inicialización que tengan todas las unidades referidas a través de cláusulas Uses.

Saludos.

Al.
Pero, si no me falla la memoria, el compilador sólo lo hace sobre aquellas units que han sido cambiadas. Esto es el comportamiento por defecto y es el que se realiza mientras uno Compile. Tengo entendido que si uno realiza Build obliga a recompilar todo.

¿Esto es así?

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #18  
Antiguo 03-03-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

Cita:
Empezado por Delphius Ver Mensaje
Algo de eso había leido en algún lado, no recuerdo bien si fue en la Cara Oculta o si fue algún comentario en los foros, muy posiblemente tuyo.

Si tengo un vago recuerdo de que mientras tengamos units en el uses el compilador las "explora"... ¿a eso te refieres...
Es tan sencillo como que función referida en el código -> función metida al .exe como parte del código máquina. Función no referida -> función no tocada. Igual pasa con las variables, constantes y otros elementos; al no ser usados en ningún lado del programa, el compilador no los incluye en el .exe. Pero con "referido" quiero dar a entender el que haya un claro uso del elemento en cuestión desde algún punto del árbol de llamadas y referencias cuya raíz es el "main" ("Program") de la aplicación.

Cita:
Empezado por Delphius Ver Mensaje
...Pero, si no me falla la memoria, el compilador sólo lo hace sobre aquellas units que han sido cambiadas. Esto es el comportamiento por defecto y es el que se realiza mientras uno Compile. Tengo entendido que si uno realiza Build obliga a recompilar todo...
Es correcto lo que dices, pero creo que no se interpretó bien lo que dije.

Al decir que "siempre será compilado el código de inicialización que tengan todas las unidades referidas a través de cláusulas Uses", no me refiero al análisis y validación sintácticos que hace el compilador sobre el código fuente, sino a la "integración" de dicho código en su versión ejecutable dentro del programa resultante. Cuando la unidad .pas no ha sido modificada desde su última compilación, el código se tomará directamente del archivo .dcu correspondiente. De hecho el compilador no necesita los .pas para generar un .exe, mientras existan las unidades compiladas .dcu. Es de éstas de dónde siempre toma lo necesario para crear el programa ejecutable.

Espero no haber confundido más.

Saludos.

Al.

Última edición por Al González fecha: 03-03-2008 a las 05:39:31.
Responder Con Cita
  #19  
Antiguo 03-03-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por Al González Ver Mensaje
Espero no haber confundido más.
Todo lo contrario amigo. Traes Luz a este tonto (yo) para que sepa por donde mirar.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
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
funciones string gallipi Varios 3 29-01-2008 17:26:29
Funciones String thomasini OOP 3 27-09-2006 14:53:45
Problemas con funciones de manejo de string destrukthor Varios 7 11-07-2006 16:39:29
Información sobre funciones string JavierO Varios 2 11-10-2005 19:34:02
Funciones de String Joacko Varios 0 01-12-2004 19:54:49


La franja horaria es GMT +2. Ahora son las 03:16:42.


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