Ir para conteúdo
Fórum Script Brasil

Jhonas

Monitores
  • Total de itens

    9.657
  • Registro em

Tudo que Jhonas postou

  1. Veja se ajuda .... este exemplo usando intraweb com datamodule http://www.linhadecodigo.com.br/Artigo.aspx?id=372 um artigo sobre intraweb que pode esclarecer muitas duvidas http://www.delphibr.com.br/artigos/iw1.php não sei se pode lhe interessar, mas vai uma dica .... como Incluir o evento onClick no DBgrid unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, DBGrids, DB, DBTables; type thack = class(tcontrol); TForm1 = class(TForm) Table1: TTable; DataSource1: TDataSource; DBGrid1: TDBGrid; Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin THack(dbgrid1).controlstyle := THack(dbgrid1).controlstyle + [csClickEvents]; THack(dbgrid1).OnClick := Form1.OnClick; end; procedure TForm1.FormClick(Sender: TObject); begin ShowMessage(‘Teste’); application.processmessages; end; end. abraço
  2. colega o SimpleDataSet esta com alguns bugs que ainda não foram solucionados prefira a combinação de componentes SQLConnection + DataSetProvider + ClientDataSet abraço
  3. Este componente (ClientDataSet) esta na aba Midas do delphi pela imagem do form que voce enviou, da para perceber que voce ainda não tem experiencia com os componentes do delphi ... leia as apostilas que indiquei, vão lhe ajudar muito neste assunto. abraço
  4. Jhonas

    Rtl70.bpl

    Oi Andreia ... o problema pode estar no executavel gerado ( roda no seu micro porque ele acha os arquivos necessarios ) mas em outro ele não encontra e pede ... no seu delphi clique no item de menu Tools na opção Environment Options ... clique na aba Library ... procure no Library Path se existe o caminho para a bpl que o executavel esta pedindo ( não deve estar lá ) ... adicione o caminho para esta bpl e recompile o programa. abraço
  5. é um componente para uso com arquivos CDS é um ClientDataSet help do delphi > TClientDataSet implements a database-independent dataset. te dei 2 exemplos ... de como jogar o conteudo da tabela em um edit e no outro de tabela para tabela e salvando no final Se voce for iniciante no delphi aconselho a fazer o download das apostilas e ler para entender melhor a programação delphi .... tem vários exemplos http://www.portaldaprogramacao.com/apostilas.asp?c=10 abraço
  6. alguns exemplos de formatação de strings para um stringgrid procedure TForm1.BitBtn1Click(Sender: TObject); begin StringGrid1.Cells[1,1] := Format('%8.2f',[123.50]); StringGrid1.Cells[1,2] := Format('%8.2f',[5.]); StringGrid1.Cells[1,3] := Format('%8.2f',[0.5]); StringGrid1.Cells[1,4] := Format('%m',[1110.5]); StringGrid1.Cells[2,1] := Formatfloat('#,##0.00',(123.50)); StringGrid1.Cells[2,2] := Formatfloat('0.00',(5)); StringGrid1.Cells[2,3] := Format('%*.*f',[6,2,0.5]); StringGrid1.Cells[2,4] := Formatfloat('#,##0.00',(1235.50)); end; OBS: para o DBGrid no clientedataset (de 2 clicks no clientdtaset para vizualizar os campos da sua tabela) é melhor usar a propriedade DisplayFormat = ,0.00;-,0.00 e a propriedade EditFormat = ,0.00;-,0.00 .... é mais prático do que DBGrid1.Fields[8].EditMask := '!999.99;1;_'; abraço
  7. use o comando Locate para procurar na tabela produtos vendidos os valores da tabela produtos cadastrados ... uma vez encontrado o codigo 1 ai vai pegar o nome,marca,fornecedor,preço e quantidade do produto e preencher ali automaticamente na FORM dos produtos vendidos. exemplo CDS_Produtos.First; if CDS_Produtos.Locate('Codigo',(trim(ComboBox1.Items.Strings[ComboBox1.ItemIndex])),[loCaseInsensitive, loPartialKey]) then begin Edit1.Text := CDS_ProdutosCodigo.AsString; // no lugar do edit poderia ser o campo da outra tabela Edit2.Text := CDS_ProdutosProduto.AsString; end; uma vez que voce tenha adicionado os registros na outra tabela é só salvar CDS_Produtos.First; if CDS_Produtos.Locate('Codigo',(trim(ComboBox1.Items.Strings[ComboBox1.ItemIndex])),[loCaseInsensitive, loPartialKey]) then begin CDS_VendasCodigo.Append; CDS_VendasCodigo.Edit; CDS_VendasCodigo.AsString:= CDS_ProdutosCodigo.AsString; CDS_VendasProduto.AsStrng:= CDS_ProdutosProduto.AsString; CDS_VendasCodigo.Post; CDS_VendasCodigo.ApplayUppdates(-1); end; abraço
  8. Jhonas

    Rtl70.bpl

    procure e copie o arquivo rtl70.bpl para dentro da pasta Bin do delphi C:\Arquivos de programas\Borland\Delphi5\Bin ou C:\Arquivos de programas\Borland\Delphi7\Bin abraço
  9. mande traduzir a pagina para voce poder entender melhor o processo http://finn.mobilixnet.dk/delphi/service/service.htm Como fazer um aplicativo em Delphi, iniciar como serviço ? http://forum.devmedia.com.br/viewtopic.php...498d5738e#73829 outra duvida parecida com a sua http://info.abril.com.br/forum/forum.php?tópico=271006 abraço
  10. Vou tentar dar uma ideia ... modifique o codigo para as suas necessidades unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids, Db, DBTables, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; DataSource1: TDataSource; Query1: TQuery; DBGrid1: TDBGrid; Query1PAPEL: TStringField; Query1COD: TStringField; Query1NUM: TFloatField; Timer1: TTimer; procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } ver : integer; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin If odd(query1.RecNo) then begin DBGrid1.Canvas.Font.Color:= clBlack; DBGrid1.Canvas.Brush.Color:= cl3DLight; end else begin DBGrid1.Canvas.Font.Color:= clBlack; DBGrid1.Canvas.Brush.Color:= clWhite; end; DBGrid1.Canvas.FillRect(Rect); DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State); if (Column.Field.FieldName = 'NUM') and (Query1NUM.AsInteger = 3) then // valores no estoque = a 3 begin ver := 1; DBGrid1.Canvas.Font.Color:= clRed; DBGrid1.Canvas.FillRect(Rect); DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State); end else begin ver := 0; DBGrid1.Canvas.Font.Color:= clBlack; DBGrid1.Canvas.FillRect(Rect); DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State); end; end; procedure TForm1.Timer1Timer(Sender: TObject); var myDLG : TForm; begin if ver = 1 then begin myDLG := CreateMessageDialog('Valor = ou menor que 3!', mtWarning, []); // não mostra nenhum botão myDLG.Show; myDLG.Refresh; sleep(2000); // mostra a mensagem por 2 segundos myDLG.Release; // apaga a mensagem end; end; end. Explicação: declarei uma variavel publica chamada 'ver' dentro do evento do dbgrid DrawColumnCell mudo a cor do numero que for = ou menor que 3 para veremelho (como se a quantidade no estoque chegasse a 3 ) e neste caso a minha variavel publica 'ver' recebe o numero 1, indicando que encontrei uma quantidade baixa no estoque. o timer faz uma leitura da variavel 'ver' a cada 5 segundos, se o valor desta variavel for 1, indicando uma quantidade baixa no estoque, então usuario ficara recebendo a mensagem ate que o valor seja corrigido para uma quantidade acima de 3 a sua DLL pode ser excutada no timer de tempos em tempos para verificar a quantidade de estoque no arquivo OBS: já fiz um sistema de controle de estoque, onde coloquei uma mensagem de estoque baixo somente quando o funcionario fosse lançar um item de venda, e acabei por gerar um relatorio de itens com estoque baixo. O fato de ficar mostrando para o usuario uma mensagem repetitiva enquanto a quantidade não for mudada como voce quer não vai agradar o cliente. abraço
  11. vai uma sugestão que o Micheus postou http://scriptbrasil.com.br/forum/index.php...st&p=424423 abraço
  12. dependendo da versão do Jedi voce vai er problemas em algumas máquinas, a solução estaria em voce baixar a versão mais recente do Jedi ( versões anteriores tinham bugs ... para a versão 2.10 foi criado um Fix ) da uma olhada neste endereço http://sourceforge.net/project/showfiles.php?group_id=45786 abraço
  13. Utilizei o DSPack para capturar imagens da WebCam em meu sistema. muito bom com exemplos http://www.progdigy.com/modules.php?name=DSPack Outros http://www.viscomsoft.com/demo/videocaplivesetup.exe Aqui tem uma vcl para o delphi e é open source: http://www.mitov.com/html/download_videolab.html Se quiser algo mais simples http://tscap32.sourceforge.net/ ou para o delphi 7 http://www.delphi32.com/vcl/5334/download,xid,5334.asp abraço
  14. Neste caso a mensagem devera ficar aparecendo por quanto tempo ?
  15. voce pode fazer algo assim para qualquer botao para retornar true ou false unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; n : integer; tipo : boolean; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin n := n + 1; if n = 1 then begin tipo := true; label1.Caption := 'true'; // mostra o resultado end else begin tipo := false; label1.Caption := 'false'; // mostra o resultado n := 0; end; end; end. abraço
  16. vou tentar reponder algumas das suas duvidas procedure TFMenu.Calculadora1Click(Sender: TObject); begin //uses shellApi if MessageDlg('Deseja usar Calculadora Simples ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin RxCalculator1.Execute; // calculadora do RX end else WinExec(pchar('calc.exe') ,sw_ShowNormal); // calculadora do windows end; -------------------------------------------------------------------------------- Se voce usar a VCLSKIN demo no seu programa até pode, só que ai ter o incomodo de ficar mostrando DEMO no caption do seu form. voce tem 2 opções: ou arruma uma VCLSKIN que não seja demo ou compra. --------------------------------------------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); var i : integer; begin ComboBox1.Clear; ListBox1.Clear; for i := 1 to Query1.RecordCount-1 do begin ComboBox1.Items.Append(Query1COD.Value); //adiciona itens do dbgrid ao combobox ListBox1.Items.Append(Query1COD.Value); //adiciona itens do dbgrid ao listbox Query1.Next; end; end; --------------------------------------------------------------------------------- OBS: na verdade voce so fecha um relatorio se clicar no botao close do QuickReport supondo que voce deixou o relatorio ( QuickReport ) aberto.... fechar somente desta maneira procedure TFMenu.Timer1Timer(Sender: TObject); begin //if timetostr(time()) >= '21:00:00' then if time() >= strtotime('21:00:00') then begin QRFatura.Destroy; QRFatura.FreeOnRelease; end; end; --------------------------------------------------------------------------------- procedure TFMenu.Timer1Timer(Sender: TObject); begin // uses shellApi; if time() >= strtotime('20:00:00') then WinExec('Shutdown -s -f -t 00', SW_HIDE); //desliga o sistema quando for 20:00 horas ou + //WinExec('Shutdown -r -f -t 00', SW_HIDE); //reinicia o sistema end; --------------------------------------------------------------------------------- procedure TFMenu.Timer1Timer(Sender: TObject); begin StatusBar1.Panels.Items[1].Text := datetostr(now); // mostra a data numa barra de Status StatusBar1.Panels.Items[2].Text := timetostr(time()); // mostra a hora numa barra de Status end; --------------------------------------------------------------------------------- aproveitando o post do amigo Eder procedure TFORM1.QrpToImg(QR: TQuickRep; Path: string; Tipo: Integer); var BMP: TBitmap; JPG: TJPegImage; aUnits: TQRUnit; i: Integer; begin // Gera o relatório em memória. QR.Prepare; // Pega unidade de medida atual no QReport. aUnits := QR.Units; // Altera unidade de medida para Pixels. QR.Units := Pixels; try for i := 1 to QR.QRPrinter.PageCount do begin // Cria Bitmap. BMP := TBitMap.Create; // Cria JPeg. JPG := TJPegImage.Create; try // Define tamanho do Bitmap de acordo com o tamanho da página do QReport. BMP.Width := Round(QR.Page.Width); BMP.Height := Round(QR.Page.Length); // Pegar página a página. QR.QRPrinter.PageNumber := i; // Atribui a página ao Bitmap. BMP.Canvas.Draw(0, 0, QR.QRPrinter.Page); // Transfere também para JPeg. JPG.Assign(BMP); // Salvar em disco. if Tipo = 0 then BMP.SaveToFile(Path + 'Pagina' + IntToStr(i) + '.bmp') else if Tipo = 1 then JPG.SaveToFile(Path + 'Pagina' + IntToStr(i) + '.jpg'); finally // Libera objetos. BMP.Free; JPG.Free; end; end; finally // Volta unidade de medida. QR.Units := aUnits; end; end; 4-No botão para Salvar coloque: QrpToImg(FORM2.QuickRep1,'C:\',1); //Exporta o Quick para JPG
  17. Exportando Relatório do QuickReport para HTML, DOC, TXT ou XLS Na clausula uses, acrescente a unit QRExport Exportando para HTML: QuickReport.ExportToFilter(TQRHTMLDocumentFilter.Create('c:\teste.html')); Exportando para DOC ou TXT: QuickReport.ExportToFilter(TQRAsciiExportFilter.Create('c:\teste.doc')); QuickReport.ExportToFilter(TQRAsciiExportFilter.Create('c:\teste.txt')); Exportando para XLS: QuickReport.ExportToFilter(TQRXLSFilter.Create('c:\teste.xls')); abraço
  18. Jhonas

    Ajuda com IP cliente

    Para modificar ou excluir o ip você entra em MEUS LOCAIS DE REDE clica em exibir conexões de rede seleciona a conexão de rede que você usa em sua rede local clica com o botão direito do mouse e vai em prorpiedades clica em protocolo TCP/IP e clica em propriedades modifica o ip como no exemplo e clica em ok! Ex: ip pc - 192.168.1.1 Mascara de subrede pc- 255.255.255.0 gateway padrão - 192.168.1.1 abraço
  19. Jhonas

    Ver micros na rede

    voce pode usar esta procedure procedure FindComputers(Workgroup: string; aResList: TStrings); var eNumHandle : THandle; WorkgroupRS : TNetResource; Buf : array[1..500] of TNetResource; BufSize : DWORD; Entries : DWORD; Result : integer; sComputer: String; begin if not Assigned(aResList) then Exit; aResList.Clear; WorkGroup := Workgroup + #0; FillChar(WorkGroupRS, SizeOf(WorkGroupRS), 0); with WorkgroupRS do begin dwScope := 2; dwType := 3; dwDisplayType := 1; dwUsage := 1; lpRemoteName := @Workgroup[1]; end; WNetOpenEnum(Resource_GlobalNet, ResourceType_Any, 0, @WorkgroupRS, ENumHandle); repeat Entries := 1; BufSize := SizeOf(Buf); Result := WNetENumResource(ENumHandle, Entries, @Buf, BufSize); if (result = NO_Error) and (Entries = 1) then begin sComputer:= StrPas(Buf[1].lpRemoteName); aResList.Add(Copy(sComputer, 3, Length(sComputer)-2)); end; until (Entries <> 1) or (Result <> NO_Error); WNetCloseENum(ENumHandle); end; ou pode usar este componente ele acha as máquinas da rede e lista!!! classe TNetUsers http://www.delphi32.com/vcl/2249/ abraço
  20. Uma solução seria usar campo autoincremento, para não causar erros na inclusão. outras soluções Quando você programar visando uma rede e quiser bloquear um arquivo, é só chamar o metodo "Edit" da Tabela que estiver usando. Exemplo: Table1.edit; //Se o registro já estiver bloqueado, ocorrerá um erro, então você deve fazer o seguinte : try { para verificar o erro } Table1.edit; exception on TDBEngineError do { o erro..} MensageDlg('Registro já esta sendo usado...!',mtInformation,[ mbOk ],0 ); end; //não use o DBNavigation //Bloqueia uma Tabela paradox procedure LockPDOXTable(TableName,Password : String); // Requer a DBIProcs na clausula uses da unit var TblDesc: CRTblDesc; LocDB : TDatabase; begin Check(DBIInit(nil)); Randomize; LocDB := TDatabase.Create(nil); with LocDB do begin Params.Add('path=' + ExtractFilePath(TableName)); DatabaseName := 'PDOXEncryptDB' + IntToStr(Random(50)); DriverName := 'STANDARD'; Connected := True; FillChar(TblDesc, SizeOf(CRTblDesc), 0); StrPCopy(TblDesc.szTblName, ExtractFileName(TableName)); with TblDesc do begin bProtected := True; StrPCopy(TblDesc.szPassword, Password); end; try Check(DbiDoRestructure(LocDB.Handle, 1, @TblDesc,nil, nil, nil, False)); finally LocDB.Free; DBIExit; end; end; outra função function IsRecordLocked(Table: TTable; ByAnyone: Boolean): Boolean; // // Testa se o registro da tabela está travado ou não // // Requer a DBIprocs declarada na clausula uses da unit // var Locked: BOOL; hCur: hDBICur; rslt: DBIResult; begin Table.UpdateCursorPos; Check(DbiIsRecordLocked(Table.Handle, Locked)); Result := Locked; if (not Result) and (ByAnyone) then begin Check(DbiCloneCursor(Table.Handle, False, False, hCur)); try rslt := DbiGetRecord(hCur, dbiWRITELOCK, nil, nil); if (rslt <> DBIERR_NONE) then begin if (HiByte(rslt) = ERRCAT_LOCKCONFLICT) then begin Result := True; end else begin Check(rslt); end; end else begin Check(DbiRelRecordLock(hCur, False)); end; finally Check(DbiCloseCursor(hCur)); end; Function LockTable(Tb: TTable; Vezes: Integer): Boolean; // // Testa se a tabela esta bloqueada ou não // // Requer DBIprocs, DB, DBTables] // declarados na clausula Uses da unit // var FlagLock : Boolean; Abandonou : Boolean; Sempre : Boolean; Ind : Integer; Quant : Integer; Temp : String; NomeArq : String; Mensagem : String; begin Sempre := (Vezes = 0); FlagLock := True; Abandonou := False; Quant := 0; NomeArq := ''; Temp := Tb.TableName; Ind := 1; while Ind <= Length(Temp) do begin if Copy(Temp,Ind,1) = '.' then begin Ind := Length(Temp); end else begin NomeArq := NomeArq + Copy(Temp,Ind,1); end; Ind := Ind + 1; end; NomeArq := UpperCase(NomeArq); Mensagem := 'O arquivo "'+NomeArq+'" está sendo usado por outro usuário da rede.'+#13; Mensagem := Mensagem + 'Deseja continuar tentando acessar este arquivo ?'; while FlagLock do begin try Tb.LockTable(ltWriteLock); FlagLock := False; except if (Quant > Vezes) and not Sempre then begin if MessageBox(GetActiveWindow, Pchar(Mensagem),'Confirmação', MB_ICONQUESTION+MB_YESNO+MB_HELP) = idYes then begin Quant := 0; end else begin FlagLock := False; Abandonou := True; end; end; end; Quant := Quant + 1; end; Result := not Abandonou; end; function RLock(oTable : TTable): Boolean; // // Testa se o registro está travado ou não // begin result := false; try oTable.Edit; except on E:EDBEngineError do begin if E.Errors[0].ErrorCode = 10241 then begin Result := True; end; end; end; end; Procedure TableUnlock(Tb: TTable); // // Desbloqueia uma tabela // // Requer DBIprocs, DB, DBTables // declarados na clausula uses da unit // Var i, ilocks: word; begin dbiIsTableLocked( Tb.Handle, dbiWRITELOCK, iLocks ); For i :=1 to ilocks do // Remove todos os locks begin Tb.UnlockTable(ltWriteLock); end end; agora é so usar a imaginação abraço
  21. 'select * from cad_eventos where data =:date and horario > :hora order by horario desc' mas a select esta trazendo todos os registros da data escolhida e horario maior que o horario atual, neste caso o foco estara no primeiro registro que é o proximo evento ..... ao fazer nova pesquisa, o que era registro atual não sera mostrado, mas sim, o proximo como registro atual ..... por isso que dei a ideia para fazer a pesquisa dentro de um timer, onde voce pode controlar a data, o tempo e os eventos abraço
  22. DBGrid2.Columns.SaveToFile(ExtractFilePath(Application.ExeName) + 'GridSai.ini'); DBGrid2.Columns.LoadFromFile(ExtractFilePath(Application.ExeName) + 'GridSai.ini'); abraço
  23. Josimarz .. melhor voce postar o codigo onde o mesmo pergunta se deseja salvar o conteúdo antes de fechar. fica melhor para achar uma solução... abraço
  24. OBS: com relação ao post anterior, deu erro para voce porque voce não colocou os uses necessarios uses shlobj, registry; vai um outro exemplo unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} function Executa (Arquivo : String; Estado : Integer) : Integer; var Programa : array [0..512] of char; CurDir : array [0..255] of char; WorkDir : String; StartupInfo : TStartupInfo; ProcessInfo : TProcessInformation; begin StrPCopy (Programa, Arquivo); GetDir (0, WorkDir); StrPCopy (CurDir, WorkDir); FillChar (StartupInfo, Sizeof (StartupInfo), #0); StartupInfo.cb := sizeof (StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW; StartupInfo.wShowWindow := Estado; if not CreateProcess (nil, Programa, nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then Result := -1 else begin WaitForSingleObject (ProcessInfo.hProcess, Infinite); //GetExitCodeProcess (ProcessInfo.hProcess, Result); end; end; procedure TForm1.Button1Click(Sender: TObject); begin // associar o executavel AbrirQRP.exe ao arquiv.QRP Executa (pchar('D:\Prj\AbrirQRP>AbrirQRP.exe C:\Temp\Arquivo.QRP') ,sw_hide); end; end. abraço
  25. Esta procedure mostra num listbox todas as placas de som instaladas uses mmsystem; procedure GetWaveOutDevices(DeviceNames: TStrings); var DNum: Integer; i: Integer; Caps: TWaveOutCapsA; begin DNum := waveOutGetNumDevs; // Number of Devices for i := 0 to DNum - 1 do // Query Devicenames begin waveOutGetDevCaps(i, @Caps, SizeOf(TWaveOutCapsA)); DeviceNames.Add(string(Caps.szPname)); end; end; procedure TForm1.Button1Click(Sender: TObject); begin GetWaveOutDevices(Listbox1.Items); end; OBS: Sei que é possivel direcionar o arquivo de som, especificamente para uma placa de som, mas ainda não usei .... voce vai achar mais informações no help do delphi ( existem mais funçoes para controle de som ) abraço
×
×
  • Criar Novo...