PDA

Ver la Versión Completa : Pasar datos de una tabla a un memo


Cosgaya
05-06-2005, 02:24:37
bueno, ahi va otra vez mi pregunta, mejor explicada
yo tengo una tabla de productos con su descripcion (paradox), y quiero, que al apretar a un boton, el campo descripcion de todos los producotos, se pase a varios memo, edit o lo que se necesite, y que cuando se llene el memo (max.200 caracteres por memo) pase al siguiente.

nota: es imprescindible varios memos

si alguien me la prodia resolver gracias
disculpen por no haber sabido expresarme en mi anterior pregunta

roman
05-06-2005, 04:38:29
¿Y cuál es el problema?

Recorres la tabla con un ciclo. En cada iteración tomas el nombre del producto con FieldByName y lo agregas al Memo en turno. Cuando éste se agote (Memo.Lines.Count te lo indicará) comienzas con el siguiente.

// Saludos

Cosgaya
06-06-2005, 11:37:44
hola roman gracias por lo del otro dia (pasar la informacion de una tabla a un memo y cuando acabe con el primer memo seguir con el otro, cuando cada memo tenia un max. 200 caracteres), pero no consigo hacer para que cuando acaba con el primer memo siga con el siguiente no se como insertarlo
si pudieras ayudarme
muchas gracias
:rolleyes: :rolleyes: :rolleyes:
procedure TForm3.Button1Click(Sender: TObject);

begin
with form2.table1 do
begin
First;
Repeat
memo1.lines.add (FieldByName('Anuncio').AsString + ('-------'));
Next
Until (FieldByName('Anuncio').AsString = ' ')
or EOF
end;

Neftali [Germán.Estévez]
06-06-2005, 13:40:28
Antes de nada, por favor, no abras hilos nuevos, para continuar con un tema ya expuexto y abierto.
(1) Usuarios que lo lean no sabrán de qué hablas (y deberán buscar el post anterior).
(2) Alguien que posteriormente busque lo mismo que tú has expuesto no encontrará una solución satisfactoria en el post (ya que está repartida en varios de ellos...)

Para saber la longitud del memo puedes utilizar Memo.Lines.Text, eso te devuelve el texto del memo en una cadena. A eso le puedes aplicar la función Lenght, para calcular la longitud.

Para utilizar varios memos, numéralos (por ejemplo) como memo1, memo2, memo3,... Dentro del bucle utiliza un contador (i, por ejemplo) para "saber" con qué memo estás trabajando. Con FindComponent('Memo'+IntToStr(i)) puedes selecconar el que necesitas en cada momento.

Cosgaya
06-06-2005, 14:40:38
gracias por la respuesta y disculpa
otra cosa no se como meter el findcomponent en mi codigo

Neftali [Germán.Estévez]
06-06-2005, 15:47:05
form1.FindComponet(Nombre);


Te buscará un componente con ese Nombre dentro del form1.

Cosgaya
06-06-2005, 20:06:59
neftali sigo sin averiguar en que parte o de que forma debo introducier el findcomponent para cuando se acabe el un memo (max.200 caracteres) empiece con el otro. el codigo en que lo tengo que metere esta un poco mas arriba.
gracias

Neftali [Germán.Estévez]
07-06-2005, 10:53:33
Échale un vistazo a éste código:


procedure TForm1.BitBtn1Click(Sender: TObject);
const
LOG_MAX_MEMO = 200;
var
i:Integer; // nos servirá para ver qué memo utilizamos
mm:TMemo;
comp:TComponent;
begin

// Inicializar la i
i := 1;
// Abrir la tabla
Self.table1.Open;
// Acceder al primer memo
mm := TMemo(Self.FindComponent('memo' + IntToStr(i)));

with Self.table1 do begin
First;
repeat
mm.lines.add(FieldByName('Codigo').AsString + ('-------'));
Next;

// Comprobar si ha llegado a la longitud máxima
if (Length(mm.Lines.Text) > LOG_MAX_MEMO) then begin
i := i + 1;
// Accder al siguiente
comp := Self.FindComponent('memo' + IntToStr(i));
// existe?
if Assigned(comp) then begin
mm := TMemo(comp);
end
else begin
MessageDlg('Se han acabado los memos...', mtError, [mbOK], 0);
Self.Table1.Last;
end;
end;

until (FieldByName('Codigo').AsString = '') or EOF
end;
end;


Éstá generado a partir del tuyo...

Cosgaya
07-06-2005, 21:47:55
hola neftali: gracias por el codigo
pero no funciona bien, porque la condicion no la cumple haste que le vuelve a apretar al boton. no tengo muxa idea pero cre que puede ser... porque pasa los datos de la base de datos al memo antes de que termine de contar los caracteres osea, que es mas rapido el que pase los datos al memo que el contar los caracteres por eso no devuelve el valor a tiempo...
soy nuevo en delphi... esta es la conclusion a la que he llegado no se si sera una barbaridad lo que acabo de decir, si es asi... perdonen:p :p :p

Neftali [Germán.Estévez]
08-06-2005, 09:39:38
A mi me funciona perfectamente. ¿Puedes explicar un poco mejor el error , no acabo de enterderlo?

Cosgaya
08-06-2005, 21:01:28
que cuando doy al boton con el cogigo ese en vez de pasar la informacion al segundo memo cuando en el primero ya hay mas de 200 caracteres, lo escribe todo en el primero, y es en la segunda vez que pulsas el boton cuando cumple la condicion de los caracteres y pasa los datos al segundo memo....

Neftali [Germán.Estévez]
09-06-2005, 09:26:02
¿Seguro que ya tienes los 200 caracteres?
¿Tienes los memos bien numerados?

Sigo sin entenderlo muy bien, pero prueba pasando éstas líneas después del if (justo antes del Until):


mm.lines.add(FieldByName('Codigo').AsString + ('-------'));
Next;

maxzama
28-03-2012, 20:46:14
saliendo del tema DE USTEDES(NECESITO AYUDA ): ESTOY HACIENDO UN PROGRAMA QUE HACE ESTO:

__ALMACENO DEL EDIT ALMEMO

__TAMBIEN LO GUARDO A LA BASE DE DATO

___Y ELIMINA

PERO LO QUE NECESITO ES Q QUIERO PASAR LA INFORMACION DEL MEMO AL EDIT NUEVAMENTE.DANDOLE CLICK CON EL RATON.

PORFAVOR LO NECESITO ME QUEDA POCO TIEMPO PARA ENTREGARLO Y HECHO DE TODO.
ESTE ES MI CORREO:enonano_1@hotmail.com

ecfisa
28-03-2012, 21:47:01
Hola maxzama y bienvenido a Club Delphi :)

Por favor, lee nuestra [guía de estilo] (http://www.clubdelphi.com/foros/guiaestilo.php), en especial los puntos [1] (http://www.clubdelphi.com/foros/guiaestilo.php#urgente), [2] (http://www.clubdelphi.com/foros/guiaestilo.php#grites) y [9] (http://www.clubdelphi.com/foros/guiaestilo.php#describe)

Saludos y gracias por tu colaboración.

maxzama
29-03-2012, 22:13:59
bueno disculpa si me exprese mal o mi forma de mi vocabulario.mejorare en eso.
____________________________________________________

1)Necesito ayuda. mi problema es q tengo que hacer es pasar de un leguaje culaquiera a delphi(como si fuera un traductor).
este programa tengo q hacerlo en delphi.

2)y el otro programa es: de almacernar un codigo,nombre,precio a un Memo y si uno quiere editar la informacion entonces q uno le de click con el raton a una de las linias almacenada en el memo y buelva otrabes
la informacion a los edit.

Ya yo pude almacenar informacion al memo pero no pude hacer lo contrario(del memo a los Edit).

utilizando estas herramientas:
3 Edit
1 memo.

si pueden ayudarme se lo agradeceria.
(si no igualmente gracias por leer esta informacion)

ecfisa
29-03-2012, 22:31:50
Hola maxzama.

Este código enviará la línea actual al Edit correspondiente:

procedure TForm1.Memo1Click(Sender: TObject);
var
Linea: Integer;
begin
Linea:= Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart, 0);
case Linea of
0: Edit1.Text:= Memo1.Lines[Linea]; // codigo
1: Edit2.Text:= Memo1.Lines[Linea]; // nombre
2: Edit3.Text:= Memo1.Lines[Linea]; // precio
end;
end;

Y si queres pasar la tres líneas de una sola vez:

procedure TForm1.btnPasarLas3Click(Sender: TObject);
begin
Edit1.Text:= Memo1.Lines[0]; // codigo
Edit2.Text:= Memo1.Lines[1]; // nombre
Edit3.Text:= Memo1.Lines[2]; // precio
end;


Saludos.

maxzama
29-03-2012, 23:20:29
Bueno me esplicado mal el codigo que me mandaste ya lo tengo.

lo que quiero es pasar lo q:

es del codigo lo pase al edit de codigo

lo q

es del nombre lo pase al edit de nombre


[al darle click al memo.]
______________________________

Gracias por responderme.

ecfisa
29-03-2012, 23:39:03
Bueno me esplicado mal el codigo que me mandaste ya lo tengo.

lo que quiero es pasar lo q:

es del codigo lo pase al edit de codigo

lo q

es del nombre lo pase al edit de nombre


[al darle click al memo.]
______________________________

Gracias por responderme.
Hola.

Eso es lo que hace precisamente el primer código de los dos que te puse: Al hacer click sobre el Memo, obtiene la línea que está actualmente seleccionada y de acuerdo a la posición obtenida la pasa al Edit correspondiente...

Saludos.

maxzama
30-03-2012, 00:09:16
el codigo que me pasaste ase que al darle click a la linia 1 del memo pasa toda esa informacion completa al edit1.Y asi con los otros edit al presionar las otras lineas del memo.
__________________________________________________________________
lo que quiero es esto:

cuando almaceno el codigo(001) y el nombre(er) y el precio (2000), al memo.

estos mismo valores que introduje lo muestre en los edit de nuevo al darle click a la linia del memo.
_____________
es decir:
al darle click a la linia del memo

q el (001) regrese al edit que dice codigo

q el (er) regrese al edit que dice nombre

q el (2000)regrese al edit q dice precio

Espero tu respuesta Gracias de nuevo.

ecfisa
30-03-2012, 00:52:03
A ver... el problema es que no has explicado algo muy importante: Como están ubicados los datos en el memo.

Encolumnados, de esta forma:

codigo
nombre
precio

caso en que funciona el código de mi mensaje anterior, o tabulados de esta otra:

codigo nombre precio

para lo cuál tendrías que hacer:

procedure TForm1.Memo1Click(Sender: TObject);
var
TS: TStrings;
begin
TS:= TStringList.Create;
try
TS.DelimitedText:= Memo1.Lines[Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart, 0)];
TS.Delimiter:= ' '; // separador de datos
Edit1.Text:= TS[0];
Edit2.Text:= TS[1];
Edit3.Text:= TS[2];
finally
TS.Free;
end;
end;


Saludos.

maxzama
30-03-2012, 01:04:31
gracias por ayudarme. es lo que necesitaba.

pero nesecito un ultimo favor:
que me expliques el codigo. (no quiero solo copy y pegar)sino tambien entenderlo por no vale la pena copiarlo y no hecho por uno y no saver que se iso en el codigo.Gracias por la ayuda.

maxzama
30-03-2012, 01:05:52
Si sabes de alguien que necesite ayuda Y este a mi alcanse. Con gusto lo ayudare.

ecfisa
30-03-2012, 02:03:21
Hola maxzama.

TStringList es, en base una lista de strings. Previo a su uso hay que crear una instancia de la clase, cosa que se hace en la línea:

TS:= TStringList.Create;

Luego de usarla hay que liberar la memoria que se ocupó, de eso se encarga la línea:

TS.Free;


Entre las propiedades de TStringList figuran:

DelimitedText, que representará todas las cadenas de la propiedad delimitadas por un separador
Delimiter es el delimitador por el cuál se separarán las cadenas de la propiedad DelimitedText.

Por ejemplo

TS.DelimitedText:= 'SEPARAR EN CADENAS ESTA FRASE';
TS.Delimiter:= ' ';

hará que en TS queden:

TS[0] = 'SEPARAR'
TS[1] = 'EN'
TS[2] = 'CADENAS'
TS[3] = 'ESTA'
TS[4] = 'FRASE'

Si no he sido claro con mi explicación, no dudes en consultar nuevamente.


Si sabes de alguien que necesite ayuda Y este a mi alcanse. Con gusto lo ayudare.

Con tu consulta ya has ayudado a muchos otros que puedan tener una duda similar.;)

Saludos. :)

maxzama
03-04-2012, 17:59:16
hola de nuevo. Nesecito que me ayudes con el mismo programa.lo que tengo que hacer cuando pase informacion del (Edit al memo) introdusca lo siguiente:

que el edit1(Codigo)trabaje con 5 caracteres

que el edit2(Nombre)trabaje con 10 caracteres

que el edit(Precio)trabaje con 5 cracteres

Si ninguno cumple con los caracteres correspondiente que agrege o introdusca (0).ejemplo:

Edit1(Codigo) introdusco:01 al pasarlo al Memo:y este lo agrega automaticamente el programa por no tener los 5 caracteres->(000)

este es el codigo que introdujo->(01).
_____________________________________________
No he encontrado como hacer este codigo lo e intentado y todo me sale (Error).

ecfisa
03-04-2012, 18:38:34
Hola maxama.

Primero ajustamos la cantidad máxima de caracteres permitidos para cada TEdit:

procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.MaxLength:= 5;
Edit2.MaxLength:= 10;
Edit3.MaxLength:= 5;
end;


Seguidamente asociá el siguiente código a los eventos OnExit de los tres TEdit:

procedure TForm1.EditExit(Sender: TObject);
begin
with (Sender as TEdit) do
if (Name = 'Edit1') or (Name = 'Edit3') then
Text:= StringOfChar('0',5-Length(Text)) + Text // agregar ceros delante
else
Text:= Text + StringOfChar(' ',10-Length(Text)) // agregar espacios detrás
end;


Saludos.