PDA

Ver la Versión Completa : ¿Similar al Choose de Visual Basic?


Iron
21-03-2009, 21:33:20
Buenas noches,

Última pregunta, para escoger un valor en función de un número, en Visual uso : z = Choose(d, 60, 55, 50, 45, 40, 35, 30, 25, 20, 15, 10). Donde z coge el valor en función de d, es decir, si por ejemplo d vale 4, z valdrá 45.
Esto me reduce bastante el código, ya que el Delphi estoy usando If.
¿Existe algo equivalente en Delphi?.

Muchas gracias y enhorabuena por el foro.

cmm07
21-03-2009, 21:37:02
no sé, pero lo que se me ocurre es que si estas poniendo muchos if del mismo tipo, ¿porque no creas esos if como una unica función y la mandas a llamar?, asi ahorrarias mucho el codigo...

Iron
21-03-2009, 21:41:27
Gracias de nuevo cmm07!!. En algunos casos pongo hasta 15 If :eek:. Se hacer funciones en Delphi pero no llego a comprender lo que me dices. ¿Serías tan amable de aclararmelo?, Gracias.

Delphius
21-03-2009, 22:45:36
Hola Iron,

Desconozco si existe alguna función ya hecha en Delphi que haga lo que pides. Pero no creo que resulte tan complicado hacerlo.

Por ejemplo, valiendome del tipo TIntegerDynArray que es un array dinámico de tipo entero es posible hacer dicha función.


function TForm1.Choose(Position: integer; ArrayNumber: TIntegerDynArray): integer;
begin
if (Position <= High(ArrayNumber)) AND (Position >= 0)
then result := ArrayNumber[Position]
else raise exception.Create('Position out of range');
end;


Y un modo de usarla sería algo como éste:


procedure TForm1.Button1Click(Sender: TObject);
var arreglo: TIntegerDynArray;
i: integer;
begin
SetLength(arreglo,6);
for i := Low(arreglo) to High(arreglo) do
arreglo[i] := random(123);

ShowMessage(IntToStr(Choose(2,arreglo)));

SetLength(arreglo,0);
arreglo := nil;
end;


Se puede mejorar evidentemente. Pero al menos es una aproximación.

Saludos,

roman
21-03-2009, 22:51:03
Yo tengo otra versión:


function Choose(d: integer; values: array of Integer): Integer;
begin
Result := values[d];
end;


Ejemplo de uso:


z := Choose(d, [60, 55, 50, 45, 40, 35, 30, 25, 20, 15, 10]);


// Saludos

dec
21-03-2009, 23:11:41
Hola,

¿No habría que comprobar si existe el índice en el Array Román? :D

PD. Acabo de probarlo, y, parece que si nos "salimos" con el índice, obtenemos valores "aleatorios", que, no termino de comprender... de todas formas me atrevo a proponer algo como esto:


function Choose(d: integer; values: array of Integer): Integer;
begin
if Length(values) >= d then
Result := values[d]
else
Result := -1;
end;


De esta forma, si el índice no existe, retornamos "-1"... y todavía así podría haber problemas, igual hay que levantar una excepción o algo así... ¿qué opináis?

roman
21-03-2009, 23:25:58
Podríamos poner:


{$R+}
function Choose(d: integer; values: array of Integer): Integer;
begin
Result := values[d];
end;
{$R-}


:D

// Saludos

dec
21-03-2009, 23:39:39
Hola,

Ah, amigo, pero, la elegancia es la elegancia. :D :D :D

Delphius
21-03-2009, 23:51:28
Hey roman, no me arruines el chiste:D
Jaja.

Inicialmente estuve pensando en tu idea, pero cuando estaba probandolo obtenía errores, que el parámetro no me lo reconocía:confused: alguna metida mal de dedo debía haber metido. Y bueno me enojé y metí esa cosa que debería ir a parar a código inútil:p:o.

Lo que si he notado con el código que expuse, es que me arrojaba un Warning diciéndome que la condición siempre se evaluaba a TRUE. La cosa es que ahora no me arroja dicha advertencia.:confused:

Saludos,

roman
22-03-2009, 00:03:29
Lo que a mi no me queda claro es para qué podría servir una función así. Creo que necesito un ejemplo.

// Saludos

Delphius
22-03-2009, 00:18:40
Lo que a mi no me queda claro es para qué podría servir una función así. Creo que necesito un ejemplo.

// Saludos
¿Para acceder a una posición de un array?:rolleyes::D
La verdad es que tienes razón, mucho sentido no tiene... yo diría que es mejor ir a secas, y leerla así:

algo := miarray[d]

Sería bueno que Iron nos comentase lo que busca con todo esto.

Saludos,

jconnor82
22-03-2009, 06:05:17
Hola a todos...

Segun entendi, lo que quiere es obtener el primer numero del arreglo q empieze con d

function Choose(D: Integer; Values: array of Integer): Integer;
var
I: Integer;
sD, sValue: string;
begin
Result := -1;

sD := IntToStr(D);
for I := 0 to High(Values) do
begin
sValue := IntToStr(Values[I]);

if Pos(sD, sValue) = 1 then
begin
Result := Values[I];
Break;
end;
end;
end;

Iron
22-03-2009, 21:18:10
Muchas Gracias a todos por contestar y poner tanto interés.
Yo esto lo hago cuando elijo en un ListBox un dato, en función del indice del ListBox escojo en varios Choose los datos que me hacen falta (lo hago así en visual). En Delphi igual pero con IF´s. Estoy seguro que se podrá hacer de una forma mas sencilla, pero esta es la que yo hago.
Con las respuestas que dais las probaré, espero que me salgan bien :confused:.

Un saludo y gracias nuevamente.