Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. Micheus

    Delphi Com Access

    João Batista, eu já utilizei desta forma para executar funções escritas nos módulos. Veja se este exemplo funciona para macros também: procedure TForm1.Button3Click(Sender: TObject); var OLEAccess :OLEVariant; Extenso :Variant; begin try // Se já estiver rodando... OLEAccess := GetActiveOleObject('Access.Application'); except // Carrega caso não esteja rodando OLEAccess := CreateOleObject('Access.Application'); end; OLEAccess.Visible := False; // Deixa o access oculto OLEAccess.OpenCurrentDatabase('C:\Projetos\EMI\EMI.mdb', True); // abre o banco de dados em questão Extenso := OLEAccess.Run('Extenso', '123,55'); // nome da função, seguido do parâmetro Label1.Caption := VarToStr(Extenso); // Converte resultado em variant para string OLEAccess.Quit(2); // Sai sem gravar end; []s
  2. Micheus

    Interbase/delphi

    No FireBird o procedimento seria este que achei em certa oportunidade no Firebase-br (link): //6. Para alterar esta senha faça: gsec -user SYSDBA -password masterkey GSEC> modify SYSDBA -pw nova_senha Acredito que deva haver a mesma coisa para o IB. Dê uma olhada, e não esqueça de fazer um backup antes!
  3. Micheus

    Ajuda Com Ini

    Valdecir, acho que é a forma como você está informando o caminho da rede. Se você está realmente informando:\\\Phoenix2:\C:\VDLR - Controle SMS\BDados\BDSMS.GDB acho que o mais correto seria (sem utilizar os dois pontos): \\Phoenix2\C\VDL - Controle SMS\BDados\BDSMS.GDB Essa é uma dúvida mais fácil de resolver. Se você tiver acesso a este diretório em design-time, você pode no botãozinho, da propriedade DatabaseName de seu DataBase e localizar o arquivo no local que você está tentando utilizar. Daí não tem erro, você vai estar sabendo como fica o caminho completo (que parece-me será neste último formato). []s
  4. Micheus

    Ajuda Com Ini

    Valdecir, já tinha lido seu post, mas não estava podendo averiguar alguns detalhes. Basicamente, a propriedade Params do seu DataBase deverá ter essas linhas (considerando o usuário padrão): user_name=SYSDBA password=masterkey ou seja, quando eu coloquei no posta anterior: Eu cometi um erro, porque afirmei algo que "lembrei de cabeça", e obviamente, agora, vejo que minha cabeça tá meio capenga. :D Observe que coloquei user=, quando deveria ter colocado user_name=, induzindo você ao erro. Esta deve ser a causa dasd mensagens: e Desculpe-me. Corrija isto e verifique como fica. []s
  5. Micheus

    Quickreport

    Eder, você poderia dar um exemplo de como deveria ser o resultado para ajudar a entender? Quem sabe possa dar alguma sugestão. []s
  6. não vou poder ver agora. mas dê uma olhada no help sobre o ADOQuery (selecione o compontente e pressione F1) procure nas propriedades e em parameters. Tenho quase certeza que há um meio similar a AsString
  7. #&%#@!!! Foi mal, entendi errado.
  8. não é bem assim. O % significa que seu like encontrará todas as pessoas que tiverem o conteúdo em edit1.text em qualquer posição do nome.Ex.: MARIA JOSEFA JOSE ANTONIO se você procurar por JOSE, vão aparecer os dois. Se você quer que aparece todos que começam com JOSE, você concatenaria o último % apenas. Já se quizesse que terminasse com JOSE, concatenaria o primeiro. Que componente você utiliza para a consulta. Se fosse TQuery, a propriedade seria Params (não parameters). Qual foi a mensagem do compilador no erro do post anterior?
  9. s3c, aparentemente não há problemas com o abrir e fechar pelo menos com o W2K e XP, mas fico em dúvida se funcionaria com as versões anteriores (tentarei testar no Me amanhã) porque pela nota que lí no final deste artigo (msdn - Calling DeviceIoControl), há risco de não funcionar (tem que testar para comprovar). Paulo, Considerando a questão de compatibilidade, há um meio simples de listar as unidades de disco ótico (CD/DVD), através da combinação das funções da API GetLogicalDriveStrings e GetDriveType. O exemplo abaixo adiciona a uma lista a letra dos dipositivos óticos encontrados:procedure TForm1.Button1Click(Sender: TObject); var pIdx :PChar; sDrives :array[0..255] of char; sDrive :string; begin if GetLogicalDriveStrings(SizeOf(sDrives)-1, sDrives) > 0 then begin pIdx := sDrives; while pIdx^ <> '' do begin sDrive := Copy(pIdx, 1, 2); if GetDriveType(PChar(sDrive)) = DRIVE_CDROM then ListBox1.Items.Add('(CD/DVD) '+sDrive); Inc(pIdx, 4); end; end; end;Entretanto para saber se é um dispositivo de DVD ou CD, a coisa novamente complica um pouco. Utilizando das funções IOCTL só conseguimos a resposta correta a partir do W2K. Se interessar a alguém, tem uma versão em VB neste link mas luizf pra que você quer que seu programa faça com que a bandeja fecha sendo que se ela abre pro usuário por ou tirar o dvd, então impossível um programa saber se ele já colocou ou tirou, então acho que cabe ao usuário fechar e não ao sistema, onde entre ele clicar em um botao no seu sistema pra fechar a gaveta ou fecha-la manualmente é mais conveniente fechar manualmente pois ele vai tar colocando ou tirando um dvd mesmo, já vai estar com a mão na massa rsr Churc, dá para saber sim se há ou não um CD na bandeja dentro do gabinete. O lance é processar a mensagem WM_DEVICECHANGE. O parâmetro DBT_DEVICEARRIVAL só chega quando a gaveta é fechada e tem uma mídia dentro. Tem um exemplo completo na página do Torry's (link) []s
  10. uhmm. Estamos falando do componente TQuery? Qual a mensagem do compilador? Em todos os casos, se você abandonar a idéia do parâmetro (eu particularmente prefiro esta opção), você pode concatenar a string utilizando a função QuotedStr: ... DataModule2.Q_pessoa.SQL.Add('SELECT pessoa.*, cliente.limite, cliente.data_cad, cliente.situacao FROM pessoa INNER JOIN cliente ON pessoa.cod_pessoa = cliente.cod_pessoa WHERE pessoa.nome LIKE ' +QuotedStr(edit1.Text); DataModule2.Q_pessoa.Open;Se não estou enganado é assim. Não. Quiz dizer o driver da BDE. []s
  11. Pu££3y, duas observações: 1) você deverá utilizar o método Open e não ExecSQL. Este último você utiliza com comandos do tipos INSERT, DELETE em seu comando SQL. de: DataModule2.Q_pessoa.ExecSQL; para: DataModule2.Q_pessoa.Open; 2) Não tenho certeza, mas sempre que não defino o parâmetro em design-time, eu passo ele para a query com AsString e não Value. de: DataModule2.Q_pessoa.Parameters.ParamByName('filtro').Value:=edit1.Text; para: DataModule2.Q_pessoa.Parameters.ParamByName('filtro').AsString:=edit1.Text;
  12. Pu££3y, se você vai passar este valor por parâmetro, só o que você precisa é fazer algo assim: Q_pessoa.Close; Q_pessoa.SQL.Clear; Q_pessoa.SQL.Add('SELECT pessoa.*, cliente.limite, cliente.data_cad, cliente.situacao FROM pessoa INNER JOIN cliente ON pessoa.cod_pessoa = cliente.cod_pessoa WHERE pessoa.nome LIKE :parameto'); Q_pessoa.ParamByName('parametro').AsString := 'pulley'; Q_pessoa.Open; as aspas vão ficar por conta do drive na hora que enviar a consulta para o banco. Era isso? []s
  13. Paulo, acho que teria que trocar o for por while, por exemplo: function SeraQueSouPrimo(N: Int64): Boolean; var Testando: Int64; begin SeraQueSouPrimo := True; Testando := 2; // com a dica do visitante: Testando := 3; while Testando <= (N -1) do begin if (N mod Testando) = 0 then begin SeraQueSouPrimo := False; break; {jump out of the for loop} end; Testando := Testando +1; // com a dica do visitante: Testando := Testando +2; end; end;
  14. Formatando horas além das 23:59h O principal uso desta função é o de apresentar em relatórios ou tela, a totalização de horas com resultado superior a 23:59:59, que não é contemplada pelas funções de conversão padrão. Assim, podemos apresentar um somatório de horas como por ex. 125:38:15. function FullTimeToStr(SUMTime: TDateTime): string; var StrHor, StrMin :string; TotHor :double; begin TotHor := SUMTime *24; if (TotHor -Trunc(TotHor)) > 0.9999 then TotHor := Round(TotHor); StrHor := FormatFloat('##0:', Int(TotHor)); StrMin := FormatDateTime('nn:ss', Frac(TotHor)/24); Result := StrHor +StrMin; end; Explicando: Chama-se a função passando para o parâmetro SUMTime o total de horas que se obteve na consulta ou componente. Multiplicamos por 24, para transformar os dias (parte inteira) em horas já somando com a hora cheia contida na parte fracionária. TotHor := SUMTime *24; O teste a seguir, visa corrigir problema relacionado a casas decimais, quando, por ex., 25.0000000008 se tornaria 24.99999 retornando 24 no uso da função Int na etapa seguinte. (correção incluida em 02/12/06) if (TotHor -Trunc(TotHor)) > 0.9999 then TotHor := Round(TotHor); Em seguida, Formatamos a hora "cheia", utilizando a parte inteira da variável. A parte fracionária estará contendo os minutos e segundos. StrHor := FormatFloat('##0:', Int(TotHor)); Dividimos a parte fracionária (atual) por 24, para obtermos novamente o formato time. Podemos então utilizar normalmente a função de formatação para obtermos a fração de tempo restante: StrMin := FormatDateTime('nn:ss', Frac(TotHor)/24); O resultado da função é a concatenação dos resultados: Result := StrHor +StrMin;
  15. s3c, essa idéia do uso do uso de DeviceIOControl (IOCTL) mais interessante, já que não depende de questões como idioma, o que torna mais genérico seu uso. Ficamos de quaquer modo, para ambas as opções, com a questão de saber qual a letra do CD ou DVD, certo?! Então, eu havia encontrado no site ma Micro$oft um exemplo de como obter informações, justamente utilizando recursos IOCTL, sobre como descobrir quantos, quais e detalhes dos drivers de CD's instalados. O detalhe é que achei o código meio comprido, em C++ e estou meio sem tempo para converter. Talvez algum colega, se habilite a dar uma enxugada no código de modo apenas a obter os drivers (respectivas letras) para serem utizados com com a opção que você postou utilizando IOCTL. []s
  16. Bom, eu tenho apenas um Gravador de DVD, então acho que não estou entendendo direito o problema, pois a alguns posts acima (post do Paulo Bergo) o comando que está aparentemente configurado para executar no CD - cdaudio (ele comenta que funciona apenas com CD) está funcionando com meu gravador. E se eu trocar por digitalvideo ou videodisc não funciona. Alguém tentou com estes antes? Os device types deveriam ser um destes: cdaudio, digitalvideo, videodisc ou MCI_DEVTYPE_CD_AUDIO, MCI_DEVTYPE_DIGITAL_VIDEO, MCI_DEVTYPE_VIDEODISC; quando aplicável (msdn). s3c, mas se pode haver problemas com o idima, será que é uma boa saída?
  17. Micheus

    Ajuda Com Ini

    Vixe!!! :blink: A mensagem 'Database name is missing' acho que é bem clara. Aparentemente não está sendo encontrado o banco de dados ou algo parecido. Na verdade, acredito que você esteja passando "nulo" para o nome do banco ao abrí-lo. Observe: 1) no OnCreate do form você chama o Grava_Configuracao, passando as variáveis locais, não inicializadas. Ou seja, não tem nada nelas e, além de tudo, se o arquivo existir, você queima seu conteúdo; 2) no evento OnShow do form você, inicialmente, tenta abrir o banco de dados sem ter ainda carregado para ele os parâmetros que você deveria ler do arquivo INI; A seguir, após tentar conectar ao banco (fazendo até 100 tentativas :o), você fecha a conexão, lê as configurações do arquivo e concatena as informações, até onde sei de forma incorreta. Os parâmetros para o banco devem ser: user=<nome usuario> password=<senha> ou seja: IBContrSMS.Params.Add('user='+Usr); IBContrSMS.params.Add('password='+PWS); SYSDBA é o usuário padrão (administrador) do banco de dados IB ou FB; masterkey é a senha padrão para o administrador. Mas, dê também uma olhada na procedure Ler_Configuracao: ... URL := BDSMS.ReadString('Database','\\Phoenix2\C\VDL - Controle SMS\BDados\BDSMS.GDB',URL); USR := BDSMS.ReadString('Database','SYSDBA',USR); PWS := BDSMS.ReadString('Database','masterkey',PWS); ... você está lendo as chaves incorretamente. Voce criou as chaves no arquivo INI com os seguintes nomes: BDSMS.WriteString('Database','Local',URL); BDSMS.WriteString('Database','user_name',USR); BDSMS.WriteString('Database','password',PWS); então, você deveria lê-los assim: URL := BDSMS.ReadString('Database','Local', '\\Phoenix2\C\VDL - Controle SMS\BDados\BDSMS.GDB'); USR := BDSMS.ReadString('Database','user_name', 'SYSDBA'); PWS := BDSMS.ReadString('Database','password', 'masterkey'); O segundo parâmetro é o nome da sessão e o terceiro é o valor padrão, caso a chave não seja encontrada. Acho que o procedimento seria, no OnCreate do form, verifica se o arquivo INI existe. Se não existir cria as chaves com valores padrão; Em seguida lê o conteúdo do arquivo; Inicializa os parâmetros da conexão e tenta abrí-la. Não há razão para ficar tentando por tantas vezes. outra coisa, para evitar problemas futuros, utilize corretamente o try...finally no procedimento Gravar_Configuracao, deveria fica assim:... SetCurrentDir(ExtractFilePath(Application.ExeName)); BDSMS := TIniFile.Create(GetCurrentDir + '\Database.ini'); Try BDSMS.WriteString('Database','Local',URL); BDSMS.WriteString('Database','user_name',USR); BDSMS.WriteString('Database','password',PWS); Finally BDSMS.Free; End; ... você está utilizando o Finally para garantir que a memória alocada por BDSMS seja liberada. Certo?! Bom, se você coloca o create dela dentro do Try e ocorre uma exeção no momento da criação, você irá liberar algo que ainda não foi alocado. Esteja atento a esses detalhes. ;) []s
  18. Micheus

    Arquivo Html

    Gerar HTML a partir do Quickreport segue esta dica - post, Mas parece que em alguns casos o resultado é ruim. Não testei, mas dê uma olhada nestes link's: 1) Gerar PDF como componente específico 2) PDF a partir do QuickReport
  19. Micheus

    Ajuda Com Ini

    Esta mensagem pode ser ignorada (é apenas uma advertência) [Error] LembrDoc.pas(125): Incompatible types: 'String' and 'procedure, untyped pointer or untyped parameter' [Error] LembrDoc.pas(126): Incompatible types: 'String' and 'procedure, untyped pointer or untyped parameter' [Error] LembrDoc.pas(127): Incompatible types: 'String' and 'procedure, untyped pointer or untyped parameter' [Error] LembrDoc.pas(131): Illegal character in input file: '}' ($7D)Estes erros, você terá que verificar, pois estão numa parte do código que não está postado aqui. A mensagem diz que o identificador Url não está declarado. Não dá para advinhar, já que a unit está com você e não sábe-se o que está em que linha. Mas a linha 243 parece inicialmente se tratar da chamada ao procedimento Ler_Configuracao que você faz no método FormCreate (evento OnCreate do form), já que você passa Url como parâmetro e aparentemente não está declarada globalmente. Mas o erro seguinte: Aparentemente descarta isto ou, se for verdade, você declarou as variáveis Usr e Psw diferentes de String(tipo esperado pelo prodedimento). Como vê não dá para resolver erros de compilação virtualmente. Qual sua dificuldade em entender as mensagens e tentar resolvê-las? Observe que sempre ao lado do nome da unit que tem o erro, é apresentado entre parênteses o número (provável) da linha onde o erro ocorre.
  20. É melhor dar continuidade ao post original, então veja resposta nele -> link
  21. Vem do post (para dar continuidade ao post anterior). você não citou que campos são habilitados e desabilitados para cada rediobuttom. Assim, vou exemplificar da seguinte forma: vamos supor que existem 4 campos no groupbox e o campo3 é o único que fica habilitado quando a opção lactação é escolhida, os demais campos apenas quando for corte. Então, você cria um evento OnClick do primeiro RadioButton e coloca algo como: procedure TForm1.RadioButton1Click(Sender: TObject); begin campo1.Enabled := RadioButtom_Corte.Checked; campo2.Enabled := RadioButtom_Corte.Checked; campo3.Enabled := RadioButtom_Lactacao.Checked; campo4.Enabled := RadioButtom_Corte.Checked; end;Depois, você seleciona o segundo RadioButton e seleciona este mesmo código (p.e. RadioButton1Click) no evento OnClick dele. Deste modo, qualquer um dos radiobotton que seja selecionado resultará na execução do mesmo procedimento. Com relação a gravar no banco de dados, falta saber que banco e componentes você utiliza. Entretanto, normalmente, se você utilizou o método Insert ou Append do seu dataset (p.e. componentes como o TTable), para gravar você utiliza o método Post. Será que era isto?
  22. Cleverson, se esses dados vem de uma TTable, então significa que as informações dos clientes ficam duplicadas mesmo. Certo?! Se for, a menos que seja proposital, parece que há um problema de modelagem (normalização dos dados - Wikipedia), já que usualmente não devemos duplicar este tipo de informação. Pelo que coloquei acima, para listar apenas uma ocorrência do registro de cliente, você teria mesmo que utilizar uma query com distinct, lembrando que qualquer campo em seu select que possa estar diferente para o mesmo cliente, resultará numa linha extra e, neste caso, ainda resultaria em mais que uma ocorrência do mesmo cliente. A questão, da ordenação alfabética, em termos do uso de um TTable, seria resolvido pela criação de um índice por nome. Já utilizando uma query, basta adicioná-la na cláusula ORDER BY. Levando em conta a questão da normalização, acredito que isto não seria necessário. Com a Query acho que cheguei a conseguir fazer com que os dados não se repetissem, não me lembro se foi com esse código, pois até hoje não entendo muito bem desses comandos SQL, o que me traz dificuldades para Trabalhar com as Query`s!você pode procurar por alguns tutoriais na net. Dê uma olhada em Apostilando, Edu Delphi Page (Veja apostilas). um exemplo de select com distinct seria: SELECT distinct NOME, FONE1, FONE2, ENDERECO FROM CLIENTE ORDER BY NOME levando em conta o comentário que fiz no início do post []s
  23. Micheus

    Regedit

    Paulo, apenas para complementar, o ideal é que a cada fração da chave posicionada, ou seja, cada vez que encontrado um "\" a parte da chave anterior a ele deveria ser checada. Não apenas como eu coloquei, quando verifico apenas a última palavra. É que eu não queria mexer muito no que você postou, apenas dar uma idéia. []s
  24. Micheus

    Regedit

    Pessoal, estava acompanhando o assunto e tenho uma pergunta. Paulo, haverá a possibilidade de a chave a ser presquisada não existir? Ou você sempre verificará que ela existe antes de abrir o RegEdit? Pergunto isto porque, por exemplo, se você procurar pela chave: \HKEY_CURRENT_USER\Software\Freeware\Teste 5 e existir apenas: \HKEY_CURRENT_USER\Software\Freeware\Teste 2, ou mesmo não existir, o editor ficará posicionado na chave errada. Passei umas horas pesquisando como ler o texto do nó selecionado, de modo a testar para ver se é o esperado. Isto, porque tem uma função da API (TreeViewGetItem) e uma mensagem também (TVM_GETITEM) que deveria funcionar, mas não funcionava. Encontrei o seguinte comentário em Experts-Exchange(link): The common control messages cannot be used across process boundaries. You will need to use an injected DLL and communicate with the DLL as to what the common controls contain. O que parece justificar o motivo de a aplicação teste não "acessar" dados do RegEdit. E acho que é isto mesmo porque achei no Delphi-PRAXiS uma função(link) que coloca todo um treview de outra aplicação em memos. Ela faz uso de VirtualAllocEx, já citado pelo s3c (link) no começo deste mês. Então, dei uma enxugada para o propósito em questão e ficou assim: function GetTreeViewText(hTVwnd: HWND; hItem :HTREEITEM): string; const MAX_TEXT = 256; var lpBuf: array[0..MAX_TEXT - 1] of char; tvi: TTVITEM; dwPId: DWORD; hProc: THANDLE; pText, pAddr: pointer; dwTmp: DWORD; begin Result := ''; // Obtém ID da Thread e Processo if BOOL(GetWindowThreadProcessId(hTVwnd, @dwPId)) then // Obtém o handle do processo que queremos acessar hProc := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, FALSE, dwPId); if hProc <> 0 then begin // Aloca memoria para o texto a ser passado para o processo alvo pText := VirtualAllocEx(hProc, nil, MAX_TEXT, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE); // Aloca memória para a estrutura TTVITEM a ser passada para o processo alvo pAddr := VirtualAllocEx(hProc, nil, sizeof(tvi), MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE); tvi.mask := TVIF_TEXT; // indica que desejamos obter o Texto tvi.pszText := pText; // Endereço da memória alocada para receber o resultado tvi.cchTextMax := MAX_TEXT - 1; // Nº máximo de caracteres a retornar // Posiciona no item do treeview informado tvi.hItem := hItem; // Escreve nossa estrutura para o processo if WriteProcessMemory(hProc, pAddr, @tvi, sizeof(tvi), dwTmp) and // Executa a solicitação definida pela mensagem TVM_GETITEM juntamente com mask em tvi (SendMessage(hTVwnd, TVM_GETITEM, 0, Integer(pAddr)) <> 0) and // Lê o resultado para lpBuf, respeitando MAX_TEXT ReadProcessMemory(hProc, pText, @lpBuf, MAX_TEXT, dwTmp) then Result := StrPas(lpBuf); // Converte para String o retorno end; if Assigned(pAddr) then VirtualFreeEx(hProc, pAddr, 0, MEM_RELEASE); if Assigned(pText) then VirtualFreeEx(hProc, pText, 0, MEM_RELEASE); CloseHandle(hProc); end; No código que o Paulo, colocou fiz as seguintes inclusões:var ... SelName, LastName :string; begin ... for i := 1 to Length(sKey) do if sKey[i] = '\' then begin LastName := ''; SendMessage(H2, WM_KeyDown, VK_Right, 0); end else begin LastName := LastName +sKey[i]; SendMessage(H2, WM_Char, Ord(sKey[i]), 0); end; Sleep(100); SelName := GetTreeViewText(H2, TreeView_GetSelection(H2)); if AnsiCompareStr(SelName, LastName) <> 0 then ShowMessage('Chave não encontrada'); h2 := FindWindowEx(h1, 0, 'SysListView32', nil); ... Legal essa idéia Paulo. Valeu.
  25. joseueg, quando você cita radiobutton, significa que você não está utilizando componentes data-aware (aqueles que você liga ao seu dataset via propriedade DataSource)? Já que do contrário seria DBRadioButton. Todos os campos dentro do GroupBox serão desabilitados ou apenas alguns? Se alguns, quais para poder montar um exemplo (não precisam ser todos) De que tipo é este campo? Que valores você pretende utilizar para cada opção? []s
×
×
  • Criar Novo...