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.
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.