Ir para conteúdo
Fórum Script Brasil

Gabriel Cabral

Membros
  • Total de itens

    406
  • Registro em

  • Última visita

Tudo que Gabriel Cabral postou

  1. Muito obrigado, Jhonas. Eu já utilizava o primeiro passo que você citou, e só agora percebi que não estava mandando a imagem pro TImage porque eu não tinha chamado o evento OnTwainAcquire. Mas me ocorre outra coisa. Quando abre a tela de captura, se eu clicar em Cancelar ou sair sem obter imagens, não consigo mais abrir esta tela novamente. Sabe o que pode ser?
  2. Boa tarde. Estou utilizando o componente DelphiTwain para captura de imagem através de webcam. Quando chamo o evento para capturar a imagem, ele abre uma tela do próprio windows e faz quantas capturas você quiser. O problema é que essas imagens capturadas não são gravadas em nenhum outro lugar, a não ser no dispositivo de imagem (webcam). Elas ficam armazenadas no dispositivo como Imagem 001, Imagem 002, e assim por diante. Gostaria de saber se há um jeito de já gravar com um nome e em um caminho escolhido por mim. Ou então se tem algo no Delphi que copie essas imagens do dispositivo para uma outra pasta. Obrigado.
  3. Os nomes que aparecem no combobox são: CyberLink Webcam Splitter HP Webcam-50 U2 EE Cam Então, se eu quiser conectar a webcam USB (U2 EE Cam), devo usar SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 2, 0);, certo?! Pois fiz o teste e não conecta. Já esperei mais de três minutos e não conectou.
  4. Boa tarde, Jhonas. Fiz o teste com o exemplo que você passou. Fiz num notebook que tem uma câmera acoplada e mais uma webcam USB. Obtive o seguinte retorno: FriendlyName: CyberLink Webcam Splitter DevicePath: \\?\root#media#0000#{65e8773d-8f56-11d0-a3b9-00a0...\global CLSID: {17CCA71B-ECD7-11D0-B908-00A0C9223196} FriendlyName: HP Webcam-50 DevicePath: \\?\usb#vid_05c8&pid_0223&mi00#7&1d1c0389&0&0...\global CLSID: {17CCA71B-ECD7-11D0-B908-00A0C9223196} FriendlyName: U2 EE Cam DevicePath: \\?\usb#vid_05e3&pid_0512&mi_00#6&1374dce8&0&0...\global CLSID: {17CCA71B-ECD7-11D0-B908-00A0C9223196} O que devo colocar no lugar do parametro DeviceID, para conectar a câmera? SendMessage(mCapHwnd, WM_CAP_CONNECT, DeviceID, 0); Tentei passar o FriendlyName, mas acusa erro, dizendo que precisa ser um Integer. Também tentei colocar 1, 2... mas a tela fica preta e não conecta nenhuma câmera. Só está conectando quando coloco 0. Nesse caso, conecta a câmera acoplada.
  5. Bom dia, Jhonas. Muito obrigado pelas dicas, mas não me dei bem com nenhum componente até agora. Preciso mesmo fazer sem utilizar componentes. Acredito que a linha onde escolho a webcam é esta SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0); Onde o parâmetro 0 indica a webcam padrão. E isso realmente funciona, pois num notebook ela liga a webcam acoplada em vez da webcam USB. Mas tentando mudar o parâmetro para 1, nada acontece. Nenhuma das câmeras é ligada.
  6. Boa tarde, pessoal. Tudo bem?! Estou precisando de uma grande ajuda para utilizar mais de uma webcam. Preciso de algo que liste as webcams instaladas ou alguma outra forma que eu possa escolher qual webcam utilizar. Já vi inúmeros tópicos relativos a webcam, mas nada que me ajudasse neste caso. O programa está fazendo a captura de imagem da seguinte forma: var frmCapturaImg: TfrmCapturaImg; hWndC: THandle = 0; rg: string; implementation uses U_frmCadMoradores; {$R *.dfm} const WM_CAP_START = WM_USER; const WM_CAP_STOP = WM_CAP_START + 68; const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10; const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11; const WM_CAP_SAVEDIB = WM_CAP_START + 25; const WM_CAP_GRAB_FRAME = WM_CAP_START + 60; const WM_CAP_SEQUENCE = WM_CAP_START + 62; const WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20; const WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+ 63; const WM_CAP_SET_OVERLAY =WM_CAP_START+ 51 ; const WM_CAP_SET_PREVIEW =WM_CAP_START+ 50; const WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6; const WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2; const WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3; const WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5; const WM_CAP_SET_SCALE=WM_CAP_START+ 53 ; const WM_CAP_SET_PREVIEWRATE=WM_CAP_START+ 52; function capCreateCaptureWindowA(lpszWindowName : PCHAR; dwStyle : longint; x : integer; y : integer;nWidth : integer;nHeight : integer;ParentWin : HWND; nId : integer): HWND; STDCALL; EXTERNAL 'AVICAP32.DLL'; ///// === CONECTA WEBCAM === ///// if hWndC <> 0 then exit; hWndC := capCreateCaptureWindowA('WINACESSO',WS_CHILD or WS_VISIBLE ,image1.Left,image1.Top,image1.width,image1.height,frmCapturaImg.Handle,0); if hWndC <> 0 then begin SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0); SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0); SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0); SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0); SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0); SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0); SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0); SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0); end; ///// === CAPTURA IMAGEM === ///// rg := frmCadMoradores.txtCadMoradores_RG.Text; if hWndC <> 0 then begin SendMessage(hWndC,WM_CAP_SAVEDIB,0,longint(pchar('C:\WINACESSO\FOTOS\' + rg + '.bmp'))); end; ///// === DESCONECTA WEBCAM === ///// if hWndC <> 0 then begin SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0); hWndC := 0; end;
  7. Olá, amigos. Estou fazendo um relatório de comissão, que faz uma busca na tabela de vendas (ESTAVEN) e na tabela de vendedores (ESTAVND). Na própria instrução SQL eu já faço o cálculo da comissão de cada vendedor. SQL.Add('SELECT (VEN.VENTOT-VEN.VENDEC) AS TOTAL, VEN.VENCOD, '); SQL.Add('VEN.VENTOT, VEN.VENDEC, VND.VNDCOD, VND.VNDCOM, VND.VNDACI, '); SQL.Add('((VEN.VENTOT-VEN.VENDEC)*(VND.VNDCOM/100)) AS COMISSAO'); SQL.Add('FROM ESTAVEN AS VEN, ESTAVND AS VND'); SQL.Add('WHERE VND.VNDCOD = VEN.VENVEN'); SQL.Add('ORDER BY VEN.VENNVD, VEN.VENDAT, VEN.VENNUM'); Mas o cliente pediu um algo a mais. Ele pediu pra criar um campo para estipular o valor em que cada vendedor teria direito a calcular sua comissão. Por exemplo: O valor estipulado foi de 500,00. Se o cara vendeu 520,00, sua comissão será calculada apenas em cima de 20,00. E se o cara vendeu menos que 500,00, ele não tem direito à comissão. Ou seja, preciso fazer nessa instrução SQL, alguma condição do tipo: if totalVenda > valorEstipulado then comissão calculada sobre (totalVenda-valorEstupilado) else comisão é igual a zero Eu trabalho com BDE e tabelas DBF (por incrível que pareça). Já tentei utilizar IIF e CASE, mas sem sucesso. Alguém tem alguma sugestão? Muito obrigado.
  8. Boa tarde, amigos. Tenho uma tabela com alguns registros repetidos, e para selecioná-los, fiz da seguinte maneira: with dm.QueryESTACAI_DUPL do begin Close; SQL.Clear; SQL.Add('SELECT DISTINCT CAIDAT, CAIHIS, CAIHO2 FROM ESTACAI'); Open; end; Utilizo três campos, pois a tabela não possui chave primária. Porém, preciso "marcar" esses registros que foram selecionados, com um X no campo CAIDEL. Então fiz da sequinte forma: with dm.QueryESTACAI_DUPL do begin Close; SQL.Clear; SQL.Add('UPDATE ESTACAI SET CAIDEL = "X" WHERE (SELECT DISTINCT CAIDAT, CAIHIS, CAIHO2 FROM ESTACAI) IS NOT NULL'); ExecSQL; end; Mas o UPDATE não funcionou e nada foi marcado. Como eu poderia fazer essa edição nos registros que foram selecionados? Muito obrigado.
  9. O cliente me informou o código do cedente, e este também possui 9 dígitos. A carteira é Rápida com Registro. Estava na esperança de que o código do cedente tivesse 7 ou 11 dígitos.
  10. Amigos, já verifiquei todas as documentações possíveis de Banespa, Real, Santander, mas ainda não consegui chegar a uma resolução. A conta do meu cliente possui 9 dígitos, mas todas as documentações trata o código do cedente com 7 ou 11 dígitos. Sei que nem sempre a conta e o código do cedente são a mesma coisa. Mas o que posso fazer neste caso? Existe alguma outra documentação que trate o código do cedente com 9 dígitos? Ou alguém poderia me esclarecer, o que compõe o código do cedente? Muito obrigado.
  11. Muito obrigado, Alberto Mota. Só fiquei com uma dúvida. Veja se pode me ajudar. No caso do Banco Real, a conta tinha 7 dígitos. E pelo que percebo, o Santander possui conta de 10 dígitos. Essa diferença traria uma certa dificuldade para utilizar este layout do antigo Banco Real, não é?! Se você já trabalhou com este layout, pode me informar como procedeu?
  12. Bom dia, amigos. Estou desenvolvendo emissão de boletos de diversos bancos, mas ainda não fiz para o Santander, pois não encontro o layout na internet e não consigo ir a qualquer agência procurar informações, por causa da greve. Se alguém tiver o layout para geração de boletos do Santander e puder compartilhar, entre em contato comigo, por favor. gfcabral@gmail.com Muito obrigado.
  13. Mas o Rave Reports possui essa banda Title? Não encontrei aqui.
  14. Tudo bem, pessoal.. Faz tempo que não apareço por aqui, hein?! Então, minha dúvida não tem nada a ver com formulário contínuo. É que eu não achei um título bom, mas vocês devem entender com a minha explicação. Estou fazendo uma carta de correção para nota fiscal, em rave. Eu preciso de um cabeçalho que fique apenas na primeira página, em seguida, preciso mostrar dados de uma tabela, então utilizo um DataBand. Logo depois, tem uma parte que deve ter o "tamanho variável".. e embaixo disso, apenas textos. Meu problema é que não consigo deixar o cabeçalho apenas na primeira página. Como proceder? Já o outro problema, explico melhor... ___________________ IRREGULARIDADES campo1 campo2 campo3 ___________________ textos e textos Essa quantidade de campos de irregularidades é variável.. Por isso, precisava que ele fosse "empurrando" (inclusive pra próxima página) a parte dos textos, conforme o número de campos for aumentando. Mas nessa próxima página, só deve imprimir essa "continuação".. e não o cabeçalho e o DataBand... por isso o "contínuo" ali no título. Espero realmente que alguém tenha entendido e possa me ajudar. Muito obrigado.
  15. Grande Jhonas!!! Funcionou certinho. Muitíssimo obrigado. Abraço.
  16. Boa tarde, amigos. Tenho uma rotina no programa que copia arquivos de uma pasta para outra, de acordo com uma máscara... colocarei esta rotina aqui pra ficar mais claro. procedure TfrmEstoqPrincipal.mnuBackupClick(Sender: TObject); var PastaOrigem, PastaDestino, Mascara: string; begin PastaOrigem := ExtractFileDir(ParamStr(0))+'\DATABASE\'; if PastaOrigem = '' then Exit; DlgSelPasta.CaptionTitle := 'BACKUP DE ARQUIVOS'; DlgSelPasta.Caption := 'ESCOLHA A PASTA DE DESTINO:'; if DlgSelPasta.Execute then begin PastaDestino := DlgSelPasta.SelectedFolder; if PastaDestino = '' then Exit; Mascara := 'E*.DBF'; if Mascara = '' then Exit; CopiaArquivos(PastaOrigem,PastaDestino,Mascara); Mascara := 'F*.DBF'; if Mascara = '' then Exit; CopiaArquivos(PastaOrigem,PastaDestino,Mascara); end; end; //////////////////////////////////////////////////////////////////////////////// ///// EFETUA COPIA DE ARQUIVOS SEGUNDO UMA MASCARA ENTRE ORIGEM E DESTINO //// //////////////////////////////////////////////////////////////////////////////// procedure CopiaArquivos (dOrigem, dDestino, dMascara: string); var Dados: TSHFileOpStruct; // procedimento de cópia pelo Shell do Windows sSepar: String; begin if dOrigem[Length(dOrigem)]='\' then sSepar:='' else sSepar:='\'; dOrigem:=dOrigem+sSepar; if dDestino[Length(dDestino)]='\' then sSepar:='' else sSepar:='\'; dDestino:=dDestino+sSepar; if (dMascara[1]='*') and not (dMascara[2]='.') then dMascara:='?'+dMascara; FillChar(Dados,SizeOf(Dados), 0); with Dados do begin wFunc := FO_COPY; pFrom := PChar(dOrigem+dMascara); pTo := PChar(dDestino); fFlags:= FOF_ALLOWUNDO; end; SHFileOperation(Dados); end; Pois bem... as máscaras são E*.DBF e F*.DBF porque os arquivos que quero copiar são começados em E e F .... Existe um outro arquivo, nesta pasta, chamado TABELA.DBF ... Aí ocorre o seguinte: Quando coloco a mascara := 'TABELA*.DBF', este arquivo é copiado normalmente... Mas quando a mascara := 'E*.DBF' ou 'F*.DBF', ocorre o seguinte erro Não é possível copiar arquivo. Não é possível ler o arquivo ou disco de origem. O curioso é que isso ocorre em um programa... Mas em um outro programa, eu utilizo essa mesma rotina, sem mudar uma letra sequer, e funciona tudo corretamente. Declarei ShellAPI nos dois programas... E estou achando que está faltando algum outro detalhe neste programa que não está funcionando. Alguém sabe me dizer se é preciso alguma outra coisa, além do ShellAPI para esta função de cópia funcionar? Algum detalhe que pode ter passado despercebido por mim? Muito obrigado.
  17. Preciso habilitar o botão maximizar de um formulário, e sei que preciso usar a propriedade Anchors dos componentes que nele estão para estes aumentarem e diminuirem proporcionalmente. Mas dessa forma, os componentes somente alteram seus tamanhos. E quanto ao posicionamento no formulário? Como faço para ajustar quando maximizo o form? Obrigado.
  18. Oi gente... Estou a um bom tempo procurando componentes e/ou funções que façam a captura de imagens de uma webcam.. Utilizei então o melhor que eu encontrei.. DECLARAÇÕES var Form1: TForm1; hWndC : THandle = 0; implementation {$R *.dfm} const WM_CAP_START = WM_USER; const WM_CAP_STOP = WM_CAP_START + 68; const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10; const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11; const WM_CAP_SAVEDIB = WM_CAP_START + 25; const WM_CAP_GRAB_FRAME = WM_CAP_START + 60; const WM_CAP_SEQUENCE = WM_CAP_START + 62; const WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20; const WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+ 63; const WM_CAP_SET_OVERLAY =WM_CAP_START+ 51; const WM_CAP_SET_PREVIEW =WM_CAP_START+ 50; const WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6; const WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2; const WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3; const WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5; const WM_CAP_SET_SCALE=WM_CAP_START+ 53; const WM_CAP_SET_PREVIEWRATE=WM_CAP_START+ 52; 04/08/07 Eduardo function capCreateCaptureWindowA(lpszWindowName : PCHAR; dwStyle : longint; x : integer; y : integer;nWidth : integer;nHeight : integer;ParentWin : HWND; nId : integer): HWND; STDCALL; EXTERNAL 'AVICAP32.DLL'; CAPTURA procedure TForm1.ToolButton1Click(Sender: TObject); begin if hWndC <> 0 then exit; hWndC := capCreateCaptureWindowA('WebCam no Turbo Delphi',WS_CHILD or WS_VISIBLE ,Panel1.Left,Panel1.Top,320,240,Form1.Handle,0); if hWndC <> 0 then begin SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0); SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0); SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0); SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0); SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0); SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0); SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0); SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0); end; end; SALVA A IMAGEM CAPTURADA procedure TForm1.ToolButton4Click(Sender: TObject); begin if hWndC <> 0 then begin SendMessage(hWndC,WM_CAP_SAVEDIB,0,longint(pchar('c:\teste.bmp'))); end; end; Fiz o teste em um computador que não tem webcam, mas tem uma placa de tv. Foi capturado o vídeo, do que estava passando na tv, mesmo com o programa da tv desligado. Quando fiz o teste em um notebook com webcam, foi capturado uma imagem preta, e não o que a webcam estava filmando. Alguém pode me ajudar com isso??? Por que foi capturada uma imagem preta? É preciso fazer alguma coisa com a webcam? Ligar? Ou ela já está ligada? (Desculpem a ignorância, mas nunca tive contato com webcam) Muito obrigado.
  19. Não encontro nenhuma informação sobre instalação de DBChart no Delphi 2007. Somente pro Delphi 7, que tem que adicionar o pacote dcltee70.bpl (se não me engano). Mas pro 2007 eu não encontrei nada até agora.
  20. Estou tendo contato pela primeira vez com gráficos, e me indicaram usar o DBChart, que fica na paleta Data Controls. Mas o Delphi aqui não tem esse componente. O Delphi 2007 não tem mesmo? É preciso instalar algum pacote? Ou vocês indicam algum outro componente pra eu trabalhar com gráficos? Muito obrigado.
  21. Trabalho com tabelas DBF, e preciso realizar a seguinte consulta: SQL.Add('SELECT SUM(VENTOT-VENDEC) AS TOTAL FROM ESTAVEN.dbf'); Mas em muitos registros, o VENDEC é nulo. Ou seja, VENTOT - nulo resulta em nulo. Preciso de algo que converta em zero tudo o que for nulo. Já tentei o NVL e o COALESCE, mas obtive a mensagem 'Capability not supported' Alguém sabe de algo que eu possa fazer? Muito obrigado.
  22. Consegui, pessoal. O segredo está na instrução SQL mesmo... Usei a função EXTRACT para extrair o mês da data de vencimento. Então o alias MES, que recebe o mês extraído, eu passei como parâmetro pro Rave para os registros serem agrupados por ele. with dmRel.QueryRelFinan do begin Close; SQL.Clear; SQL.Add('SELECT LANCOD, LANDES, LANCHE, LANVEN, LANDUP, '); SQL.Add('LANNUM, LANVAL, LANEMI, LANNAT, LANOBS, LANDPG, '); SQL.Add('LANVPG, LANJUR, LANDEC, LANTIP, LANVED, LANMUL, '); SQL.Add('LANMOR, EXTRACT(Month from LANVEN) AS MES FROM FINALAN.dbf'); SQL.Add('WHERE LANVEN BETWEEN :pDataIni AND :pDataFin'); SQL.Add('AND LANDPG IS NULL'); SQL.Add('ORDER BY LANVEN'); ParamByName('pDataIni').AsDateTime := StrToDateTime(txtContasP_Rel_DataIni.Text); ParamByName('pDataFin').AsDateTime := StrToDateTime(txtContasP_Rel_DataFin.Text); Open; end; Funcionou como eu queria... Valeu, Jhonas.
  23. Não encontrei nada no forum referente ao assunto... Eu preciso fazer um relatório Mestre/Detalhe, em que o mês seja a referência pra eu agrupar. Por exemplo: Como eu tenho um campo com a data de vencimento, se eu usar este campo, os registros virão agrupados por data: _________________________ 29/06/2010 registro 2 registro 6 registro 7 Total do dia 29/06/2010 : R$ _________________________ 30/06/2010 registro 1 registro 5 Total do dia 30/06/2010 : R$ _________________________ 01/07/2010 registro 3 registro 4 Total do dia 01/07/2010 : R$ _________________________ Ou seja... os registro 2, 6 e 7, tem a data 29/06/2010 como valor no campo 'data de vencimento' (LANVEN) ... e assim por diante. Mas preciso fazer isso por mês, para fechar o valor total do mês, e não apenas de cada dia. Se eu tivesse um campo guardando o mês e ano, era só agrupar por esse campo. Mas não tenho... preciso usar o campo data de vencimento para agrupar por mês.
  24. Preciso fazer um relatório, em rave reports, que agrupe os registros por mês. Mais precisamente pelo mês do vencimento... Mas o vencimento está armazenado no campo LANVEN, no formato dd/mm/yyyy. Se eu for agrupar por dia, é só eu especificar a GroupKey da Band como LANVEN. Mas para agrupar pelo mês??? Como faço???
  25. Então... me disseram pra tentar utilizar subconsultas... mas não obtive sucesso ainda... olhem só: Antes estava assim: SQL.Add('SELECT VENCOD, VENDES, SUM(VENQTD) AS QTDE, '); SQL.Add('SUM(VENTOT-((VENTOT*VENDSC)/100)) AS TOTAL, SUM(VENCUS) AS CUSTO, '); SQL.Add('SUM((VENTOT-(VENCUS*VENQTD))) AS MARGEM FROM ESTAVEN.dbf'); SQL.Add('WHERE VENDAT BETWEEN :pDataIni AND :pDataFin'); SQL.Add('AND VENCAN IS NULL'); SQL.Add('AND VENFLA IS NOT NULL'); SQL.Add('GROUP BY VENCOD, VENDES'); Então mudei e ficou assim: SQL.Add('SELECT((SELECT SUM (VENTOT) FROM ESTAVEN)-(SELECT(((SELECT SUM(VENTOT)FROM ESTAVEN)*(SELECT SUM(VENDSC) FROM ESTAVEN))/100) FROM ESTAVEN)) AS TOTAL, '); SQL.Add('VENCOD, VENDES, SUM(VENQTD) AS QTDE, SUM(VENCUS) AS CUSTO FROM ESTAVEN.dbf'); SQL.Add('WHERE VENDAT BETWEEN :pDataIni AND :pDataFin'); SQL.Add('AND VENCAN IS NULL'); SQL.Add('AND VENFLA IS NOT NULL'); SQL.Add('GROUP BY VENCOD, VENDES'); Mas aí deu a seguinte mensagem: Single row subquery produced more than one row
×
×
  • Criar Novo...