Ver Mensaje Individual
  #3  
Antiguo 26-10-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.141
Reputación: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
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... 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.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 26-10-2007 a las 08:49:43.
Responder Con Cita