Ir para conteúdo
Fórum Script Brasil

Thales Pontes Martins

Membros
  • Total de itens

    453
  • Registro em

  • Última visita

Tudo que Thales Pontes Martins postou

  1. Eu também, fiz um curso mas meu negócio é programação mesmo. De vez em quando eu tenho que fazer uma ou outra planta baixa e as vezes tenho que desenhar uns objetos 3d, mas nada de muito avançado, 90% é line mesmo. Com line e arc você consegue desenhar bastante coisa, é claro que se você souber usar as ferramentas avançadas facilita muito, e alguns recursos também como os blocos... Que injustiça, porque só os moderadores podem floodar, tem que colocar pra comunidade toda também :( . Abraços.
  2. Perdão, é que eu apaguei o código que eu escreví no Delphi, eu usei o GetWindowDC mesmo. E aconteceu isto, quando não se move a janela ele pinta por cima de tudo, mas se mecher e não pegar outroDC ele não pinta por cima dos botões.
  3. Thales Pontes Martins

    While

    Mesmo se chamar não gera código, porque não há nada a fazer. Bom creio que o caso esteja resolvido, né? Quando se coloca While True o compilador identifica e coloca um Jump incondicional(jmp) sem fazer teste nenhum, e quando há uma condição usa-se cmp para fazer a comparação e um jump condicional(jl, jnl, jg, já..........).
  4. Opa, ótima idéia, havia pensado em sugerir isso, seria uma boa, de vez em quando faz falta. Tem o fórum "Outros Programas Gráficos" que diz para perguntar sobre 3dmax, autocad... Mas se alguém fizer uma pergunta lá difícilmente obterá resposta. Muito pouco frequentado. Outra sugestão seria criar o fórum "Flood". XD Brincadeira. Abraço.
  5. O que eu disse foi o oposto. o Sim foi para sua última pergunta. Então porque o TForm faz daquele jeito, pegando um DC a cada Paint? Eu fiz assim -> var dc : HDC; r : TRect; cn : TCanvas; begin DC:=GetWindowDC(handle); r.left:=0; r.top:=0; r.right:=width; r.bottom:=height; cn:=TCanvas.create; cn.Handle:=DC; cn.FillRect(r); // o form tem 3 botões e ele pinta por cima de todos, fica tudo preto. //Aqui eu movimento o form ou redimensiono, saindo com ele todo pra fora da tela pra que repinte cn.FillRect(r); // Aqui é pintado todo o form menos os botões, a area dos botões não é preenchida. end; Isso aí eu botei uma parte no OnClick de cada botão, um pra pegar DC, um pra FillRect e um pra releaseDC.
  6. Thales Pontes Martins

    While

    Travou porque de vez em quando deve escapolir alguma coisa lá que trava mesmo, mas foi só uma vez, as outras vezes funcionou direitinho. E a que conclusão chegamos, o registrador incrementa ou não? Aqui se eu botar um break point no inc(i) ele nunca chega a brekar porque o i nunca incrementa, e se eu colocar um break point no while ele mostra somente um jump para o inicio do procedimento -> 00453244 EBFE jmp TForm1.Button1Click No Delphi 6 aconteceu a mesma coisa. Repare que se você colocar um procedimento assim-> procedure algo; var a, b, c, d, e, f : cardinal; begin a:=10; b:=20; c:=30; d:=40; e:=50; f:=50; end;Ele nem chega a alocar essas variáveis na pilha, quanto mais colocar um valor nelas. E nem chega a chamar o procedimento. Isso porque o compilador percebe que os valores não são usados nem as variáveis então ele elimina o código.
  7. Ainda não entendí porque eu não posso chamar um DC no início do programa, usar ele até o final e depois chamar ReleaseDC. Veja que curioso que aconteceu-> Seu eu pego um DC e dou um FilRect com ele no form todo beleza, ele pinta o form todo, mas quando eu arrasto ou dimensiono o form (Supostamente deveria pegar outro DC mas não pego) ele pinta o form todo certinho menos os botões. Porque isso acontece?
  8. Thales Pontes Martins

    While

    Quem falou em erro. Ninguém disse que tem erro nenhum. Por que você postou essa mensagem? O que você quis dizer com esse código?
  9. Thales Pontes Martins

    While

    Na 1º tentativa o computador travou nas 4. Na 2º tentativa o break point mostrou só uma linha -> 00453244 EBFE jmp TForm1.Button1Click Ou seja, como o valor de i não é usado ele desconsidera a linha, e como o while vem depois disso ele pula pro início do procedimento, ou seja, mesma linha. Conclusão no Delphi 2006 ele não incrementa mesmo o i.
  10. Thales Pontes Martins

    While

    Não preciso nem ver, nesse caso é claro que vai mudar. Só não é modificado y quando seu valor não é usado posteriormente, ou seja, quando ocorre o warning "Value assigned to 'y' never used".
  11. Thales Pontes Martins

    While

    While not(s3c.Understand) and (Self.Alive) do try Explain(s3c); except Kill(Self); end; Foi exatamente adicionando um break point que eu ví. Ele não incrementa y porque sabe que não teria sentido já que o programa não vai mais a lugar nenhum depois dali. Veja você mesmo, adicione um break point. Acredito que seja porque loops infinitos são comuns dependendo do efeito esperado pelo programador, ou porque esqueceram de colocar mesmo.
  12. Thales Pontes Martins

    While

    Beleza, Vamos supor -> var x, y: integer; begin x:=200; y:=20; while true do y:=y+3; Caption:=inttostr(x)+inttostr(y); end; Seja com o While true ou While (0=0) o compilador faz sempre isso-> 0045325C EBFE jmp $0045325c Ou seja, ele nem chega a incrementar y porque ele sabe que não tem condição para sair do loop então ele fica em uma linha que tem um JUMP incondicional para a mesma linha. Agora se for assim -> var x, y : integer; begin x:=200; y:=10; while true do begin y:=y+3; if (y>40000) then break; end; Caption:=inttostr(y)+inttostr(x); end; O compilador vai fazer isso -> 00453268 83C303 add ebx,$03 0045326B 81FB409C0000 cmp ebx,$00009c40 00453271 7EF5 jle $00453268 Ou seja, ele ignora totalmente o teste do true porque ele sabe que a única condição para ele sair é o teste do break, então a única coisa que ele testa é a condição para break. Agora se for assim -> var x, y : integer; begin x:=200; y:=10; while true do begin y:=y+3; if false then break; end; Caption:=inttostr(y)+inttostr(x); end; O compilador vai fazer isso -> 00453268 83C303 add ebx,$03 0045326B EBFB jmp $00453268 ou seja, ele chega a incrementar y mas não testa nada porque mais uma vez ele sabe que não existe condição para sair do loop. Nesse caso o compilador ignora completamente o trecho if false then break; por que ele sabe que nunca será executado um comando precedido por if false, então não é gerado código para isso. Agora se for assim -> var x, y : integer; begin x:=200; y:=10; while (x > y) do dec(x); Caption:=inttostr(y)+inttostr(x); end; O compilador vai fazer isso -> Unit1.pas.33: while (x > y) do dec(x); 00453268 3BF3 cmp esi,ebx 0045326A 7D05 jnl $00453271 0045326C 4B dec ebx 0045326D 3BF3 cmp esi,ebx 0045326F 7CFB jl $0045326c Ou seja, em tempo de compilação o compilador verificou que para ser avaliada essa expressão seria necessário comparar os registradores ESI e EBX e usar o JUMP condicional JL para fazer o loop. Entendeu agora?
  13. Thales Pontes Martins

    While

    Putz, ainda não entendeu. 3º tentativa -> O compilador requer uma expressão, variável ou constante booleana depois do while. Então se for variável vai ficar assim -> Var cansado : boolean; begin while cansado do begin sleep; cansado:=(sono > disposição); end; end; se for constante, ora quais constantes booleanas, False e True. -> type Boolean = (false, true); //A declaração é interna do compilador e fica como se estivesse declarada no início da unit System begin while true do ...; end; Se for expressão booleana tipo (x > y) então o compilador vai ter que avaliar ele para ver se o valor é igual a constante True ou igual a constante False. Vamos ver um exemplo no assembly. Primeiro o compilador se depara com alguma coisa que tem que ver se é expressão ou constante/variável. Se for a expressão (x > y) por exemplo ele vai fazer-> {Tira os valores da pilha} POP EAX POP EDX {Compara os valores} TEST EAX, EDX {pula se for maior} JG maior {valor se falso} MOV BX, 0 JUMP teste maior: MOV BX, 1 teste: TEST BX, 0 JG comandosSeVerdadeiro JUMP comandosSeFalso Foi necessário testar os 2 valores para colocar o resultado em BX, no caso de ele encontrar variável ou constante ele teria apenas que puxar o seu valor da pilha e executar o último teste -> XOR BX, BX POP BL teste: TEST BX, 0 JG comandosSeVerdadeiro JUMP comandosSeFalso Entendeu mais ou menos?
  14. Coloquem no evento OnPaint do form o seguinte -> procedure TForm1.FormPaint(Sender: TObject); begin Caption:=IntToStr(Canvas.Handle); end; Verão que o Handle do canvas muda a cada repintagem. Arrastem o form para fora do limite da tela e devagar traga de volta e o handle vai ficar mudando. Então minha pergunta é: É necessário pegar um DC e liberá-lo a cada vez que eu vou pintar alguma coisa no form? Não posso pegar um DC e usá-lo até o término do programa? Desculpem estar perguntando isso por aqui mas não conseguí achar a resposta na documentação do Delphi e não sei que palavras usar para achar isso numa busca no Google. Valeu.
  15. Thales Pontes Martins

    While

    Bom, o exit sai do procedimento todo, e o break sai só do loop. Ora bolas, o while repete o loop enquanto a condição for True, não é mesmo? Tipo se (x > y) for True ele roda o bloco de repetição, senão ele pula o bloco e continua executando o código abaixo. Então se você quiser que essa condição seja sempre True é só você colocar a constante booleana True, você não acha? porque aí ele vai chegar lá e vai testar a condição para ver o seu valor, e qual vai ser o valor: True. Entendeu? Mesma coisa que repeat . . . . . until false; Porque no repeat ele só não volta pro inicio do loop se a condição for verdadeira, se for falsa ele volta. ;)
  16. nessa parte do código -> if combobox1.text = 'ENTREGADOR' then begin Form1.Hide; FormENT.SHowmodal; Close; end está faltando ; no end. e está faltando outro end (sem ponto e vírgula) depois dele.
  17. se você observar em cima da caixa onde você escreve seu post tem um botão # Clique nele e escreva seu código depois clique nele denovo.
  18. Meu amigo, poste código sempre dentro de uma caixa de código pra agente poder vizualizar os blocos. O erro está na linha 62, tire esse end. Porque assim ele considera o end da linha 63 como sendo fim do procedimento. Abraço.
  19. Se for o form principal é só colocar a propriedade FormStyle dele para fsStayOnTop. Se for form secundario é só usar a dica do nosso colega s3c, e sobrescrever esse procedimento -> procedure CreateParams(var Params: TCreateParams); override; procedure TForm2.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); Params.WndParent := 0; end; Lembrando que também é preciso colocar a propriedade FormStyle para fsStayOnTop. Abraço.
  20. Pode-se ajustar a seleção com as propriedades SelLength e SelStart, que é quantos caracteres estão selecionados e a (posição do cursor)-SelLength respectivamente. Edit1.SelLength:=0; Edit1.SelStart:=5;Move o cursor para o 5º caractere sem nenhum texto selecionado.
  21. Exatamente. Realmente na documentação do Delphi está escrito que é necessário essa contra barra antes. Abraço.
  22. if ((numero mod divisor) = 0) then o número é divisível pelo divisor; Abraço.
  23. Thales Pontes Martins

    While

    Opa isso aí é quando é preciso testar a condição no meio do loop, e não no começo, exemplo -> Function _search(brd: TBoard; depth : byte) : TMove; var node : array of byte;//Aponta para a jodada de uma resposta na qual estamos PList : array of TMoves;//Guarda as jogadas que serão feitas para cada resposta ply{A resposta em que estamos}, i : byte; Color : TTurn; score : array of longint; //MateCheck : TMoves; Res : byte; begin Color:=Brd.Turn; if (depth < 2) then depth:=2; if (depth > 8) then depth:=8; SetLength(node, depth+1); SetLength(PList, depth+1); for i:=1 to depth do node[i]:=1; ply:=1; Brd.WriteMoves(PList[1]); if (Plist[1].Length = 0) then exit; setlength(score,Plist[1].length+1); for i:=1 to Plist[1].Length do begin score[i]:=0; Brd.MakeMove(PList[1].m[i]); //Brd.WriteMoves(MateCheck); if (Brd.Mate) and Brd.Xeque(não(clr(color),peao)) then begin _Search:=PList[1].m[i]; exit; end; Brd.TakeBack(PList[1].m[i]); end; //*Repetição principal*// while true do begin if (ply < depth) then begin if (node[ply] <= PList[ply].Length) then begin {Faz a jogada e vai mais fundo} Brd.MakeMove(PList[ply].m[node[ply]]); if (brd.Turn = color) then dec(score[node[1]],KindVal(PList[ply].m[node[ply]].Tipo)) else inc(score[node[1]],KindVal(PList[ply].m[node[ply]].Tipo)); //inc(node[ply]); inc(ply); Brd.WriteMoves(Plist[ply]); if (PList[ply].Length = 0) then begin if (brd.Turn = color) then dec(score[node[1]],(160 div ply)) else inc(score[node[1]],(160 div ply)); node[ply]:=1; dec(ply); inc(node[ply]);//*****// Brd.TakeBack(PList[ply].m[pred(node[ply])]); end; end else begin if (ply <= 1) then break; node[ply]:=1; dec(ply); inc(node[ply]);//*****// Brd.TakeBack(PList[ply].m[pred(node[ply])]); end; end else if (ply = depth) then begin if (node[ply] <= PList[ply].Length) then begin Brd.MakeMove(PList[ply].m[node[ply]]); //Brd.WriteMoves(MateCheck); if (Brd.Mate) then begin if (brd.Turn = color) then dec(score[node[1]],(160 div ply)) else inc(score[node[1]],(160 div ply)); end; if (brd.Turn = color) then dec(score[node[1]],KindVal(PList[ply].m[node[ply]].Tipo)) else inc(score[node[1]],KindVal(PList[ply].m[node[ply]].Tipo)); Brd.TakeBack(PList[ply].m[node[ply]]); Inc(node[ply]); end else begin node[ply]:=1; dec(ply); inc(node[ply]);//******// Brd.TakeBack(PList[ply].m[pred(node[ply])]); end; end; end; //*Fim da repetição pricipal*// res:=1; for i:=1 to pred(length(score)) do begin if (score[i] > score[res]) then res:=i; end; _Search:=PList[1].m[res]; end; Isso aí eu tirei de um código de um programa meu, aí você testa a condição no meio do loop e sai do loop com o comando break-> if (x > y) then break; Abraço.
  24. Acho que não deveria ser TRUE já que a chave é suposta a já existir. E esse parametro TRUE cria a chave caso não exista. O mais provável é que o colega esteja fazendo alguma coisa errada.
×
×
  • Criar Novo...