Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-06-2014
Jovalca Jovalca is offline
Miembro
NULL
 
Registrado: sep 2013
Ubicación: Madrid - España
Posts: 30
Poder: 0
Jovalca Va por buen camino
ListBox y DelimitedText para Cargar y Guardar Datos

Buenos Dias.

Gracias de antemano por dedicar vuestro tiempo a atender esta consulta.

Estoy haciendo una pequeña aplicación y no quiero que lleve bases de datos, para ello estoy utilizando el componente ListBox con las propiedades LoadFromFile y SaveToFile. Hasta ahora bien, pero se me presenta la necesidad de guardar en el listbox el contenido de 2 tedit. Es decir, por ejemplo "Concepto Uno - 3 Euros". He estado leyendo acerca de las propiedades delimitedtext, etc. He visto varios ejemplos, todos distintos por lo que ando un poco perdido.

Exactamente necesito que al pulsar un boton, me guarde en el listbox el contenido del Edit1 + (Delimitador) + Edit2. Y que al pulsar otro boton, sea capaz de devolver la informacion correspondiente desde el listbox al Edit1 y la del Edit2 al Edit2.

He visto las propiedades SetDelimitedText y GetDelimitedText pero no tengo mas informacion de como usarlas, agradeceria cualquier ayuda u orientacion el respecto.

Mil gracias a todos.
Un Saludo.
Responder Con Cita
  #2  
Antiguo 13-06-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por Jovalca Ver Mensaje
...
Exactamente necesito que al pulsar un boton, me guarde en el listbox el contenido del Edit1 + (Delimitador) + Edit2. Y que al pulsar otro boton, sea capaz de devolver la informacion correspondiente desde el listbox al Edit1 y la del Edit2 al Edit2.
Hola jovalca.
Código Delphi [-]
...
type
  TListBox = class(StdCtrls.TListBox)
  public
    procedure LoadData(const aFileName: TFileName);
    procedure SaveData(const aFileName: TFileName);
  end;

  TForm1 = class(TForm)
    ListBox1: TListBox;
    btnAdd: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    btnSave: TButton;
    btnLoad: TButton;
    procedure btnAddClick(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
    procedure btnLoadClick(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
  private
  public
  end;
...

implementation 

const
  DELIM = '-';
  FILESTR = 'C:\Carpeta\ListBox1.txt';

type
  TDblItem = class
    str: string;
  end;

var
  di: TDblItem;

{ TListBox }
procedure TListBox.LoadData(const aFileName: TFileName);
var
  i: Integer;
  TS: TStrings;
begin
  TS:= TStringList.Create;
  try
    TS.LoadFromFile(aFileName);
    Items.Clear;
    for i:= 0 to TS.Count-1 do
    begin
      di:= TDblItem.Create;
      di.str:= Copy(TS[i], Pos(DELIM, TS[i])+1, MaxInt);
      AddItem(Copy(TS[i], 1, Pos(DELIM, TS[i])-1), TObject(di));
    end;
  finally
    TS.Free;
  end;
end;

procedure TListBox.SaveData(const aFileName: TFileName);
var
  i: Integer;
  TS: TStrings;
begin
  TS:= TStringList.Create;
  try
    for i:= 0 to Items.Count-1 do
      TS.Add(Items[i] + DELIM + TDBlItem(Items.Objects[i]).str);
    TS.SaveToFile(aFileName);
  finally
    TS.Free;
  end;
end;

// agregar Edit's al ListBox
procedure TForm1.btnAddClick(Sender: TObject);
begin
  di:= TDblItem.Create;
  di.str:= Edit2.Text;
  ListBox1.AddItem(Edit1.Text, TObject(di));
end;

// Guardar datos ListBox al archivo
procedure TForm1.btnSaveClick(Sender: TObject);
begin
  ListBox1.SaveData(FILESTR);
end;

// Cargar datos al ListBox desde el archivo
procedure TForm1.btnLoadClick(Sender: TObject);
begin
  ListBox1.LoadData(FILESTR);
end;

// Mostrar ambos datos 
procedure TForm1.ListBox1Click(Sender: TObject);
begin
  with ListBox1 do
    if ItemIndex <> - 1 then
      ShowMessage(Items[ItemIndex] + '  ' + TDBlItem(Items.Objects[ItemIndex]).str);
end;
...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 13-06-2014
Jovalca Jovalca is offline
Miembro
NULL
 
Registrado: sep 2013
Ubicación: Madrid - España
Posts: 30
Poder: 0
Jovalca Va por buen camino
Hola Ecfisa.

Ante Todo muchas gracias por responder. Probaré todo mañana cuando tenga un poco mas de tiempo. Aunque ahora visto esto quería preguntarte algunas cosas si tienes un momento y no te importa.

Yo, los ejemplos que he visto, bueno, algunos de ellos, usan las propiedades DelimitedText, Delimiter, y Strings. He probado algunas pero no han llegado a buen puerto.
Por ejemplo alguna de ellas es:

Código:
var
Texto: String;

begin
Texto:= Edit1.Text+'-'+Edit2.Text;
ListBox1.Items.Delimiter:= '-';
ListBox1.Items.DelimitedText:= Texto;
end;
En principio y según he entendido, esto añade el contenido de los Edit al ListBox quedando de la siguiente manera: Texto1 - Texto2.

Posteriormente, para seleccionar un Item del ListBox y que éste devuelva el Texto1 al Edit1 y el Texto2 al Edit2 usan algo así: (No son códigos probados, los estoy escribiendo sobre la marcha, es solo para que te hagas una idea).

Código:
var
Index: Integer;

begin
Index:= ListBox1.ItemIndex;
ListBox1.Items.StrictDelimiter:= True;
Edit1.Text:= ListBox1.Items.Strings[Index], 0;
Edit2.Text:= ListBox1.Items.Strings[Index], 1; //esto no es exactamente así... es por poner el ejemplo
end;
Según entendí, cuando tienes la cadena 'Texto1 - Texto2' para luego recogerla, el ejemplo usaba String[0] para Texto1 y String[2] para Texto2.

Probaré tu código, pero me intriga saber un poco más acerca de lo que te comento puesto que no he encontrado documentación al respecto, al menos que explique de forma mas o menos entendible estas funciones, además de las de que te comentaba SetDelimitedText y GetDelimitedText. Si no sirven para esto, tienen alguna utilidad?

Muchas gracias de nuevo.
Un Saludo.
Responder Con Cita
  #4  
Antiguo 13-06-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Jovalca.

Entiendo, deseas que se vean las dos componentes de texto en el ListBox separadas por el delimitador... Eso lo hace muchísimo mas simple:
Código Delphi [-]
const
  DELIM = '-';
  FILESTR = 'C:\Carpeta\ListBox1.txt';

procedure TForm1.btnAddClick(Sender: TObject);
begin
  ListBox1.Items.Add(Format('%s-%s',[Edit1.Text, Edit2.Text]))
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  with ListBox1 do
    if ItemIndex <> -1 then
    begin
      Edit1.Text:= Copy(Items[ItemIndex],1,Pos(DELIM,Items[ItemIndex])-1);
      Edit2.Text:= Copy(Items[ItemIndex],Pos(DELIM,Items[ItemIndex])+1,MaxInt);
    end;
end;

procedure TForm1.btnSaveClick(Sender: TObject);
begin
  ListBox1.Items.SaveToFile(FILESTR);
end;

procedure TForm1.btnLoadClick(Sender: TObject);
begin
  ListBox1.Clear;
  ListBox1.Items.LoadFromFile(FILESTR);
end;

Usar las propiedades Delimiter y DelimitedText de la clase TStrings no te va a ayudar en este caso, si tomamos en cuenta el código que mencionas arriba:
Código Delphi [-]
var
  Texto: String;
begin
  Texto:= Edit1.Text+'-'+Edit2.Text;
  ListBox1.Items.Delimiter:= '-';
  ListBox1.Items.DelimitedText:= Texto;
end;
Obtendrías un resultado como este:

Que creo, no es lo que buscas.

Vas a encontrar mucha información útil sobre las clases TStrings y TStringLists. En la propia ayuda de Delphi, aquí y también mediante una búsqueda con el navegador.

De la forma que te indiqué en el primer mensaje, la segunda componente de texto se guarda y obtiene de modos similar, sólo que es transparente para el usuario (no se visualiza la segunda).

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 13-06-2014 a las 22:26:24.
Responder Con Cita
  #5  
Antiguo 14-06-2014
Jovalca Jovalca is offline
Miembro
NULL
 
Registrado: sep 2013
Ubicación: Madrid - España
Posts: 30
Poder: 0
Jovalca Va por buen camino
Muchísimas gracias por tu ayuda ecfisa.

Me ha sido de gran utilidad, y creo que con esto podré hacer alguna cosa más que tenia pensado hacer de otro modo.
Ahora, como es lógico me queda controlar que no se introduzca el caracter delimitador en el campo para que no se vuelva loco al devolver los valores.

Por otro lado, si quisiera separar un poco más los valores en el ListBox, bastaría con asignar
Código:
Delim = '[espacio]-[espacio]';
?
O quizá en el formato? Donde entiendo "%s" son los valores? Debería asignar True a la propiedad StrictDelimiter para que no detecte esos espacios?

Ahora para el resto de cosas que me quedan por hacer, supongo que también podría hacerlas de este modo, si quisiera que fueran 3 o 4 campos los que guardara en el Listbox, estaría bien hacerlo de este modo? Debería incluir en el formato tantos "%s" como campos quiera introducir?

Código:
ListBox1.Items.Add(Format('%s-%s',[Edit1.Text, Edit2.Text, Edit3.Text, Edit4.Text]))
Y para devolver los valores, sería incrementar las posiciones según tu código? Evidentemente no quiero que me des el código hecho, solo quería si me puedes explicar un poco como funciona el método para devolverlos, entiendo que es algo así como recorrer la cadena de texto del Item hasta el delimitador para el primero y el segundo a partir del delimitador hasta el final no?

Código:
      Edit1.Text:= Copy(Items[ItemIndex],1,Pos(DELIM,Items[ItemIndex])-1);
Donde "1" es el primer caracter? Hasta el delimitador y "-1" es para quitar el delimitador?

Código:
      Edit2.Text:= Copy(Items[ItemIndex],Pos(DELIM,Items[ItemIndex])+1,MaxInt);
Donde "POS" es desde donde se quedó la anterior (ósea el delimitador)? El "+1" y MaxInt no entiendo muy bien que significan.

Agradezco enormemente tu tiempo y te doy de nuevo las gracias por ayudarme a entender el código para aprender y no solo hacer copia y pega.
Un Saludo.
Responder Con Cita
  #6  
Antiguo 14-06-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Jovalca.

Cita:
solo quería si me puedes explicar un poco como funciona el método para devolverlos, entiendo que es algo así como recorrerla cadena de texto del Item hasta el delimitador para el primero y el segundo a partir del delimitador hasta el final no?
La función Copy, devuelve parte de una cadena o arreglo dinámico comenzando desde el segundo parámetro hasta el tercero.
La función Pos devuelve la posición de una subcadena dentro de una cadena.

Cita:
Donde "1" es el primer caracter? Hasta el delimitador y "-1" es para quitar el delimitador?
Exactamente.


Cita:
Donde "POS" es desde donde se quedó la anterior (ósea el delimitador)? El "+1" y MaxInt no entiendo muy bien que significan.
Pos devuelve la posición del delimitador y Copy copia desde allí mas uno (para excluir el delimitador) hasta MaxInt.
MaxInt es una constante de Delphi que equivale al máximo valor que puede tener un entero, normalmente (2^32) -1.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 15-06-2014
Jovalca Jovalca is offline
Miembro
NULL
 
Registrado: sep 2013
Ubicación: Madrid - España
Posts: 30
Poder: 0
Jovalca Va por buen camino
Gracias de nuevo ecfisa.

Estoy con ello, controlando y probando mas cosas.

Ahora solo me viene una duda, como indicarle parar en el segundo delimitador para cuando tengo mas de dos valores.

Es decir, tengo esto: Dato 1 | Dato 2 || Dato 3. //He incluido un segundo delimitador para que no devuelva valores incorrectos.

Y el código para recogerlos es:

Código:
procedure TForm5.ListBox1DblClick(Sender: TObject);
const
  Delim1 = '|';
  Delim2 = '||';
begin
  with ListBox1 do
    If ItemIndex <> -1 Then
    begin
  Form1.LabeledEdit5.Text:= Copy(Items[ItemIndex],1,Pos(Delim1,Items[ItemIndex])-2);
  Form1.LabeledEdit6.Text:= Copy(Items[ItemIndex],Pos(Delim1,Items[ItemIndex])+2,Pos(Delim2,Items[ItemIndex])-3);
  Form1.LabeledEdit7.Text:= Copy(Items[ItemIndex],Pos(Delim2,Items[ItemIndex])+3,MaxInt);
end;
end;
El problema es que en el segundo, quiero indicarle que pare en el segundo delimitador -3 para eliminarlo, pero me devuelve lo siguiente, "Dato 2 || Dato 3".
He probado ha ponerle solo Delim2, a quitar el Pos, pero de estas formas no compila. También con AnsiPos pero hace lo mismo. Debo declarar simplemente Delim2 de otro modo para que pare ahí?

Gracias otra vez.
Responder Con Cita
  #8  
Antiguo 15-06-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Jovalca.

Para mas de dos valores te sugiero otra opción que sólo requiere un delimitador. Continuando la línea, un ejemplo usando los valores de cuatro Edits:
Código Delphi [-]
const
  DELIM = '-';
  FILESTR = 'C:\Carpeta\ListBox1.txt';

procedure TForm1.btnAddClick(Sender: TObject);
begin
  with ListBox1.Items do
    Add(Edit1.Text+' - '+Edit2.Text+' - '+Edit3.Text+' - '+Edit4.Text);
end;

procedure TForm1.ListBox1Click(Sender: TObject);
var
  TS: TStrings;
begin
  if ListBox1.ItemIndex <> -1 then
  begin
    TS:= TStringList.Create;
    try
      ExtractStrings(['-'], [], PChar(ListBox1.Items[ListBox1.ItemIndex]), TS);
      Edit1.Text:= Trim(TS[0]); 
      Edit2.Text:= Trim(TS[1]);
      Edit3.Text:= Trim(TS[2]);
      Edit3.Text:= Trim(TS[3])
    finally
      TS.Free
    end
  end;
end;

procedure TForm1.btnSaveClick(Sender: TObject);
begin
  ListBox1.Items.SaveToFile(FILESTR);
end;

procedure TForm1.btnLoadClick(Sender: TObject);
begin
  ListBox1.Clear;
  ListBox1.Items.LoadFromFile(FILESTR);
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 19-06-2014
Jovalca Jovalca is offline
Miembro
NULL
 
Registrado: sep 2013
Ubicación: Madrid - España
Posts: 30
Poder: 0
Jovalca Va por buen camino
Muchisimas gracias por tu ayuda ecfisa. Un saludo.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Guardar y Cargar Contenido del ListBox FrianxD C++ Builder 10 29-08-2017 19:48:41
Como guardar y cargar los datos de un RichEdit sin perder los Atributos? pmcastilla Varios 4 10-10-2007 15:09:48
listbox cargar un txt DM2005 Varios 1 05-07-2006 19:59:25
Cargar datos en Listbox Delphos Firebird e Interbase 5 22-06-2005 00:20:42
Tiempo para cargar datos en bd jsc Firebird e Interbase 1 26-03-2004 10:00:31


La franja horaria es GMT +2. Ahora son las 02:01:58.


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
Copyright 1996-2007 Club Delphi