problema de exibição pólo em c #
-
23-08-2019 - |
Pergunta
Eu costumava monitor de poste (E POS) no meu POS c # application.I tem dois grande problema em que, 1. Eu não posso limpar o visor perfeitamente. 2. Não consigo definir a posição do cursor.
I used some dirty tricks to do these.But I am not satisfied with that code.The following code i used.
Código: -
class PoleDisplay : SerialPort
{
private SerialPort srPort = null;
public PoleDisplay()
{
try
{
srPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
if (!srPort.IsOpen) srPort.Open();
}
catch { }
}
~PoleDisplay()
{
srPort.Close();
}
//To clear Display.....
public void ClearDisplay()
{
srPort.Write(" ");
srPort.WriteLine(" ");
}
//Display Function
//'line' 1 for First line and 0 For second line
public void Display(string textToDisplay, int line)
{
if (line == 0)
srPort.Write(textToDisplay);
else
srPort.WriteLine(textToDisplay);
}
}
Solução
Seu problema é que você está chamando Write a clara linha 1, e WriteLine a linha clara 2.
Isto não faz qualquer sentido. A única diferença entre os métodos é que WriteLine adiciona uma quebra de linha até o fim. Tudo o que você está realmente fazendo é esta saída esta string:
" "\r\n
Sem saber a marca da tela pólo você estiver usando, eu não posso dizer-lhe a maneira correta de fazê-lo, mas a maneira que você está tentando fazer isso nunca vai funcionar. A maioria dos terminais aceitam códigos de caracteres especiais para mover o cursor, ou limpar o visor. Você já encontrou uma referência para o terminal que você está trabalhando? A maioria dos monitores irá limpar se você enviá-los CHR (12).
Tudo isso de lado, não é um grande problema com o seu design de classe. Você nunca deve confiar em destruidores para liberar recursos em C #.
Em C #, o destruidor será chamado quando o coletor de lixo recolhe o objeto, de modo que não há nenhuma maneira determinista saber quando o recurso (neste caso uma porta Com), serão recolhidos e fechados.
Em vez disso, implementar a interface IDisposable na sua classe.
Isso requer que você adicionar um método Dispose para sua classe. Isto serviria a mesma finalidade que o seu destruidor atual.
Ao fazer isso, você pode utilizar uma característica construída em linguagem C # para liberar seus recursos quando o objeto sai do escopo.
using (PoleDisplay p = new PoleDisplay())
{
// Do Stuff with p
}
// When the focus has left the using block, Dispose() will be called on p.
Outras dicas
Enviar 0C código hexadecimal para limpar a tela, ele funciona para a maioria dos monitores
aqui é um exemplo de código:
byte[] bytesToSend = new byte[1] { 0x0C }; // send hex code 0C to clear screen
srPort.Write(bytesToSend, 0, 1);