Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Leer inicio de un string (https://www.clubdelphi.com/foros/showthread.php?t=90001)

feliz-58 16-03-2016 21:37:08

Leer inicio de un string
 
Saludos, Consulta rápida....

imaginemos que tengo dentro de un edit lo siguiente:
//ClubDelphi

a manera de If...Then...Else como puedo definir que si en el edit los dos primeros espacios son exactamente esos dos símbolos // por ejemplo me muestre un mensaje diciendo Hola y que de lo contrario diga Adiós.

Me di a entender? solo necesito identificar el inicio de una cadena para a partir de esa información establecer condiciones

ecfisa 16-03-2016 22:15:06

Cita:

Empezado por feliz-58 (Mensaje 503405)
Saludos, Consulta rápida....

imaginemos que tengo dentro de un edit lo siguiente:
//ClubDelphi

a manera de If...Then...Else como puedo definir que si en el edit los dos primeros espacios son exactamente esos dos símbolos // por ejemplo me muestre un mensaje diciendo Hola y que de lo contrario diga Adiós.
...

Hola, respuesta rápida
Código Delphi [-]
function foo(const s: string): string;
begin
  if (s[1] = '/')and(s[2] = '/') then
    Result := 'Hola'
  else
    Result := 'Adios';
end;
O también:
Código Delphi [-]
function foo(const s: string): string;
const
  MSG: array[Boolean] of string = ('Adios','Hola');
begin
  Result := MSG[(s[1] = '/')and(s[2] = '/')];
end;

Uso:
Código Delphi [-]
 
  ShowMessage(foo('//ClubDelphi'));

Saludos :)

BDWONG 16-03-2016 22:19:40

Hola
 
Parece que se me adelanto eficsia
pero tambien existen estas posibles soluciones

Código Delphi [-]
var
  cadena:String;
begin
   cadena:='//ClubDelphi';

   //Opcion 1: comparando las dos primeras posiciones de la cadena
   if (cadena[1]='/') and (cadena[2]='/') then WriteLn('Hola')
   else WriteLn('Adios');

   //OpCION 2: Usando la funcion Pos que nos regresa la posicion donde se encuentra la "//"
   //si nos devuelve 1 esta al inicio de la cadena
   if  Pos('//',cadena)=1 then WriteLn('Hola')
   else WriteLn('Adios');

   //Opcion 3: Usanodo AnsiStartsStr nos devuevel true o false si una palabra se encuentra al inicio de la cadena
   if AnsiStartsStr('//',cadena) then WriteLn('Hola')
   else WriteLn('Adios');

   ReadLn;
end.

Saludos...:cool:

ecfisa 16-03-2016 22:30:25

Hola.

Es correcto BDWONG ;)

Otras alternativas:
Código Delphi [-]
function foo(const s: string): string;
begin
  if s[1]+s[2] = '//' then
    Result := 'Hola'
  else
    Result := 'Adios';
end;

Código Delphi [-]
function foo(const s: string): string;
begin
  if Copy(s, 1, 2) = '//' then
    Result := 'Hola'
  else
    Result := 'Adios';
end;

Saludos :)

fredo 16-03-2016 22:36:52

commo dato los strings para plataformas moviles parten en la posicion cero, para macos y windows en la 1....

ojo con eso salu2

feliz-58 16-03-2016 22:45:13

Cita:

Empezado por ecfisa (Mensaje 503406)
Hola, respuesta rápida
Código Delphi [-]
function foo(const s: string): string;
begin
  if (s[1] = '/')and(s[2] = '/') then
    Result := 'Hola'
  else
    Result := 'Adios';
end;
O también:
Código Delphi [-]
function foo(const s: string): string;
const
  MSG: array[Boolean] of string = ('Adios','Hola');
begin
  Result := MSG[(s[1] = '/')and(s[2] = '/')];
end;

Uso:
Código Delphi [-]
 
  ShowMessage(foo('//ClubDelphi'));

Saludos :)

Agradecimiento Rápido. Saludos! ^\||/

Ñuño Martínez 17-03-2016 10:14:58

Cita:

Empezado por fredo (Mensaje 503409)
commo dato los strings para plataformas moviles parten en la posicion cero, para macos y windows en la 1....

ojo con eso salu2

Espera, espera, espera: ¿Que qué? O sea, ¿no hay congruencia dentro del lenguaje? :eek:

¿Y si estás haciendo algo para móviles y escritorio (una bilbioteca, por ejemplo), cómo te lo montas?

AgustinOrtu 17-03-2016 16:18:42

El ayudante TStringHelper se "encarga" de esos menesteres

+Info

roman 18-03-2016 16:22:41

Hola,

Algunas de las soluciones propuestas son propensas a un Access Violation ;)

LineComment Saludos

AgustinOrtu 19-03-2016 04:58:08

Pues si, ojo con los strings vacios :)

Código Delphi [-]
function foo1(const s: string): string;
begin
  if (s[1] = '/') and (s[2] = '/') then
    Result := 'Hola'
  else
    Result := 'Adios';
end;

function foo2(const s: string): string;
const
  MSG: array [Boolean] of string = ('Adios', 'Hola');
begin
  Result := MSG[(s[1] = '/') and (s[2] = '/')];
end;

function foo3(const s: string): string;
begin
  if s[1] + s[2] = '//' then
    Result := 'Hola'
  else
    Result := 'Adios';
end;

begin
  try
     Writeln('Foo1 EmptyStr: ' + foo1('')); // AV
     Writeln('Foo2 EmptyStr: ' + foo2('')); // AV
     Writeln('Foo3 EmptyStr: ' + foo3('')); // AV
     Writeln('Foo3 A: ' + foo3('A')); // AV
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

ecfisa 20-03-2016 00:18:00

Hola.

Dije fué una respuesta rápida (al vuelo) por lo que no incluí comprobaciones :o Pero se puede verificar que la cadena a enviar esté vacía externamente como bién lo ha expuesto Agustín, o también dentro de las mismas funciones.

Ejemplo:
Código Delphi [-]
function foo(const s: string): string;
const
  MSG: array [Boolean] of string = ('Adios', 'Hola');
begin
   if s = '' then raise Exception.Create('cadena vacía');
   Result := MSG[(s[1] = '/') and (s[2] = '/')];
end;

Saludos :)

ecfisa 20-03-2016 00:19:32

Hola.

Como dije fué una respuesta rápida (al vuelo) por lo que no incluí comprobaciones :o. Pero se puede verificar que la cadena a enviar esté vacía externamente como bién lo ha expuesto Agustín, o también dentro de las mismas funciones.

Ejemplo:
Código Delphi [-]
function foo(const s: string): string;
const
  MSG: array [Boolean] of string = ('Adios', 'Hola');
begin
   if s = '' then raise Exception.Create('cadena vacía');
   Result := MSG[(s[1] = '/') and (s[2] = '/')];
end;

Saludos :)

AgustinOrtu 20-03-2016 01:07:46

De todos modos a mi no me parece mal que se implemente asi

Siempre me gusto la filosofia de "diseño por contrato", basicamente la funcion cumple con su parte siempre y cuando el que la invoca cumpla con la suya

En este caso las precondiciones son: La cadena no debe estar vacia y en el caso de una de las versiones que tiene una condicion or debe tener una longitud mayor o igual a 2 caracteres

Si las precondiciones se cumplen, la funcion "foo" te promete cumplir con las postcondiciones: Decirte True o False si un string comienza con dos determinados caracteres

BDWONG 20-03-2016 01:13:07

Aquí una pequeña variación de la función de eficsia evitando usar excepciones

Código Delphi [-]
function foo(const s: string): string;
const
  MSG: array [Boolean] of string = ('Adios', 'Hola');
begin
   Result := MSG[(Length(s)>=2) and (s[1] = '/') and (s[2] = '/')];
end;

begin

  Writeln(foo('sinBarras'));
  Writeln(foo('//conBarras'));
  ReadLn;
end.


La franja horaria es GMT +2. Ahora son las 07:45:09.

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