Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ayuda en un código (https://www.clubdelphi.com/foros/showthread.php?t=56175)

kbaby 09-05-2008 15:11:33

Ayuda en un código
 
Hola! Estoy haciendo una minibase de datos con lo que he aprendido. Utilizo la MEMO para guardar los ITEMS. Me gustaría hacer algo para que cuando ponga por ejemplo: García ... me salieran todos los garcías de mi base de datos y yo elejir uno que se mostrara en una tabla ^^.

Espero expresarme bien. Un saludo.

Delphius 09-05-2008 16:24:56

Hola kbaby,
Podrías explicar mejor tu situación?
Por empezar sácame una duda... Cuando dices:
Cita:

Utilizo la MEMO para guardar los ITEMS
¿A qué te refieres? ¿A un TMemo? ¿Y como es que ingresas los datos?
Así?:

Código:

Dato1
Dato2
...
DatoN

O ¿Así?
Código:

Dato1 Dato2 ... DatoN
De cualquier manera no creo que sea lo más adecuado para ingresar los items... No se me parece que hay algo que se nos escapa de esta explicación.

Además, deberías aportarnos más detalles. Por empezar que base de datos usas, componentes de acceso a la base de datos ¿ADO?, un poquito de tu código para saber como es que estás haciendo las cosas.

Saludos,

kbaby 09-05-2008 20:09:21

Vale empiezo.

- Utilizo la utilidad ListBox*.

- Para añadir items a la lista utilizo el siguiente comando:
Código Delphi [-]
l.items.add(edit1.text); // donde l es el nombre de la ListBox* y edit1.text el cuadro de edicción que utilizo para meter el nombre o el dato de la persona.

- Los datos los guardo en un documento de texto .txt y un ejemplo sería:
  • Alfonso Megías Navarro 19/05/1921 Hombre 54875422I Granada
  • Alfonso Megías Navarro 19/05/1921 Hombre 54875422I Granada
  • Alfonso Megías Navarro 19/05/1921 Hombre 54875422I Granada
  • Alfonso Megías Navarro 19/05/1921 Hombre 54875422I Granada
Pero cambiarían los datos a mostrar. Así que yo quiero que cuando ponga el DNI XXXXXXXXXX salga la persona que yo quiero en una tabla :p.

- No se lo que es ADO
- No te pego código porque lo que tengo está en mi libreta de apuntes y eso no lo tengo (porque no lo vimos).

Gracias ^^

*Antes puse TMemo, me equivoque.

kbaby 09-05-2008 20:42:03

También quiero añadir unas dudas que me surgen mientras compilo el programa.

Tengo dos formularios. En el FORM1 tengo una ListBox y en el FORM2 tengo los datos que voy a guardar en la ListBox cuando pulse un button. ¿Cómo lo hago? Yo se hacerlo si la ListBox está dentro del mismo formulario pero no fuera. Gracias.

Otra duda: Me gustaría ponerle a los button iconos. Por ejemplo al de salir, una puerta... y así. No se que tipo de button es ni como hacerlo.

Gracias :o es un proyecto lo que estoy haciendo.

Casimiro Noteví 09-05-2008 21:05:30

Puedes visitar la wiki del clubdelphi:http://wiki.clubdelphi.com/
Puedes visitar la ftp del clubdelphi, donde encontrarás libros tan buenos como este: http://www.terawiki.clubdelphi.com/a...elphi4.pdf.zip
Puedes visitar los trucos del clubdelphi: http://www.clubdelphi.com/trucos/
Si tienes alguna duda, pregunta :)

Delphius 09-05-2008 21:09:44

Hola kbaby,
Entonces no estamos hablando de base de datos... sino de uso de ficheros.
Olvida lo que dije sobre ADO, motores de base de datos.

¿A que le llamas tabla? Para mi una tabla es un TxxxTable. Y esto si es ya el mundo de base de datos.

Sería bueno que nos expliques profundamente que es lo quienes. Porque cualquier palabra que digas puede tener un significado para otros. Como dije... una tabla para mi es una tabla de una base de datos, a la cual accedo mediante un TTable, o un TQuery, linqueado a un DataSource y una TConeection... etc Y como ves, esto es un mundo que no estás explorando por el momento.

Por el momento lo que te entiendo es que tienes unos datos en el TListBox y tu deseas buscar un item en específico. Para ello se cuenta con el método IndexOf() que devuelve el índice del item si lo encuentra.

El código que te paso a continuación busca el contenido de un TEdit en un TListBox, en caso de encontrarlo lo selecciona, de otra manera recibes un mensaje:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var Index: integer;
begin
  Index := ListBox1.Items.IndexOf(Edit1.Text);
  if Index >= 0
     then ListBox1.Selected[Index] := True
     else ShowMessage('Elemento no encontrado');
end;

Por lo segundo, Tienes dos forms. Cada uno con su respectiva Unit. Para hacer lo que buscas debes declarar la unit de uno en otro en la sección unit.

Código Delphi [-]
Unit Unit2;

interface
...

uses
  bla, bla, bla, Unit1.

...

Entonces esto permite de que desde Unit2 "veamos" y tengamos acceso a Unit1.

Pero he aquí un dilema, Si Unit1 "llama" a Unit2 y Unit2 debe comunicarse a Unit1 y si declaras en uses la Unit del otro, provocarás un conflicto que recibe el nombre de referencia circular. ¿Como solucionarlo?
Uno de los Unit debe tener declarado el uso de la otra unit en la sección implementation y el otro en interface:

Código Delphi [-]
Unit UnitX;

...

implementation

uses
 UnitY;
...

Espero que esto te haya dado una idea. Más no puedo decirte puesto que no comprendo tu idea. Como he dicho, sería oportuno que nos describieses mejor el problema.

Saludos,

kbaby 09-05-2008 21:40:28

Bueno empezemos:

La 1º duda solucionada, lo de buscar un ITEM y señalarlo. Luego lo que quiero es que ese ITEM con otros que vienen asociados a la información de la persona, se muestren en la tabla. Mi tabla, es la StringGrid (eso es la unica tabla que yo se). Así que voy a probar tu solución de buscar para mostrar para ver si puedo hacer lo que yo quiero.

Lo que yo quiero es... que si pongo el DNI XXX.XXX.XX.X que corresponde a HHHHH HHHHH HHHHH pues en la tabla que tiene sólo una fila... tiene que salir el nombre de HHHHH sus apellidos HHHHHH HHHHH y mas datos que guardo.


La 2º duda... cuando me la explicaste :D me recordó a algo que dijo el profesor así que muchas gracias jajaja. Solucionada.

La 3º duda... eso si que no la entiendo... si me diera el error la uso, sino ... mejor me quedo quieto y parado.



PD: Puse otro post con "mini dudas que me surgen cuando compilo".

Gracias tio,.

kbaby 09-05-2008 21:48:00

Con respecto a la 3º duda... efectivamente me a ocurrido y creo que con lo que hice se solucionó, claro está gracias a tu explicación. Sigo indagando por aquí.

---EDITO---

He hecho lo de poner Unit1 y Unit2 (en mi caso se llama: fiesta y fiesta2). // no se porqué xD. Bueno el resultado es que cuando estoy en fiesta2 y quiero usar la ListBox que tengo en fiesta me dice que no conoce L. "L" es el nombre que le di a la ListBox.

Cuando estoy en Unit1 (en mi caso "fiesta")... pongo en uses (los que hay dentro de interface) bla, bla, bla, fiesta2; y cuando estoy en Unit2 (en mi caso "fiesta2").... pongo en uses (los que hay dentro de implementation) uses fiesta;
Pues le doy a F9 y lo ejecuto y me dice noseque circular noseque.... osea eso que me dijiste jajaja. ¿Qué hago?.

Te pego aquí los codigos:

Mi Unit1:

Código Delphi [-]
unit hospital;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Menus, StdCtrls, Grids, hospital2;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    MainMenu1: TMainMenu;
    MENU1: TMenuItem;
    NuevoPaciente1: TMenuItem;
    Salir1: TMenuItem;
    t: TStringGrid;
    l: TListBox;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    Button4: TButton;
    Button5: TButton;
    procedure NuevoPaciente1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

Mi Unit2

Código Delphi [-]
unit hospital2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm2 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

uses hospital;

kbaby 10-05-2008 12:14:09

Sigo sin poder utilizar la ListBox de mi Form1 en el Form2 :S aquí arriba os puse el code de mis dos formularios. Gracias :rolleyes:;)

Delphius 10-05-2008 16:37:09

1 Archivos Adjunto(s)
A ver... No veo donde está el problema...

Te paso un ejemplo sencillo para que veas de lo que hablo.
Ya nos dirás como avanzas.

Saludos,

kbaby 11-05-2008 13:18:53

Voy a ver que tal el ejemplo. Gracias tio.

kbaby 26-05-2008 16:55:39

aqui vuelvo, con el mismo problema, no se como hacerlo. no se hacer lo siguiente:
cuando en un listbox tengo los items metidos... yo quiero insertar el dni de una persona en un edit y al pulsar en un button... que me salga un mensaje (si puede ser en una tabla stringnoseke) con los datos de la persona.

Sería asi:

Lisbox:
dni1
nombre1
apellido1
telefono1
dni2
nombre2
apellido2
telefono2


Cuando en el edit ponga "dni2" me volcara en una tabla:
dni2 - nombre2 - apellido2 - telefono2

Espero explicarme bien (aunque no lo se).

gracias

kbaby 26-05-2008 16:58:18

Tu ejemplo me ayuda mucho porque porlomenos BUSCA el item. Ahora yo quiero aprender como pasar ese item (y los que les siguen) a una tabla.

Delphius 26-05-2008 18:10:47

Hola kbaby... el siguiente código es un ejemplo de lo que buscas:

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var indice: integer;
    i: integer;
begin
  // primero buscamos el dato. Supuesto: que siempre estamos buscando un DNI
  indice := ListBox1.Items.IndexOf(Edit5.Text);
  if indice <> -1
     then begin
             for i := 1 to 4 do  //este cuatro corresponde a la cantidad
               // de datos a mostrar. En este caso son: DNI, Nombre, Apellido,
               // Teléfono
               begin;
                 // mostrar cada dato en una celda distinta
                 // De hecho, lo mostramos en la primera fila
                 // [columna,fila]
                 StringGrid1.Cells[i,1] := ListBox1.Items[indice];
                 inc(indice);
               end;
          end
     else ShowMessage('DNI no encontrado');
end;

El código funciona, siempre que busques el DNI. Si buscas el apellido o cualquier otro dato no vas a obtener lo que deseas... Hice el supuesto de que siempre están disponibles todos los datos, de otro modo el algoritmo falla. Para hacerte una idea de porque funciona. piensa al listBox como una lista. Y cada elemento ocupa una posición.

Código:

0 - DNI
1 - Nombre
2 - Apellido
3 - Teléfono
4 - DNI
5 - Nombre
6 - Apellido
7 - Teléfono

¿Ves algo extraño? ¿No parece haber una correlación entre 0 y 4?¿Lo mismo que para 1 y 5?
Es por ello que al encontrar la posición del DNI, la copio a la posición [1,1] del stringGrid, luego, exploro las siguientes 3 posiciones y las añado a la posición [i,1]. ¿Porqué sacamos siempre el valor del Indice? Pues porque si te fijas, al final de cada bucle FOR incremento (la función inc()) la variable indice en 1. Y esto hace que con cada pasada, se obtenga el siguiente elemento del ListBox.

Inc(indice) es análogo a indice := indice + 1;
inc(indice, 2) es análogo a indice := indice + 2;

Analiza el código que te pasee y ve de que manera se adapta a lo que buscas.

Muchas de las cosas que preguntas tienen tanto de lógica como del uso del uso de las propiedades de los objetos que empleas. No temas pulsar F1 al seleccionar un objeto. Por ejemplo, si no sabes como usar el StringGrid, arrastra uno al form, seleccionalo y presiona F1. Obtendrás la ayuda.

El inglés no es pretexto, habiendo traductores on-line como off-line.

Saludos,

kbaby 26-05-2008 18:44:00

Tio, muchas gracias, me entere fenomenal. Ahora viene la segunda parte... ver si yo puedo. Ahora te aviso.

kbaby 26-05-2008 19:04:44

Primer problema que me surge:

"Estoy intentando que el programa lea un archivo .txt previamente creado con los datos puestos:

nombre
apellido
nombre
apellido

(esto es una prueba)

Bueno el problema es que cuando le doy a "recuperar" pues me lo lee y sale en el LISTBOX pero con un espacio entre nombre y apellido... así:

pepe
//aqui hay un espacio que no había
gomez
// aquí tambien
juan
// aqui tambien
lopez

El codigo es:

Código Delphi [-]var f:textfile;
n:string;
begin assignfile(f,'nombres.txt');
reset(f);
while not eof(f) do begin readln(f,n); edit1.Text:=n; button1.Click; //añadir ¿en mis apuntes sale ke tengo que poner esto... pq?
button2.Click; //lo que hace es volcar
end;
closefile(f);
end;

end.

kbaby 26-05-2008 19:05:35

Primer problema que me surge:

"Estoy intentando que el programa lea un archivo .txt previamente creado con los datos puestos:

nombre
apellido
nombre
apellido

(esto es una prueba)

Bueno el problema es que cuando le doy a "recuperar" pues me lo lee y sale en el LISTBOX pero con un espacio entre nombre y apellido... así:

pepe
//aqui hay un espacio que no había
gomez
// aquí tambien
juan
// aqui tambien
lopez

El codigo es:

Código Delphi [-]
 
var f:textfile;
    n:string;
  begin
  assignfile(f,'nombres.txt');
  reset(f);
  while not eof(f) do
     begin
     readln(f,n);
     edit1.Text:=n;
     button1.Click; //añadir ¿en mis apuntes sale ke tengo que poner esto... pq?
     button2.Click; //lo que hace es volcar
     end;
  closefile(f);
end;

end.

Delphius 26-05-2008 19:14:43

kbaby, el TListBox cuenta con los métodos LoadFromFile y SaveToFile que hace todo el trabajo más fácil.

LoadFromFile abre un archivo y lo muestra. SaveToFile lo guarda.
El archivo que se genera es como aparece en el ListBox. Cada texto en un "renglón". Es decir que si en un ListBox tienes esto (cada uno en una linea):

Código:

Hola como estas kbaby
yo aqui un poco adivinando
lo que hace ese button1.click
y también desorientado con el button2.click

Tu archivo quedará escrito en la misma forma.

El problema con ese código puede deberse al Readln() ya que eso hace que se pase al siguiente "renglón". El porque en tus apuntes invocas a un Button1.Click y luego a un Button2.Click lo desconozco... es cosa de tus apuntes... y pues... no estoy allí para ver que es lo dicen.:D

Si nos aportaras más datos podría saber el modo de ayudarte.

Saludos,

kbaby 26-05-2008 19:19:42

¿Por qué utilizas el Inc(indice)?

Es lo único que no me ha quedado claro.


Yo pulso f1, y lo leo, pero no veo como se adapta lo que a mí me han enseñando y no puedo llevar algo que no haya yo enseñado. Ahora si yo el " Inc(indice)" lo adapto a lo que me han enseñado pues sí.

Espero me comprendas.

kbaby 26-05-2008 19:25:30

Cita:

Empezado por Delphius (Mensaje 289155)
kbaby, el TListBox cuenta con los métodos LoadFromFile y SaveToFile que hace todo el trabajo más fácil.

LoadFromFile abre un archivo y lo muestra. SaveToFile lo guarda.
El archivo que se genera es como aparece en el ListBox. Cada texto en un "renglón". Es decir que si en un ListBox tienes esto (cada uno en una linea):

Código:

Hola como estas kbaby
yo aqui un poco adivinando
lo que hace ese button1.click
y también desorientado con el button2.click

Tu archivo quedará escrito en la misma forma.

El problema con ese código puede deberse al Readln() ya que eso hace que se pase al siguiente "renglón". El porque en tus apuntes invocas a un Button1.Click y luego a un Button2.Click lo desconozco... es cosa de tus apuntes... y pues... no estoy allí para ver que es lo dicen.:D

Si nos aportaras más datos podría saber el modo de ayudarte.

Saludos,


Problema solucionado, fue simplemente ir probando, el código quedaría así:

Código Delphi [-]
var i:integer;
begin
  t.rowcount:=l.items.count div 4 +1;
  for i:=0 to (l.items.count-1)div 4 do
  begin
  t.cells[1,I+1]:=l.items[i*4];
  t.cells[2,I+1]:=l.items[i*4+1];
  t.cells[3,I+1]:=l.items[i*4+2];
  t.cells[4,I+1]:=l.items[i*4+3];
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var f:textfile; i:integer;
begin
  assignfile (f,'nombres.txt');
  rewrite(f);
  for i:=0 to l.items.count-1 do
  writeln (f,l.items[i]);
  closefile(f);
end;

procedure TForm1.Button4Click(Sender: TObject);
var f:textfile;
    n:string;
  begin
  assignfile(f,'nombres.txt');
  reset(f);
  while not eof(f) do
     begin
     readln(f,n);
     edit1.Text:=n;
     readln(f,n);     //lo que he hecho es añadir esto
     edit2.Text:=n; //y esto por cada item que tenga, como en mi caso son 4, pues sería esto.
     readln(f,n);
     edit4.Text:=n;
     readln(f,n);
     edit5.Text:=n;
     button1.Click; //esto hace añadir. si lo quito falla... así que lo dejo mejor.
     button2.Click; //lo que hace es volcar en la tabla todo el contenido del listbox.
     end;
  closefile(f);
end;

end.

Lo que hace el boton añadir es irse esto:

Mete la 1º linea del .txt en el edit1.text, luego la 2º linea en el edit2.text y así hasta las cuatro lineas y luego las añade al listbox.
Esto lo repite hasta llegar al final.

Luego lo vuelca en la tabla. He quitado lo de volcarlo porqueno me interesa volcar TODO.

Duda: ¿Cabe la posibilidad de recuperar la información del .TXT en el LISTBOX sin tener que hacerlo de mi manera tan "cutre"?.

Delphius 26-05-2008 19:33:16

Cita:

Empezado por kbaby (Mensaje 289156)
¿Por qué utilizas el Inc(indice)?

Es lo único que no me ha quedado claro.


Yo pulso f1, y lo leo, pero no veo como se adapta lo que a mí me han enseñando y no puedo llevar algo que no haya yo enseñado. Ahora si yo el " Inc(indice)" lo adapto a lo que me han enseñado pues sí.

Espero me comprendas.

Pues es una costumbre mia. Inc() es una función que lo que hace es incrementar una variable (no puede utilizarse con las propiedades de un objeto, por ejemplo... la propiedad ItemIndex) en un valor. Por defecto el incremento es de 1. Te explico:

cuando uno hace:

Código Delphi [-]
inc(tu_variable);

Lo que consigues es incrementar tu_variable en 1. Al hacer:

Código Delphi [-]
inc(tu_variable,5);

Lo que consigues es incrementar tu variable en 5.

De cualquier manera, puedes sustituir, como he dicho, a inc() por su equivalente:

Código Delphi [-]
tu_variable := tu_variable + 1 // 5, 300, 2321321, lo que se te ocurra.

¿El porqué uso la variable indice para incrementar? Pues... para ahorrarme otra variable. Si te fijas, la uso inicialmente para localizar la posición de un texto. Y si se dicha posición puedo saber la de los demás.

Si el archivo SIEMPRE contendrá TODOS los datos y en dicho ORDEN, con saber la posición del DNI se puede conocer la de los demás datos.
Por ejemplo:
Nombre ocupa la posición siguiente a indice. Lo que se traduce a Indice + 1.
Apellido ocupa la posición siguiente a Nombre. Traducido: indice + 2.
Telefono ocupa la posición siguiente a Apellido. Traducido: indice + 3.

Con cada paso del bucle FOR, no sólo me desplazo sobre la fila del StringGrid, sino también sobre el indice del ListBox.

¿Me vas entendiendo?

Saludos,

kbaby 26-05-2008 20:13:42

Entendido :rolleyes: Gracias profe :D

kbaby 28-05-2008 15:37:45

Aqui volviii :p Con dudas :D bueno en realidad son solo dos dudas.

1º Duda: Como acordamos, el codigo que funciona para buscar a los usuarios por DNI es el siguiente:

Código Delphi [-]
var indice: integer;
    i: integer;
begin
  indice := l.Items.IndexOf(Edit3.Text);
  if indice <> -1
     then begin
             for i := 1 to 4 do
               begin;

                 t.Cells[i,1] := l.Items[indice];
                 inc(indice);
               end;
          end
     else ShowMessage('Este DNI no pertenece a ningún usuario');
     Exit;
end;

Pero funciona eso porque los datos son:
0-DNI
1-NOMBRE
2-APELLIDOS
3-CIUDAD
4-DNI
5-NOMBRE
6-APELLIDOS
7-CIUDAD

Entonces, como dijiste, entre el 0 y el 3 existe una relacion. Pero y si yo lo que quiero ahora es ampliar el programa ¿y si busco por los APELLIDOS me salga en la tabla la persona con esos apellidos? Creo, que lo que hay que tocar es:

t.Cells[i,1] := l.Items[indice];

Pero como ya te dije, eso de INC no lo entendi bien. Por lo visto, va aumentando de 1 en 1 ¿no? Por eso sale el item 0, luego 1, 2,3...
Entonces si yo pongo en el EDIT de la busqueda los APELLIDOS... en la tabla me salen los items 3,4,5,6.
¿Como arreglo eso? :D Ya estoy indagando xD pero nada.


Otra cosa es la siguiente. Yo se volcar el contenido de mi LISTBOX en una TABLA (STRINGRID). AQUI TENEIS UN EJEMPLO:

MI TABLA
----------------------------------
|dni1 |nombre1 |apellido1 |
----------------------------------
----------------------------------
|dni2 |nombre2 |apellido2 |
----------------------------------
----------------------------------
|dni3 |nombre3 |apellido3 |
----------------------------------
----------------------------------
|dni4 |nombre4 |apellido4 |
----------------------------------

Y así, con todas las personas de mi listbox. Entonces si al nombre3 (un ejemplo) le cambio el nombre y se llama pepito en vez de juan... y le doy a GUARDAR... (guardar para que se guarden los cambios)... pierdo todas las otras personas y solo se me queda la persona "3" con sus cambios. ¿Por qué? ¿Qué manera usais vosotros para hacer lo que yo intento? Lo siento por ser tan... malo... pesimo.... en mis detalles.


gracias.

kbaby 28-05-2008 15:41:57

La PRIMERA DUDA la he resuelto solo!!! Siii!!! En la linea

Código Delphi [-]
 indice := l.Items.IndexOf(Edit3.Text);

La modifique haciendo esto:

Código Delphi [-]
 indice := (l.Items.IndexOf(Edit3.Text))-2;

Con este cambio, en la variable indice, metera el item que yo pongo en el edit pero bajandolo dos casillas (por el -2).

Siguiente duda: ¿Y si ahora hay dos personas con los mismo apellidos... hermanos? Solo me sale la primera... ¿alguna manera? :o:p

Delphius 28-05-2008 19:21:11

Cita:

Empezado por kbaby (Mensaje 289568)
Aqui volviii :p Con dudas :D bueno en realidad son solo dos dudas.

1º Duda: Como acordamos, el codigo que funciona para buscar a los usuarios por DNI es el siguiente:

Código Delphi [-]
var indice: integer;
    i: integer;
begin   indice := l.Items.IndexOf(Edit3.Text);   if indice <> -1
     then begin              for i := 1 to 4 do                begin;

                 t.Cells[i,1] := l.Items[indice];
                 inc(indice);
               end;
          end      else ShowMessage('Este DNI no pertenece a ningún usuario');
     Exit;
end;

Pero funciona eso porque los datos son:
0-DNI
1-NOMBRE
2-APELLIDOS
3-CIUDAD
4-DNI
5-NOMBRE
6-APELLIDOS
7-CIUDAD

Entonces, como dijiste, entre el 0 y el 3 existe una relacion. Pero y si yo lo que quiero ahora es ampliar el programa ¿y si busco por los APELLIDOS me salga en la tabla la persona con esos apellidos? Creo, que lo que hay que tocar es:

[DELHPI]
t.Cells[i,1] := l.Items[indice];
[/delphi]

Pero como ya te dije, eso de INC no lo entendi bien. Por lo visto, va aumentando de 1 en 1 ¿no? Por eso sale el item 0, luego 1, 2,3...
Entonces si yo pongo en el EDIT de la busqueda los APELLIDOS... en la tabla me salen los items 3,4,5,6.
¿Como arreglo eso? :D Ya estoy indagando xD pero nada.

Creo que eso ya te lo había dicho. El algoritmo es simple, y he recalcado que si buscabas cualquier otro dato obtendrías otros resultados.

Cita:

Empezado por kbaby (Mensaje 289568)
Otra cosa es la siguiente. Yo se volcar el contenido de mi LISTBOX en una TABLA (STRINGRID). AQUI TENEIS UN EJEMPLO:

MI TABLA
----------------------------------
|dni1 |nombre1 |apellido1 |
----------------------------------
----------------------------------
|dni2 |nombre2 |apellido2 |
----------------------------------
----------------------------------
|dni3 |nombre3 |apellido3 |
----------------------------------
----------------------------------
|dni4 |nombre4 |apellido4 |
----------------------------------

Y así, con todas las personas de mi listbox. Entonces si al nombre3 (un ejemplo) le cambio el nombre y se llama pepito en vez de juan... y le doy a GUARDAR... (guardar para que se guarden los cambios)... pierdo todas las otras personas y solo se me queda la persona "3" con sus cambios. ¿Por qué? ¿Qué manera usais vosotros para hacer lo que yo intento? Lo siento por ser tan... malo... pesimo.... en mis detalles.

gracias.

Primeramente sería oportuno que nos indicaras de que modo estás volcando la información desde el TListBox hacia el StringGrid. Y si me explicaras mejor lo que estás buscando hacer...

El problema kbaby es que tu estás empleando un método para guardar y leer archivos un tanto incompatible con los controles que estás usando.
Habiendo la posibilidad de emplear SaveToFile y LoadFromFile tanto para ListBox como para StringGrid el trabajo se hace más fácil.

Pero si es como dices, que no puedes emplear nada fuera de lo que viste ¿De que sirve que te indiquemos de que manera lo hacemos, si es mucho más probable de que sea algo complejo y/o algo que no has visto ni tienes en tus apuntes?
A lo que voy, es que si te estás basando en tus apuntes, poco puedo imaginarme el modo de hacerte más fácil los ejemplos. No se que tienes en tus apuntes, y eso me condiciona mucho.

Y es posible que también lo sea para otros foristas.

Cita:

Empezado por kbaby (Mensaje 289573)
La PRIMERA DUDA la he resuelto solo!!! Siii!!! En la linea

Código Delphi [-]
 indice := l.Items.IndexOf(Edit3.Text);



La modifique haciendo esto:

Código Delphi [-]
 indice := (l.Items.IndexOf(Edit3.Text))-2;



Con este cambio, en la variable indice, metera el item que yo pongo en el edit pero bajandolo dos casillas (por el -2).

Siguiente duda: ¿Y si ahora hay dos personas con los mismo apellidos... hermanos? Solo me sale la primera... ¿alguna manera? :o:p

Me alegro que vayas comprendiendo y logrando las cosas por ti mismo. ¿No es gratificante?:)

¿A que te refieres? ¿A que si buscas en el ListBox, a los Martinez (un ejemplo) te liste a todos los martinez?
Hay manera de hacerlo... y puede que se me ocurra una, y vuelvo al tema que comenté antes... existe la posibilidad de que lo haga de un modo al que para ti resulte chinesco.
Si pudiera conocer hasta que punto es compatible las opciones que te ofrecemos con los contenidos que tu estás estudiando sería más fácil.

El mayor problema, es el TListBox. y la manera en que estás guardando los datos. Una opción sería guardar los datos separados y delimitados por comas o algún otro caracter... y emplear las propiedades CommaText, DelimiterChar, DelimiterText, pertenecientes a Items. Pero es posible que esto sea el chinesco que a ti no te agradaría.

kbaby, lamentablemente para ayudarte del mejor modo es conociendo lo que sabes, y haz estado estudiando.
Lamento decirtelo, pero no se me ocurre, por el momento, un modo de demostrarte una solución de más bajo nivel como para el que tu comprendieras.

El método (algoritmo) más sencillo que se me está ocurriendo es algo similar a este:
1. Iniciar una variable i al valor 2. La usaremos para ir recorriendo lal ListBox.
2. Mientras i sea menor a la cantidad de elementos hacer:
2.1. Si el item i-ésimo es igual al valor buscado
2.1.1. incrementamos una variable j. Sera usada para ir agregando las filas a la "tabla". Inicialmente debe valer cero.
2.1.2. agregamos a la fila j-ésima:
2.2.2.1. en la primera columna el DNI. Cuya posición es igual a i - 2.
2.2.2.2. en la segunda columna el Nombre. Cuya posición es igual a i - 1.
2.2.2.3. en la tercera columna el Apellido. Cuya posición es igual a i.
2.2.2.4. en la cuarta columna la ciudad. Cuya posición es igual a i + 1.
2.2. incrementar a la variable i en 4.

¿Porqué lo redacté así? Para que descubras que lo que necesitas es dominar el arte de lógica, en vez de buscarle un sentido en el uso de propiedades y métodos.
Además lo hago con la finalidad de que lo pienses tu, y le encuentres solución.

El algoritmo que te pasé lo que hace es ir dando saltos de 4 en 4 sobre los items del TListBox. Si en dicha posición el contenido del ListBox es igual al buscado suceden las siguientes cosas:
1. incrementa una variable j. Es decir j = j + 1.
2. agrega en la posición [1,j] lo almacenado en el listbox, posición i - 2.
3. agrega en la posición [2,j] lo almacenado en el listbox, posicion i - 1.
etc...

Es decir que en cada ocurrencia, agrega los items que corresponde a dichos datos. Recuerda que SIEMPRE que se mantenga el orden:
DNI
NOMBRE
APELLIDO
CIUDAD

el algoritmo podrá encontrar la información.

Ten presente que el StringGrid guarda sus datos del siguiente modo:

Código:

[1,1][2,1][3,1][4,1][5,1]
[1,2][2,2]...
...
[1,N][2,N]

Espero haberte dado una idea.
Disculpa que he haya extendido, pero no veo otro modo de demostrarte lo limitado que estamos para ayudarte si te proponemos alternativas que posiblemente tu no comprendas y que no estén en tus apuntes.

Saludos,

kbaby 28-05-2008 19:48:18

Bueno yo voy a intentar darte mas información de lo que hago. Para guardar utilizo este código:

Código Delphi [-]
var f:textfile; i:integer;
begin
  assignfile (f,'nombres.txt');
  rewrite(f);
  for i:=0 to l.items.count-1 do
  writeln (f,l.items[i]);
  closefile(f);

Y cuando abro el programa, para "cargar" el listbox utilizo esto:

Código Delphi [-]
var f:textfile;
    n:string;
  begin
  assignfile(f,'nombres.txt');
  reset(f);
  while not eof(f) do
     begin
     readln(f,n);
     edit1.Text:=n;
     readln(f,n);
     edit2.Text:=n;
     readln(f,n);
     edit4.Text:=n;
     readln(f,n);
     edit5.Text:=n;
     button1.Click; //lo que va haciendo esto, es ir poniendo en edits cada item y añadirlo automaticamente. Por eso al final limpio los edits.
     end;
  closefile(f);
  edit1.text:='';
  edit2.text:='';
  edit4.text:='';
  edit5.text:='';
end;

1). En la tabla NO vuelco todo el contenido, solo la persona que se apellida Martinez Perez. Pero el caso es si hay dos personas con Martinez Perez. Como poner a los dos?.

2) Y la otra duda es, una vez volcada a Pepe Martinez Perez, si le tengo que cambiar algun dato, por ejemplo su nombre (cosa que hago desde la tabla, una vez volcado cuando lo busque...) pues le doy y borro su nombre y escribo ahora Jose. Le doy a guardar y se borra TODOS LOS ITEMS del listbox, menos la "persona" con sus 4 datos (DNI,NOMBRE,APELLIDOS,CIUDAD).


El código que utilizo para borrar lo que hay en la tabla y que se guarde es este:
l.items.clear;
edit1.text:=t.cells[1,1];
edit2.text:=t.cells[2,1];
edit4.text:=t.cells[3,1];
edit5.text:=t.cells[4,1];
button1.click;


¿Que pasa? Pues que borra toda la lista y añade a esa persona con sus cuatro datos, pero las otras las pierdo. ¿Alguna otra forma?

gracias.

Delphius 28-05-2008 20:29:07

Bueno, con respecto a buscar los martinez y mostrarlos te he propuesto una solución. ¿Porqué no la traduces a código? Sería un buen ejercicio para ti.

Con respecto al tema de porque borra el contenido del TListBox es simplemente porque al principio de todo invocas al método Clear.

No debes llamar al método Clear. Sino que debes realizar el paso inverso al algoritmo que te he pasado:
Analizemos la situación:
Antes ibamos saltando por los items de 4 en 4 y volcando la información. De este modo de cumplía lo siguiente.
Si buscamos por el apellido,
El DNI siempre está en la posición i - 2.
El Nombre siempre está en la posición i - 1
El Apellido siempre está en la posición i
La Ciudad siempre está en la posición i + 1

Por tanto, lo que hacíamos era agregar estos datos en el StringGrid del siguiente modo:
Celda[1,j] = La info de i - 2
Celda[2,j] = la info de i - 1
Celda[3,j] = la info de i
Celda[4,j] = la info de i + 1

A la inversa tenemos:

La info de i - 2 = Celda[1,y]
La info de i - 1 = Celda[2,y]
La info de i = Celda[3,y]
La info de i + 1 = Celda[4,y]

¿Se entiende? No debes hacer Clear, sino sustituir un dado de una celda por el de la posición en un índice:
Código Delphi [-]
ListBox1.Items[i] := StringGrid1.Cells[x,y];

¿Porque y? y no i?
El problema es que cuando agregamos desde el ListBox hacia el StringGrid perdemos referencia a la posición i-esima del campo Apellido de dicha persona. Lo más fácil es, que al agregar la información al StringGrid guardemos dicha posición para asi poder hacer el paso inverso. Tal vez, algo como esto:

Indice - DNI - Nombre - Apellido - Ciudad
De modo que en [1,j] tenemos la posición i-ésima del campo Apellido de los datos de la persona j-esima en el StringGrid.
En [2,j] su DNI.
En [3,j] su Nombre.
Y así sucesivamente.

¿Que significa ese j?
Pues la fila. De modo que si j es 1, nos referimos la persona que ocupa la fila 1 en el StringGrid. Ojo: no confundir a ese j con la posición i en el ListBox.
Cuando j vale 2, nos estamos refiriendo a la persona que ocupa la fila 2.

Por ejemplo, si en [1,1] tenemos el valor 6 quiere decir que en el ListBox, la información del apellido para dicha perona está en 6. Hacemos que i sea 6.
Por tanto:
1. El DNI está en i - 2. Es decir, 6 - 2 = 4. Item[4] = Celda[2,1].
2. El Nombre está en i - 1. Es decir, 6 - 1 = 5. Item[5] = Celda[3,1]
3. El Apellido está en i. Es decir, 6. Item[6] = Celda[4,1]
4. La Ciudad está en i + 1. Es decir, 6 + 1 = 7. Item[7] = Celda[5,1]

Cuando en [1,2] tenemos el valor 14, entonces:
DNI: 14 - 2 = 12. Item[12] = Celda[2,2]
Nombre: 14 - 1 = 13. Item[13] = Celda[3,2]
Apellido: 14. Item[14] = Celda[4,2]
Ciudad: 14 + 1 = 15. Item[15] = Celda[5,2]

¿Se entiende? Tendrás que modificar un poco tus códigos pero se consigue tener referencia a que persona estramos cambiando la información.

kbaby, te he dicho que esto se trata de lógica. No pienses en código... deja que el código salga del análisis de la situación y de un planteo del problema.

Saludos,

kbaby 28-05-2008 20:37:14

Una cosa que he notado es que el boton que tengo de "buscar" cuando en el edit pones una palabra con espacio en mi ejemplo: apellido1_apellido2 salta error. ¿por que?

Delphius 28-05-2008 20:48:47

Cita:

Empezado por kbaby (Mensaje 289698)
Una cosa que he notado es que el boton que tengo de "buscar" cuando en el edit pones una palabra con espacio en mi ejemplo: apellido1_apellido2 salta error. ¿por que?

kbaby, si no dices el error no te podré ayudar ¿Modificaste el código de buscar? ¿Si es así, como lo tienes?

Lo siento, pero si no aprendes a aportar verdaderamente la información que nos ayude a ayudarte no podemos seguir.
La paciencia tiene cierto límite. Yo he estado siendo paciente... pero ha sido dificil sacarte la información para que te pueda asesorar.

Cuando uno dice me sale error, ¿que puede ser?... Menos ganas de ayudar me dan.
Tu ya conoces como funciona esto... el que aporta detalles recibe soluciones y alternativas, el que no tiene dos opciones:
1. lamentarse
2. Ceder parte de su tiempo en explicar acabadamente su situación

Me parece fabuloso que estés dandole a esto de programación. Es admirable porque muchos cuando lo intentan y ven que las cosas no les va se tiran abajo...
Tu no te tiras abajo, nos tiras abajo. Posteo y inmediatamente posteas. Analiza primero en frio lo que te he dicho y luego adaptalo a tus necesidades.

Por hoy, lo dejamos. Vuelve en frio, y yo tambien.

Saludos,

kbaby 28-05-2008 20:52:01

Lo siento por no saber expresarme, pero aquí esta todo. He montado el programa en un pispas puesto que no lo tengo en mi casa sino en el instituto. Así que aqui tienes mas o menos "mi proyecto" que en el instituto esta mucho mejor hecho.

http://rapidshare.com/files/11838241...ATICA.rar.html

Bajalo de ahí, y veras el problema al buscar algun item que contenga espacio y el problema al modificar una persona que esta en la tabla.

Gracias, más no se que poder ofrecerte.

Llevo toda la tarde, toda, toda pero no piyo nada ni lo saco por logica. Eso del I,J no lo comprendi bien, o eso creo. Voy a volver a leerlo.

kbaby 28-05-2008 21:04:25

Código Delphi [-]
ListBox1.Items[i] := StringGrid1.Cells[x,y];

Voy a comentarte. Segun ese codigo quiere decir que en el Item de posicion I (no se sabe, es una variable) se va a cambiar por la cadena que hay en la celda [x,y].

Pero ahora viene mi cuestion... siento ser tan pesado pero tengo muy poco tiempo y experiencia y por eso acudo aqui, a pedir ayuda y porque veo que es un sitio util ¿Cómo sabe el programa que vale I? Cuando yo pulse el button que le asigne el codigo, el no sabe que ITEM es... ni que CELDA he modificado. ... Eso es mi problema. Gracias.

Delphius 29-05-2008 20:48:47

kbaby, antes que nada te recuerdo algo que tu habías dicho:
Cita:

Empezado por kbaby (Mensaje 289156)
y no puedo llevar algo que no haya yo enseñado.

Y esto lo hago no con la finalidad de ser pesado sino de hacerte notar de que muchas veces uno por ponerse a ser original termina descubriendo cosas que están fuera de nuestra comprensión y atentan con lo que estuvimos haciendo.

El que nos digas a nosotros que quieres hacer esto, hacer esto otro... y a riesgo de que nos saltes diciendo algo parecido a esto:

Cita:

Pero eso no lo vi en clase. ¿Hay una forma de hacerlo más fácil? No puedo usar algo que no me enseñaron.
Nos pone en una situación difícil. Porque sin conocer hasta donde llegan tus conocimientos no vamos a poder ayudarte.

Pusiste a disposición tu código fuente, lo estuve viendo... En cuanto a estética deja que desear, pero eso no es problema.
En cuanto a código... también deja que desear. Puede mejorarse.
Y es aquí donde voy a hacer una pausa para darte algunos consejos:
1. Declaración de variables. Debes declarar a tus variablesy controles de mejor manera. Un "l", un "t" no es adecuado. Termina confundiendo más. A veces es mejor tener un StringGrid1, que un t.
2. Mucho código puede reducirse y compartirse entre los controles. Aqui debo volver hacia lo que te dije al comienzo de este post: Al no saber hasta donde llegan tus conocimientos no sabría decirte y preguntarte el porqué no haces usos de procedimientos y funciones. Buena parte del código se ahorra teniendo funciones y procedimientos que hagan las tareas comunes e invocandolas cuando sea conveniente.

Cita:

Empezado por kbaby (Mensaje 289714)
Código Delphi [-]ListBox1.Items[i] := StringGrid1.Cells[x,y];


Voy a comentarte. Segun ese codigo quiere decir que en el Item de posicion I (no se sabe, es una variable) se va a cambiar por la cadena que hay en la celda [x,y].

Pero ahora viene mi cuestion... siento ser tan pesado pero tengo muy poco tiempo y experiencia y por eso acudo aqui, a pedir ayuda y porque veo que es un sitio util ¿Cómo sabe el programa que vale I? Cuando yo pulse el button que le asigne el codigo, el no sabe que ITEM es... ni que CELDA he modificado. ... Eso es mi problema. Gracias.

Creo que fui claro en mi post anterior. He dicho que cuando se hace el volcado desde el TListBox hacia el TStringGrid (te sugiero que empieces a llamar las cosas por su nombre, un StringGrid no es una tabla; es una rejilla en todo caso) perdemos la referencia hacia que elemento nos referimos.
Debido a ello es que cuando deseamos hacer el paso inverso no sabemos a quien atribuírsele.
¿Como se soluciona esto?
Lo he dicho en el post anterior: Una alternativa es que al volcar los datos, usar la primera columna para hacer referencia al índice en cuestión. De modo que con leer dicha celda sabemos a que índice o posición (ya sea del Apellido, DNI, o el que fuera) podemos aplicar el paso inverso valiendonos de un corrimiento por arriba y debajo de dicho indice.

No interesa si modificaste uno o varios campos. El proceso funciona igual. ¿Que importa si antes un campo tiene PEPE y lo sustituímos por PEPE? ¿Afectó en algo?
Si por cuestiones de "perfomance" deseas evitar recorrer todos los elementos, deberías llevar un registro de cuales son las celdas que han sido editadas. Y esto implicaría más código...
Y más código, sobre todo para ti y la funcionalidad que buscas, es más de lo que estarías dispuesto a hacer. Nuevamente volvemos a lo que te he dicho al inicio: ¿Cuanto sabes? ¿Que puedes usar? ¿Que no puedes usar?
¿Si te ofresco una solución, cuál es la probabilidad de que entiendas de lo que hablo?

Digo... si me baso en lo que pasó al explicarte sobre el uso de la función inc()... ¿que puedo esperar si te ofrezco un algoritmo que lleve registro de las celdas editadas y luego recorrerlas a fin de aplicar los cambios adecuados?
Un algoritmo como ese implica de una u otra forma el uso de una estructura de datos dinámica, ya sea que termine usando un array dinámico, un TList, un lo que sea.... lo más seguro es que termines diciendome nuevamente que no entiendes y/o que no viste nada de eso y no puedes usarlo.

kbaby, te he dicho que tus problemas están en la lógica. Y ahora lo veo también por la prisa que tienes de hacer tu "tarea".

Con respecto al error que dices, no me arroja error. El algoritmo que tienes funciona tanto para un apellido simple como para uno compuesto. Da lo mismo que pongas MARTINEZ que MARTINEZ VELASQUEZ. Si en el TListBox existe, lo encontrará. Lo acabo de probar, no alteré el código... FUNCIONA.

Habría que ver que es lo que realmente haz puesto tu, a lo mejor fue un despiste "de dedo".

kbaby, ¿Recuerdas como empezaste en el Club? Varios foristas salieron a tu ayuda y tu lograste dar con la solución.
¿Porqué no haces nuevamente eso? Analiza el problema, deja de pensar en TListBox, en TStringGrid.... borra de tu mente el código y piensa objetivamente sobre la raiz del problema. Olvidate de la PC, agarra un lapiz, y papel. Y describe tu problema. Todo en forma textual... ahora piensa un poco y redacta en la forma una solución.
¿Listo? Luego a cada oración, párrafo o idea buscale un sentido en programación.

Ese ejercicio te puede ayudar a comprender que los mayores problemas no están en el lenguaje sino en tu cabeza.
No es mi intensión llamarte tonto, ni nada de eso. Sino que lo que nos detiene a muchos aquí es que se meten en un código buscando que la idea se adapte a él, cuando es la inversa lo que debe suceder.

Hace tiempo te comunicaste conmigo pidiendome una opinión sobre que carrera te convenía. En vista a que quiere meterte en informática, y tal parece por lo que me comentaste, te gusta mucho esto de la programación.
No es por asustarte ¿pero sabes los golpes que nos damos a diario muchos aqui?
No pretendo decir que esto no es para cualquiera... porque no es ni lo uno ni lo otro.
Hazme caso kbaby... Piensa en frio. imagina a las cosas de manera más simple, buscale a los problemas una representación similar a algo real, algo que ya hayas resuelto. Incrementa tu habilidad de abstracción.
¿Me creerías si te digo que me imagino al TStringGrid como varias pilas de platos una al lado de la otra? ¿Me creerías si te digo que le encuentro al procedo del volcado inverso una analogía al proceso de desapilar las pilas de platos?

Si... tal vez te parezca que me he estado dando unos cuantos golpes y que he salido con unos extraños personajes de los años 70 que profetizaban la frase "paz y amor, viejo". Pero lo cierto es que prefiero no matarme buscando adaptar la idea al código, sino que la idea me de el código.

Lenguajes hay muchos, y cada uno te puede hacer más o menos fácil la vida. Y no tiene sentido que te aprendas el lenguaje.
Aqui muchos preferimos Delphi, a mi me gusta... pero ¿cuanto se de él? ¿Un 20%? ?Un 50%? ¡Pues que importa! si lo que realmente importa es resolver el problema....

Piensa en frio.
Tal vez estas palabras te sean rudas... No es mi intención que así sea.
Noto en ti muchas ganas de aprender y disfrutar de esto. Y ando buscando el modo de demostrarte, y creo que lo que ha estado sucediendo en este hilo lo está demostrando en parte, de que las cosas no se hacen de un día a otro.
A su tiempo.
Analiza en frio el problema, y mi propuesta. ¿Existe otra manera? Muy posiblemente. Me extraña que otros no se hayan animado a ofrecerte ayuda.

Esto si será rudo: No te voy a resolver el código, porque considero que allí no está el problema. Creo que hay un bosque que te tapa el arbol ¿O se trata de que un Arbol te tapa el bosque?;)

Saludos,

Fenareth 29-05-2008 21:20:37

Cita:

Empezado por Delphius (Mensaje 290016)
...Olvidate de la PC, agarra un lapiz, y papel. Y describe tu problema. Todo en forma textual... ahora piensa un poco y redacta en la forma una solución.
¿Listo? Luego a cada oración, párrafo o idea buscale un sentido en programación....

Para mí esta frase da exactamente en el clavo de lo que la programación es y resuelve, al final es un proceso de automatización y de manejo de información, pero no solucionará nada que no pueda ser resuelto por métodos convencionales y primitivos...

Si aún no encuentras esa respuesta convencional y primitiva cómo es que la automatizarás ? No puedes hacer más fácil algo que no sabes cómo se hace de ninguna manera...

El consejo que te da Delphius te permitirá darte cuenta de que el problema no es tan difícil como lo crees, simplemente te falta sentarte y realmente analizarlo...

Saludos :)

kbaby 30-05-2008 14:45:11

Bueno, yo he leido los dos post y pienso que entiendes como si yo no hiciera eso. Claro que lo hago, pero llega un momento que lo que yo he aprendido me pone una barrera que no me deja acceder a otras cosas. Yo solo puedo hacer cosas limitadas. Eso sí, nos dejaron indagar en libros, internet, foros, para aprender cosas nuevas e implantarlas en el proyecto final. Por eso estoy aquí, preguntando cosas de las que NUNCA he odio hablar.

Con respecto a la estetica... fue un programa que hice en 10 o 15 minutos rapidamente para que veas como lo tengo organizado en el aula de informatica... pero allí uso 3 formularios, imagenes, paneles.... En mi casa lo que hago es pensar en un codigo para luego, ponerlo allí, pues solo tengo 1 hora de informatica y alli no puedo pensarlo. En mi casa lo pienso y lo pruebo y me lo apunto en mi libreta de delphi.

Yo pienso que hago todo lo posible por aprender, no he llegado al extremo de imaginarme esas cosas que me dijiste el final, pero si a dibujarlo e intentar solucionar las cosas "dificiles" con procedimientos faciles...

Lo de "t" a la <rejilla> y lo de l al <listbox> tienen ese nombre porque así me enseño mi profesor. Nos dijo que para ser mas rapidos, usaramos variables cortas y facil de recordar... en ningun momento lo eleji yo.

Hoy estuve en informatica, ya me queda muy poco por acabar. Os cuento de lo que hace mi proyecto ^^
- Añade a personas (al listbox)
- Las modifica (aunque al modificar una, se borra todas del .txt).
- Puedes bucar a personas por DNI, apellidos, telefono (gracias Delphius).
- Puedes ver el estado del hotel (% de habitaciones ocupado, gente dentro...)
- Mi super boton close; (para salir :P)

¿Qué me queda?
- Arreglar lo de modificar a las personas y que se guarde.
- Poder buscar y ver en el StrinGrid1 (lo dije bien ehh) todas las personas que sus apellidos sean MARTINEZ LOPEZ y no solo, la primera.


Eso es todo.

Espero que no pienses que soy un vago que lo quiere todo hecho. Me he leido la caraocultadedelphi, el libro que me compre en la feria del libro por 1€ (si ese), he consultado en personas que saben (sin encontrar ayuda por parte de ellas), he venido al foro y entré, desde el primer miomento que di programacion. Yo tengo aun la idea en mi mente de poder ser informatico, alomejor programando no valgo (cosa que no me preocupa, intentare conseguir la meta) pero dentro de la informatica hay muchisimos campos.

Gracias.

PD: Lo de apellidos compuesto ya se porque me tiro error, por el error de "dedo".
Gracias

kbaby 30-05-2008 17:52:08

Pues aquí, desde el último post, estaba indagando un codigo para borrar del LISTBOX a una persona que tengo volcada en un StringGrid. Pues el código que se me ocurrio fue este:

Código Delphi [-]
var a,i:integer;
begin
  a:=t.row;
  for i:= 0 to 3 do l.items.delete(a+i);

Pero el problema es el siguiente si mi listbox es:
0-dni
1-nombre
2-apellidos
3-telefono
4-(y asi, sucesivamente).

Lo que hara es borrar el dni y entonces "nombre" pasara a la posicion "0" y así todos bajan una. Por lo siguiente, al repetir el FOR, borrará a+1 "posicion 2" ... el telefono de la persona...

Bueno voy a seguir intentando sacar codigo (te estoy haciendo caso, con papel y lapiz).

--------------------Minutos despues.......---------------------------

Aquí estoy, se me iluminó la bombilla y... tachán! Mirad que código mas sencillo para borrar a una persona (dni,nombre,apellido,ciudad) sin borrar las otras.
Código Delphi [-]
var a,i:integer;
begin
  a:=t.row;
  l.items.delete(a-1);
  l.items.delete(a-1);
  l.items.delete(a-1);
  l.items.delete(a-1);

Delphius 30-05-2008 18:41:55

Cita:

Empezado por kbaby (Mensaje 290150)
Bueno, yo he leido los dos post y pienso que entiendes como si yo no hiciera eso. Claro que lo hago, pero llega un momento que lo que yo he aprendido me pone una barrera que no me deja acceder a otras cosas. Yo solo puedo hacer cosas limitadas. Eso sí, nos dejaron indagar en libros, internet, foros, para aprender cosas nuevas e implantarlas en el proyecto final. Por eso estoy aquí, preguntando cosas de las que NUNCA he odio hablar.

kbaby, en ningún momento te he dicho que seas flojo. Sino que estás un poco impaciente. Lo mejor es hacer las cosas a su ritmo.
Con respecto a lo que te había comentado antes, si te lo digo es porque al intentar explicarte el uso de inc() tu mismo dijiste que no puedes poner nada que no haya sido visto.

Y si no puedo estar seguro de que has visto o no haz visto... ¿de que modo te puedo ser de ayuda?

Ahora, si estás aqui con la finalidad de ver cosas nuevas y mejorar el código. Entonces, aquel comentario que mi hiciste sobre de que no puedes poner nada visto está de más y tus preguntas debieron hacerse de otro modo para que nosotros si te pudieramos ofrecer alternativas.
Por el modo en que redactabas tus dudas se vee reflejado el deseo de "apagar un incendio" y no de ver buscar alternativas.

Si para el trabajo final puedes poner otras cosas y sustituir algunos códigos te sugeriría que te evitaras ese código para abrir y guardar en el archivo.
Es mucho más cómodo el método LoadFromFile y SaveToFile del cual disponen tanto el TStringGrid como como el TListBox y te aseguras de que lo está "escrito" en pantalla se guardará.
También podría ser útil el uso de funciones y procedimientos.
Mucho código del cual empleas puede concentrarse en unas pocas funciones y/o procedimientos y con ello evitar repitir código.

En ocasiones tener un:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var Indice: integer;
begin
  Indice:= BuscarPaciente(Edit1.Text; BUSCAR_POR_DNI);
  if Indice <> -1
    then ...
    else MessageBox(....)
end;

Es mucho más conveniente que estar implementando en varios controles el mismo o similar código. En este ejemplo, BuscarPaciente es una función que recibe en el primer parámetro el texto a buscar, el segundo parámetro es una constante definida y sirve para establecer el criterio de búsqueda.
Si Se diseña un algoritmo que busque por cualquier criterio, puede usarse en distintas partes y sin ningún cambio, sólo basta con suministrar el criterio adecuado.

El algoritmo que te yo te di como ejemplo puede fácilmente ser adaptado a esta necesidad con unos pocos cambios.

[quote=kbaby;290150]
Con respecto a la estetica... fue un programa que hice en 10 o 15 minutos rapidamente para que veas como lo tengo organizado en el aula de informatica... pero allí uso 3 formularios, imagenes, paneles.... En mi casa lo que hago es pensar en un codigo para luego, ponerlo allí, pues solo tengo 1 hora de informatica y alli no puedo pensarlo. En mi casa lo pienso y lo pruebo y me lo apunto en mi libreta de delphi.
[/delphi]
El comentario que te hice sobre estética no fue con la intención de atacar. Sino un comentario que debe ser tomado con ligereza. Si lees bien, he dicho: "pero ese no es el problema".

Y no lo es porque yo pongo atención a la lógica y no a la pantalla... Yo dejo la interfaz para el último, y si tengo que ir haciendola, la hago burdamente.
Sólo lo hice para recordarte de que al final debes mejorarla.
El problema de la gran mayoría de los sistemas es de lógica y no de interfaz. Por eso a mi poco me importa como se vea... fue un simple recordatorio para cuando termines.


Cita:

Empezado por kbaby (Mensaje 290150)
Yo pienso que hago todo lo posible por aprender, no he llegado al extremo de imaginarme esas cosas que me dijiste el final, pero si a dibujarlo e intentar solucionar las cosas "dificiles" con procedimientos faciles...

Ninguno nace aprendiendo.
Yo no me creo genio, ni un experto. Esta profesión, como cualquier otra requiere de constancia. Y las cosas no salen de un día a otro.
De hecho, hay un algoritmo que yo todavía lo tengo trabado (pero gracias a Dios, no es vital) y el compañero Seoane me lo dió vueltas en una patada.
Hay cosas que nos salen, otras que no.
Y con el tiempo comprenderás que lo que cuesta ahora en un futuro lo verás como (perdón por la palabra) una estupidez.

Yo te he recalcado algo: analizalo en frio.
Y es así porque he notado que en el momento en que posteabas te quedabas esperando a que posteara. Y ni bien yo posteaba no pasaban muchos minutos y ya había un post tuyo diciendo que tenías problemas para entender mis propuestas.
Algunas veces las soluciones no se hallan en minutos ni en días. Aprenderás esta lección cuando estés estudiando en la universidad y/o salgas a la calle.
No desesperes, porque es lo último que debes perder.


Cita:

Empezado por kbaby (Mensaje 290150)
Lo de "t" a la <rejilla> y lo de l al <listbox> tienen ese nombre porque así me enseño mi profesor. Nos dijo que para ser mas rapidos, usaramos variables cortas y facil de recordar... en ningun momento lo eleji yo.

Es cierto lo que te comenta el profesor. Es preferible variables cortas. ¿Pero una sola letra?
kbaby, los extremos son peligrosos: Muchas son muchas, pocas son pocas.
¿Te gusta leer esto?:

Código Delphi [-]
ComboQueTieneLosHorariosDeLosPacientes.ItemIndex := 5;

¿Y esto otro?:
Código Delphi [-]
a.Expr := '(5 x %2');

En el primero tenemos un caso en que hay demasiado información. En el segundo en el que hay poca.
Mientras que el primer caso se sobre entiende que se trata de un Combo, en el segundo, No sabemos que es a, y el porqué existe lo que pareciera ser una Propiedad llamada Expr que vaya a saber que hace.

Lamento decirlo pero tu profesor tiene razón parcialmente.

Cita:

Empezado por kbaby (Mensaje 290150)
Hoy estuve en informatica, ya me queda muy poco por acabar. Os cuento de lo que hace mi proyecto ^^
- Añade a personas (al listbox)
- Las borra (la que tu quieras)
- Las modifica (aunque al modificar una, se borra todas del .txt).
- Puedes bucar a personas por DNI, apellidos, telefono (gracias Delphius).
- Puedes ver el estado del hotel (% de habitaciones ocupado, gente dentro...)
- Mi super boton close; (para salir :P)

¿Qué me queda?
- Arreglar lo de modificar a las personas y que se guarde.
- Poder buscar y ver en el StrinGrid1 (lo dije bien ehh) todas las personas que sus apellidos sean MARTINEZ LOPEZ y no solo, la primera.

Me alegra saber que te queda poco.
Creo que te he dado buenas pistas. ¿Las repasamos desde tu punto de vista como la entiendes? Yo entiendo el problema... hace falta que aquí comprendamos tu visión de la propuesta.
Te propongo que redactes lo que entiendes de mi propuesta.

Para el caso de la búsqueda de todos los pacientes con determinado apellido, el algoritmo que tienes en volcar te debe ser de orientación.
De hecho haste esta pregunta ¿Que diferencia existe entre volcar toda la información de un TListBox de volcar sólo la que coincide con cierto criterio?

Una pista más:
Por "cada item" hacer:
1. ¿Es igual a criterio?.
1.1. SI: entonces agreamos sus datos a la rejilla
1.2. NO: entonces no hacemos nada.

Lo de guardar los datos es la inversa de volcar. Pasar lo que haya en el TStringGrid hacia el TListBox. He aquí que para hacerlo debemos contemplar una situación que ya he explicado y me gustaría "oir" que es lo que entiendes y no entiendes de mi propuesta. ¿Cómo te lo estabas imaginando?



Cita:

Empezado por kbaby (Mensaje 290150)
Espero que no pienses que soy un vago que lo quiere todo hecho. Me he leido la caraocultadedelphi, el libro que me compre en la feria del libro por 1€ (si ese), he consultado en personas que saben (sin encontrar ayuda por parte de ellas), he venido al foro y entré, desde el primer miomento que di programacion. Yo tengo aun la idea en mi mente de poder ser informatico, alomejor programando no valgo (cosa que no me preocupa, intentare conseguir la meta) pero dentro de la informatica hay muchisimos campos.

Gracias.

No pienso que eres vago, sino que estás apresurado. Y ello ye hace no ver las cosas del mejor modo.
Es bueno que leas libros, son de ayuda. Pero en los libros es posible que no encuentres la receta para preparar el algoritmo para buscar más de un paciente. Esto, lamentablemente, se aprende por ensayo y error.

Yo me vivo dando golpes con código kbaby... por algo he dicho y sigo sosteniendo: es una actividad mental, muy humana. Y al ser humanos, nos vemos movidos por miles de cosas.

Me alegro que sientas la convicción y ganas de estudiar sobre informática.
No digo que seas mal programador. Nunca he dicho eso...
Sólo te digo estas cosas para que te prepares, mentalmente, para cuando tengas dificultades.
No es agradable darse golpes... hay que aprender a vivir con ellos. Y no sólo en la vida profesional, sino en lo personal, en lo anímico, en lo sentimental, en lo existencial.

Muy cierto que la informática es amplia, y como te había comentado por MP: debes informarte y asesorarte bien sobre que del amplio abanico de posibilidades deseas enfocarte.

Yo no prefiero darte código kbaby... y me parece que es la decisión adecuada. Porque es necesario que logres ver donde está el problema... el porque te cuesta hallar el paso inverso (StringGrid a TListBox). Creeme que es lo mejor para ti, porque no sólo te sentirás mejor por encontrar tu mismo hecho el algoritmo sino porque comprenderás al problema y lograrás formular una solución.

Y creeme que te digo que la solución está en tus narices. Cuando la encuentres dirás, posiblemente algo como esto: "Pero que g... que soy. Si había sido una tontera".

¿Que diferencia a un TListBox de un TStringGrid?
Pues yo veo a un TStringGrid como una varios TListBox horizontales, uno debajo del otro.
ListBox1: [0][1][2][3][4]
ListBox2: [0][1][2][3][4]
....
ListBoxN: [0][1][2][3][4]

Puede que eso te sirva de ayuda.

Cita:

Empezado por kbaby (Mensaje 290150)
PD: Lo de apellidos compuesto ya se porque me tiro error, por el error de "dedo".
Gracias

No hay de que agradecer.
Puede que esa metida de dedo sea por impaciencia...

Hazme caso... redacta la comprensión que tienes de mis propuestas y vemos ¿Si?

No te sientas atacado. Si asi te has sentido, lo lamento, disculpa.
Lo que quiero es hacerte ver que esto es mucho más mental que lo que algunos piensan.
Y si deseas irte por las ingenierías, con más razón. Yo diría que repases por las dudas un poco de matemática, física y química. ¿Porqué crees que en los primeros años de la carrera verás más números que a la PC? ¿Sólo para hacer a las carreras más duras? ¿Porque son relleno? Cada materia tiene su propósito, no sólo forma parte de la cultura general.

kbaby, te deseo que tengas triunfos en la carrera. No cometas el mismo error que yo: no desesperes por unas cuantas LDC (lineas de código).

Saludos,

kbaby 30-05-2008 19:53:56

Antetodo... vaya pedazo de texto... tienes que escribir muy rápido jaja. Bueno vamos al grano.

Lo de que me ves impaciente es por el tiempo que tengo. Estamos en exámenes finales en España porque es final de curso. El proyecto queda una semana y me siento agobiado por el tiempo y por todo lo que me gustaría ponerle y nose.

Con respecto a que no puedo usar nada de lo que no me hayan enseñado... es hasta un punto cierto. Yo puedo llevar un algoritmo "un cacho codigo, como yo lo llamo" a clase y exponerlo pero el profesor me preguntará... y bien... ¿por qué pusiste lo de inc(indice)? Al no saber la respuesta, el profesor puede que piense este chico no ha hecho el proyecto, se lo han hecho. Y no quiero que piense eso, para nada. Yo pido ayuda, pido información y comprension. Para poderle decir que:

Código Delphi [-]
inc(indice);

es lo mismo que

Código Delphi [-]
a:= indice + 1;

pero de una manera mas "correcta" creo yo.


Una cosa que me gustaría preguntar del código que tengo para buscar es que significa la línea:

Código Delphi [-]
if Indice <> -1

Exactamente, ¿qué es eso de <> - 1? Sí tiene que comprobar que coincida... ese número qué hace ahí?.

Con respecto a lo de usar variables largas o cortas, seguiré tu consejo para mi proyecto. Lo intentaré cambiar, jaja.

Referente a lo de volcar al StrinGrid y volcar del StrinGrid al Listbox, sé cuales la diferencia, pero no se cómo. Yo me imaginaba un código que sea algo así:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var Indice: integer;
begin
  Indice:= BuscarPaciente(Edit1.Text; BUSCAR_POR_APELLIDOS);
  if Indice <> -1
    then // bueno ahora yo pienso que debería encontrar la persona que tiene el apellido ese y volcar toda su información, pero cuando termine, seguir buscando hasta el final de la lista por si hay otra persona con ese mismo apellido y así volcarla.

Yo me acuerdo de haber utilizado el comando eof(f) pero para el botón de "recuperar" de mi listbox.


Con respecto a lo de utilizar otras formas de cargar/guardar cosas en el listbox estoy con mis orejas abiertas (más bien ojos) para escuchar lo que me expliques, mientras pueda explicarlo yo, puedo usarlo.

Cita:

¿Que diferencia a un TListBox de un TStringGrid?
Pues yo veo a un TStringGrid como una varios TListBox horizontales, uno debajo del otro.
ListBox1: [0][1][2][3][4]
ListBox2: [0][1][2][3][4]
....
ListBoxN: [0][1][2][3][4]
No se me abía ocurrido, lo veía una cosa totalmente.... muy diferente xD.

Espero que esto te sirva de ayuda para ayudarme o intentar que yo piense :p

Saludos,gracias.

Delphius 30-05-2008 20:51:43

Cita:

Empezado por kbaby (Mensaje 290250)
Antetodo... vaya pedazo de texto... tienes que escribir muy rápido jaja. Bueno vamos al grano.

Algo. No mucho pero hago mi esfuerzo para escribir rápido. Lamentablemente no estoy demasiado acostumbrado a escribir sin mirar el teclado. Me cuesta un poco. Este texto lo escribí sin mirar.:) El truco está en usar la mayor candidad de dedos posibles, aunque,yo utilizo solamente entre 4 y 6 de los dedos cuanto mucho.

Cita:

Empezado por kbaby (Mensaje 290250)
Lo de que me ves impaciente es por el tiempo que tengo. Estamos en exámenes finales en España porque es final de curso. El proyecto queda una semana y me siento agobiado por el tiempo y por todo lo que me gustaría ponerle y nose.

Un motivo de impaciencia. Y si te sientes así... pues... Prepárate para la carrera. Se que no suena agradable pero es así.

Cita:

Empezado por kbaby (Mensaje 290250)
Con respecto a que no puedo usar nada de lo que no me hayan enseñado... es hasta un punto cierto. Yo puedo llevar un algoritmo "un cacho codigo, como yo lo llamo" a clase y exponerlo pero el profesor me preguntará... y bien... ¿por qué pusiste lo de inc(indice)? Al no saber la respuesta, el profesor puede que piense este chico no ha hecho el proyecto, se lo han hecho. Y no quiero que piense eso, para nada. Yo pido ayuda, pido información y comprension. Para poderle decir que:


Código Delphi [-]
inc(indice);


es lo mismo que

[delphi]a:= indice + 1;
[delphi]



pero de una manera mas "correcta" creo yo.

Entendido. Pues comiezo de nuevo.

Inc() es una función. Y lo que hace es sumar a la variable que pases como parámetro cierta cantidad. Pero inc() tiene una particularidad, el segundo parámetro que recibe (la cantidad) puede ser omitido. ¿Que significa omitido? Que si no se pasa algún valor asume uno por defecto. Este valor por defecto es 1. Inc entonces se resume a esto:

Código Delphi [-]
variable := variable + cantidad;

De modo que si pones
Código Delphi [-]
inc(variable);
Obtienes lo mismo que hacer

Código Delphi [-]
Variable := variable + 1;

O igual a:

Código Delphi [-]
inc(variable,1);

Si pones 2, en vez de sumarle 1, suma 2.

¿Se entiende? Si te fijas. En una ocasión no paso el segundo parámetro, pero en los otros si. Si deseo que el incremento sea distinto a 5, entonces debo suministrar el segundo parámetro.

Cita:

Empezado por kbaby (Mensaje 290250)
Una cosa que me gustaría preguntar del código que tengo para buscar es que significa la línea:


Código Delphi [-]
if Indice <> -1


Exactamente, ¿qué es eso de <> - 1? Sí tiene que comprobar que coincida... ese número qué hace ahí?.

Para ello deberías entender el funcionamiento o la estructura de un TListBox, y otros componentes similares.
Los métodos de busqueda, por lo general devuelven un índice o una referencia sobre la posición que tienen en la lista.
Y la mayoría de estas listas comienzan a contar desde cero.

Si lees la ayuda sobre IndexOf() y/o otros métodos de busqueda notarás que se devuelve el valor -1 en caso de no encontrarse el elemento.

Por ello una vez buscado, se hace dicha comprobación para tomar las acciones necesarias en caso haberse encontrado y/o no encontrado.

Cita:

Empezado por kbaby (Mensaje 290250)
Con respecto a lo de usar variables largas o cortas, seguiré tu consejo para mi proyecto. Lo intentaré cambiar, jaja.

A la larga te beficiará.

Cita:

Empezado por kbaby (Mensaje 290250)
Referente a lo de volcar al StrinGrid y volcar del StrinGrid al Listbox, sé cuales la diferencia, pero no se cómo. Yo me imaginaba un código que sea algo así:


[delphi]procedure TForm1.Button1Click(Sender: TObject);
var Indice: integer;
begin Indice:= BuscarPaciente(Edit1.Text; BUSCAR_POR_APELLIDOS); if Indice <> -1
then // bueno ahora yo pienso que debería encontrar la persona que tiene el apellido ese y volcar toda su información, pero cuando termine, seguir buscando hasta el final de la lista por si hay otra persona con ese mismo apellido y así volcarla.


Yo me acuerdo de haber utilizado el comando eof(f) pero para el botón de "recuperar" de mi listbox.

Bueno... volvamos desde el comienzo...

Este caso de búsqueda es un tanto peculiar. Puesto los métodos de búsqueda devuelven la primera coincidencia.

Necesitamos que se recorra la lista. Eso lo sabemos... ¿Cómo?
Tu comprendes que el orden de los datos en la lista tiende a "repetirse" cada 4 lugares.
Independientemente de cual seal el campo buscado (DNI, Nombre, Apellido, Ciudad), debemos hacer "saltos" de 4 en 4. para ir hacia la información correspondiente de una persona a otra.
Si nos basamos en ello podemos hacer un algoritmo que haga lo siguiente:

Supongamos que buscamos por apellido. El primer apellido a localizar está en la posición 2. Si icrementamos 2 en 4, nos ponemos en el apellido de la segunda persona ¿No es cierto?
¿Me sigues?

Entonces, por cada salto, comparamos si en dicha posición el contenido del listBox es igual al buscado.
Si es igual entonces sabemos que dos posiciones antes (si buscamos por apellido) encontraremos el DNI. Una posición antes, el nombre, la que le sigue corresponde a ciudad.
Por tanto, esos datos son agregados.

¿Cuando termina el algoritmo? Cuando la variable que usamos para ir saltanto por los indices es mayor a la cantidad de elementos del ListBox.

Dentro de ese texto que te he redactado. Esta el algoritmo. Ve si tu lo descubres. Sino volvemos.

Ahora, ¿cual es el probema cuando volcamos estos datos?
Que cuando lo hacemos no sabemos si al final nos referimos a los datos de la primera persona (cuyos datos ocupan los 4 primeros lugares en el TListBox), de la segunda (cuyos datos ocupan los siguientes 4), o de la vigesima...
¿Porqué? Porque en ningún momento de la búsqueda guardamos en algún lugar que esta persona es la primera, es la segunda, la que sea...

¿Cómo lo planteo yo?
Fácil:
Cuando encontramos una coincidencia en el algoritmo anteriormente descripto, lo primero que guardo (en la primera columna del StringGrid) es dicha posición o índice. Por ejemplo, si encontré una condicencia en la posición 6. Guardo en la primera columna ese 6. Los demás datos van en las siguientes columnas.

Bueno... ese el volcado.
Ahora, el paso inverso.

Lo primero que hago, es leer la primera columna. Encuentro el 6.
Entonces, si el criterio de búsqueda fue por apellido, se que los demás datos de esta fila corresponden a los datos que se ubican en las posiciones 4, 5, 6 y 7.
¿De donde obtuve esos números? Fácil:
Si el 6 el dato correspondiente al apellido, entonces se que el DNI está dos lugares antes ( 6 - 2). El nombre está un lugar antes: ( 6 - 1), El apellido entonces está en 6. Y la ciudad en la siguiente posición ( 6 + 1).

Solo me queda hacer:

ListBox1.Items[4] := StringGrid1.Cells[2,1].
...
ListBox1.Items[7] := StringGrid1.Cells[5,1].

¿Porqué desde 2? Recuerda que en la primera, estabamos guardando indice del apellido asociado a dicha persona.

¿Que hago ahora?
Me desplazo a la segunda fila y repito el proceso:
Leo lo que que hay en la primera columna, y veo.... digamos que es 14. Si hacemos cuenta... se que esta es la tercera persona de la lista. Cuyo datos abarcan la posiciones 12, 13, 14 y 15.

Por tanto... me queda que:
ListBox1.Items[12] := StringGrid1.Cells[2,2];
...
ListBox1.Items[15] := StringGrid1.Cells[5,2];

Nota la diferencia... si bien en el StringGrid, estamos en la segunda fila... sabemos que en el ListBox esta es la tercera persona.

¿Cuando finaliza el algoritmo?
Cuando se ha lkegado al final del StringGrid.

Entonces, de esta manera, consigues sólo traspasar los datos de aquellas personas que estén en el StringGrid hacia el ListBox.
En realidad no interesa si sólo modificó una vocal, todos los campos... si antes decia Pepe, y no se modificó se sobrescribe con Pepe. Y si ahora dice Ana, va a decir Ana.

¿Cúal es el requisito fundalmental de todo esto?
Que no se llame al método Clear del TListBox. Porque eso borra todo, y por tanto se pierden referencia a los datos. Allí tienes una falla.

Tu algoritmo de guardar debe recorrer los elementos del ListBox e ir guardandolos. Creo que eso no te resultará un problema.

No lo llames a menos que se trate de abrir otros datos. Y si lo haces debes asegurarte de "limpiar" lo que tengas en el STringGrid porque se tratan de datos nuevos.

Cita:

Empezado por kbaby (Mensaje 290250)
Con respecto a lo de utilizar otras formas de cargar/guardar cosas en el listbox estoy con mis orejas abiertas (más bien ojos) para escuchar lo que me expliques, mientras pueda explicarlo yo, puedo usarlo.


No se me abía ocurrido, lo veía una cosa totalmente.... muy diferente xD.

Espero que esto te sirva de ayuda para ayudarme o intentar que yo piense :p

Saludos,gracias.

Bueno... eso eso lo puedes ver para más adelante.

Eso es todo por el momento.


Saludos,

kbaby 30-05-2008 22:20:47

Vale Delphius aquí estuve pensando pero creo que con tus palabras ya me das todo "machacado" aunque yo sea duro y no me entere. He hecho un nuevo código para que busque el DNI de la persona y lo pase a la tabla. Sólo busca a una persona, a la primera, pero no importa, lo que quiero hacer es que funcione el código hecho por mi. Aquí te lo pongo y me dices si tienes erratas, porque se me ejecuta el programa, pincho en el boton y ... "no hace nada :D".

---> CORRECCIÓN: Ya si me funciona y me busca a la persona !!! Bien !!! el fallo estaba en el signo > del while que antes puse < jaja.

Código Delphi [-]
procedure TForm1.Button12Click(Sender: TObject);
var salto:integer ;
begin
  salto:=0;
  while l.items.count > salto do
     If edit7.text = l.Items[salto] then begin
          t.cells[salto+1,1]:=l.Items[salto];
          t.cells[salto+2,1]:=l.items[salto+1];
          t.cells[salto+3,1]:=l.items[salto+2];
          t.cells[salto+4,1]:=l.items[salto+3];
          inc(salto,4);
          end;



end;
end.

Ya tengo un boton de BUSCAR creado por mi jojojo :D gracias tio.

Delphius 30-05-2008 22:45:40

Kbaby, vas entiendo.... el error está en que salto debe recibir inialmente el valor igual a la posición - 1 del campo a buscar. Es decir que:
Si estamos buscando Apellido, Salto debe valer incialmente 2.
Si estamos buscando Nombre, Salto debe valor inicialmente 1.
Si estamos buscando DNI, Salto debe valer inicialmente 0.
Si estamos buscando Ciudad, Salto debe valor inicialmente 3.

Recuerda que StrinGrid comienza en cero por ello:
[0] -> DNI
[1] -> Nombre
...
[3] -> Ciudad

el inc(salto,4) debe hacerse fuera del IF. Ten presente que por más que encuentre, o no... debe seguir recorriendo la lista.

Otro problema, estás sobreescribiendo la primera fila. Necesitas de otra variable, que se incremente en 1 sólo cuando haya una coincidencia, de modo que con Cells[salto +- ?,otra_variable] se consiga ir iterando fila a fila en cada condidencia.

Creo que con esto ya lo tienes.
Ya te lo di bastante regalado.

EDITO:
Otra cosa que veo, es que como dije antes, además de esos campos necesigas guardar el valor de salto para tener referencia e implementar el algoritmo de volcado inverso (desde el STringGrid hacia el TListBox).

Saludos,


La franja horaria es GMT +2. Ahora son las 18:13:14.

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