Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Seleccionar un item en FileListBox desde codigo (https://www.clubdelphi.com/foros/showthread.php?t=80337)

Anel Hernandez 19-09-2012 14:13:00

Seleccionar un item en FileListBox desde codigo
 
Hola,

como puedo seleccionar desde codigo un TFileListBox, es decir, que aparezca un item seleccionado.

lo intente con itemIndez pero no funcioana. Igual con selected.

gracias

ecfisa 19-09-2012 14:28:33

Hola.

Ejemplo:
Código Delphi [-]
procedure SelectItemFLB(FLB: TFileListBox; Inx: Integer);
begin
  Dec(inx);  // comienza en FLB.Items[0]
  if (Inx >= 0)and(Inx < FLB.Items.Count) then
    FLB.FileName := FLB.Items[Inx]
end;

Llamada:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  SelectItemFLB(FileListBox1, 5); // en realidad posición 4
end;


Saludos.:)

Anel Hernandez 19-09-2012 16:08:33

gracias, funciona bien. pero no se ejecuta el onchange. como puedo hacer para que al seleccionarse desde codigo se ejecute el onchange?

gracias

ecfisa 19-09-2012 16:46:46

Cita:

Empezado por Anel Hernandez (Mensaje 443597)
gracias, funciona bien. pero no se ejecuta el onchange. como puedo hacer para que al seleccionarse desde codigo se ejecute el onchange?

gracias

Hola.

Acabo de hacer la prueba y siempre que a la función SelectItemFLB se le envíe como argumento (Inx) un valor diferente al item actualmente seleccionado, el evento OnChange del TFileListBox se dispara correctamente...

Saludos.

Anel Hernandez 19-09-2012 16:57:30

yo no puse el procedimiento, puse directamente:FLB.FileName := FLB.Items[Inx]

y no entra al onchange

ecfisa 19-09-2012 17:18:27

Cita:

Empezado por Anel Hernandez (Mensaje 443609)
yo no puse el procedimiento, puse directamente:FLB.FileName := FLB.Items[Inx]

y no entra al onchange

Hola.

Un ejemplo en forma directa:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  Inx: Integer;
begin
  Inx := 5;
  with FileListBox1 do
    FileName := Items[Inx];
end;
De este modo también dispara el evento OnChange del TFileListBox sin problemas.

Saludos.

Anel Hernandez 19-09-2012 17:42:35

lo acabo de poner aparte en un boton y si levanta el onchange.

el mio, lo tengo en un procedimiento aparte que añado, a continuacion, a ver si me dicen por que no lo levanta:
Código Delphi [-]
procedure inidir;
var
 s:string;
 i,j:byte;
begin
 TotalCheck:=0;i:=0;
 IF NOT FileExists(extractfiledir(application.exename)+'\inidir.ini') THEN exit;
 assign(fichero,extractfiledir(application.exename)+'\inidir.ini');RESET(FICHERO);
 readln(fichero,s);form1.radiogroup1.itemindex:=strtoint(s);
 readln(fichero,s);form1.CheckBox1.Checked:=StrToBool(s);
 readln(fichero,s);form1.CheckBox2.Checked:=StrToBool(s);
 readln(fichero,dirE);
 readln(fichero,dirt);
 readln(fichero,dirM);form1.edit4.text:=dirM;
 readln(fichero,s);form1.FileListBox1.ItemIndex:=strtoint(s);
 form1.FileListBox1.FileName := form1.FileListBox1.Items[form1.FileListBox1.ItemIndex];
 readln(fichero,s);
 repeat
  form1.CheckListBox1.Items.Add(copy(s,3,length(s)));
  if strtoint(copy(s,0,1))=1 then BEGIN
   form1.CheckListBox1.Checked[form1.CheckListBox1.count-1]:=true;
   Inc(TotalCheck);
  END;
 readln(fichero,s);
 until pos(':',s)=0;
 while not eof(fichero) do begin
  form1.CheckListBox2.Checked[i]:=StrToBool(s);inc(i);
  readln(fichero,s);
 end;
 close(fichero);
 form1.statusbar1.Panels[3].Text:=inttostr(TotalCheck)+'/'+inttostr(form1.CheckListBox1.Count);
 form1.edit1.text:=dirE;
 form1.edit2.text:=dirT;
end;

gracias

ecfisa 19-09-2012 21:45:48

Hola.

Pareciera que el problema es el valor que lee del archivo 'fichero' en la variable 's' cosa que sin el archivo no es posible asegurar.

Modifiqué un poco el código (en negrita) sin alterar el funcionamiento original para que visualice el valor de 's' y puedas evaluarlo:
Código Delphi [-]
procedure inidir;
var
 s:string;
 i,j:byte;
 Inx: Integer;
begin
  TotalCheck:=0;i:=0;
  IF NOT FileExists(extractfiledir(application.exename)+'\inidir.ini') THEN exit;
  assign(fichero,extractfiledir(application.exename)+'\inidir.ini');
  Reset(FICHERO);
  readln(fichero,s);
  with Form1 do
  begin
    radiogroup1.itemindex:= strtoint(s);
    readln(fichero,s);
    CheckBox1.Checked:= StrToBool(s);
    readln(fichero,s);
    CheckBox2.Checked:= StrToBool(s);
    readln(fichero,dirE);
    readln(fichero,dirt);
    readln(fichero,dirM);
    edit4.text:= dirM;
    readln(fichero,s);
    Inx := StrToInt(s);
    ShowMessage('Valor del indice: ', IntToStr(Inx));
    FileListBox1.FileName := FileListBox1.Items[Inx]; // o sólo: FileListBox1.FileName := FileListBox1.Items[StrToInt(s)];
    readln(fichero,s);  
    repeat
      CheckListBox1.Items.Add(copy(s,3,length(s)));
      if strtoint(copy(s,0,1))=1 then
      begin
        CheckListBox1.Checked[CheckListBox1.count-1]:=true;
        Inc(TotalCheck);
      end;
      readln(fichero,s);
    until pos(':',s)=0;
    while not eof(fichero) do
    begin
      CheckListBox2.Checked[i]:= StrToBool(s);
      inc(i);
      readln(fichero,s);
    end;
    close(fichero);
    statusbar1.Panels[3].Text:= inttostr(TotalCheck)+'/'+inttostr(CheckListBox1.Count);
    edit1.text:=dirE;
    edit2.text:=dirT;
  end;
end;
Si funciona, sólo elimina la línea del ShowMessage.

Saludos.

Anel Hernandez 20-09-2012 10:19:35

No, el valor s que lee esta bien.

parece que hay otro problema.

en este ejemplo que me sugieres da error en Close(fichero); dice que "too many actual parameters".

al final resolvi poniendo la sentencia
Código Delphi [-]
FileListBox1.FileName := FileListBox1.Items[Inx];
fuera, en un procedimiento de Tform1.Mil gracias

ecfisa 20-09-2012 20:47:57

Cita:

Empezado por Anel Hernandez (Mensaje 443713)
No, el valor s que lee esta bien.

parece que hay otro problema.

en este ejemplo que me sugieres da error en Close(fichero); dice que "too many actual parameters".

Pero ese error te lo debería estar dando anteriormente, ya que no toqué para nada esa parte de tu código.
Por otro lado no tiene relación con tu planteo inicial, como te mencioné antes, solo cambié las líneas que figuran en negrita.

Saludos. :)

Anel Hernandez 20-09-2012 20:59:11

Y ademas pusiste lo de With Tform1 do.

al ponerlo asi da ese error, con la llamada a las propiedades de cada objeto poniendo la ruta completa uno por uno, form1.objeto.propiedad, no da ese error.

ese error aparece al poner el with.

saludos

ecfisa 20-09-2012 21:18:47

Hola Anel.

No, el error "too many actual parameters" no es provocado por la inclusión de:
Código Delphi [-]
with Form1 do
ni tampoco se provoca en la línea:
Código Delphi [-]
Close(fichero);

El error se produce en la línea:
Código Delphi [-]
   ShowMessage('Valor del indice: ' , IntToStr(Inx));  // error por la ','
Al transcribir el código cometí un error de tipeo del que ahora me percato, la línea tendría que ser:
Código Delphi [-]
  ShowMessage('Valor del indice: ' + IntToStr(Inx)); // ( '+' )

Saludos.:)

Anel Hernandez 20-09-2012 21:27:38

ahora todo listo, mil gracias.

ecfisa 20-09-2012 21:31:19

Y yo te pido mil disculpas por las complicaciones que te traje con ese error tán estúpido... :(

Saludos :)

Anel Hernandez 20-09-2012 21:35:46

no pasa nada, me has dado una gran ayuda.

mil gracias


La franja horaria es GMT +2. Ahora son las 10:35:56.

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