Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como se asigna el index del checklistbox.... (https://www.clubdelphi.com/foros/showthread.php?t=45613)

ronimaxh 09-07-2007 14:57:55

Como se asigna el index del checklistbox....
 
Hola amigos del club, aquí les planteo lo que pretendo hacer para que mes den una ayudita: Tengo una tabla con los tipos de nominas lleno el checklistbox y quiero asignarle el id_nomina de la tabla para cuando marque un tipo saber que id tiene mi codigo es el siguiente:
Código Delphi [-]
//Con esto lleno el CheckListBox1begin
  with CheckListBox1 do
       begin
          st.SQL.Text:='';
          st.SQL.Text:='select * from nf_cuentasnom order by descripcion';
          st.Open;
          st.First;
          while not st.Eof do
                begin
                   Items.Add(st.fieldbyname('descripcion').AsString);
                   Items.Index:=(st.FieldByName('nomina').AsInteger); //Este es el indice que quiero
                   st.Next;
                end;
       end;
end;
// con este código consigo cuales tienen cotejo;
var i:integer;
begin
   with CheckListBox1 do
   begin
     for i:=0 to Items.Count-1 do
         begin
           if Checked[i]then
              begin
                id_nom:=ItemIndex; //Este index no es el que esta en la tabla de nomina
              end;
         end;
   end;
end;

Nota: uso sql Server 2000, delphi 7 y ado

gabrielkc 09-07-2007 16:28:44

Cita:

Empezado por ronimaxh
Código Delphi [-]
//Con esto lleno el CheckListBox1
begin
with CheckListBox1 do
begin
st.SQL.Text:='';
st.SQL.Text:='select * from nf_cuentasnom order by descripcion';
st.Open;
st.First;//Esto no es necesario, porque acabas de abrir el query
while not st.Eof do
begin
Items.Add(st.fieldbyname('descripcion').AsString);
Items.Index:=(st.FieldByName('nomina').AsInteger); //Este es el indice que quiero
st.Next;
end;
end;
end;

// con este código consigo cuales tienen cotejo;
var i:integer;
begin
with CheckListBox1 do
begin
for i:=0 to Items.Count-1 do
begin
if Checked[i]then
begin
id_nom:=ItemIndex; //Este index no es el que esta en la tabla de nomina
end;
end;
end;
end;


1.- st.SQL.Text:='';//esto no es necesario, porque en la siguiente linea le asignas un valor
2.-st.First;//Esto no es necesario, porque acabas de abrir el query.

2.- La propiedad ItemIndex del CheckListBox determina cual item está seleccionado, aunque en tu código
si entendí bien cambiarías dicho ItemIndex con cada registro, además la propiedad
Index no existe en los TStings
Items.Index:=(st.FieldByName('nomina').AsInteger); //Este es el indice que quiero

4.-
Código:

with CheckListBox1 do
  begin
    for i:=0 to Items.Count-1 do
        begin
          if Checked[i]then
              begin
                id_nom:=ItemIndex; //Este index no es el que esta en la tabla de nomina
              end;
        end;

En el anterior código haces un for y asignas al id_nom el ItemIndex del
item seleccionado, pero como es un for si hay más de 1 item seleccionado
solo obtendrías el último, me parece que estás conciderando que solo se seleccionaría 1,
por lo tanto yo creo que el CheckListBox no es el componente ideal para esa operación,
probablememte un ComboBox te funcionaría mejor (es incluso más estandar)

ContraVeneno 09-07-2007 16:48:54

Lo más cómodo cuando se trata de seleccionar un valor de la base de datos ( en este caso el tipo de nómina), es utilizar un DBLookupCombo. Solo haces una consulta, aplicas dos o tres propiedades y listo.

ronimaxh 10-07-2007 01:54:36

Gracias por las correcciones, tomeré eso en cuenta;
hay más de 1 item seleccionado siempre
la situación es, si hay varios selecionados necesito el id_nomina de la tabla que lo llena para guardalo en otra tabla y el DBLookupCombo resuelve (si fuera uno, pero siempre seran varios), pero la lista ayudaría más al usuario que use el programa.

Nota: Si hay otro componente que se pueda usar para esto les agradeceré.

ContraVeneno 10-07-2007 15:26:48

¿que tal un TDBLookUpListBox?

adfa 10-07-2007 17:00:54

En realidad estas cerca usando el checklistbox...
En vez de hacer:
Código Delphi [-]
Items.Add(st.fieldbyname('descripcion').AsString);
Items.Index:=(st.FieldByName('nomina').AsInteger);
Podes hacer:
Código Delphi [-]
Items.AddObject(st.fieldbyname('descripcion').AsString,Pointer(st.FieldByName('nomina').AsInteger));

Luego para recuperarlo: (usando tu mismo código)
Código Delphi [-]
// con este código consigo cuales tienen cotejo;
var i, id_nom:integer;
begin
with CheckListBox1 do
begin
for i:=0 to Items.Count-1 do
begin
if Checked[i]then
begin
id_nom:= integer(Items.objects[i]);
end;
end;
end;
end;

gabrielkc 10-07-2007 20:04:28

Cita:

Empezado por adfa
Luego para recuperarlo: (usando tu mismo código)
Código Delphi [-]
// con este código consigo cuales tienen cotejo;
var i, id_nom:integer;
begin
with CheckListBox1 do
begin
for i:=0 to Items.Count-1 do
begin
if Checked[i]then
begin
id_nom:= integer(Items.objects[i]);
end;
end;
end;
end;

El problema que veo yo en ese código es que si hay varios seleccionados es que se sobreescribe el valor de la variable id_nom en cada paso del bucle en el cual esté checado el item en cuestion:

Item1 Valor 1 checked
Item2 Valor 2 checked
Item3 Valor 3 checked

el id_nom quedaría como 3, pero el 1 y el 2?? tambien están checked

ronimaxh 10-07-2007 20:09:48

Gracias a todos por la ayuda, con eso está resuelto.

Nota: un comentario para grabrielkc, dentro del bucle for se lo paso a la varialbe id_nomina y luego llama a una rutina para insertarla, excusemen por no poner la llamada de la rutina.

adfa 10-07-2007 20:17:14

Cita:

Empezado por gabrielkc
El problema que veo yo en ese código es que si hay varios seleccionados es que se sobreescribe el valor de la variable id_nom en cada paso del bucle en el cual esté checado el item en cuestion:

Item1 Valor 1 checked
Item2 Valor 2 checked
Item3 Valor 3 checked

el id_nom quedaría como 3, pero el 1 y el 2?? tambien están checked

Si, supongo que faltara algo de código alli. Yo solo puse el código que habia posteado ronimaxh y le agregue como recuperar el valor del item, que era el problema en cuestión.
Creo que ronimaxh ya entendió el truco.

Saludos


La franja horaria es GMT +2. Ahora son las 22:24:24.

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