Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error en Array (https://www.clubdelphi.com/foros/showthread.php?t=82924)

Jere_84 25-04-2013 06:11:54

Error en Array
 
Hola club. La verdad que tengo poca experiencia con arrays y me gustaría ver si me pueden ayudar esta vez, este es mi código:

Código Delphi [-]
var
  vFormuABMCiuda: TvFormuABMCiuda;
  BaseFieldTypes: array of TFieldType;

procedure TvFormuABMCiuda.FormCreate(Sender: TObject);
var
  I: integer;
begin
  inherited;
  CrearDataModule(TDataModuleCiuda, DataModuleCiuda);
  AbrirQuery([DataModuleCiuda.ADODataSetCiudad]);

  for I := 0 to DataModuleCiuda.ADODataSetCiudad.FieldCount - 1 do
     if ((DataModuleCiuda.ADODataSetCiudad.Fields[i].DataType = ftString) or (DataModuleCiuda.ADODataSetCiudad.Fields[i].DataType =    ftInteger)) then
     begin
       BaseFieldTypes[i] := DataModuleCiuda.ADODataSetCiudad.Fields[i].DataType;
       JfComboBoxCampoBusca.Items.AddEx(DataModuleCiuda.ADODataSetCiudad.Fields[i].FieldName, DataModuleCiuda.ADODataSetCiudad.Fields[i].DisplayLabel, '', 0, nil);
     end;
  JfComboBoxCampoBusca.ItemIndex := 0;
end;

Me sale error de memoria en esta linea

Código Delphi [-]
 BaseFieldTypes[i] := DataModuleCiuda.ADODataSetCiudad.Fields[i].DataType;

cuando intento asignar al Array.. que estoy haciendo mal? :mad:

Al González 25-04-2013 06:31:56

Cita:

Empezado por Jere_84 (Mensaje 459238)
Me sale error de memoria en esta linea
Código Delphi [-]
 BaseFieldTypes[i] := DataModuleCiuda.ADODataSetCiudad.Fields[i].DataType;

Hola Jere_84. Es muy importante poner los mensajes de error exactos para saber con más precisión de qué se trata.

Pero, según se puede ver en el código, te ha hecho falta darle un tamaño a la matriz dinámica BaseFieldTypes. Antes del ciclo For puedes llamar al procedimiento SetLength:
Código Delphi [-]
SetLength (BaseFieldTypes, DataModuleCiuda.ADODataSetCiudad.FieldCount);
Y tras finalizar el ciclo For, conviene que ajustes su tamaño a la cantidad de elementos que hayan sido asignados:
Código Delphi [-]
SetLength (BaseFieldTypes, X);
Donde "X" podría ser una variable que lleve la cuenta de las veces que entra el programa a ese If. ;)

Saludos.

Al González.

Al González 25-04-2013 06:45:00

Un consejo más. Dado que las constantes ftString y ftInteger son de un tipo enumerado (TFieldType), y por tanto valores ordinales, la doble condición del If puede reducirse a:
Código Delphi [-]
If DataModuleCiuda.ADODataSetCiudad.Fields [i].DataType In [ftString, ftInteger] Then
Esa sola condición pregunta si el valor de la propiedad DataType es uno de los del conjunto expresado entre corchetes detrás la palabra reservada In.

Saludos. :)

Jere_84 25-04-2013 06:48:08

Gracias Al...

Anda perfecto sabes como podría consultar estos datos ya que en otra parte de mi codigo hago algo asi:

Código Delphi [-]
procedure TvFormuABMCiuda.JfEditValorBuscaChange(Sender: TObject);
begin
   if JfRadioGroupTipoBusca.Value = 1 then
    if (JfEditValorBusca.InputText = '') then
    begin
      DataModuleCiuda.ADODataSetCiudad.Filtered := False;
      DataModuleCiuda.ADODataSetCiudad.Filter := '';
    end
    else
    begin
      if BaseFieldTypes[JfComboBoxCampoBusca.ItemIndex] = ftString then
        DataModuleCiuda.ADODataSetCiudad.Filter := JfComboBoxCampoBusca.Value + ' LIKE ' + QuotedStr(JfEditValorBusca.InputText + '*' )
      else
        DataModuleCiuda.ADODataSetCiudad.Filter := JfComboBoxCampoBusca.Value + ' = ' + QuotedStr(JfEditValorBusca.InputText);
      DataModuleCiuda.ADODataSetCiudad.Filtered := True;
    end;

end;

Y me gustaría ver lo que se cargo en el BaseFieldTypes para ver que coincida con el campo que tengo en el combo...

ecfisa 25-04-2013 16:57:10

Cita:

Empezado por Jere_84 (Mensaje 459241)
...
Y me gustaría ver lo que se cargo en el BaseFieldTypes para ver que coincida con el campo que tengo en el combo...

Hola Jere_84.

Código Delphi [-]
...
implementation

uses  TypInfo;

type
  TArrayFieldTypes = array of TFieldType;

var
  BaseFieldTypes : TArrayFieldTypes;

procedure GetFieldsTypes(aft: TArrayFieldTypes; ts: TStrings);
var
  i: Integer;
begin
  for i:= Low(aft) to High(aft) do
    ts.Add(GetEnumName(TypeInfo(TFieldType), Ord(aft[i])))
end;
...

Llamada ejemplo:
Código Delphi [-]
   GetFieldsTypes(BaseFieldTypes, ListBox1.Items);

Saludos.

Jere_84 26-04-2013 00:21:59

Muchisimas gracias lo voy a testear esta noche en mi maquina...

Saludos.


La franja horaria es GMT +2. Ahora son las 01:27:30.

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