Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Guardar Datos en un CheckListBox y dbgrid (https://www.clubdelphi.com/foros/showthread.php?t=93200)

DiegoPucho 14-06-2018 09:35:08

Guardar Datos en un CheckListBox y dbgrid
 
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:
Código Delphi [-]
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;
Código Delphi [-]
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:
Código Delphi [-]
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:
Código Delphi [-]
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:
Código Delphi [-]
  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:


Código Delphi [-]
    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:


Código Delphi [-]
    ...
   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:
Código Delphi [-]
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:
Código Delphi [-]
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:


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

Cita:

Empezado por DiegoPucho (Mensaje 527123)
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.


La franja horaria es GMT +2. Ahora son las 00:54:44.

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