[Lazarus-es] [Fpc] Refresh no funciona

francisco prieto fajprieto en gmail.com
Mie Ago 5 18:54:38 CEST 2015


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.
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20150805/bc7c28f8/attachment-0002.html>


More information about the Lazarus-es mailing list