Ir para o conteúdo

Rankings


Conteúdo Popular

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

  1. 2 pontos
    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.
  2. 2 pontos
    @passarito, estamos em 2018, não em 1978 😂 A função upcase pode ser usada com caracteres e strings. readln(linha); linha := UpCase(linha); if linha = 'SIM' then begin // doçura de código end;
  3. 1 ponto
    Se sabes que tens uma ou várias linhas com filmes de 1890 ainda assim pode não existir nenhuma chave para esse ano no HashMap: - Se a formatação das linhas no ficheiro estiver mal e o número de campos por linha não fôr 7 as linhas serão ignoradas; basta um ponto em vez duma vírgula, pois estás a separar os campos com vírgulas. String dados[] = linha.split(","); if (dados.length == 7){ - Se tiveres linhas com o mesmo primeiro campo todas as subsequentes à primeira serão ignoradas, independentemente dos restantes campos. if(filmesRepetidos.get(id)==null){ filmesRepetidos.put(id,filme); O melhor a fazeres é meteres um 'breakpoint' na linha que estoura e verificar quais as chaves contidas no HashMap. O teu IDE deverá permitir fazer isso sem esforço.
  4. 1 ponto
    Falou-se nisso aqui: https://www.portugal-a-programar.pt/forums/topic/61541-at-questões-legais/?do=findComment&comment=579005
  5. 1 ponto
    Estás a usar o método 'get' para procurar os filmes de 1890; se nenhum existir (estás a procurar nos primórdios do cinema) no HashMap irás obter um ponteiro nulo, como explicitado aqui. Deves usar o método containsKey para proteger contra isso.
  6. 1 ponto
    IBAN não é obrigatório. O resto é, mas tanto quanto sei, só no caso de empresas. (you know what I mean )
  7. 1 ponto
    Não use mais as extensões mysql_* veja: http://php.net/manual/en/function.mysql-query.php Warning This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used. See also MySQL: choosing an API guide and related FAQ for more information. Alternatives to this function include: mysqli_query() use apenas mysqli ou pdo
  8. 1 ponto
    Comissão Europeia quer apanhar os milhões de euros que Google e companhia tiram aos autores, mas há o risco de tornar a internet “um lugar cinzento”. [Continua...] In Dinheiro Vivo, 19 de Julho de 2018.
  9. 1 ponto
    Boas notícias, para já: https://www.publico.pt/2018/07/05/tecnologia/noticia/eurodeputados-chumbam-novas-regras-para-direitos-de-autor-online-1836955 Mas parece que em Setembro volta a haver discussão sobre o assunto.
  10. 1 ponto
    aumenta o z-index do header de forma a ser apresentado por cima do resto
  11. 1 ponto
    Tudo bem! Adicione dois botões no teu Form um para Ver o valor duma determinada chave e o outro para eliminar uma chave. Quanto a atualização o método Add empenha os dois papeis ou seja quando a chave não existe ele cria caso contrário ele atualizar o valor. Aqui esta o código do projecto completo: Imports System.Configuration Public Class Form1 Private Sub BtnAdd_Click(sender As Object, e As EventArgs) Handles BtnAdd.Click Dim config As Configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) If TxtValue.Text = "" Then MsgBox("O parâmetro value não contém nenhum valor!") ElseIf TxtKey.Text = "" Then MsgBox("O parâmetro key não contém nenhum valor!") Else config.AppSettings.Settings.Add(TxtKey.Text, TxtValue.Text) config.Save(ConfigurationSaveMode.Minimal) ConfigurationManager.RefreshSection("appSettings") MsgBox("Nova chave adicionada!") End If End Sub Private Sub BtnVer_Click(sender As Object, e As EventArgs) Handles BtnVer.Click Dim config As Configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) If TxtKey.Text = "" Then MsgBox("O parâmetro key não contém nenhum valor!") Else TxtValue.Text = config.AppSettings.Settings(TxtKey.Text).Value End If End Sub Private Sub BtnEliminar_Click(sender As Object, e As EventArgs) Handles BtnEliminar.Click Dim config As Configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) If TxtKey.Text = "" Then MsgBox("O parâmetro key não contém nenhum valor!") Else config.AppSettings.Settings.Remove(TxtKey.Text) config.Save(ConfigurationSaveMode.Minimal) ConfigurationManager.RefreshSection("appSettings") MsgBox("Chave eliminada!") End If End Sub End Class Para pegar o valor duma chave é só introduzir o nome dele no textbox txtKey e clicar em Ver. Para eliminar da mesma clicando em eliminar. Força!
  12. 1 ponto
    Olá! aqui segue o exemplo. crie um projecto do windows Form no formulário adicione dois textbox e um botão, pode usar se quiser um checkbox como preferir, se quiser seguir à letra o código de exemplo nomeie o botão e os textboxs segundo o exemplo. Como já falei anteriormente adicione a secção <appSettings> </appSettings> no arquivo app.Config depois clique com botão direito do mouse em cima de Referências(References se está usar uma versão do vs em inglês) no contextmenu clique em Adicionar Referência(Add Reference) na janela aberta clique em Assemblies percorre a lista até no assembly System.Configuration cheque o e dá OK. feito isso usa o código a baixo dentro do teu formulário. Imports System.Configuration Public Class Form1 Private Sub BtnAdd_Click(sender As Object, e As EventArgs) Handles BtnAdd.Click Dim config As Configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) If TxtValue.Text = "" Then MsgBox("O parâmetro value não contém nenhum valor!") ElseIf TxtKey.Text = "" Then MsgBox("O parâmetro key não contém nenhum valor!") Else config.AppSettings.Settings.Add(TxtKey.Text, TxtValue.Text) config.Save(ConfigurationSaveMode.Minimal) ConfigurationManager.RefreshSection("appSettings") MsgBox("Nova chave adicionada!") End If End Sub End Class Para confirmar o resultado vai no directório do seu projecto na pasta Bin\Debug abre com bloco de nota o arquivo do tipo nomedoseuprojeto.exe.Config e pronto! Caso te tenha ajudado dá um feed back.
  13. 1 ponto
    Viva. Respondendo às tuas questões: Qualquer aplicação é possível, é apenas uma questão de custo (tempo e/ou dinheiro). Essa resposta só vais obter quando estiveres no mercado. Depende do know-how e do tempo que tens. Se não tens tempo, encontra parceiros, mas tens de ter em mente que ficas dependente de terceiros.
  14. 1 ponto
    Olá Rafael! Dê dois cliques no teu arquive app.Config dentro do teu projecto, depois do fechamento de qualquer secção que termine com </.....> crie esta secção : <appSettings> </appSettings> importa estas namespace Import System.IO Import System.Configuration Import System.Reflection Aqui seque o método para adicionar uma chave(key) e um valor(value) da chave que pode usar futuramente no seu aplicativo: Private Shared appPath As String = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) Private configFile As String = Path.Combine(appPath, "App.config") Private configFileMap As ExeConfigurationFileMap = new ExeConfigurationFileMap() Private Sub AddKeyValue(byval key As String, byval value As Object) configFileMap.ExeConfigFilename = configFile Dim config As Configuration = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None) If value = null MsgBox("O parâmetro value não contém nenhum valor!") else If key = null Then MsgBox("O parâmetro key não contém nenhum valor!") else config.AppSettings.Settings.Add(key, value.ToString()) config.Save(ConfigurationSaveMode.Minimal) ConfigurationManager.RefreshSection("appSettings") End If End Sub Obs: o parâmetro key é o nome da chave que quere criar e o value é o valor que quere guardar aí para depois usar no teu programa. para ver o resultado entre no directorio do teu programa na pasta bin\Debug\ Abra o arquivo de configuração que tem este formato: nomedoteuprograma.exe.Config, ou em outros casos ele estará com seu próprio nome app.Config vai até na section <appSettings> e confirme o resultado. ops! o código era em c# e fiz esforço possível para converter em vb.net caso note algumas diferências e favor de reagir caso isso te ajudou ou não. um abraço!
  15. 1 ponto
    sem prepared statements <?php $accepted = [ 'nome', 'frosto', /* ... */ ]; $_POST['nome'] = 'ze das couves'; $input = array_filter($_POST, function ($v, $k) use ($accepted) { return in_array($k, $accepted); }, ARRAY_FILTER_USE_BOTH); $sql = 'INSERT INTO usuario ('.implode(',', array_keys($input)).') VALUES (\''.implode('\',\'', $input).'\')'; echo $sql; para prepared statements, basta adaptar
  16. 1 ponto
    Viva António, Qual é o contentType que estás a passar com o POST? Experimenta definir "text/xml". Já agora aproveito para dizer que já consigo comunicar documentos de transporte com sucesso. O meu problema era a encriptação RSA. Eu estava a utilizar Encoding.UTF8.GetBytes, mas como o Nonce se trata de uma string Base64, tem que ser Convert.FromBae64String(). Public Function EncryptUsingRSA(text As String, certificateFilePath As String, Optional password As String = "") As String Implements IEncryptionServices.EncryptUsingRSA If Not text.IsBase64() Then Throw New ArgumentException("Input must be base 64 string", NameOf(text)) End If Dim certificate As New X509Certificate2(certificateFilePath, password) Dim csp As New System.Security.Cryptography.RSACryptoServiceProvider csp.FromXmlString(certificate.PublicKey.Key.ToXmlString(False)) Dim key() As Byte = csp.Encrypt(Convert.FromBase64String(text), False) Dim cypherText = Convert.ToBase64String(key) Return cypherText End Function Também criei ali um extension method para string, que valida se é uma stirng base64. Fica aí o código VB.NET: <Extension()> Public Function IsBase64(ByVal str As String) As Boolean Try Dim bytes As Byte() = Convert.FromBase64String(str) Return str.Replace(" ", "").Length Mod 4 = 0 Catch ex As Exception Return False End Try End Function Obrigado a todos! Cumprimentos
  17. 1 ponto
    Mas existem chaves de fendas!!!!! Inacreditável!!!! Inventam de tudo hoje em dia
  18. 1 ponto
    Leituras complementares sobre o tema: https://www.eff.org/files/2018/06/13/article13letter.pdf https://www.eff.org/deeplinks/2018/06/eus-copyright-proposal-extremely-bad-news-everyone-even-especially-wikipedia
  19. 1 ponto
    @Imperador_Alien, a resposta é a mesma. Como referi anteriormente, há duas ou três distribuições que vale a pena conhecer a nível profissional, tudo o resto é irrelevante. As tuas questões são equivalentes a perguntares se vale a pena saber Windows 95, Windows NT, Windows XP, Windows 7, e Windows Server 2012. Vale a pena saber Windows de forma genérica e Windows Server se fores um administrador, tudo o resto "é mais do mesmo"...
  20. 1 ponto
    Não percebo porque tens duas threads. Podes ter apenas uma thread, que recebe a RichTextBox1 como argumento (só depois de ter sido criada, atenção aos ciclos de vida), e sempre que recebe informação da porta, adiciona a informação à RichTextBox1. Já agora, se estás a fazer um try/catch, podias fazer log das excepções, tipicamente é útil quando acontecem problemas.
  21. 1 ponto
    Acho que e isto que tu queres Fiz em javascript + html sem usar jquery <html> <head> <style> #listaCarrinho { padding: 10px; border: 1px solid #ccc; } #listaCarrinho .listItem { margin-top: 4px; display: block; padding: 5px; border: 1px solid #ccc; } #listaCarrinho .listItem .text { display: block; } #listaCarrinho .listItem button { margin-top: 10px; } </style> </head> <div id="listaCarrinho"> vazio </div> <div>Computador Nivel 1<button onclick="addCarrinho('Computador Nivel 1')">Adicionar ao carinho</button></div> <div>Computador Nivel 2<button onclick="addCarrinho('Computador Nivel 2')">Adicionar ao carinho</button></div> <div>Computador Nivel 3<button onclick="addCarrinho('Computador Nivel 3')">Adicionar ao carinho</button></div> <div>Computador Nivel 4<button onclick="addCarrinho('Computador Nivel 4')">Adicionar ao carinho</button></div> <script type="text/javascript"> //Carinho do usuario var carrinhoCliente = []; //Adicionar item ao carinho function addCarrinho(itemText) { //Adicona o item ao Array 'carrinhoCliente' carrinhoCliente.push(itemText); //Criat html lista createHtml(); } // function removeCarrinho(index) { //Remove item pelo index carrinhoCliente.splice(index, 1); //Criat html lista createHtml(); } // function createHtml() { //O html que vai existir dentro da div 'listaCarrinho' var html = ""; //Faz o loop dos item do 'carrinhoCliente' for(var i = 0; i < carrinhoCliente.length; i++) { //Vai adiconar a varivael html html += "<div class=\"listItem\"><label class=\"text\">" + carrinhoCliente[i] + "</label><button onclick=\"removeCarrinho(" + i + ")\">Remover do carinho</button></div>"; } //Entao insere na div 'listaCarrinho' o 'html' que tem todos o item que o cliente adiciona ao cariinho document.getElementById('listaCarrinho').innerHTML = html; } </script> </html> Aqui esta a lista do cliente "Computador Nivel 1", "Computador Nivel 2", "Computador Nivel 3" //Carinho do usuario var carrinhoCliente = []; Funcao para adicionar function addCarrinho( itemText ) Funcao para remover removeCarrinho( index ) Espero ter ajudado
  22. 1 ponto
    se fazes "reload" do elemento do DOM que tem os registos dos eventos, então perdes esses eventos. no entanto, existe outra maneira de fazer de forma a não perder esses registos de eventos (no Jquery que pareces usar) - registar o event listener no elemento pai que não irá ser eliminado no teu processo de "reload", que irá então ser delegado como "tratador" desses eventos - usar uma escolha mais inteligente do elemento a ser seleccionado assim como uma forma mais HTML de guradar o valor a ser usado dentro do event listener doc : http://api.jquery.com/on/
  23. 1 ponto
    Boas. Conforme leias a variável A conforme a resposta. Se leres com readln(A); então a opção será For i:=1 to length(A) do A[i]:=upcase(A[i]) if A = 'SIM' then begin ... else ... end; Também já li em qualquer lado que pode ser algo do género A:=upcase(A); mas não tenho a certeza que isso funcione com strings, sempre usei o upcase com caracteres. Por outro lado se leres a variável A caracter a caracter então terás de elevar o caracter quando o leres A:=''; Repeat ch:=upcase(readkey); A:=A+ch; until ch=#13
  24. 1 ponto
    Inc serve para adicionar um valor ordinal a uma variável cujo tipo de dados seja ordinal... Por exemplo: var i: Integer; begin i := 0; // i = 0 Inc(i); // i = 1 Inc(i, 5); // i = 6 É a mesma coisa que fazer isto: var i: Integer; begin i := 0; // i = 0 i := i + 1; // i = 1 i := i + 5; // i = 6 Por curiosidade, Dec é o inverso, e subtrai o valor.
  25. 1 ponto
×

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.