Ir para o conteúdo

Rankings


Conteúdo Popular

A mostrar o conteúdo com mais reputação desde 18-07-2018 em todas as áreas

  1. 3 pontos
    Estou até meio que sem saber o que responder a essa história do professor, pelo que vou deixar para último... 😕 Isso é outra coisa... Ninguém nasce ensinado, e o paradigma OOP é radicalmente diferente do Imperativo. Muitas pessoas (sim, programadores de Java também) não fazem a mais pálida ideia de como se programa realmente em OOP. Acham que programar orientado a objectos é... fazer objectos. É muito mais. Todo o conceito muda, a forma de pensar tem de mudar também, ou apenas terão objectos a fazer o papel de armazéns de código. Recomendo, para entender o conceito OOP, o livro Object Thinking (David West). Não tem nada a ver com Pascal, Java, etc. É um livro para expandir um conceito. Alguns exemplos usados estão em SmallTalk, mas poderiam estar em qualquer outra, visto que são só exemplos para entender o conceito. Já programei muito em Imperativo, e programei muito mais em 'Imperativo com Objectos' - e pensava como os outros que estava a fazer OOP. Actualmente prefiro programar em "OOP a sério", e com anos disto considero que ainda tenho muito para aprender. É uma evolução constante para quem quer realmente aprender, mas dependendo do tipo de software que se quer criar, vale a pena o esforço. As Units do Pascal, que depois chamas na secção Uses, são apenas uma das formas de reutilizar código. Um simples procedimento é uma forma de reutilizar. Um objecto, uma framework - há várias formas de reutilizar código, e podem e devem ser usadas em Pascal (ou qualquer outra LP). Sempre que no teu código usares copy/paste, quase de certeza estás na presença de uma situação onde um qualquer método de reutilização de código se faz necessário. Isso já virou piada entre os programadores de Pascal... Pessoas que nunca tocaram no Pascal a reclamarem dele é motivo para rir. Pessoas que tentam comparar o Standard Pascal - uma LP de 1974 formalizada em 1983, com um conjunto limitado de funcionalidades visto que era uma linguagem pensada para uso académico - com LPs actuais com funcionalidades actuais. Obviamente, nesta comparação, Pascal perde. O que falta a essa malta é aprender a não comparar alhos com bugalhos. Querem comprar com uma LP actual? Então comparem com Delphi actual. E mesmo quando comparam o Pascal 'actual', em vez de compararem linguagens, comparam compiladores - e geralmente acham boa ideia comparar com PascalZIM, que, sem desprimor ao seu criador, é muito fraquinho, tendo apenas uma pequena parte das funcionalidades do Pascal. Bem... Tem de ser, vamos a isto: Se ele disse mesmo isto, podes por favor dizer-lhe que ele é burro que nem uma porta, que não tem competência para ser professor de informática, muito menos de programação, e muito provavelmente não devia ser autorizado nem a operar uma calculadora de bolso... Podes dizer que fui eu que disse! A divisão do código em segmentos menores - sejam métodos, funções, procedimentos, rotinas, units, módulos, ou o que quiseres chamar-lhe - não é 'típico de programadores de Delphi'. É típico de quem sabe programar, seja em que linguagem for. Colocar todo o código no bloco principal? A sério? Até o Basic evoluiu para além disso. Imagina criar um projecto com milhões de linhas de código, todas no bloco principal. Ui, que lindo seria. Se esse é o teu professor, a minha sugestão é fazeres tudo ao contrário do que ele mandar. Aprendes mais a limpar o pó a livros de lógica e algoritmia do que a ser ensinado por quem quer que seja que te diga isso.
  2. 2 pontos
    Eish, ainda levam os dois com a bengala... É 2018, não 1956! Poupem nos comandos, p.f. readln(linha); if UpCase(linha) = 'SIM' then begin // doçura de código end;
  3. 2 pontos
    Correcto, o Borland Pascal suporta objectos desde a versão Turbo Pascal 5.5, de 1989 (coisa recente, daí os teus colegas não saberem ainda ) Lógico que a linguagem foi evoluindo para lá da Borland, e os objectos que podes fazer num compilador recente como o FreePascal ou o Delphi estão a anos luz do que o TP5.5 permitia, mas isso é plenamente natural... Reutilização de código é sempre possível fazer, em qualquer LP digna do nome, e Pascal não é excepção. O meu projecto Reusable Objects é mesmo exemplo disso. São objectos, interfaces e respectivas implementações padrão, que uso e reuso em inúmeros projectos meus. Funcionam mais ou menos como peças de lego. Há lá uma série delas, e vamos usando as que nos dão jeito para criar o software. Havia no tempo dele um projecto associado ao TP chamado Turbo Vision, que era uma framework para criar um User Interface, com menus e tudo, feito com objectos em TP 5.5. Os TP's seguintes, como o TP 6.0, já tinham o seu IDE construído com recurso ao Turbo Vision, num exemplo de reutilização de código e objectos em TP 5.5.
  4. 2 pontos
    O findfirst procura o primeiro ficheiro, o findnext procura os seguintes. Em ambas as funções é devolvido um valor em que se for zero quer dizer que encontrou. Assim, um exemplo rápido e fácil será: Uses SysUtils; Var Info:TSearchRec; begin if findfirst('*.pas', AnyFile, Info)=0 then begin //procura o primeiro ficheiro e coloca a informação no record Info repeat writeln(info.name); until findnext(info)<>0; //procura o próximo ficheiro end; findclose(Info); //fecha find end. O registo Info tem "todas" as informações do ficheiro: Nome, data, tamanho, etc. Estrututa do TSearchRec: https://www.freepascal.org/docs-html/rtl/sysutils/trawbytesearchrec.html
  5. 1 ponto
    Boa tarde, Quando não definimos o SecurityProtocol, é utilizado o protocolo que estiver definido por defeito no Windows... O que tem sido alterado nos ultimos tempos através do Windows Update. Por isso, forcei a utilização de TLS 1.2. O ServerCertificateValidationCallback serve para ignorar a validação do certificado remoto (o tal que foi alterado pela AT, cuja entidade emissora - COMODO - não consta nas entidades de certificação raiz). Se instalares o certificado em todas as máquinas, não é necessário estar a implementar isto... Relativamente à framework, eu estou a utilizar a 3.5 (por isso tive de utilizar o valor 3072 em vez da constante por não existir), e só tive problemas com máquinas que não tinham updates em dia... o erro algo semelhante a: «could not load protocol»... Não tenho a aplicação instalada em XP, mas como o XP não tem atualizações, pode não ter o protocolo instalado ou estar desativado no registry...
  6. 1 ponto
    Bom dia Fabio, posso tentar ajudar nas tuas duvidas, mas convém consultares a documentação oficial da AT: http://info.portaldasfinancas.gov.pt/pt/apoio_contribuinte/Pages/certificacao-de-software.aspx http://info.portaldasfinancas.gov.pt/pt/apoio_contribuinte/SAFT_PT/Paginas/news-saf-t-pt.aspx 1. a) A melhor forma de teres a certeza do formato é analisares o ficheiro de validação do SAF-T para o campo DocumentNumber. Mas basicamente a série é uma forma de identificar unicamente a numeração. Por exemplo podes ter a série por posto e juntas o ano, ficando P12018 (ex: FR P12018/1). Não podes ter o caracter de espaço na série. b) O código hash é gerado com a chave privada, usando alguns campos do documento (dataemissão;datahorasistema;numero;total;hashdocanterior). No caso do primeiro documento, como não tens documento anterior, omites esse conteúdo. Essa parte de extrair 4 caracteres do hash será apenas na impressão do documento para entregar ao cliente. c) Não entendi a duvida mas os documentos fechados e assinados não podem ser alterados. d) Todos os documentos que possam ser entregues a clientes têm de ser assinados (faturas, contas, etc). O prazo de envio do SAF-T é atualmente até ao dia 20 do mês seguinte. e) Para cancelamento de algum produto, deve ser feita uma nota de crédito. A anulação julgo que só em casos extremos (por exemplo, engano no NIF) 2. Esse erro indica que estás a exportar um produto (com o código MO) na parte dos documentos, que não referenciaste no inicio do SAF-T, na parte dos produtos 3. Não tenho conhecimento se existe alguma API que facilite, mas tenta ver o tópico SAFT-PT: debate de dúvidas e ideias no forum, tem lá bastante informação que ajudou-me na altura que fiz. Espero que ajude, nelsonr
  7. 1 ponto
    Já que hoje é dia de desenterrar tópicos, ofereço uma adição a este snippet: program ascii; uses Crt; var Tecla: Char; begin WriteLn('Prima tecla. ENTER para sair.'); Writeln('NOTA: ENTER e a tecla #13.'); Writeln('O resultado aparece sob a forma: caracter > #numero'); Writeln; repeat Tecla := ReadKey; if Tecla = #0 then begin Tecla := ReadKey; Write('Tecla especial > 0 + '); end else Write(Char(Tecla) , ' > '); WriteLn(Ord(Tecla)); until (Tecla = #13); end. Desta forma, também as teclas especiais, como setas, F's, etc são mostradas sem que haja um desmembramento do código originário.
  8. 1 ponto
    Boa dica "nunopicado", Também é possível usando o gerador próprio de ID do delphi da seguinte forma function idUnique:String; var gID: TGuid; begin CreateGUID(gID); result := gID.ToString; end;
  9. 1 ponto
    Penso que sim, mas não sou grande expert na matéria de Programação Orientada por Objectos, mas há por aqui pessoal que te pode ajudar muito mais do que eu. Encontrei algo que te pode ser útil: Em Inglês - http://www.bitsavers.org/pdf/borland/turbo_pascal/Turbo_Pascal_Version_5.5_Object-Oriented_Programming_Guide_1989.pdf Em Português - http://renepegoraro.tripod.com/ADAII/Aula9.pdf
  10. 1 ponto
    O problema está no certificado da AT. Após testar verifiquei que a solução do jvarandas funciona porque porque passou o CURL_SSLVERSION_SSLv3 como uma string e não como uma constante ignorando o método de autenticação. No .NET se comentarem a linha que indica o protocolo ( SecurityProtocol = SecurityProtocolType.Ssl3 ) já funciona. De qualquer modo penso que esta será uma solução temporária.
  11. 1 ponto
    Vou testar isso para ver o que acontece agora enviei amis esta questão e esta foi a resposta deles
  12. 1 ponto
    Na altura não me pediram nada disso. Pessoal fiz a mesma pergunta a AT e esta foi a resposta deles
  13. 1 ponto
    Boa noite, Isto pode ser que resolva o problema Private sub txt_To_RichText() dim strRichText As String strRichText = me.txtRich.Text & Me.txtPlain.Text & ControlChars.CrLf me.txtRich.Text = strRichText End sub
  14. 1 ponto
    Boa noite, Quase qualquer tipo de ficheiro pode ser convertido em stream e ser guardado numa coluna tipo OLE Object. algo assim: Private Sub btnSave_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSave.Click Dim fdlgbox As New OpenFileDialog() fdlgbox.Filter = "All Files (.*)|*.*" fdlgbox.ShowDialog() If fdlgbox.FileName.Trim() <> "" Then Dim ofile() As Byte = Nothing ofile = GetStream(fdlgbox.FileName.Trim()) SaveToDb(fdlgbox.SafeFileName.Trim(), ofile) 'Get Just FileName with Extention End If End Sub Private Function SaveToDb(strFileName As string ,fileStream As Byte()) As Boolean 'your saving process here (entity framework, ado.net, dapper etc) End Function Public Shared Function GetStream(ByVal filePath As String) As Byte() Dim buffer() As Byte Dim fileStream As New FileStream(filePath, FileMode.Open, FileAccess.Read) Try Dim length As Integer = CInt(Fix(fileStream.Length)) ' get file length buffer = New Byte(length - 1){} ' create buffer Dim count As Integer ' actual number of bytes read Dim sum As Integer = 0 ' total number of bytes read ' read until Read method returns 0 (end of the stream has been reached) count = fileStream.Read(buffer, sum, length - sum) Do While count > 0 sum += count ' sum is a buffer offset for next reading count = fileStream.Read(buffer, sum, length - sum) Loop Finally fileStream.Close() End Try Return buffer End Function
  15. 1 ponto
    Para executar uma consulta que tem parámetros vindos de um form/report, estes tem que estar definidos dentro da query. Assim: Run a parameter query within an Access form Ainda, este form/report deve permancer aberto (visible/hidden) durante o tempo de execução da query A mesma sintaxe é aplicada para visualizar o parámetro no relatório
  16. 1 ponto
    Tive um problema parecido a actualizar do Kubuntu 16.04 para o 18.04. Tive de interromper a actualização porque um driver do VirtualBox não arrancava por causa do SecureBoot e pendurou tudo. Obviamente o sistema ficou todo lixado. Estando neste ponto não há soluções milagrosas; se conseguires faz cópias de segurança de dados que precises pois no pior caso terás de reinstalar o SO. Querendo tentar, será preferível passar para o 16.04 (o 14.04 é antiquissimo), tenta o seguinte: - Verifica no ficheiro /etc/apt/sources.list se as fontes já foram todas mudadas para o 16.04; deves ter o nome 'xenial' em cada linha. Portanto onde estiver 'trusty' muda para 'xenial'. - Tenta o comando 'sudo apt dist-upgrade' para ver se ele consegue limpar alguma da confusão; como irá remover pacotes em conflito pode piorar ainda mais. - Usa o comando 'apt list --installed' para obter uma lista dos pacotes instalados e nela procura pacotes com 14.04 na versão ou que não tenham 'xenial' na linha. Tenta remover esses pacotes, um a um, com o comando 'sudo dpkg -r --force-depends <pacote>' e volta a instalá-los de seguida, para que sejam instalados os da versão 16.04. - Quando não parecer teres mais pacotes do 14.04 tenta mais uma vez o 'dist-upgrade'. Se tiveres sorte o sistema deverá estar funcional. Podes notar a falta de alguns aplicativos, que terás de re-instalar manualmente.
  17. 1 ponto
    Isso até pode ir no SAFT, mas seria um pesadelo para a gestão de stocks :D
  18. 1 ponto
    Hi, 1. The difference bettween MovementOfGoods and WorkingDocuments, is that MovementOfGoods are made to follow the shipment and the others don't. WorkingDocuments are not valid documents in terms of sales, they are sales to be that may or not happen in the future. 2. Yes, by law it's mandatory to send WorkingDocuments in Invoice SAFT. 3. I'm not sure what do you mean by unique. One of the tipical types of WorkingDocument is the Proforma Invoice, that is an Invoice to be, that is not an Invoice yet. So it hasn't ShiFrom, ShipTo, DeliveryAddess, etc,
  19. 1 ponto
    Neste caso foi mesmo ignorância. Ao adicionar um assembly file à lista de ficheiros a gerar pelo 'make', estava implicitamente a obrigar o compilador a criar o file debounce.o pela segunda vez. Mas como não preciso do assembly file, retirei-o da configuração do Makefile e já funcionou!
  20. 1 ponto
    Olá em VBA também podes fazer seguindo a minha ideia. http://www.tomasvasquez.com.br/forum/viewtopic.php?t=4250 Public Sub Untitled() Dim selenium As New SeleniumWrapper.WebDriver selenium.start "firefox", "http://agenciaweb.celesc.com.br:8080/" selenium.setImplicitWait 5000 selenium.open "/AgenciaWeb/autenticar/autenticar.do" selenium.type "name=sqUnidadeConsumidora", 26911222 selenium.click "id=CPJ" selenium.type "name=numeroDocumentoCNPJ", 03774688002107 selenium.clickAndWait "css=input.botao" selenium.type "name=senha", "SENHA" selenium.clickAndWait "css=input.botao" selenium.clickAndWait "link=» Histórico de Pagamento" selenium.clickAndWait "link=01/2016" selenium.click "id=download" selenium.stop Fazes Login Via selenium: Guardas os cookies do cookiecontainer Post com o pedido usandos os cookies.
  21. 1 ponto
    Os erros aparecem porque estás a tentar 'linkar' duas vezes o mesmo ficheiro objecto 'debounce.o'; verifica a linha de comandos usada para 'linkar' o ELF. Quanto ao motivo para isso, usa uns '@echo' no Makefile para verificar o conteúdo das variáveis ALL_CFLAGS e OBJ e procura a segunda referência ao ficheiro.
  22. 1 ponto
    Boas Rafael Tens aqui alguma informação de como mexer no registo do Windows: https://social.msdn.microsoft.com/Forums/vstudio/en-US/5b22e94c-37a9-4be5-ad55-3d9229220194/how-to-use-add-read-change-delete-registry-keys-with-vbnet?forum=vbgeneral e para 64bits https://www.codeproject.com/Questions/675355/Read-Bit-Registry-Values-Using-VB-NET é veres como eles fazem e aplicares em funções etc Abraço amigo
  23. 1 ponto
    O Application.ProcessMessages é largamente usado para 'desenrascar' esse problema, mas o seu uso não é sem custos... Este método serve para 'avisar' o programa para processar as mensagens (duh! ) que estão na queue do Windows, independentemente de quais são e do risco associado à execução de mensagens fora de ordem. Antes de mais, uma explicação simplista do que são 'mensagens': O GUI do Windows funciona porque os seus elementos enviam mensagens uns aos outros com indicação do que querem fazer. Por exemplo, quando clicas num botão, é enviada uma mensagem para o componente encarregue de alterar o aspecto visual do botão (que o faz parecer 'pressionado' visualmente) que por sua vez manda uma mensagem à form para se redesenhar para que o novo aspecto seja mostrado, há uma mensagem a dar iniciação do trabalho do botão, etc. Ao fazer ProcessMessages, estás a forçar a main thread do programa a executar tudo o que estiver na fila, e isto tem, de entre outras, as seguintes consequências: Estás a parar temporariamente a execução da tarefa principal, obrigando-a a demorar mais tempo Estás a mandar executar mensagens a meio da tarefa, sem saber quais as mensagens que lá estão nem os problemas que a sua execução forçada pode causar. No caso, a tua ideia faz com que ele pare a leitura dos dados, actualize o UI ao processar as mensagens de actualização que estão pendentes, e volta a ler, e voltar a parar, e por aí fora até completar a leitura. Como à primeira vista, isto funciona, muita gente o faz. O que muitos desconhecem é que, ao fazer isto, podem estar com uma simples linha a introduzir bugs no programa, bugs esses que são de detecção extremamente difícil pois existem pela execução de mensagens fora da ordem correcta. O caso é tal que podes correr um programa e dar tudo bem, voltas a correr sem alterar nada e os bugs manifestam-se, voltas a correr e está tudo bem, voltas a correr e aparecem bugs completamente diferentes dos primeiros. Ou seja, o pesadelo de qualquer programador. Por outro lado, dependendo das mensagens pendentes, o resultado pode nem ser o esperado, e não resolve sequer o problema inicial. Podes agora 'resolver' assim, e noutro programa em que te depares com um problema semelhante, resolves usar o mesmo, mas nesse outro programa não funcionar, por um qualquer motivo. Isto retira-te a previsibilidade das soluções, o que te obrigará a perder tempo à procura da solução de cada vez que te surgir o problema. E se o utilizador for dado a clicar à toa enquanto espera, como há tantos por aí, o resultado é muitas vezes o crash do programa, porque independentemente de lhe mandarmos processar as mensagens, a thread continua a ser só uma, e nem sempre com capacidade de fazer tudo o que lhe pedem. Nota: Não estou com isto a dizer que nunca se deve usar o ProcessMessages, ou que no teu caso não resolva o problema sem introduzir outros. Tudo depende do código circundante ao ProcessMessages. E mesmo quando os bugs aparecem, podem ser coisas tão banais quanto uma barra de progresso que anda para a frente e depois volta atrás, para depois voltar pra frente, não afectando nada de especial senão o aspecto visual. Mas há casos bem mais graves, o que me leva a recomendar que quem não saiba exactamente o que está a acontecer, ignore o 'remendo' que é o ProcessMessages, em favor de uma solução mais previsível, como o uso de multi-threading. Nota 2: Multi-threading não é, no entanto, um mar de rosas. É preciso perder algum tempo para sequer começar a ter ideia do ninho de ratos que aquilo é. No entanto, a partir do momento que saibas usar e implementares com as devidas protecções, é mais previsível e consistente do que correr mensagens desconhecidas a meio de uma tarefa.
  24. 1 ponto
    e qual é a linha 71 ?
  25. 1 ponto
    é possivel fazer isso , basta ir ás propriedades do campo e a primeira opção e dizer quem tem acesso ao campo
×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.