[Lazarus-es] Refresh no funciona
francisco prieto
fajprieto en gmail.com
Jue Ago 6 19:06:45 CEST 2015
ok, esa es otra solucion valida entonces.
recibo el paquete.
cierro el puerto.
analizo el paquete.
actualizo la pantalla
abro el puerto.
Me gusta, gracias.
Pruebo y te cuento.
Pancho
Córdoba
Argentina
El 6 de agosto de 2015, 14:02, Maxi <maximiliano.duarte en gmail.com> escribió:
> Como te dije en principio, es un tema de tiempos.
> Para eso existe el handshak cuando el receptor no está disponible
> avisa para que no mande mas datos. Pero en estos bichos generalmente
> tira datos sin esperar acuse.
> Para eso deberias descartar cualquier paquete hasta que no hayas
> procesado todo. Podes hacer flush mientras procesas.
> No le encuentro en las funciones como ignorar sin cerrar el puerto
>
> El 6 de agosto de 2015, 9:54, francisco prieto <fajprieto en gmail.com>
> escribió:
> >
> > Creo que estoy mas cerca, aunque ahora da otro error...
> >
> > Les cuento los cambios que hice...
> >
> > 1) Agregue la propiedad publica lcLectura a la clase TMiHilo
> >
> > TMiHilo = class(TThread)
> > private
> > fStatusText: string;
> > procedure MostrarPeso;
> > protected
> > procedure Execute; override;
> > public
> > lcLectura:string;
> > constructor Create(CreaSuspendido: boolean);
> > end;
> >
> > 2) Modifique el contenido de UpdPeso, ahora solo crea el hilo y le pasa
> la lectura recibida de la balanza... esa que como les comente en la otra
> pantalla la muestro en una lista.
> >
> > procedure TfrmPesaje.UpdPeso(cLectura:String);
> > var
> > MiHilo : TMiHilo;
> > begin
> > //creamos el hilo, pero no lo iniciamos
> > MiHilo := TMiHilo.Create(True); // Con el parametro true no se
> inicia automaticamente
> > if Assigned(MiHilo.FatalException) then
> > raise MiHilo.FatalException;
> > //si no hay ninguna excepción lo iniciamos
> > MiHilo.lcLectura:=cLectura;
> > MiHilo.Start;
> > end;
> >
> > 3) Modifique el contenido de MostrarPeso en MiHilo, para que contenga
> todo el analisis de la trama y lo muestre por pantalla.
> >
> > procedure TMiHilo.MostrarPeso;
> > var
> > lcTramas:TStringList;
> >
> lnNeto,lnNegativo,lnFueraRango,lnFueraEqui,lnTeclaAd,lnCantTramas:integer;
> > lcEstadoA,lcEstadoB,lcEstadoC,lcPeso,lcTara,lcDecimales:string;
> > lnPesoTara,lnPesoTot:real;
> > lnPesoComa:integer;
> > begin
> > lcEstadoA:='';
> > lcEstadoB:='';
> > lcEstadoC:='';
> > lcPeso:='';
> > lcTara:='';
> > lcTramas:= TStringList.Create;
> > Split('|', lcLectura, lcTramas);
> >
> > lnCantTramas:=lcTramas.count;
> > if lnCantTramas=5 then
> > begin
> > lcEstadoA:=lcTramas.Strings[1];
> > lcEstadoB:=lcTramas.Strings[2];
> > lcEstadoC:=lcTramas.Strings[3];
> > lcPeso:=copy(lcTramas.Strings[4],1,6);
> > lcTara:=copy(lcTramas.Strings[4],7,6);
> > {Analisis Estado A}
> > lcEstadoA:=HextoBin(lcEstadoA);
> > lcDecimales:=copy(lcEstadoA,6,3);
> > case lcDecimales of
> > '010':lnPesoComa:=0;
> > '011':lnPesoComa:=1;
> > '100':lnPesoComa:=2;
> > '101':lnPesoComa:=3;
> > '110':lnPesoComa:=4;
> > else
> > lnPesoComa:=0;
> > end;
> > {Analisis Estado B}
> > lcEstadoB:=HextoBin(lcEstadoB);
> > lnNeto:=StrToInt(copy(lcEstadoB,8,1));
> > lnNegativo:=StrToInt(copy(lcEstadoB,7,1));
> > lnFueraRango:=StrToInt(copy(lcEstadoB,6,1));
> > lnFueraEqui:=StrToInt(copy(lcEstadoB,5,1));
> > {Analisis Estado C}
> > lcEstadoC:=HextoBin(lcEstadoC);
> > lnTeclaAd:=StrToInt(copy(lcEstadoB,5,1));
> > {Calculos Finales}
> > lnPesoTara:=StrToInt(lcTara)/(Exp(LN(10)*lnPesoComa));
> > lnPesoTot:=StrToInt(lcPeso)/(Exp(LN(10)*lnPesoComa));
> > if lnNegativo=1 then
> > lnPesoTot:=lnPesoTot*(-1);
> > frmPesaje.txtPesoAct.Text:=FloatToStr(lnPesoTot);
> > frmPesaje.txtPesoAct.Refresh;
> > end;
> > end;
> >
> > Todo eso compila fantastico pero al ejecutar da el siguiente error:
> >
> > Thread creation error: Espacio de almacenamiento insuficiente para
> procesar este comando
> >
> > constructor TMiHilo.Create(CreaSuspendido: boolean);
> > begin
> > FreeOnTerminate := True;
> > inherited Create(CreaSuspendido); <== aca da el error
> > end;
> >
> > Espero sus comentario, y de paso invenstigo.
> >
> > Saludos,
> >
> > Pancho
> > Córdoba
> > Argentina
> >
> > El 6 de agosto de 2015, 8:02, francisco prieto <fajprieto en gmail.com>
> escribió:
> >>
> >> Maxi, eso seguramente funciona, pero eso no me sirve porque la cadena
> que envía la balanza hay que analizarla, pues no solo trae el peso, trae
> otros estados que me son de utilidad.
> >>
> >> Ademas subi el procedimiento que funciona
> TfrmCheck.olePuertoRxData(Sender: TObject); y el que no....
> >>
> >> y la diferencia entre ambos es justamente esa..., es decir en el caso
> que funciona, lectura a lectura lo voy tirando en una lista en pantalla y
> al refresco le da el cuero y eso que mi maquina es un avión con acoplado...
> >>
> >> en cambio, si analizo la cadena, son tantas las lecturas que entran por
> olePuertoRxData que no logra refrescar.
> >>
> >> En VFP existe algo denominado AutoYield para estos casos que va
> procesando en la medida que puede cada una de las peticiones y también
> existe el DoEvents, aquí veo que existe algo parecido denominado
> application.ProcessMessages pero tampoco funciona...
> >>
> >> Lo que creo que solucionaría el problema es...
> >>
> >> recibir la data de olePuertoRxData en un hilo por separado cada vez...
> >> procesar el hilo
> >> y cada proceso que actualice la pantalla...
> >>
> >> Eso es lo que voy a intentar el dia de hoy...
> >>
> >> Los mantengo al tanto, pues esto se esta transformando en un error muy
> interesante de estudiar.
> >>
> >> Saludos,
> >>
> >> Pancho
> >> Córdoba
> >> Argentina
> >>
> >>
> >>
> >> El 5 de agosto de 2015, 20:54, Martin Gomez <mmgomez en gmail.com>
> escribió:
> >>>
> >>> Con el Sincronize(UpdPeso) tampoco? Eso debería aislarte del
> multithreading interno de LazSerial (si es que tiene)
> >>>
> >>> 2015-08-05 13:54 GMT-03:00 francisco prieto <fajprieto en gmail.com>:
> >>>>
> >>>> En primer lugar gracias a todos por responder...
> >>>>
> >>>> En segundo lugar el proceso monitorea con LazSerial el peso en una
> balanza que escupe muy rapido cada lectura.
> >>>>
> >>>> En tercer lugar como dije hice el proceso de comunicacion utilizando
> el evento OnRxData y si envio la data que recibo a un ListBox funciona sin
> inconvenientes...
> >>>>
> >>>> El siguiente es el codigo que funciona contra el ListBox.
> >>>>
> >>>> procedure TfrmCheck.olePuertoRxData(Sender: TObject);
> >>>> var
> >>>> lcLecturaReal,lcLetra:string;
> >>>> i:integer;
> >>>> begin
> >>>> lcLecturaReal:= olePuerto.ReadData;
> >>>> for i := 1 to Length(lcLecturaReal) do
> >>>> begin
> >>>> lcLetra:=InttoHex(Ord(lcLecturaReal[i]),2);
> >>>> lcLecturaHex := lcLecturaHex + lcLetra+ ' ';
> >>>> case lcLetra of
> >>>> '30'..'39':
> >>>> begin
> >>>> lcLetra:=RightStr(lcLetra,1);
> >>>> lcLecturaTotal := lcLecturaTotal + lcLetra;
> >>>> end;
> >>>> '0D':
> >>>> begin
> >>>> lcLecturaTotal := lcLecturaTotal + 'CR';
> >>>> if (cboBalanza.KeyValue=1) then
> >>>> begin
> >>>> lcLecturaTotal := lcLecturaTotal +'LF';
> >>>> if chkAuditaCom.Checked=True then
> >>>> UpdLog(lcLecturaTotal);
> >>>> lstTrama.Items.Add(lcLecturaTotal);
> >>>> lcLecturaTotal:='';
> >>>> end;
> >>>> end;
> >>>> '0A':
> >>>> begin
> >>>> lcLecturaTotal := lcLecturaTotal +'LF';
> >>>> if chkAuditaCom.Checked=True then
> >>>> UpdLog(lcLecturaTotal);
> >>>> lstTrama.Items.Add(lcLecturaTotal);
> >>>> lcLecturaTotal:='';
> >>>> end;
> >>>> else
> >>>> begin
> >>>> if (lcLetra='02') and (Length(lcLecturaTotal)>0)
> then
> >>>> begin
> >>>> if chkAuditaCom.Checked=True then
> >>>> UpdLog(lcLecturaTotal);
> >>>> lstTrama.Items.Add(lcLecturaTotal);
> >>>> lcLecturaTotal:='';
> >>>> end;
> >>>> if (lcLetra='02') then
> >>>> lcLetra:='STX'
> >>>> else
> >>>> lcLetra:='|'+lcLetra+'|';
> >>>> lcLecturaTotal := lcLecturaTotal + lcLetra;
> >>>> end;
> >>>> end;
> >>>> end;
> >>>> if chkAuditaCom.Checked=True then
> >>>> UpdLog(lcLecturaHex);
> >>>> edtRecepcion.Lines.Add(lcLecturaHex);
> >>>> end;
> >>>>
> >>>> Es mas si revisan hay un listbox y un memo recibiendo la info al
> mismo tiempo... pero claro la info en esta instancia no se analiza porque
> es un simple programa de comunicacion para comprobar que la comunicacion
> funciona...
> >>>>
> >>>> Ahora bien ese mismo metodo lo repeti en la pantalla que debe
> analizar la trama y cambia a esto otro
> >>>>
> >>>> procedure TfrmPesaje.olePuertoRxData(Sender: TObject);
> >>>> var
> >>>> lcLecturaReal,lcLecturaHex,lcLecturaTotal,lcLetra:string;
> >>>> i:integer;
> >>>> begin
> >>>> lcLecturaHex:='';
> >>>> lcLecturaTotal:='';
> >>>> lcLecturaReal:= olePuerto.ReadData;
> >>>> for i := 1 to Length(lcLecturaReal) do
> >>>> begin
> >>>> lcLetra:=InttoHex(Ord(lcLecturaReal[i]),2);
> >>>> lcLecturaHex := lcLecturaHex + lcLetra+ ' ';
> >>>> case lcLetra of
> >>>> '30'..'39':
> >>>> begin
> >>>> lcLetra:=RightStr(lcLetra,1);
> >>>> lcLecturaTotal := lcLecturaTotal + lcLetra;
> >>>> end;
> >>>> '0D':
> >>>> begin
> >>>> lcLecturaTotal := lcLecturaTotal + 'CR';
> >>>> if (cboBalanza.KeyValue=1) then
> >>>> begin
> >>>> lcLecturaTotal := lcLecturaTotal +'LF';
> >>>> if llAuditaCom=True then
> >>>> UpdLog(lcLecturaTotal);
> >>>> UpdPeso(lcLecturaTotal);
> >>>> lcLecturaTotal:='';
> >>>> end;
> >>>> end;
> >>>> '0A':
> >>>> begin
> >>>> lcLecturaTotal := lcLecturaTotal +'LF';
> >>>> if llAuditaCom=True then
> >>>> UpdLog(lcLecturaTotal);
> >>>> UpdPeso(lcLecturaTotal);
> >>>> lcLecturaTotal:='';
> >>>> end;
> >>>> else
> >>>> begin
> >>>> if (lcLetra='02') and (Length(lcLecturaTotal)>0)
> then
> >>>> begin
> >>>> if llAuditaCom=True then
> >>>> UpdLog(lcLecturaTotal);
> >>>> UpdPeso(lcLecturaTotal);
> >>>> lcLecturaTotal:='';
> >>>> end;
> >>>> if (lcLetra='02') then
> >>>> lcLetra:='STX'
> >>>> else
> >>>> lcLetra:='|'+lcLetra+'|';
> >>>> lcLecturaTotal := lcLecturaTotal + lcLetra;
> >>>> end;
> >>>> end;
> >>>> end;
> >>>> if llAuditaCom=True then
> >>>> UpdLog(lcLecturaHex);
> >>>> end;
> >>>>
> >>>> Si revisan el cambio es minimo ya que en vez de agregar la lectura al
> ListBox o al Memo, envio la lectura como argumento al UpdPeso
> >>>>
> >>>> Y UpdPeso funciona sin inconveniente, cuyo codigo es el siguiente:
> >>>>
> >>>>
> >>>> procedure TfrmPesaje.UpdPeso(cLectura:String);
> >>>> var
> >>>> lcTramas:TStringList;
> >>>>
> lnIndice,lnNeto,lnNegativo,lnFueraRango,lnFueraEqui,lnTeclaAd,lnCantTramas:integer;
> >>>>
> lcEstadoA,lcEstadoB,lcEstadoC,lcPeso,lcTara,lcDecimales,lcLectura:string;
> >>>> begin
> >>>> lcEstadoA:='';
> >>>> lcEstadoB:='';
> >>>> lcEstadoC:='';
> >>>> lcPeso:='';
> >>>> lcTara:='';
> >>>> lcTramas:= TStringList.Create;
> >>>> Split('|', cLectura, lcTramas);
> >>>> lnCantTramas:=lcTramas.count;
> >>>> if lnCantTramas=5 then
> >>>> begin
> >>>> lcEstadoA:=lcTramas.Strings[1];
> >>>> lcEstadoB:=lcTramas.Strings[2];
> >>>> lcEstadoC:=lcTramas.Strings[3];
> >>>> lcPeso:=copy(lcTramas.Strings[4],1,6);
> >>>> lcTara:=copy(lcTramas.Strings[4],7,6);
> >>>> {Analisis Estado A}
> >>>> lcEstadoA:=HextoBin(lcEstadoA);
> >>>> lcDecimales:=copy(lcEstadoA,6,3);
> >>>> case lcDecimales of
> >>>> '010':lnPesoComa:=0;
> >>>> '011':lnPesoComa:=1;
> >>>> '100':lnPesoComa:=2;
> >>>> '101':lnPesoComa:=3;
> >>>> '110':lnPesoComa:=4;
> >>>> else
> >>>> lnPesoComa:=0;
> >>>> end;
> >>>> {Analisis Estado B}
> >>>> lcEstadoB:=HextoBin(lcEstadoB);
> >>>> lnNeto:=StrToInt(copy(lcEstadoB,8,1));
> >>>> lnNegativo:=StrToInt(copy(lcEstadoB,7,1));
> >>>> lnFueraRango:=StrToInt(copy(lcEstadoB,6,1));
> >>>> lnFueraEqui:=StrToInt(copy(lcEstadoB,5,1));
> >>>> {Analisis Estado C}
> >>>> lcEstadoC:=HextoBin(lcEstadoC);
> >>>> lnTeclaAd:=StrToInt(copy(lcEstadoB,5,1));
> >>>> {Calculos Finales}
> >>>> lnPesoTara:=StrToInt(lcTara)/(Exp(LN(10)*lnPesoComa));
> >>>> lnPesoTot:=StrToInt(lcPeso)/(Exp(LN(10)*lnPesoComa));
> >>>> if lnNegativo=1 then
> >>>> lnPesoTot:=lnPesoTot*(-1);
> >>>> end;
> >>>> end;
> >>>>
> >>>> El valor que quiero mostrar se almacena en la propiedad del
> formulario lnPesoTot,
> >>>>
> >>>> Entiendo que con este link
> http://wiki.freepascal.org/Multithreaded_Application_Tutorial/es
> >>>> debería implementar un hilo con el procedimiento UpdPeso, o quizas
> un hilo que sea llamado desde el procedimiento UpdPeso.
> >>>>
> >>>> Hasta ahora por mas que lo estudio no logro entender como se hace
> eso, porque entiendo que mi caso es este...
> >>>>
> >>>> Type
> >>>> TForm1 = class(TForm)
> >>>> Button1: TButton;
> >>>> Label1: TLabel;
> >>>> procedure FormCreate(Sender: TObject);
> >>>> procedure FormDestroy(Sender: TObject);
> >>>> private
> >>>> { private declarations }
> >>>> MyThread: TMyThread;
> >>>> procedure ShowStatus(Status: string);
> >>>> public
> >>>> { public declarations }
> >>>> end;
> >>>>
> >>>> procedure TForm1.FormCreate(Sender: TObject);
> >>>> begin
> >>>> inherited;
> >>>> MyThread := TMyThread.Create(true);
> >>>> MyThread.OnShowStatus := @ShowStatus;
> >>>> end;
> >>>>
> >>>> procedure TForm1.FormDestroy(Sender: TObject);
> >>>> begin
> >>>> MyThread.Terminate;
> >>>> MyThread.Free;
> >>>> inherited;
> >>>> end;
> >>>>
> >>>> procedure TForm1.Button1Click(Sender: TObject);
> >>>> begin
> >>>> MyThread.Resume;
> >>>> end;
> >>>>
> >>>> procedure TForm1.ShowStatus(Status: string);
> >>>> begin
> >>>> Label1.Caption := Status;
> >>>> end;
> >>>>
> >>>> Pero no se si Deberia reemplazar ShowStatus por UpdPeso y
> MyThread.Resume colocarlo en el lugar en que coloco UpdPeso...
> >>>>
> >>>> Voy a probar asi, ya que ningun otro consejo me dio resultado.
> >>>>
> >>>> Saludos y los mantengo al tanto.
> >>>>
> >>>> Pancho
> >>>>
> >>>> Córdoba
> >>>>
> >>>> Argentina
> >>>>
> >>>>
> >>>>
> >>>> El 5 de agosto de 2015, 13:04, Daniel Sánchez <
> resetsoftware en gmail.com> escribió:
> >>>>>
> >>>>> Lo que comentas es al parecer que cuando pierde el foco el
> formulario en tu caso llamando a showmessage y vuelve es cuando se muestra
> el dato, en todo caso haz un deactivate/activate en tu formulario para que
> dispare el evento refresh del mismo o en todo caso invoca el refresh del
> formulario. Otra cosa después de actualizar tu text y te posicionas en el
> con el mouse o el teclado sigue sin mostrar tus datos nuevos o sigue
> mostrando los datos anteriores.
> >>>>>
> >>>>> Saludos
> >>>>>
> >>>>> El 4 de agosto de 2015, 11:30, francisco prieto <fajprieto en gmail.com>
> escribió:
> >>>>>>
> >>>>>> Tengo el siguiente código
> >>>>>>
> >>>>>> procedure TfrmPesaje.UpdPeso(cLectura:String);
> >>>>>> var
> >>>>>> lcTramas:TStringList;
> >>>>>>
> lnIndice,lnNeto,lnNegativo,lnFueraRango,lnFueraEqui,lnTeclaAd,lnCantTramas:integer;
> >>>>>>
> lcEstadoA,lcEstadoB,lcEstadoC,lcPeso,lcTara,lcDecimales,lcLectura:string;
> >>>>>> begin
> >>>>>> lcEstadoA:='';
> >>>>>> lcEstadoB:='';
> >>>>>> lcEstadoC:='';
> >>>>>> lcPeso:='';
> >>>>>> lcTara:='';
> >>>>>> lcTramas:= TStringList.Create;
> >>>>>> Split('|', cLectura, lcTramas);
> >>>>>> lnCantTramas:=lcTramas.count;
> >>>>>> if lnCantTramas=5 then
> >>>>>> begin
> >>>>>> lcEstadoA:=lcTramas.Strings[1];
> >>>>>> lcEstadoB:=lcTramas.Strings[2];
> >>>>>> lcEstadoC:=lcTramas.Strings[3];
> >>>>>> lcPeso:=copy(lcTramas.Strings[4],1,6);
> >>>>>> lcTara:=copy(lcTramas.Strings[4],7,6);
> >>>>>> {Analisis Estado A}
> >>>>>> lcEstadoA:=HextoBin(lcEstadoA);
> >>>>>> lcDecimales:=copy(lcEstadoA,6,3);
> >>>>>> case lcDecimales of
> >>>>>> '010':lnPesoComa:=0;
> >>>>>> '011':lnPesoComa:=1;
> >>>>>> '100':lnPesoComa:=2;
> >>>>>> '101':lnPesoComa:=3;
> >>>>>> '110':lnPesoComa:=4;
> >>>>>> else
> >>>>>> lnPesoComa:=0;
> >>>>>> end;
> >>>>>> {Analisis Estado B}
> >>>>>> lcEstadoB:=HextoBin(lcEstadoB);
> >>>>>> lnNeto:=StrToInt(copy(lcEstadoB,8,1));
> >>>>>> lnNegativo:=StrToInt(copy(lcEstadoB,7,1));
> >>>>>> lnFueraRango:=StrToInt(copy(lcEstadoB,6,1));
> >>>>>> lnFueraEqui:=StrToInt(copy(lcEstadoB,5,1));
> >>>>>> {Analisis Estado C}
> >>>>>> lcEstadoC:=HextoBin(lcEstadoC);
> >>>>>> lnTeclaAd:=StrToInt(copy(lcEstadoB,5,1));
> >>>>>> {Calculos Finales}
> >>>>>> lnPesoTara:=StrToInt(lcTara)/(Exp(LN(10)*lnPesoComa));
> >>>>>> lnPesoTot:=StrToInt(lcPeso)/(Exp(LN(10)*lnPesoComa));
> >>>>>> if lnNegativo=1 then
> >>>>>> lnPesoTot:=lnPesoTot*(-1);
> >>>>>> {Actualizo campo de Peso Actual}
> >>>>>> txtPesoAct.Text:=FloatToStr(lnPesoTot);
> >>>>>> txtPesoAct.Refresh;
> >>>>>> application.ProcessMessages;
> >>>>>> end;
> >>>>>>
> >>>>>> Que se ejecuta por cada lectura del puerto serie.
> >>>>>>
> >>>>>> txtPesoAct es una caja de texto en la cual pongo el peso de la
> balanza.
> >>>>>>
> >>>>>> Si solo hago el Refresh no se refresca el control...
> >>>>>> Si le agrego application.ProcessMessages tampoco se refresca el
> control.
> >>>>>>
> >>>>>> El control solo se refresca cuando hago un showmessage desde otro
> control.
> >>>>>>
> >>>>>> Tengo otra pantalla que tiene un codigo similar pero el que recibe
> la info es una lista, en ese caso funciona sin inconvenientes...
> >>>>>>
> >>>>>> Espero sus comentarios.
> >>>>>>
> >>>>>> Pancho
> >>>>>> Córdoba
> >>>>>> Argentina
> >>>>>>
> >>>>>> --
> >>>>>> Has recibido este mensaje porque estás suscrito al grupo
> "comunidad-hispana-freepascal" de Grupos de Google.
> >>>>>> Para anular la suscripción a este grupo y dejar de recibir sus
> mensajes, envía un correo electrónico a
> freepascalhispano+unsubscribe en googlegroups.com.
> >>>>>> Para ver esta conversación en el sitio web, visita
> https://groups.google.com/d/msgid/freepascalhispano/CAB6XyW1o82vA9sBAtO0LW48Q6qk84jBD9PJFrWXyNJk_datp1w%40mail.gmail.com
> .
> >>>>>> Para acceder a más opciones, visita
> https://groups.google.com/d/optout.
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>> --
> >>>>> Daniel Sánchez Escobar
> >>>>> Investigación y Desarrollo
> >>>>> Reset Software & Sistemas
> >>>>> Móvil +051-949398047 RPM #948615385
> >>>>> Trujillo - Perú
> >>>>>
> >>>>> P Sugerimos no imprimir este e-mail a menos que sea absolutamente
> necesario. Protejamos el medio ambiente.
> >>>>>
> >>>>> --
> >>>>> Has recibido este mensaje porque estás suscrito al grupo
> "comunidad-hispana-freepascal" de Grupos de Google.
> >>>>> Para anular la suscripción a este grupo y dejar de recibir sus
> mensajes, envía un correo electrónico a
> freepascalhispano+unsubscribe en googlegroups.com.
> >>>>> Para ver esta conversación en el sitio web, visita
> https://groups.google.com/d/msgid/freepascalhispano/CA%2BEDH_V%3DY2gOs66FZKPtHzCW6rhuyW-29z2rkosiMR5eB0r3-Q%40mail.gmail.com
> .
> >>>>>
> >>>>> Para acceder a más opciones, visita
> https://groups.google.com/d/optout.
> >>>>
> >>>>
> >>>>
> >>>> _______________________________________________
> >>>> Lazarus-es mailing list
> >>>> Lazarus-es en lists.lazarus.freepascal.org
> >>>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
> >>>>
> >>>
> >>>
> >>>
> >>> --
> >>> Most good programmers do programming not because they expect to get
> paid or get adulation by the public, but because it is fun to program.
> >>> Linus Torvalds
> >>>
> >>> _______________________________________________
> >>> Lazarus-es mailing list
> >>> Lazarus-es en lists.lazarus.freepascal.org
> >>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
> >>>
> >>
> >
> >
> > _______________________________________________
> > Lazarus-es mailing list
> > Lazarus-es en lists.lazarus.freepascal.org
> > http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
> >
>
>
>
> --
> El que pregunta aprende, y el que contesta aprende a responder.
>
> No a la obsolecencia programada:
>
> http://www.rtve.es/noticias/20110104/productos-consumo-duran-cada-vez-menos/392498.shtml
>
> Linux User #495070
> http://domonetic.com/blog
>
>
>
> --
> El que pregunta aprende, y el que contesta aprende a responder.
>
> No a la obsolecencia programada:
>
> http://www.rtve.es/noticias/20110104/productos-consumo-duran-cada-vez-menos/392498.shtml
>
> Linux User #495070
> http://domonetic.com/blog
>
> _______________________________________________
> Lazarus-es mailing list
> Lazarus-es en lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20150806/7b2684e6/attachment-0002.html>
More information about the Lazarus-es
mailing list