Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Funciones sobre String (https://www.clubdelphi.com/foros/showthread.php?t=53824)

RdlP 02-03-2008 02:25:31

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

ixMike 02-03-2008 02:33:21

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

Delphius 02-03-2008 02:43:49

Lamento darte una mala noticia ixMike, acabas de reinventar la rueda:D. 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,

ixMike 02-03-2008 02:47:17

Cita:

Empezado por Delphius (Mensaje 270039)
ixMike, acabas de reinventar la rueda:D.

No sería la primera vez :D. De hecho, hasta pensé en poner un post acerca de ello.

...¡ni se te ocurra robarme la idea, ¿eh?!

Delphius 02-03-2008 02:51:12

Cita:

Empezado por ixMike (Mensaje 270040)
No sería la primera vez :D. 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,

ixMike 02-03-2008 02:59:21

Cita:

Empezado por Delphius (Mensaje 270042)
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) :D:D


Salu2.

[h.d.]
(+1)

RdlP 02-03-2008 12:09:33

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

Gracias

Delphius 02-03-2008 17:54:55

Cita:

Empezado por RdlP (Mensaje 270064)
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,

ixMike 02-03-2008 18:08:11

Cita:

Empezado por Delphius (Mensaje 270105)
(*) A menos claro, que quieras evitarse el uso de la unidad StrUtils.

Para mí es un buen motivo :D

Al González 02-03-2008 22:47:29

Cita:

Empezado por ixMike (Mensaje 270107)
Para mí es un buen motivo :D

¡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. :rolleyes:

ixMike 02-03-2008 23:14:44

No es por esfuerzo, amigo Al, es por el tamaño resultante del ejecutable ;)

Delphius 02-03-2008 23:21:11

Cita:

Empezado por ixMike (Mensaje 270179)
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:D:eek::rolleyes:;):D
PD: Hilo desvirtuado. +1:o

ixMike 02-03-2008 23:47:42

Cita:

Empezado por Delphius (Mensaje 270182)
Vamos! ¿Que tanto puede aumentar el añadir una unit?

¡Nada!:mad: 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! :D:D:D

[h.d. +1]

Al González 03-03-2008 00:37:52

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

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

Un abrazo.

Al.

ixMike 03-03-2008 01:23:01

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

Al González 03-03-2008 01:31:54

Cita:

Empezado por ixMike (Mensaje 270202)
...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.

Delphius 03-03-2008 04:10:33

Cita:

Empezado por Al González (Mensaje 270199)
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 :p).

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 (Mensaje 270204)
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,

Al González 03-03-2008 05:33:04

Cita:

Empezado por Delphius (Mensaje 270217)
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 (Mensaje 270217)
...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. :o

Saludos.

Al.

Delphius 03-03-2008 13:19:00

Cita:

Empezado por Al González (Mensaje 270221)
Espero no haber confundido más. :o

Todo lo contrario amigo. Traes Luz a este tonto (yo) para que sepa por donde mirar.

Saludos,


La franja horaria es GMT +2. Ahora son las 17:57:03.

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