Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-06-2006
Avatar de quinqui
quinqui quinqui is offline
Miembro
 
Registrado: jun 2006
Posts: 14
Poder: 0
quinqui Va por buen camino
Red face Cómo asignar valores a una variable tipo Array

pareciera fácil, pero no lo es ^^

me refiero a que no he podido encontrar la forma de hacerlo de cierta manera en especial...

tradicionalmente, para asignar valores a un arreglo se ocupa la forma :

Código Delphi [-]
var
miArreglo : Array of String;
begin
SetLength(miArray, 2);
miArreglo[0] := 'Hola';
miArreglo[1] := 'Chau';
end;

lo que yo busco es la forma de hacerlo como se hace en otros lenguajes, como PHP :

Código PHP:
$miArreglo = array('Hola''Chau'); 
o sea, todos los elementos para el lado, sin tener que escribir una línea por cada elemento del arreglo; algo como esto :

Código Delphi [-]
var
miArreglo : Array of String;
begin
SetLength(miArreglo, 2);
miArreglo := ('Hola', 'Chau');
end;

existe un método o forma para hacerlo?

mil gracias

pd: la utilidad que busco está en las situaciones en que son muchos los elementos a asignar en el arreglo... se me ocurrió usar un striinlist o algo así de apoyo para poder llenar el arreglo dinámico rápidamente, pero no me gusta mucho entrar a usar más elementos cuando podría hacerlo directamente sobre el arreglo... ojalá se pudiera o_o
Responder Con Cita
  #2  
Antiguo 22-06-2006
celades1 celades1 is offline
Miembro
 
Registrado: ago 2005
Posts: 116
Poder: 19
celades1 Va por buen camino
Hola
Suponiendo que los datos los saco de una query que llamaremos consulta

Código Delphi [-]
procedure llenar_array(consulta:tibquery);
var miArreglo : Array of String;
n:integer
begin
n:=0;
while not consulta.eof do begin
SetLength(miArray, n+1);
miArreglo[n] := consulta.fieldbyname('campo').asstring;
inc(n);
consulta.next
end;

end;

No se si eso te sirve pero es como yo las utilizo
Saludos
Responder Con Cita
  #3  
Antiguo 22-06-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cuando tú haces algo así en PHP:

Código PHP:
$arregloStrings = array('a''b''c'); 
Estás creando un nuevo "Array" con unos elementos predeterminados. Observa que "array()" es una construcción del lenguaje PHP, que devuelve, precisamente, un Array del tipo de los parámetros que le pases a la construcción "array()".

Con Delphi puedes también iniciarlizar "Arrays" estáticos, tal que así:

Código Delphi [-]
var
  arregloStrings: array [1..3] of string = ('a', 'b', 'c');

Por otro lado, un Array dinámico en Delphi, tal como dices, puede declararse, iniciarlizarse y rellenarse de este modo:

Código Delphi [-]
var
  arrayDinamico: array of string;

begin
  SetLength(arrayDinamico, 3);

  arrayDinamico[0] := 'a';
  arrayDinamico[1] := 'b';
  arrayDinamico[2] := 'c';

  // Muestra "a"
  ShowMessage(arrayDinamico[0]);

end;

Sin embargo, echando un vistazo en la ayuda de Delphi, en el apartado "Open array constructors", puede leerse lo siguiente:

Cita:
Open array constructors allow you to construct arrays directly within function and procedure calls.
Con lo que es posible hacer algo como esto:

Código Delphi [-]
type
  { Tipo que nos servirá para devolver
    el resultado de la siguiente función
  }
  TArrayStrings = array of string;

{ Esta función toma como parámetros una serie de cadenas
  y devuelve un "TArrayStrings" (array of strings) como
  resultado
}
function CrearArray(elementos: array of string) : TArrayStrings;
var
  i: integer;
begin
  // Inicializamos el Array/resultado
  SetLength(Result, High(elementos)+1);

  // Lo rellenamos con los elementos
  for i := 0 to High(elementos) do
    Result[i] := elementos[i];

end;

{ Ejemplo de llamada a la función anterior
}
procedure TForm1.Button1Click(Sender: TObject);
var
  unArray: TArrayStrings;
begin

  { ¿A que esto se parece algo más a PHP? }
  unArray := CrearArray(['a', 'b', 'c']);

  ShowMessage(unArray[0]); // Muestra "a"

end;

Nota: Lo inmediatamente anterior puede no ser del todo correcto, o en todo caso puede ser muy mejorable, lo escribí a bote pronto a modo de introducción al tema, para explicar cómo es posible crear "Arrays" de ese modo, pero, que cada palo aguante su vela, he dicho.

En fin, lo mismo hasta sirve de algo el rollo que acabo de meteros.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
Antiguo 23-06-2006
Avatar de quinqui
quinqui quinqui is offline
Miembro
 
Registrado: jun 2006
Posts: 14
Poder: 0
quinqui Va por buen camino
o sea que realmente no existe una forma directa como con PHP ...

les explico mejor mi caso:
He hecho un procedimiento que realiza una consulta y muestra los resultados en una Grid. La idea es que esta Grid se adapte al formato de dicho resultado; me refiero específicamente a la cantidad de columnas y al texto de la fila de encabezados.

el procedimiento debe ser capaz de decidir, aparte de cuál consulta realizar, qué encabezados darle a la grilla, y a eso iba yo con cómo darle valores distintos a un mismo arreglo, pero de manera dinámica.

esto es, que si, por ejemplo, consultara por Usuarios, la Grid debiera tener 3 columnas y sus encabezados debieran decir algo como "ID", "Clave" y "Nivel"; luego, si consultara por Clientes, los encabezados debieran ser 4 y decir "Nombre", "Dirección", "Fono" e "Email"... etc...

en este caso, el procedimiento se vería algo así como esto :

Código Delphi [-]
procedure Cargar(Consulta: Integer);
var
 i : Integer;
 miArray : Array of String;
begin

 { Selecciona los parámetros a aplicar en la Grid según la Consulta recibida }
 case Consulta of
   1 : { Usuarios }
   begin
     SetLength(miArray, 3);
     miArray := ('ID', 'Clave', 'Nivel');
   end;
  2: { Clientes }
   begin
     SetLength(miArray, 4);
     miArray := ('Nombre', 'Dirección', 'Fono', 'Email');
   end;
 end;

 { Formateo la Grid }
 miGrid.ColCount := Length(miArray);

 { Lleno el encabezado de la Grid }
 for i := 0 to Length(miArray) - 1 do
   miGrid.Cells[i, 0] := miArray[i];

 { Aquí realizaría la consulta sql en sí, leyendo los registros encontrados y mostrándolos en la Grid ya inicializada... }

end;

la idea, en función de mi flojera, es no tener que hacer esto por cada opción de Consulta :

Código Delphi [-]
 case Consulta of
   1 : { Usuarios }
   begin
     SetLength(miArray, 3);
     miArray[0] := 'ID';
     miArray[1] := 'Clave';
     miArray[2] := 'Nivel';
   end;
   .
   .
   .

esop....
Responder Con Cita
  #5  
Antiguo 23-06-2006
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
En teoría, el grid se adapta a los campos que tenga el query, y no habría necesidad de definir los campos del encabezado, ya que el grid los tomaría de forma automática al momento de especificar el query como datasource del grid.
__________________

Responder Con Cita
  #6  
Antiguo 23-06-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
o sea que realmente no existe una forma directa como con PHP ...
Es que en PHP tampoco hay ninguna forma "directa"... esto es, tú no puedes hacer esto con un "Array" en PHP:

Código PHP:
 $arrayStrings = ('a''b''c'); 
Sino que tienes que emplear la función que existe para ello, aunque en realidad no es una función sino una construcción del lenguaje, lo cierto es que cuando haces algo así:

Código PHP:
 $arrayStrings = array('a''b''c'); 
No estás "rellenando" un Array con elementos, sino que estás creando el Array.

Ahora bien, con Delphi, como dije arriba, también es posible inicializar un Array estático, claro está:

Código Delphi [-]
var
  arregloStrings: array [1..3] of string = ('a', 'b', 'c');

Y, en todo caso, siempre podrás utilizar una función como la que puse arriba a modo de "array()", tal como haces en PHP.

Por otro lado me suena más que en tu caso lo que dice Contraveneno sea lo correcto, esto es, acaso no seas tú directamente el haya de encargarse de darle los encabezados al "Grid", tal vez, como dice Contraveneno, sea cuestión de que el propio "Grid" se haga cargo.

Yo aquí ya no me meto, porque, sencillamente, no tengo mucha idea, por no decir ninguna.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 23-06-2006 a las 10:14:46.
Responder Con Cita
  #7  
Antiguo 23-06-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Yo tengo un grid que me sirve para administrar 4 tablas simultáneamente con Firebird. Lo único que tienes que hacer es darle el sql al Query, abrirlo y despues puedes llamar a dbgrid.Columns.RebuildColumns para que se actualice las columnas, los anchos, etc.

En lugar de pasar un entero a la funcion Cargar(consulta :integer) usa constantes, o incluso Tipos enumerados, te saldrá un código más descriptivo:

Código Delphi [-]
type
  TTipoConsulta = (tcClientes= 0, tcProductos, tcFacturas);

var  ConsultaSql = Array [TTipoConsulta] of String = (' SELECT * FROM CLIENTES',
'SELECT UNO, DOS FROM PRODUCTOS',
'SELECT TRES, CUATRO FROM FACTURAS');

procedure Cargar( TipoDeConsulta : TTipoConsulta);
begin
  case TipoDeConsulta of
    tcClientes: ....
    tcProductos: .....
    tcFacturas: ....
  else
    raise exception.Create('No está controlado esta sql en este procedimiento');
  end;
 query1.Sql.Text := Consultasql[TipoDeConsulta];
end;
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #8  
Antiguo 23-06-2006
Avatar de quinqui
quinqui quinqui is offline
Miembro
 
Registrado: jun 2006
Posts: 14
Poder: 0
quinqui Va por buen camino
mmm pues ya me parecía que usando el DBGrid saldría fácil la cosa, pero es que estoy usando el clásico StringGrid.... pero como veo, si le doy los nombres de los encabezados en el SQL, entonces demás me saldría bien la cosa usando el DBGrid...

por cierto, si estoy usando el SGrid es más que nada porque nunca he usado el DBGrid (creo recordar que cuando intenté usar uno de esos, pero en Visual, era demasiado limitado en cuanto a eventos y cosas así en comparación con el FlexGrid, por eso me quedé con la idea de que no convenía usar el DBGrid en general...), intentaré probándolo pues, jejeje ^^U... y lo de crear tipos personalizados también, a ver qué me sale (nunca he creado uno ^o^, jejeje).

disculpen las molestias
y muchas gracias a todos por su tiempo!
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como edito un variable de tipo real??? Rafe Varios 2 07-07-2005 02:15:45
Impresora punto matriz, como alinear los valores tipo dinero ? Jorge Taveras Impresión 2 19-05-2005 02:08:30
Como Asignar Variable Tipo Array de Tform a otro Array del Mismo tipo morfeo21 Varios 5 17-08-2004 18:39:51
Pasar valores a una variable tipo const Reyhert Varios 3 27-06-2004 18:55:07
como asignar un valor a una variable juan Varios 6 18-06-2003 02:26:19


La franja horaria es GMT +2. Ahora son las 01:40:48.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi