PDA

Ver la Versión Completa : Leer inicio de un string


feliz-58
16-03-2016, 21:37:08
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
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

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

O también:

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


Uso:

ShowMessage(foo('//ClubDelphi'));


Saludos :)

BDWONG
16-03-2016, 22:19:40
Parece que se me adelanto eficsia
pero tambien existen estas posibles soluciones

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:

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



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
Hola, respuesta rápida

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

O también:

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


Uso:

ShowMessage(foo('//ClubDelphi'));


Saludos :)

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

Ñuño Martínez
17-03-2016, 10:14:58
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 (http://docwiki.embarcadero.com/RADStudio/Seattle/en/Migrating_Delphi_Code_to_Mobile_from_Desktop)

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


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:

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:

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

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.