
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
Churc, esses eventos serão, digamos assim, pré-definidos (você citou:OnStart; OnFinish; ...) ?Porque se forem, você poderia utilizar um array de TList, onde cada linha do array, seria o evento predefinido, e cada item da lista conteria as informações do plugin (que informações você imagina gardar?) Mas se não forem pré-definidas, acho que você poderia utilizar então um TStringList com os TList. Neste caso você teria no stringlist, a lista de eventos retornados pelos plugins (não duplicados) e na propriedade Objects você armazenaria os TList com as informações sobre os plugins. Será que era mais ou menos isso ou estou viajando? :huh:
-
Que tipo de erros? Talvez porque você copiou tudo o que coloquei no post anterior, dentro do seu programa. (veja a seguir) Bom, o código que postei, em teoria (e na prática também, já que testei e funcionou) deveria fazer justamente isto. Observe que há duas opções (versões) dentro do mesmo código - talvez isso possa tê-lo confundido. Mas vou colocar só a que eu testei, e que conforme o comentário, serve para "todas" as versões do Windows. É um form com um botão apenas: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms; type TForm1 = class(TForm) ... end; ... var Form1: TForm1; implementation uses Tlhelp32; // ************************************************** // For Windows 9x/ME/2000/XP // ************************************************** function KillTask(ExeFileName: string): Integer; const PROCESS_TERMINATE = $0001; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin Result := 0; FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while Integer(ContinueLoop) <> 0 do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then Result := Integer(TerminateProcess( OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0)); ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end; // ** Aqui está a forma de chamar o procedimento. No exemplo estamos passando, fixo, o nome do programa que queremos "matar" - neste caso NOTEPAD.EXE. // Na sua figura, você mostra botões com o nome dos processos a matar. Bom, acho que são estes // nomes que você vai ter que passar. procedure TForm1.Button1Click(Sender: TObject); begin KillTask('notepad.exe'); end; []s
-
Pirambu!, estes campos não deveriam ser numéricos? Em todos os casos, além da opção do colega Arckyz, talvez você possa utilizar, simplesmente: If (TableItensPedidosFichaTecnicaID.AsInteger > 0 ) then TableItensPedidosSaldo.AsInteger := (TableItensPedidosEntradaPA.AsInteger - TableITensPedidosSaidaPA.AsInteger); []s
-
Digamos que retirar o form da memória e mostrar ele denovo, você tem que criá-lo novamente. Se não puder fazer isso não tem jeito. você pode fazer: retira o form2 do auto-create (em opções do projeto) if not Assigned(form2) then form2 := TForm2.Create(Self); form2.Show lá no Destroy do Form2, você coloca (se for Delphi 7 ou superior) FreeAndNil(form1); e continua utilizando a dica do visitante: no OnClose do form2 Action := caFree; Acho que é isso. []s
-
É possível. Obrigado e desejo o mesmo a todos os colegas aqui do Script Brasil []s
-
Pirambú!, a tableItensPedidos é a tabela associada ao DBGrid correto?! O uso das query's para obter os totais está correto. Porém, esses totais são por código do produto, então, você deve parametrizar suas query's para obter o total referente determinado produto. Eu faria mais ou menos assim: Criaria, na tabela tableItensPedidos, campos calculados para armazenar os totais, que serão apresentados no DBGrid (essas colunas serão ReadOnly). Estes campos, são inicializados(preenchidos) no evento OnCalcField da tabela. Assim, neste evento, você abre suas query's passando como parâmetro o campo código do produto (conforme mensionei antes) e atribui o total ao respectivo campo. O saldo (também campo calculado) seria obtido após a obtenção do valor de entrada e saída, também neste evento. Bom, essas contas você sabe fazer, a questão era onde fazer. Não esqueça de observar o comportamento de Quantidade_Entrada, com relação ao fato do valor Quantidade informada. Ex. 1) Novo item no pedido (Insert/Append). - quantidade digitada 100 - total entrada era 530, então talvez no cálculo você tenha que fazer 100+530 (630 -> total entrada no grid) Ex. 2) Alterar item no pedido (Edit). - nova quantidade digitada 150 - total entrada era 630, então talvez no cálculo você tenha que fazer 150+(630 - field.OldValue) (680 -> total entrada no grid) Se você observar, a propriedade OldValue será zero no Insert, então o cálculo será o mesmo que o da Edição. Testa ai pra ver se não falei abobrinha. rsrsrs []s
-
Ch0n0, veja se isto lhe ajuda. O código não é meu, mas vou postar aqui para o caso de mais alguém precisar no futuro. Fonte: DelphiTricks.com // ************************************************** // For Windows 9x/ME/2000/XP // ************************************************** uses Tlhelp32; function KillTask(ExeFileName: string): Integer; const PROCESS_TERMINATE = $0001; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin Result := 0; FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while Integer(ContinueLoop) <> 0 do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then Result := Integer(TerminateProcess( OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0)); ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end; procedure TForm1.Button1Click(Sender: TObject); begin KillTask('notepad.exe'); end; // ************************************************** // For Windows NT/2000/XP // ************************************************** procedure KillProcess(hWindowHandle: HWND); var hprocessID: INTEGER; processHandle: THandle; DWResult: DWORD; begin SendMessageTimeout(hWindowHandle, WM_CLOSE, 0, 0, SMTO_ABORTIFHUNG or SMTO_NORMAL, 5000, DWResult); if isWindow(hWindowHandle) then begin { Get the process identifier for the window} GetWindowThreadProcessID(hWindowHandle, @hprocessID); if hprocessID <> 0 then begin { Get the process handle } processHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION, False, hprocessID); if processHandle <> 0 then begin { Terminate the process } TerminateProcess(processHandle, 0); CloseHandle(ProcessHandle); end; end; end; end; procedure TForm1.Button2Click(Sender: TObject); begin KillProcess(FindWindow('notepad',nil)); end;
-
Churc, eu ainda não trabalhei com plug-ins não. Mas, pretendo no próximo ano (tá logo aí), começar a modularizar uma aplicação e fazer justamente uso deste tipo recurso. Neste sentido, o que tenho feito é dar uma olhada pela net e ver o que há implementado, observando suas características e se possível observando fontes. A idéia é descobrir se já existe algo FREE que possa ser aproveitado, ou pelo menos obter conhecimento das funcionalidades necessárias a uma implementação. Não sei se ajuda muito, mas seguem esses link's são de plug-ins de onde tirei algumas informações/idéias: - SmartPlugin; - TMS Plugin Framework; Esses eu baixei da página Torry - Componentes FREE com código fonte (ainda não implentei nada - só estudando...) - TPlugin; - UIL Plugin; - TMX Plugin Loader; - WildFireZ Plugin SDK. []s
-
VDLR, era quase isso que eu estava falando. Só que quando você pára na linha do break, você não executa de imediato. você utiliza a combinção CTRL+F7 para inspencionar o conteúdo das variáveis que lhe mencinei. Captou? Access violation normalmente está associado a acesso a área de memória não alocada. Não possibilidade de em algum momento estas variáveis (DMdados, DMdados.TBcadequip) assumirem o valor nil ou lixo? você não está também mexendo em outro evento do tipo KeyPress ou algo assim, está? []s
-
Conferiu, nestes break's o valor de:1) DMdados 2) DMdados.TBcadequip Eles por alguma razão não poderiam estar inválidos? Tem que por o break antes de usá-los, daí verifica o 1º, se o conteúdo for válido (<> de nil), verifica o 2º. []s
-
Acho que você não vai encontrar, mas enquanto isso, se estiver precisando entender algum trecho, utilize o BabelFish on-line para traduzir o texto. É só copiar e colar. "Não é uma brastemp", mas pode ajudar. []s
-
Erso, acho que não tem forma mais simples.
-
Psyk3r, o Quick Report não tem um componente para isso, mas podem haver alguns por ai - tem que procurar. Se você quer imprimir os dados que está visualizando no DBGrid, uma opção seria utilizar um Datamodule, o qual seria comum ao seu DBGrid e ao relatório. Com o relatório pronto, você associa dataset do DBGrid (que estará no datamodule) ao dataset do QuickRep. (mais ou menos isso) []s
-
josuediniz, esses 18MB são só código, ou tem muito recurso do tipo imagem embutido nele (em botões, telas,...) ? Quando você fala Turbo Delphi 7, você está falando das novas IDE's da Borland (linha Turbo)? É que no site não há referência a versão (Borland: Turbos) e sem tê-lo instalado, ainda, parece que há uma mistura do Turbo Delphi com o Delphi 7. Poderia exclarecer? O Win98 e Me (acho que o 95 também) tem problemas com o uso de recursos de sistema (bitmap, icones, ...) associados a limitação de 64Kb (primeira parte do artigo) - já tive problema neste sentido. Falando em Delphi 7, um update corrige alguns "extravios de memória" (veja artigo - procure por leak) No Win98, utilizando o monitor de recursos do sistema (Iniciar/Acessórios/{ferramentas de sistema}??? - não lembro direito), dá para ter uma idéia de como está o consumo de memória e recursos. []s
-
juniorboll, para códigos de barras eu utilizei (no passado) o componente BarCode (download). São dois componentes, um para os Forms e outro para o QuickReport. Voce tem que ver se eles suportam o padrão que você utilizará. Se utilizar Rave, dá uma olhada neste exemplo e vê se lhe dá uma luz Uma apresentação PPT que mostra os padrões de cód. de barras utilizados no Brasil e no Mundo (ClubeDelphi)
-
ReX, se for apenas para trocar a extensão, é possível utilizar a função ChangeFileExt para facilitar o trabalho. Ex.: RenameFile(File_Name, ChangeFileExt(File_Name, '.rex')); apenas uma dica com relação a contatenação de códigos ASCII via "#". É possível omitir o "+" que vem entre ele e um string (exceto quando ficam em linhas diferentes no código fonte). Ex.: 1) 'O Arquivo não existe...'#13 + 'Aqui a segunda linha' 2) #13'Texto qualquer'#13'Outra linha'#13#44; []s
-
Cleverson, o FB não é exatamente a mesma coisa que o IB. Ele apenas teve seu início a partir da versão Open Source do InterBase 6.0 (veja), está na versão 2.0 (RoadMap 2007). Cleverson, eu utilizao o FireBird e com relação a esta questão de endereçamento do banco ele tem uma opção interessante. Na pasta de instalação do servidor do banco (no servidor), existe um arquivo alias.conf onde você configura o caminho do banco e atribui a ele um alias.Ex.: Criando um alias para um bando de dados Fones, uma linha adicionada neste arquivo contém: FONE = C:\Arquivos de programas\Freeware\Firebird_1_5\Database\fones.fdb é possível definir vários. Daí onde você colocou Server Name=SERVER:Path, você utiliza Server Name=SERVER:FONE. A principal vantagem, é que você não tem que saber o caminho do arquivo do banco de dados no servidor. Para o cliente (e em sua aplicação) pouco interessa onde está este arquivo. No máximo você deve saber (e/ou configurar) onde estará o servidor do banco (e isso já seria necessário). Com relação a desempenho, nunca observei qualquer problema. Entretanto, como lhe sugeriu o colega Churc, eu utilizo componente de acesso específico para FB (o pacote MDO). []s
-
Carvalho, seria melhor você colocar mais detalhes.Se você observar bem, o post que você "ressucitou" é de Outubro de 2005, com pouca informação e sem resposta. Melhore seu questionamento, dê mais detalhes (mensagem de erro correta, componentes que utiliza, banco, versão do Delphi, e por aí vai), quem sabe alguém poderá lhe ajudar. []s
-
Churc, permita-me uma parte aqui, apenas para melhor esclarecimento... Marcelo, essas variáveis PCHAR criadas foram simplesmente assim definidas na cláusula VAR? Voce está reservando (alocando) espaço para elas? []s
-
Pirambu!, o parâmetro que você passa para VARCHAR é o tamanho do campo. Então, você tem que ter certeza de colocar(reservar) um tamanho que caiba o resultado da conversão, caso contrário ocorre erro. (É só experimentar) []s
-
VDLR, você depurou (aquele lance de colocar um brack-point) e verificou se o erro ocorre ainda na chamada à locate ou na linha em que você faz o copy (StrToSearch := copy(EDpesquisa.Text, 1, EDpesquisa.SelStart))?
-
Pirambu!, o LIKE só pode ser utilizado com strings (CHAR, VARCHAR, ...). Se você quer fazer isto com um campo do tipo integer, terá que convertê-lo para string na linha onde você o utiliza com o LIKE. Para que alguém possa lhe dar um sugestão neste sentido, é necessário saber de que banco de dados você está falando. se for Interbase, FireBird ou Paradox, eu sei que você pode utilizar o CAST. Sua instrução ficaria assim: WHERE CAST(fichatecnicaID as VARCHAR(10)) like :N Confira se é isto mesmo. []s
-
Isto acontece toda vez que digito uma pesquisa no edit e uso a tecla backspace ou detele, dando ok no erro ele me aponta pra esta procedure aponta pra esta linha na procedure if DMdados.TBcadequip.Locate('DESCRICAO',copy(EDpesquisa.Text,1,EDpesquisa.SelStart),[loPartialKey]) then Tente incluir uma variável para receber o texto a ser pesquisado (ex. StrToSearch), assim você pode avaliar (CTRL+F7) seu conteúdo antes de chamar a função locate, além de chamar a função copy uma única vez e utilizar a variável em todos os pontos em que necessitar. Uma dica: se há ações que são realizadas tanto dentro do then quando do else, provavelmente este código pode ficar antes e/ou depois do bloco if...then...else, veja abaixo: procedure TFRcontvctoequip.EDpesquisaChange(Sender: TObject); var Aux : integer; StrToSearch :String; begin EDpesquisa.OnChange := nil; Aux := EDpesquisa.SelStart; StrToSearch := copy(EDpesquisa.Text, 1, EDpesquisa.SelStart); if DMdados.TBcadequip.Locate('DESCRICAO', StrToSearch, [loPartialKey]) then begin // *** a linha seguinte parece não fazer sentido devido a linha subsequente. EDpesquisa.Text := IntToStr(DMdados.TBcadequipREG.Value); EDpesquisa.Text := DMdados.TBcadequipDESCRICAO.AsString; end else begin if EDpesquisa.SelStart>0 then begin // *** a linha seguinte parece não fazer sentido devido a linha subsequente. EDpesquisa.Text :=''; EDpesquisa.Text :=StrToSearch; end; end; EDpesquisa.SelStart := Aux; EDpesquisa.OnChange := EDpesquisaChange; end;
-
Erso, pelas minhas contas, se você pegar o tempo em minutos e dividir pela quantidade de minutos que tem um dia, você obtem o resultado. Dá uma testada: var Data :TDateTime; begin Data := 45310 / (24*60); end;só que daí você terá o ano começando em 01/01/1899 (se não me engano). Assim, se o resultado for 01 diae tantas horas, a data ficaria algo como 02/01/1899 e tantas horas.
-
Opa, agora sim, já que você está usando Table, é so pegar o valor do ultimo registro antes de inserir o novo redistro. tipo: var i : integer; begin Table1.Next; i := Table1.FieldByName('Codigo').Value + 1; Table1.Insert; Table1.FieldByName('Codigo').Value := i; etc... end; Abs. Progr'amador. B) Progr'amador, permitame apenas uma observação:- deve ser substituído Table1.Next por Table1.Last, de modo a posicionar no último registro. M@tEuS, por acaso esse campo Codigo está definido no Access como Decimal ou outro com casas decimais? O ideal é que fosse Inteiro Longo.Uma outra coisa que você também pode tentar é definir o tipo de dados que você quer atribuir. Por exemplo: Table1.FieldByName('Codigo').AsInteger := i; Table1.FieldByName('Codigo').AsFloat := i; []s