Hola a todos de nuevo,
Como ya comenté en otro post, suelo diseñar las aplicaciones haciendo que cada opción del programa active el frame que corresponda. Al seleccionar la opción del menú, se llama al procedimiento init, que siempre pongo en todos los frames. Este procedimiento se encarga de limpiar los formularios si es preciso, cargar los combos que pueda haber y por último, de mostrar el formulario.
Para cargar los combos (con datos de una tabla mysql) suelo hacer lo siguiente:
he declarado una variable en private como
valores: array of integer;
y para cargar el combo hago:
Código:
procedure TFrame.Cargar_valores();
var
sSql: String;
SoloQuery : TQuery;
i: integer;
begin
Ssql := 'Select * from tabla';
SoloQuery := TQuery.Create(nil);
SoloQuery.DatabaseName := 'basededatos';
SoloQuery.SessionName := 'session';
SoloQuery.SQL.Clear;
SoloQuery.SQL.Add(sSql);
SoloQuery.ExecSQL;
SoloQuery.Active := True;
SoloQuery.Open;
Combobox.ClearSelection;
Combobox.Items.Clear;
Combobox.Text := 'Selecciona valor';
Combobox.ItemIndex := Combobox.Items.Count - 1;
SetLength(valores, 0);
while (not SoloQuery.EOF) do
begin
Combobox.Items.Add(SoloQuery.FieldByName('texto').AsString);
i := Length(valores);
SetLength(valores, i + 1);
Valores[i] := SoloQuery.FieldByName('valor').AsInteger;
SoloQuery.Next;
end;
SoloQuery.Close;
SoloQuery.Destroy;
end;
Esto lo hago por cada combo que tenga que cargar y en ocasiones son unos cuantos. Para cada combo hago un procedimiento. Lo que estoy buscando es la forma de crear UN SOLO PROCEDIMIENTO GENERAL para cargar los distintos combos, pasándole como parámetros los datos del combo que se trate cada vez. Las llamadas serían del estilo:
cargarCombo(NombreCombo, ArrayValores, Tabla, CampoTexto, CampoValor)
He intentado hacerlo, pero cometo algún error al pasar el array. Imagino que el problema estará en que paso el array por valor y se debe pasar por referencia. No estoy seguro. También he intentado hacerlo con una función y que la llamada fuera así:
ArrayValores := CargarCombo(NombreCombo,Tabla, CampoTexto, CampoValor)
Pero no puedo definir la función para que devuelva un array de enteros.
¿A Alguien se le ocurre cómo podría realizar esta tarea? Me ahorraría muchas horas de tecleo.
Gracias y un saludo.