PDA

Ver la Versión Completa : Seleccionar un item en FileListBox desde codigo


Anel Hernandez
19-09-2012, 14:13:00
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:

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:

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
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
yo no puse el procedimiento, puse directamente:FLB.FileName := FLB.Items[Inx]

y no entra al onchange
Hola.

Un ejemplo en forma directa:

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:
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:

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
FileListBox1.FileName := FileListBox1.Items[Inx];fuera, en un procedimiento de Tform1.Mil gracias

ecfisa
20-09-2012, 20:47:57
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:
with Form1 do
ni tampoco se provoca en la línea:
Close(fichero);

El error se produce en la línea:

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:

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