PDA

Ver la Versión Completa : Guardar Datos en un CheckListBox y dbgrid


DiegoPucho
14-06-2018, 09:35:08
Para continuar con mis preguntontas: ´Guardar Datos en un CheckListBox y dbgrid´. El problema es en el código.
Paso a detallar mi problema: Luego de investigar logre hacer lo siguiente: 1° Visualizar mi CheckListBox y dbgrid de la siguiente manera:
procedure TFrmModArt.FormCreate(Sender: TObject);
var
i: Integer;
begin
for i:= 0 to DBGridProductos.Columns.Count-1 do
begin
DBGridProductos.Columns[i].Visible:= true; // mostrar columna.
CheckListBox1.Items.Add(DBGridProductos.Columns[i].Title.Caption); // copiar título al combo
CheckListBox1.Checked[i]:= true; // pone a todos en Checked.
end;
procedure TFrmModArt.CheckListBox1ClickCheck(Sender: TObject);
begin
with TCheckListBox(Sender) do
begin
DBGridProductos.Columns[ItemIndex].Visible:= not DBGridProductos.Columns[ItemIndex].Visible;
end;
end;
Con esto se ve genial... Ya que los CheckListBox1.Checked quedan todos seleccionados y me los muestra en el dbgrid.
2° ahora se me ocurrió agregarle que guardara tanto los datos del CheckListBox y como el formato del dbgrid. de esta manera:
procedure TFrmModArt.BtGuarConfigClick(Sender: TObject);
begin
DBGridProductos.Columns.SaveToFile('C:\1TProColum.cln');
CheckListBox1.Items.SaveToFile('C:\1TProItems.cln');
showmessage('Configuración Guardada con Exito!');
end;
3° He aquí la complicación..!! Lo muestro de la siguiente manera:
procedure TFrmModArt.FormCreate(Sender: TObject);
var
i: Integer;
begin
if FileExists('C:\1TProColum.cln') then
begin
DBGridProductos.Columns.LoadFromFile('C:\1TProColum.cln');
CheckListBox1.Items.LoadFromFile('C:\1TProItems.cln');
end
else
begin
for i:= 0 to DBGridProductos.Columns.Count-1 do
begin
DBGridProductos.Columns[i].Visible:= true; // mostrar columna.
CheckListBox1.Items.Add(DBGridProductos.Columns[i].Title.Caption); // copiar título al combo
CheckListBox1.Checked[i]:= true; // pone a todos en Checked.
end;
end;
end;
Aquí la PREGUNTONTA!!! Como hago para que me muestre lo que guarde, osea me lo muestra, pero no como yo quiero, me de selecciona todos los Checked de mi CheckListBox y quiero que me muestre como yo lo guarde, solo los Checked que guardé... Algo le falta al código que no se como hacerlo... Alguna idea??? Desde ya gracias son los mejores... Espero muy pronto poder aportar mis aprendizajes...:D

Neftali [Germán.Estévez]
14-06-2018, 16:02:31
Porque la línea:

CheckListBox1.Items.SaveToFile('c:\1TProItems.cln');




Sólo guarda los elementos, no su estado (checked o no).
Quien sí guarda esa información es el DBGrid junto a las columnas con esta línea:



DBGridProductos.Columns.SaveToFile('c:\1TProColum.cln');




Entonces como ya tienes esa información en las columnas, sólo tienes que pasarla al componente de CheckListBox.
Añade esto en el FormCreate:



...
CheckListBox1.Items.LoadFromFile('C:\1TProItems.cln');
for i:= 0 to DBGridProductos.Columns.Count-1 do begin
CheckListBox1.Checked[i]:= DBGridProductos.Columns[i].Visible;
end;
....

ecfisa
14-06-2018, 21:41:30
Hola.

Otra opción para el TCheckListBox que requiere escribir un poquito más, pero te permite reutilizar los nuevos métodos añadidos cuando lo precises:

unit CheckListBoxEx;

interface

uses SysUtils, Classes, CheckLst;

type
TCheckListBox = class(CheckLst.TCheckListBox)
public
procedure SaveToFile(const FileName: string);
procedure LoadFromFile(const FileName: string);
end;

implementation

procedure TCheckListBox.SaveToFile(const FileName: string);
var
i: Integer;
TS: TStrings;
begin
TS := TStringList.Create;
try
for i := 0 to Self.Items.Count-1 do
if Self.Checked[i] then
TS.Add('*' + Self.Items[i])
else
TS.Add(' ' + Self.Items[i]);
TS.SaveToFile(FileName);
finally
TS.Free;
end;
end;

procedure TCheckListBox.LoadFromFile(const FileName: string);
var
i: Integer;
TS: TStrings;
begin
if not FileExists(FileName) then
raise Exception.Create('Archivo no encontrado');
Self.Items.Clear;
TS := TStringList.Create;
try
TS.LoadFromFile(FileName);
for i := 0 to TS.Count-1 do
begin
Self.Items.Add(Copy(TS[i], 2, MaxInt));
Self.Checked[i] := TS[i][1] = '*';
end;
finally
TS.Free;
end;
end;
end.


Ejemplo de uso:

unit Unit1;

interface

uses ..., { siempre añadir última -> } CheckListBoxEx;

type
TForm1 = class(TForm)
CheckListBox1: TCheckListBox;
btnSave: TButton;
btnLoad: TButton;
procedure btnSaveClick(Sender: TObject);
procedure btnLoadClick(Sender: TObject);
private
public
end;

var
Form1: TForm1;

implementation

const FNAME = 'Items.cln';

procedure TForm1.btnSaveClick(Sender: TObject);
begin
CheckListBox1.SaveToFile(FNAME);
end;

procedure TForm1.btnLoadClick(Sender: TObject);
begin
CheckListBox1.LoadFromFile(FNAME);
end;
...


Muestra:
https://s22.postimg.cc/kd2owm0mp/diegopucho.gif

Saludos :)

DiegoPucho
15-06-2018, 13:34:06
Muchas Gracias ecfisa y Neftali muy buena la explicación...
Se podría guardar todo en un solo archivo?? Digo datos del DbGrid y datos del CheckListBox???

Neftali [Germán.Estévez]
15-06-2018, 14:36:32
Se podría guardar todo en un solo archivo?? Digo datos del DbGrid y datos del CheckListBox???


Si utilizas los métodos que ya hay no, ya que son componentes diferentes y cada cual guarda su información y en su formato.
Pero siempre puedes extender lo que hay, de la forma que ha explicado ecfisa, y programar tú lo que necesites con el formato que quieras.