[Lazarus-es] Load combobox

Jose Antonio Cuello josea en artextrading.com
Mar Jun 16 08:53:37 CEST 2009


Hola, sólo quería comentar unas cosillas que tal vez te puedan ayudar.
Al realizar la sentencia de adición de items al cualquier TStrings, como 
son los items del combobox devuelve el indice que a añadido por lo que 
no haría falta el contador y todo su control, es decir que bastaría con

  nCont := cboempresa.Items.Add(DataModule1.lstempresa.FieldByName('emp_razsoc').AsString);


Otra idea, si en vez de usar Items.Add existe un Items.AddObject( 
descripcion, objeto ) que resulta más útil para cuando queremos listas 
más complejas.
Puede parecer más complejo pero da una mayor flexibilidad, sobretodo de 
cara a que posteriormente queramos ampliar los datos a guardar. Por ejemplo.

    // Declaración de los datos a guardar
    type
      TmiObjeto = class
      private
        FCampo1: String;
        FCampo2: String;
      public
        property Campo1: String read FCampo1 write FCampo1;
        property Campo2: String read FCampo2 write FCampo2;
      end;

    // Declaracion de variables
    var opc: TmiObjeto;

    // Rutina de carga
    while Not DataModule1.lstempresa.EOF Do
    begin
      opc := TmiObjeto.Create;
      opc.Campo1 :=
    DataModule1.lstempresa.FieldByName('emp_razsoc').AsString;
      opc.Campo2 := DataModule1.lstempresa.FieldByName('emp_id').AsString;
     
    cboempresa.Items.AddObject(DataModule1.lstempresa.FieldByName('emp_razsoc').AsString,
    opc);
      DataModule1.lstempresa.Next;
    end;

    // Rutina de recogida de datos
    DataModule1.lstcencosto.Params.ParamByName('ID').AsString:=
    cboempresa.Items.Objects[cboempresa.ItemIndex].Campo2;

Espero haberme expresado correctamente, se entienda y sobre todo sea de 
utilidad.

P.S.: Los objetos del combobox son liberados al destruir el combobox, a 
menos que se cambie una propiedad del mismo a false pero que no me 
recuerdo ahora cual es.
> Amigos,
>
> Estoy trabajando un programa sencillo, pero me he trancado en un problema con el combobox.
>
> Estoy cargando un combobox con data, alli coloco la descripcion y tambien creo un array global al formulario donde guardo el id de la data.
>
> Digamos algo asi
>
> var
>   TxtQuery: String;
>   nCont: Integer;
> begin
>   TxtQuery:='Select emp_id,emp_razsoc from empresa';
>   DataModule1.lstempresa.SQL.Text:=TxtQuery;
>   DataModule1.lstempresa.Open;
>   cboempresa.Items.Clear;
>   if DataModule1.lstempresa.RecordCount >0 then
>      begin
>         SetLength(aItems, DataModule1.lstempresa.RecordCount );
>         nCont:=1;
>         while Not DataModule1.lstempresa.EOF Do
>         begin
>             cboempresa.Items.Add(DataModule1.lstempresa.FieldByName('emp_razsoc').AsString);
>             aItems[nCont]:=DataModule1.lstempresa.FieldByName('emp_id').AsString;  //array creado para guardar el ID de empresa.
>             DataModule1.lstempresa.Next;
>             nCont:=nCont + 1;
>         end;
>      end;
>   DataModule1.lstempresa.Close;   
>
> Hasta alli todo OK, el punto esta cuando realizo la sinconizacion Combobox + Array desde el evento OnChange del combobox.
>
> if (cboempresa.ItemIndex>0) then
>  begin
>     DataModule1.lstcencosto.Close;
>     DataModule1.lstcencosto.Params.ParamByName('ID').AsString:= aItems[cboempresa.ItemIndex];
>     DataModule1.lstcencosto.Open;
>     DataModule1.lstcencosto.Refresh;
>    // monitor de valores
>     stdato.caption:=aItems[cboempresa.ItemIndex] ;
>  end;     
>
> Como veran este me refresca otro DataSet con informacion x empresa, pero el combobox no se ubica en la posicion que deberia ser, siempre se salta un registro.Por tanto, el codigo de empresa no siempre es el real.
>
> Es problema de logica o no debi usa el evento OnChange si no otro ?.
>
> No uso el DBCombobox ni el DBLookupCombox  porque no despliegan la lista, asi que estoy usando algo que siempre usaba en VB6.
>
> Saludos.
>
> FG
>   




More information about the Lazarus-es mailing list