[Lazarus-es] [Fpc] Refresh no funciona

Martin Gomez mmgomez en gmail.com
Jue Ago 6 01:54:22 CEST 2015


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
>>> <https://groups.google.com/d/msgid/freepascalhispano/CAB6XyW1o82vA9sBAtO0LW48Q6qk84jBD9PJFrWXyNJk_datp1w%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>> .
>>> 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
>> <https://groups.google.com/d/msgid/freepascalhispano/CA%2BEDH_V%3DY2gOs66FZKPtHzCW6rhuyW-29z2rkosiMR5eB0r3-Q%40mail.gmail.com?utm_medium=email&utm_source=footer>
>> .
>>
>> 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*
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20150805/f5355536/attachment-0002.html>


More information about the Lazarus-es mailing list