[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