Hola gente como andan? llevo mas de 3 horas buscando en los foros de club delphi e internet algo que me ayude con mi problema pero no encuentro nada, si no les molesta a los que mas saben por favor denme una mano, o un pie o algo por favor!!!!!!!! estoy por volverme loco.
EL PROBLEMA
He desarrollado una aplicación que entre muchas cosas, lee datos de una balanza electrónica que pesa camiones (cuando comence con el desarrollo ya estaba). La cuestión es que esta balanza usa un ejecutable en DOS (si Disk Operating Sistem de Micro...), cuando lo ejecuto con cierta sintaxis me devuelve el valor del peso en un archivo .txt. Hasta aca todo bien. Por cuestiones de tiempo (demoras del archivito, mostrar los datos, etc) tuve que implementar un thread para que la aplicación pueda realizar otras tareas mientras pesa los camiones, y ejecuto dentro del thread el programita de la balanza, luego leo el archivo .txt y muestro el numerito en LA aplicación, cuando deja de pesar, se termina el thread, imprime el ticket y cuando cierro la ventana de la balanza, puuuuuuuuffffff,!"·$·$|@#~&·$&|@#~%&|@#~€|34% me tira el siguiente error (obviamente le meti un par de try except... y muestra un lindo mensajito).
Error Win32 Code1400
El identificador de la ventana no es válido
todo bien hasta que se quiere volver a abrir la ventana de la balanza.
Ya existe un componente con el nombre F_Balanza.
y no me lo deja crear, y cuando cierro la aplicaciópn paaaaaaassfff
violacion de acceso a la direccion 7c928fea en el módulo ntdll.dll
aca va el codigo de mi thread, junto con el que dispara el ejecutable de la balanza.
por favor les pido que si alguien me pude decir donde le estoy errando, porque ya no veo nada.
Código Delphi
[-]
function T_Lectura_Balanza.Ejecutar(const AppName, Params:String):THandle;
var
ProcInfo:TProcessInformation;
Info:TStartupInfo;
begin
FillChar(Info,SizeOf(Info),0);
Info.cb:=SizeOf(Info);
Info.dwFlags:=STARTF_USESHOWWINDOW;
info.wShowWindow:=SW_HIDE;
if not CreateProcess(nil, pchar(AppName+' '+Params),nil,nil,False,0,nil,nil,Info,ProcInfo) then
raise Exception.Create('No se puede iniciar la lectura de la balanza.');
Result:=ProcInfo.hProcess;
end;
procedure T_Lectura_Balanza.Esperar(H:THandle);
begin
while WaitForSingleObject(H,100)=WAIT_TIMEOUT do
begin
Application.ProcessMessages;
if Application.Terminated then
Break;
if F_Balanza.Terminar then
Break;
end;
end;
procedure T_Lectura_Balanza.Execute;
begin Linea_Comando:=MD_Config.IBQ_CONFIGLINEA_COMANDO_BALANZA.AsString;
repeat
try
Esperar(Ejecutar(Linea_Comando,''));
Archivo_Peso:=F_Principal.Dir+'Peso';
F_Balanza.Memo_Peso.Lines.LoadFromFile(Archivo_Peso);
Archivo_Peso:=F_Balanza.Memo_Peso.Lines[0];
if Archivo_Peso='E' then
begin
F_Balanza.Img_Error.Visible:=True;
end
else
begin
F_Balanza.Img_Error.Visible:=False;
Peso:=Copy(Archivo_Peso,2,(Length(Archivo_Peso)-1));
try
Long_:=StrToFloat(Peso);
except
Long_:=0;
end;
if Long_=0 then
F_Balanza.Img_Cero.Visible:=True
else
F_Balanza.Img_Cero.Visible:=False;
F_Balanza.Kg:=Long_;
Decodificar_Numero(Long_,CM,DM,UM,C,D,U);
Mostrar(CM,DM,UM,C,D,U);
end;
except
Decodificar_Numero(0,CM,DM,UM,C,D,U);
Mostrar(CM,DM,UM,C,D,U);
F_Balanza.Img_Cero.Visible:=True;
end;
until F_Balanza.Terminar;
end;
desde ya muchas gracias.