Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Case para strings?? (https://www.clubdelphi.com/foros/showthread.php?t=49653)

Milperrimo 26-10-2007 06:57:23

Case para strings??
 
Se puede hacer un case para strings????????? utilizo delphi 7, y ando buscando como hacer algo como un case pero con strings, aunque lo puedo hacer con if, pero serian como 25 ifs y kedaria un chorizote, alguien sabe como o de plano tendre ke hacerlo con ifs??

marcoszorrilla 26-10-2007 07:08:59

Si es para vocales algo como esto te puede servir:


Código Delphi [-]
    Case cPeriodo[1] of
      '1':begin


Un Saludo.

dec 26-10-2007 08:42:40

Hola,

Cita:

Empezado por Marcos
Si es para vocales (...)

Más que para vocales para "chars", puesto que "char" es un tipo ordinal, tal como requieren los "case" en Delphi.

De todas formas es posible que sea más costoso un "case" que usar "if". Y, digo yo, que, probablemente pudiera hacerse lo que el compañero necesita de otro modo, sólo que así sin más datos... no es posible adivinar cómo es que se plantea lo que dice necesitar.

Si se quiere liar la cosa... y tal vez a costa de que todo resulte más costoso, podríamos preparar un "conjunto" que "emparejar" a un "Array de strings", de modo que pudiera quedarnos algo como lo de más abajo... que puede ser una tremenda tontería, fruto de llevar toda la noche picando código y sin dormir, y el que avisa no es traidor. :)

Pero, vengamos al caso, o al "case", como queráis. Declaramos un conjunto tal que así:

Código Delphi [-]
type
  TStringsCase = (scInvalid, scOne, scTwo, scThird);

Y preparamos un "Array de strings" que estará "emparejado" con el tipo de más arriba:

Código Delphi [-]
var
  StringsCase: array [0..3] of string = (
    '', // scInvalid salt
    'One',
    'Two',
    'Third'
  );

Ahora, podemos preparar un procedimiento que requiera una cadena, de modo que en el mismo podamos comprobar con qué elemento del conjunto se "empareja". Acto seguido usaremos una variable del tipo del "conjunto" para determinar el "caso" correspondiente a la cadena en cuestión:

Código Delphi [-]
procedure DoStringCase(aString: string);
var
  i: byte;
  sc: TStringsCase;
begin
  sc := scInvalid; // Default case
  for i := Low(StringsCase) to High(StringsCase) do begin
    if (aString = StringsCase[i]) then begin
      sc := TStringsCase(integer(i));
      Break;
    end;
  end;
  case sc of
      scOne: ShowMessage('aString = One');
      scTwo: ShowMessage('aString = Two');
    scThird: ShowMessage('aString = Third');
  else
    raise Exception.Create('Invalid case string');
  end;
end;

El tema está en que al procedimiento "DoStringCase" le pasamos un "string" como parámetro, de modo que, en el ejemplo, se ejecutará el "ShowMessage()" correspondiente a dicho "string", en realidad al elemento del conjunto que emparejamos con el "string":

Código Delphi [-]
begin
  // Mostraría: aString = One
  DoStringCase('One');

  // Mostraría: aString = Two
  DoStringCase('Two');

  // Se elevaría la excepción
  // DoStringCase('');

  // Se elevaría la excepción
  // DoStringCase('Four');
end;

Pero,... creo que después de esto ya me puedo echar a dormir... :D :D Sinceramente, es probable que haya otras formas de hacer lo que se plantea el compañero. Aun habiendo escrito lo anterior, dudo mucho que algún día lo utilizase... pero, en fin, ahí queda, por si puede servir de algo.

PD. Tiene el inconveniente principal de tener que añadir tantos elementos al "conjunto" como sean precisos... y hacer lo propio con el "Array de string" correspondiente. Por no mencionar otra vez el posible costo de llevar a cabo el "bucle for", a continuación el "case"... y el resto de defecos que se os ocurran. :)

marcoszorrilla 26-10-2007 10:29:20

En realidad quería decir para tipo Char, según ha corregido David.

Un Saludo.

Caro 26-10-2007 14:20:47

Hola Milperrimo, tambien lo puedes hacer de esta forma

Código Delphi [-]

 case AnsiIndexStr(cadena,['Uno', 'Dos', 'Tres']) of
  0 : showmessage('Uno');
  1 : showmessage('Dos');
  2 : showmessage('Tres');
  -1 : //la cadena no se encuentra en el arreglo, seria como el else del Case;
 end;


La función AnsiIndexStr te devuelve el indice de una cadena dentro de un arreglo de cadenas y -1 si no encuentra dentro de ese arreglo.

Saluditos

dec 26-10-2007 14:37:46

Hola,

Caro apunte Caro. :)

marcoszorrilla 26-10-2007 14:51:04

Abundando en lo dicho por David Carísimo apunte Caro.

Un Saludo.

Caro 26-10-2007 15:24:09

Hola dec y marcoszorrilla, solo queria comentarles que mi nick no tiene nada que ver con la palabra caro, sino que es una abreviación de Carolina que es el nombre que me gusta mucho :D .

Saluditos

dec 26-10-2007 15:41:53

Hola,

Bueno. Pues fatal el apunte Caro, cómo puedes escribir código tan malo. :D :D :D

PD. Es broma... ¿eh? Lo dicho, dicho. :)

Milperrimo 26-10-2007 16:13:41

Gracias compañeros por sus respuestas, voy a probar con las soluciones dadas, haber cual me funciona mejor para lo que necesito:)

roman 21-01-2009 18:50:14

¡Estupendo truco Caro! Recién hoy me entero y con éste es el segundo tuyo que veo hoy. ¿Los has puesto en la sección de trucos?

// Saludos

marcoszorrilla 21-01-2009 22:11:57

Ah!

Cita:

Carolina, nombre femenino de origen germánico derivado de Carlos "Karl", su significado es "Aquella que es inteligente"

Historia y el Santo:
Carolina Kózka, virgen y mártir. Nació en Polonia en 1898, en una familia de gran fervor cristiano. Durante la primera Guerra Mundial, en la invasión a Polonia, Carolina es atacada y ultrajada; muere defendiendo su virginidad. Se la conoce como "La estrella de Tarnow". Juan Pablo II la beatifico el 10 de junio de 1987. Se conmemora el 18 noviembre.

Variantes de Carolina: en su forma abreviada: Lina (Lino); diminutivo de Carolina: Carol, derivado de Carlos y Carla.

Carolina en otros idiomas, catalán: Carolina; francés e ingles: Caroline; italiano: Caroline.

Famosos, personales históricos celebres con el nombre de Carolina:

* Carolina Coronado, nació en Badajoz en el año 1823; poeta romántica; entre sus poemas mas destacados, citaremos: "La Palma"; "La rosa blanca" o "A Alberto" entre otros.
* Carolina Herrera, nació en Venezuela en el año 1939, diseñadora con fama internacional representante de la moda del ultimo cuarto del siglo XX; a marcado tendencia en la alta costura.
*

Carolina de Mónaco, princesa de Mónaco, nació en el año 1957, hija del príncipe Rainero y la princesa Grace de kelly
Un Saludo caro Caro.

jhonny 21-01-2009 22:19:28

Ey, ¿Como es que yo no había visto este apunte?, pues esta muy bueno, que bien Caro, gracias :).


La franja horaria es GMT +2. Ahora son las 15:18:30.

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