Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Borrar dato de arreglo? (https://www.clubdelphi.com/foros/showthread.php?t=67210)

CaosDeath 06-04-2010 00:36:03

Borrar dato de arreglo?
 
Tengo un problema tengo datos metidos en arreglo (array) y se muestran en un listbox pero no se como borrar un dato seleccionado en el listbox del arreglo solo puedo quitarlo del listbox pero sigue en el arreglo alguien que me diga como le ago?

o aunque sea como guardar los datos de un listbox en un arreglo nuevo?

ecfisa 06-04-2010 04:14:03

Hola CaosDeath.

Si tenes declarado un arreglo ej: v: array[1..n] of string y deseas borrar un dato correlacionado con el del ListBox, podrías obtener el índice del dato actualmente seleccionado con: ListBox1.ItemIndex y eliminar el contenido de esa posición del array.
Pero no se puede eliminar dicha posición en sí misma puesto que es una estructura estática. Es decir que te quedará un lugar vacío donde elimines un dato.

Me parece mucho más apropiado usar TstringList en lugar de un array, ya que podrás eliminar items de forma más sencilla.

Un código simple de ejemplo: (agregá a un Form 2 TListBox y un Tbutton )

Implementation
var
StList: TstringList;
...
Código:

procedure TForm1.FormCreate(Sender: TObject);
begin
  StList:= TStringList.Create;
  with StList do
  begin
    Add('UNO');
    Add('DOS');
    Add('TRES');
    Add('CUATRO')
  end;
  ListBox1.Items:= StList;  // Items de StringList a ListBox
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  ix: Integer;
begin
  ix:= ListBox1.ItemIndex;    // Obtener indice de el item actual
  ListBox1.Items.Delete(ix);  // Borrar de ListBox
  StList.Delete(ix);                // Borrar de StringList
  ListBox2.Items:= StList;
end;

Saludos.

BrunoBsso 06-04-2010 05:24:21

Como dice ecfisa, al ser una estructura estática no tenés forma de eliminar datos.
Lo que se suele hacer es, en el caso de que sea un arreglo de strings, poner un string vacío en la posición que querés borrar - Arreglo[i]:=''; - o ponerle un identificador determinado - Array[i]:='%&VACIO&%';
Si es de números (enteros o decimales) suele ponerse un número teóricamente inutilizable - Array[i]:=-99999; o Array[i]:=-865.14563; - para entender que el dato que está ahí es obsoleto.
Esos identificadores usualmente se colocan como constantes para utilizarlos eficazmente.
Código Delphi [-]
const
  StrVacio = '%&VACIO&%';
  IntVacio = -99999;
  RealVacio = -865.14563;
Al leer el arreglo, verificás si el dato en esa posicion no es un vacío
Código Delphi [-]
if (ArStr[i] <> StrVacio) then
  ......
if (ArInt[i] <> IntVacio) then
  ......
if (ArReal[i] <> RealVacio) then
  ......
y hacés lo que necesitás.
Saludos.

Caro 07-04-2010 15:51:25

Cita:

Empezado por CaosDeath (Mensaje 359323)
Tengo un problema tengo datos metidos en arreglo (array) y se muestran en un listbox pero no se como borrar un dato seleccionado en el listbox del arreglo solo puedo quitarlo del listbox pero sigue en el arreglo alguien que me diga como le ago?

o aunque sea como guardar los datos de un listbox en un arreglo nuevo?

Hola CaosDeath, borrar directamente como te han indicado no se puede, lo que si podrías hacer, es recorrer los elementos a la izquierda sin tomar en cuenta el elemento a borrar, así lo sobreescribes y tienes una relación entre los indices de tu ListBox y tu Array, ejemplo:

Código Delphi [-]
var
 band : Boolean;
 ind, i : Integer;
begin
 band := False;
 ind := -1;
 PosABorrar := ListBox.ItemIndex;
 While (ind<=High(ArrayCadenas)) and (Not band) do
  begin
   if ind=PosABorrar then
    for i:=ind to High(ArrayCadenas) do
     begin
       if ithen
        ArrayCadenas[i] := ArrayCadenas[i+1]
       else
        ArrayCadenas[i] := '';
       band := True;
     end;
   inc(ind);
  end;

Ahora, si quieres hacer desaparecer el ultimo elemento que tiene como valor '', puedes utilizar un array dinamico, la primera ves tendra todos los elementos que le indiques, despues haciendo primero lo que esta en el codigo de arriba y para eliminar la ultima posición solo debes redimensionarlo con la función SetLength, no te olvides que el indice con el que empieza un array dinamico es 0.

Código Delphi [-]
  //Para redimensionar a menos un elemento
  SetLength(Cadena, High(ArrayCadenas));

Pero, para que te evites hacer todo eso, también te recomiendo utilizar un StringList.

Saluditos

Caro 07-04-2010 15:53:16

Otra cosita, al redimensionar y aplicar nuevamente el SetLength, no se pierden los datos que ya tenías antes.

Saluditos


La franja horaria es GMT +2. Ahora son las 11:35:49.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi