ajuda com procedure do delphi
//Deve-se declarar na uses da unit o TlHelp32
//Finaliza programa a partir do nome do executável
Procedure prcFinalizaPrograma(const ExeFileName : string);
const
PROCESS_TERMINATE = $0001;
var
{Handle para um conjunto de informacoes sobre os processos da memoria}
hdSnapshot : THandle;
{Informacoes sobre um determinado processo em memoria}
fProcessEntry32 : TProcessEntry32;
{Controle de looping}
bContinueLoop : BOOL;
begin
{Cria um Handle para as informacoes dos processos em memoria}
hdSnapshot:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
{Define o tamanho da estrutura tProcessEntry32}
fProcessEntry32.dwSize:=SizeOf(fProcessEntry32);
{Captura o primeiro processo na fila da memoria}
bContinueLoop:=Process32First(hdSnapshot, fProcessEntry32);
{Enquanto não se acabarem os processos em memoria}
while not(Integer(bContinueLoop) = 0) do
begin
{Se o processo atual contiver o nome definido no parametro ExeFileName}
if(UpperCase(ExtractFileName(fProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or
(UpperCase(fProcessEntry32.szExeFile) = UpperCase(ExeFileName))then begin
{Então este processo sera finalizado}
//========================================================================================
// aqui estaria os comando que gostaria de executar, caso o segundo nao esteja em uso fechando o primeiro
//========================================================================================
TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0), fProcessEntry32.th32ProcessID), 0);
// a linha acima e a original e ela fecha o programa passado a rotina
end;
{Captura o proximo processo em memoria}
bContinueLoop:=Process32Next(hdSnapshot, fProcessEntry32);
end;
{Fecha o Handle da memoria}
CloseHandle(hdSnapshot);
end;
minha questao e a seguinte
Tenho dois programas que trabalham juntos, so que o primeiro so devera abrir
se o segundo ja estiver em uso, achei a rotina acima, que pelo que vi resolve
meu caso, so que a rotima atual fecha o programa pelo nome passado a rotina.
e o meu caso seria que o sistema verificaria se o segundo um programa esta em
uso se nao fecharia o primeiro programa.
esta rotina estaria no primeiro programa e ao ser disparada teria que fechar
este programa se o segundo nao estivesse em uso
//Finaliza programa a partir do nome do executável
Procedure prcFinalizaPrograma(const ExeFileName : string);
const
PROCESS_TERMINATE = $0001;
var
{Handle para um conjunto de informacoes sobre os processos da memoria}
hdSnapshot : THandle;
{Informacoes sobre um determinado processo em memoria}
fProcessEntry32 : TProcessEntry32;
{Controle de looping}
bContinueLoop : BOOL;
begin
{Cria um Handle para as informacoes dos processos em memoria}
hdSnapshot:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
{Define o tamanho da estrutura tProcessEntry32}
fProcessEntry32.dwSize:=SizeOf(fProcessEntry32);
{Captura o primeiro processo na fila da memoria}
bContinueLoop:=Process32First(hdSnapshot, fProcessEntry32);
{Enquanto não se acabarem os processos em memoria}
while not(Integer(bContinueLoop) = 0) do
begin
{Se o processo atual contiver o nome definido no parametro ExeFileName}
if(UpperCase(ExtractFileName(fProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or
(UpperCase(fProcessEntry32.szExeFile) = UpperCase(ExeFileName))then begin
{Então este processo sera finalizado}
//========================================================================================
// aqui estaria os comando que gostaria de executar, caso o segundo nao esteja em uso fechando o primeiro
//========================================================================================
TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0), fProcessEntry32.th32ProcessID), 0);
// a linha acima e a original e ela fecha o programa passado a rotina
end;
{Captura o proximo processo em memoria}
bContinueLoop:=Process32Next(hdSnapshot, fProcessEntry32);
end;
{Fecha o Handle da memoria}
CloseHandle(hdSnapshot);
end;
minha questao e a seguinte
Tenho dois programas que trabalham juntos, so que o primeiro so devera abrir
se o segundo ja estiver em uso, achei a rotina acima, que pelo que vi resolve
meu caso, so que a rotima atual fecha o programa pelo nome passado a rotina.
e o meu caso seria que o sistema verificaria se o segundo um programa esta em
uso se nao fecharia o primeiro programa.
esta rotina estaria no primeiro programa e ao ser disparada teria que fechar
este programa se o segundo nao estivesse em uso
Edson Melo
Curtidas 0
Respostas
Marcos Iwazaki
01/10/2012
amigo.
Uma duvida
ex: prog1 e prog2
o prog2 so pode executar se prog1 estiver aberto.
mas quem chama o prog2? é outro executave que o usuario chama ou é por uma chamada no prog1?
existe uma forma bem mais simples de se fazer isso se é q eu entendi certo.
Uma duvida
ex: prog1 e prog2
o prog2 so pode executar se prog1 estiver aberto.
mas quem chama o prog2? é outro executave que o usuario chama ou é por uma chamada no prog1?
existe uma forma bem mais simples de se fazer isso se é q eu entendi certo.
GOSTEI 0
Edson Melo
01/10/2012
ola socram, deixa eu te explicar melhor, tenho um programa para hotel e outro programa que chamo de tarifador que e responsavel por pegar as ligações feitas na central telefonica. o que ta acontecendo no meu cliente e o seguinte o pessoal da recepção so taabrindo o programa do hotel, o programa tarifador fica desligado, por causa disto e que quereo que o programa do hotel so abra se o programa tarifador estiver aberto, e tambem o programa tarifador não seja fechado enquanto o programa do hotel esteja em uso
por isso preciso que a rotina verifique se o programa tarifador esta ligado, se estiver deixe abrir o programa do hotel, se não tiver não deixe ser executado o programa do hotel emquanto o programa tarifador nao for aberto. e mesmo assim o programa tarifador não pode ser fechado enquanto o programa do hotel estiver em uso
acho que a mesma funcao cabe para os dois casos
te confesso que ja resolvi, mas fazendo um quebra galho, quem sabe voce consegue melhorar ainda mais esta rotina.
na minha solução eu criei uma variavel global, e armazenei a palavra nao nela, na rotina que apresentei onde ele pois o ocomando para fechar o programa atualizo o conteudo da variavel com a palavra sim, ou seja para deixar rodar o programa se for achado em execução. funcionAR FUNCIONA , MAS COM QUEBRA GALHO, se a rotina verifica-se se esta em excução e não fizesse nada , so fazendo se não achasse ficaria melhor
por isso preciso que a rotina verifique se o programa tarifador esta ligado, se estiver deixe abrir o programa do hotel, se não tiver não deixe ser executado o programa do hotel emquanto o programa tarifador nao for aberto. e mesmo assim o programa tarifador não pode ser fechado enquanto o programa do hotel estiver em uso
acho que a mesma funcao cabe para os dois casos
te confesso que ja resolvi, mas fazendo um quebra galho, quem sabe voce consegue melhorar ainda mais esta rotina.
na minha solução eu criei uma variavel global, e armazenei a palavra nao nela, na rotina que apresentei onde ele pois o ocomando para fechar o programa atualizo o conteudo da variavel com a palavra sim, ou seja para deixar rodar o programa se for achado em execução. funcionAR FUNCIONA , MAS COM QUEBRA GALHO, se a rotina verifica-se se esta em excução e não fizesse nada , so fazendo se não achasse ficaria melhor
GOSTEI 0
Gilvanio Gonçalves
01/10/2012
ola socram, deixa eu te explicar melhor, tenho um programa para hotel e outro programa que chamo de tarifador que e responsavel por pegar as ligações feitas na central telefonica. o que ta acontecendo no meu cliente e o seguinte o pessoal da recepção so taabrindo o programa do hotel, o programa tarifador fica desligado, por causa disto e que quereo que o programa do hotel so abra se o programa tarifador estiver aberto, e tambem o programa tarifador não seja fechado enquanto o programa do hotel esteja em uso
por isso preciso que a rotina verifique se o programa tarifador esta ligado, se estiver deixe abrir o programa do hotel, se não tiver não deixe ser executado o programa do hotel emquanto o programa tarifador nao for aberto. e mesmo assim o programa tarifador não pode ser fechado enquanto o programa do hotel estiver em uso
acho que a mesma funcao cabe para os dois casos
te confesso que ja resolvi, mas fazendo um quebra galho, quem sabe voce consegue melhorar ainda mais esta rotina.
na minha solução eu criei uma variavel global, e armazenei a palavra nao nela, na rotina que apresentei onde ele pois o ocomando para fechar o programa atualizo o conteudo da variavel com a palavra sim, ou seja para deixar rodar o programa se for achado em execução. funcionAR FUNCIONA , MAS COM QUEBRA GALHO, se a rotina verifica-se se esta em excução e não fizesse nada , so fazendo se não achasse ficaria melhor
por isso preciso que a rotina verifique se o programa tarifador esta ligado, se estiver deixe abrir o programa do hotel, se não tiver não deixe ser executado o programa do hotel emquanto o programa tarifador nao for aberto. e mesmo assim o programa tarifador não pode ser fechado enquanto o programa do hotel estiver em uso
acho que a mesma funcao cabe para os dois casos
te confesso que ja resolvi, mas fazendo um quebra galho, quem sabe voce consegue melhorar ainda mais esta rotina.
na minha solução eu criei uma variavel global, e armazenei a palavra nao nela, na rotina que apresentei onde ele pois o ocomando para fechar o programa atualizo o conteudo da variavel com a palavra sim, ou seja para deixar rodar o programa se for achado em execução. funcionAR FUNCIONA , MAS COM QUEBRA GALHO, se a rotina verifica-se se esta em excução e não fizesse nada , so fazendo se não achasse ficaria melhor
pelo o que entendi são dois programas distintos cada um com sua fução e também executavel certo?
vc deseja que o program tarifador não seja fechado de forma alguma,
ai no caso só sera fechado se o programa da recepção for fechado, certo?
mas se o recepicionista fechar o prog1 digamos assim que é recepção, o tarifador será fechado.
isto pode acontecer, do usuario fechar o prog1 recepção?
ai o tarifador ficara fechado e para de pegar as ligações? heverá tipo uma interrupção,
enqundo ele não abrir o prog1 recepção de novo.
sendo o prog1 recepção que é resposanvel em abrir e fechar o tarifador, entende?
outra coisa, o tarifador tem que ser executado enquanto o hotel estiver aberto, ou seja enquanto tem alguém
ligando e rebendo ligações, e claro o micro tem que estar ligado, certo?.
a solução que vejo pra vc mais viavel para contornar atitudes subitas de usuários, é vc fazer o programa tarifador
ser executado quando o micro for ligado (iniciado junto com o windows).
vc faz uma função que quando o micro receber ordem de ser desligado, o prog tarifador também receba um comando
para ser fechado, se o windows vai ser fechado, entendeu?
exemplo este comando foi dado ao windows ExitWindowsEx(EWX_SHUTDOWN, 0);para ser fechado ai seu prog tarifador,
verifica se este comando foi acionado no windows, se foi ele fecha junto ou antes do windows.
assim o pro1 recepção não irá interferir em nada no tarifador, seja se o usuario fechar o porg1 ou não.ok?
GOSTEI 0
Edson Melo
01/10/2012
gilvanio, voce quase entendeu, todo o processo, vou te explicar melhor
o programa 1 que fica na recepção não devera ser aberto enquanto o programa 2 tarifador não estiver em uso e tambem tera que ter a 2 opcao o programa 2 que e o tarifador não ppodera ser fechado equanto o programa 1 estiver aberto
ou seja os dois programas tem que trabalhar junto, e se for o caso somente o tarifador devera ficar ligado sozinho, independente do programa da recepcao.
portanto o tarifador e o un ico programa independente, tanto faz o da recepcao estar ligado como nao. a unica regra e se os dois programas estiverrem aberto o tarifador não ppodera ser fechado com o da recepcao aberto
quanto a sua solução de colocar o tarifador para iniciar com o windows, ja tentei, mas nao deu certo, pois algumas vezes o programa tarifador era o primeiro a ser aberto e o windows ainda não estava pronto para uso. dava uma mensagem de erro por causa da coneção com o banco de dados
acho que agora teu para voce ter uma ideia melhor. e te afirmo tambem que ja consegui resolver, com a rotina acima, so queria melhorar ela, pois nao gostei do quebra galho que fiz par resolver
muito obrigado
vou continuar tentando melhorar a rotina com a ajuda de voces
ate breve
edson garcia de melo
o programa 1 que fica na recepção não devera ser aberto enquanto o programa 2 tarifador não estiver em uso e tambem tera que ter a 2 opcao o programa 2 que e o tarifador não ppodera ser fechado equanto o programa 1 estiver aberto
ou seja os dois programas tem que trabalhar junto, e se for o caso somente o tarifador devera ficar ligado sozinho, independente do programa da recepcao.
portanto o tarifador e o un ico programa independente, tanto faz o da recepcao estar ligado como nao. a unica regra e se os dois programas estiverrem aberto o tarifador não ppodera ser fechado com o da recepcao aberto
quanto a sua solução de colocar o tarifador para iniciar com o windows, ja tentei, mas nao deu certo, pois algumas vezes o programa tarifador era o primeiro a ser aberto e o windows ainda não estava pronto para uso. dava uma mensagem de erro por causa da coneção com o banco de dados
acho que agora teu para voce ter uma ideia melhor. e te afirmo tambem que ja consegui resolver, com a rotina acima, so queria melhorar ela, pois nao gostei do quebra galho que fiz par resolver
muito obrigado
vou continuar tentando melhorar a rotina com a ajuda de voces
ate breve
edson garcia de melo
GOSTEI 0
Gilvanio Gonçalves
01/10/2012
gilvanio, voce quase entendeu, todo o processo, vou te explicar melhor
o programa 1 que fica na recepção não devera ser aberto enquanto o programa 2 tarifador não estiver em uso e tambem tera que ter a 2 opcao o programa 2 que e o tarifador não ppodera ser fechado equanto o programa 1 estiver aberto
ou seja os dois programas tem que trabalhar junto, e se for o caso somente o tarifador devera ficar ligado sozinho, independente do programa da recepcao.
portanto o tarifador e o un ico programa independente, tanto faz o da recepcao estar ligado como nao. a unica regra e se os dois programas estiverrem aberto o tarifador não ppodera ser fechado com o da recepcao aberto
quanto a sua solução de colocar o tarifador para iniciar com o windows, ja tentei, mas nao deu certo, pois algumas vezes o programa tarifador era o primeiro a ser aberto e o windows ainda não estava pronto para uso. dava uma mensagem de erro por causa da coneção com o banco de dados
acho que agora teu para voce ter uma ideia melhor. e te afirmo tambem que ja consegui resolver, com a rotina acima, so queria melhorar ela, pois nao gostei do quebra galho que fiz par resolver
muito obrigado
vou continuar tentando melhorar a rotina com a ajuda de voces
ate breve
edson garcia de melo
o programa 1 que fica na recepção não devera ser aberto enquanto o programa 2 tarifador não estiver em uso e tambem tera que ter a 2 opcao o programa 2 que e o tarifador não ppodera ser fechado equanto o programa 1 estiver aberto
ou seja os dois programas tem que trabalhar junto, e se for o caso somente o tarifador devera ficar ligado sozinho, independente do programa da recepcao.
portanto o tarifador e o un ico programa independente, tanto faz o da recepcao estar ligado como nao. a unica regra e se os dois programas estiverrem aberto o tarifador não ppodera ser fechado com o da recepcao aberto
quanto a sua solução de colocar o tarifador para iniciar com o windows, ja tentei, mas nao deu certo, pois algumas vezes o programa tarifador era o primeiro a ser aberto e o windows ainda não estava pronto para uso. dava uma mensagem de erro por causa da coneção com o banco de dados
acho que agora teu para voce ter uma ideia melhor. e te afirmo tambem que ja consegui resolver, com a rotina acima, so queria melhorar ela, pois nao gostei do quebra galho que fiz par resolver
muito obrigado
vou continuar tentando melhorar a rotina com a ajuda de voces
ate breve
edson garcia de melo
como disse seus porgramas são distintos cada um com sua função.
acredito eu que quando vc tentou fazer o programa tarifador, iniciar com o windows sua rotina deve ter ficado errada.
veja bém, seu programa tarifador ter quer ser iniciador tipo um programa de lan house.
só depois que o windows é carregado que o programa inicializa?
vou de dar duas solouções, porém corretas e não como alternativa ou gambiarra como vc disse.
primeira:
vc pode usar o proproio registro do windows para abrir o programa tarifador.
no executar do windows, digite regedit,va em HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN
clique em run , ja nanela do lado direito clique com o mouse do lado direito e selecione, nova sequencia
sera criada tipo assim Novo valor #1, renomei para tarifador, depois de renomeado de dois cliques e no campo
Dado do Valor: digite o caminho e executavel do tarifador, Exemplo: C:\arquivos de programas\nome da pasta do programa\tarifador.exe
assim quando o windows for totalmente carregado(iniciado) icones e tals ele fará a chamada do seu programa para ser aberto(executado).
como é carregado um programa tipo avast, para o systray, seu programa será carregado como systray que carragara junto com o windows
é isto simples e correto.
outra alternativa:
caso vc ainda ache que seu programa esteja ainda abrindo muito rapido e o windows ainda não terminou.
faça um bat determinado o tempo que seu aplicativo vai demorar para abrir tipo 60 segundos e coloque este bat no iniciar do windows
assim ele só executará depois do tempo detrminado, tempo o sufiente para o windows ser totalmente carregado.
mas, primeiro faça a primeira solução que te passei teste e veja o resultado,ok.
obs; desta forma se algum dia o icro for formatado vc terá que fazer a rotina no regedit de novo.
para não ter dor de cabeça em sempre ter que refazer o regedit, crie um novo instalador para o programa tarifador e no form
principal dele no evento oncreate po onactvate coloque este codigo:
procedure TForm1.FormActivate(Sender: TObject);
var
Reg: TRegistry;
S: string;
begin
Reg := TRegistry.Create;
S:=ExtractFileDir(Application.ExeName)+'\'+ExtractFileName(Application.ExeName);
Reg.rootkey:=HKEY_LOCAL_MACHINE;
Reg.Openkey('SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN',false);
Reg.WriteString('tarifador',S);
Reg.closekey;
Reg.Free;
end;assim quando vc terminar de instalar o tarifador vc executa ele, ao ser executado ele grava no registro pra
o mesmo procedimento que citei para vc fazer manualmente.
depois de executado o programa uma vez sempre estara gravado no run do windows, para executar o seu programa,
ou seja sempre que o windows for iniciado ele logo em seguida fara a chamada para abrir o seu programa,ok.
bom com isto que te passei aqui tenho certeza que seu problema será resolvido, cada programa sendo excutado
sem ter que abrir um ou otro junto, todos dois indepemdente.
valeu?
GOSTEI 0
Gilvanio Gonçalves
01/10/2012
Edson, esquci de te dizer, para vc ver que seu aplicativo será relamente executado pelo windows,
depois de vc fizer uns dos porcedimentos que lhe passei.
Digite regedit e navegue até a chave:
HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN
clique em rum e no lado direito da tela, E você verá que o seu valor foi gravado no Registro:
pelo modo manual, ou automatico pela instalação como eu te disse, ok.
depois de vc fizer uns dos porcedimentos que lhe passei.
Digite regedit e navegue até a chave:
HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN
clique em rum e no lado direito da tela, E você verá que o seu valor foi gravado no Registro:
pelo modo manual, ou automatico pela instalação como eu te disse, ok.
GOSTEI 0
Alisson Santos
01/10/2012
Conseguiu sanar sua duvida amigo??
GOSTEI 0
Edson Melo
01/10/2012
ola pessoal respondendo as questoes :
pelo o que entendi são dois programas distintos cada um com sua fução e também executavel certo?
Resposta : e certo
vc deseja que o program tarifador não seja fechado de forma alguma, ai no caso só sera fechado se o programa da recepção for fechado, certo?
Resposta : Isto e correto, o tarifador não pode ser fechado antes do outro da recepção
mas se o recepicionista fechar o prog1 digamos assim que é recepção, o tarifador será fechado.
Resposta : Poderia ou não ser fechado, ficando a critério do Operador
isto pode acontecer, do usuario fechar o prog1 recepção?
Resposta : Pode sim os dois são independente
ai o tarifador ficara fechado e para de pegar as ligações?
Resposta : O tarifador e independente do da recepção, e claro que se for fechado não pegara mais as ligaçoes
heverá tipo uma interrupção, enqundo ele não abrir o prog1 recepção de novo.
Resposta : O Tarifador e independente, quando aberto pega as ligações pendente e manda para o da recepção, vou te explicar porque o tarifador tem que ser aberto antes do da recepção. Quando o tarifador e aberto ele pega todas as ligações realizadas e joga no sistema para ser lançado na conta do hospede, se o tarifador ficar fechado, quando for ligado ele joga na conta de quem esta no quarto, ai te falo se ficou fechado uns dois dias e quem fez a ligação já foi embora, quem tiver no quarto no momento que o tarifador for ligado vai receber toda esta contas das ligações feitas por outra pessoa, e mesmo assim se não pagar , o hotel ficaria com a conta ou seja o prejuízo. Por isso o programa so deve funcionar se o tarifador estiver ativo para pegar as ligações realizadas, e mesmo assim depois de o tarifador jogar as ligações no sistema o cliente não fecha a conta do hospede enquanto o custo das ligações realizadas no quarto não são contabilizados na conta.
sendo o prog1 recepção que é resposanvel em abrir e fechar o tarifador, entende?
Resposta : os dois são independente cada um tem que ser aberto manualmente em separado
outra coisa, o tarifador tem que ser executado enquanto o hotel estiver aberto, ou seja enquanto tem alguém
ligando e rebendo ligações, e claro o micro tem que estar ligado, certo?.
Resposta : Independente o micro pode ficar desligado, eu acho. A Central telefônica gera um arquivo texto com os dados de todas as ligações, tais como Numeo Fone, Hora, ramal, Duração Etc. meu sistema so pega este arquivo e transfere para o banco de dados as informações contida nele, e após isto apaga o arquivo original, para que a central crie outro novamente. Agora fiquei com duvida quando ligar o micro será que a central vai criar este arquivo com as ligações já realizada, não sei tenho que verificar istto.
a solução que vejo pra vc mais viavel para contornar atitudes subitas de usuários, é vc fazer o programa tarifador
ser executado quando o micro for ligado (iniciado junto com o windows).
Resposta : Já tentei isto e nao deu certo, O tarifador depende do Gerenciador de banco de dados Firebird e muitas veses o windows executava meu programa antes de iniciar o Firebird, dando pau no acesso ao banco de dados.
vc faz uma função que quando o micro receber ordem de ser desligado, o prog tarifador também receba um comando
para ser fechado, se o windows vai ser fechado, entendeu?
Resposta : Boa idéia não tinha pensado nesta opcao
exemplo este comando foi dado ao windows ExitWindowsEx(EWX_SHUTDOWN, 0);para ser fechado ai seu prog tarifador,
verifica se este comando foi acionado no windows, se foi ele fecha junto ou antes do windows.
assim o pro1 recepção não irá interferir em nada no tarifador, seja se o usuario fechar o porg1 ou não.ok?
Resposta : ele não interfere, eu so preciso fazer com que o programa da recepção não abra sem o programa tarifador estar ativo , e o tarifador não feche se o da recepção estiver aberto, simples assim obs o tarifador poderá ficar ativo mesmo que o da recepção for fechado, que o único caso em que poderia fechar o taridador(se o da recepção tiver fechado)
pelo o que entendi são dois programas distintos cada um com sua fução e também executavel certo?
Resposta : e certo
vc deseja que o program tarifador não seja fechado de forma alguma, ai no caso só sera fechado se o programa da recepção for fechado, certo?
Resposta : Isto e correto, o tarifador não pode ser fechado antes do outro da recepção
mas se o recepicionista fechar o prog1 digamos assim que é recepção, o tarifador será fechado.
Resposta : Poderia ou não ser fechado, ficando a critério do Operador
isto pode acontecer, do usuario fechar o prog1 recepção?
Resposta : Pode sim os dois são independente
ai o tarifador ficara fechado e para de pegar as ligações?
Resposta : O tarifador e independente do da recepção, e claro que se for fechado não pegara mais as ligaçoes
heverá tipo uma interrupção, enqundo ele não abrir o prog1 recepção de novo.
Resposta : O Tarifador e independente, quando aberto pega as ligações pendente e manda para o da recepção, vou te explicar porque o tarifador tem que ser aberto antes do da recepção. Quando o tarifador e aberto ele pega todas as ligações realizadas e joga no sistema para ser lançado na conta do hospede, se o tarifador ficar fechado, quando for ligado ele joga na conta de quem esta no quarto, ai te falo se ficou fechado uns dois dias e quem fez a ligação já foi embora, quem tiver no quarto no momento que o tarifador for ligado vai receber toda esta contas das ligações feitas por outra pessoa, e mesmo assim se não pagar , o hotel ficaria com a conta ou seja o prejuízo. Por isso o programa so deve funcionar se o tarifador estiver ativo para pegar as ligações realizadas, e mesmo assim depois de o tarifador jogar as ligações no sistema o cliente não fecha a conta do hospede enquanto o custo das ligações realizadas no quarto não são contabilizados na conta.
sendo o prog1 recepção que é resposanvel em abrir e fechar o tarifador, entende?
Resposta : os dois são independente cada um tem que ser aberto manualmente em separado
outra coisa, o tarifador tem que ser executado enquanto o hotel estiver aberto, ou seja enquanto tem alguém
ligando e rebendo ligações, e claro o micro tem que estar ligado, certo?.
Resposta : Independente o micro pode ficar desligado, eu acho. A Central telefônica gera um arquivo texto com os dados de todas as ligações, tais como Numeo Fone, Hora, ramal, Duração Etc. meu sistema so pega este arquivo e transfere para o banco de dados as informações contida nele, e após isto apaga o arquivo original, para que a central crie outro novamente. Agora fiquei com duvida quando ligar o micro será que a central vai criar este arquivo com as ligações já realizada, não sei tenho que verificar istto.
a solução que vejo pra vc mais viavel para contornar atitudes subitas de usuários, é vc fazer o programa tarifador
ser executado quando o micro for ligado (iniciado junto com o windows).
Resposta : Já tentei isto e nao deu certo, O tarifador depende do Gerenciador de banco de dados Firebird e muitas veses o windows executava meu programa antes de iniciar o Firebird, dando pau no acesso ao banco de dados.
vc faz uma função que quando o micro receber ordem de ser desligado, o prog tarifador também receba um comando
para ser fechado, se o windows vai ser fechado, entendeu?
Resposta : Boa idéia não tinha pensado nesta opcao
exemplo este comando foi dado ao windows ExitWindowsEx(EWX_SHUTDOWN, 0);para ser fechado ai seu prog tarifador,
verifica se este comando foi acionado no windows, se foi ele fecha junto ou antes do windows.
assim o pro1 recepção não irá interferir em nada no tarifador, seja se o usuario fechar o porg1 ou não.ok?
Resposta : ele não interfere, eu so preciso fazer com que o programa da recepção não abra sem o programa tarifador estar ativo , e o tarifador não feche se o da recepção estiver aberto, simples assim obs o tarifador poderá ficar ativo mesmo que o da recepção for fechado, que o único caso em que poderia fechar o taridador(se o da recepção tiver fechado)
GOSTEI 0
Edson Melo
01/10/2012
esta explicacao toda e por causa da procedure que coloquei no inicio do post, so quero ver se alguem consegue alterar para servir ao meu proposito sugerido assima.
a rotina normalmente fecha o programa passado o nome, so que paara isso a rotina verifica se ele ta em uso. eu gostaria de fazer o contrario verificar se o programa tarifador esta aberto se estiver nao fazer nada, mas se nao tiver fechar o programa da recepcao, fiz um quebra galho que me resolveu, mas gostaria de ver se alguem consegue alterar a rotina acima para obter o resultado esperado.
vou continuar tentando uma hora eu consigo ou alguem me passa outra dica
a rotina normalmente fecha o programa passado o nome, so que paara isso a rotina verifica se ele ta em uso. eu gostaria de fazer o contrario verificar se o programa tarifador esta aberto se estiver nao fazer nada, mas se nao tiver fechar o programa da recepcao, fiz um quebra galho que me resolveu, mas gostaria de ver se alguem consegue alterar a rotina acima para obter o resultado esperado.
vou continuar tentando uma hora eu consigo ou alguem me passa outra dica
GOSTEI 0
Gilvanio Gonçalves
01/10/2012
Te passamos tantas sugestões para uma rotina totalmente diferente ao que entedemos com
o exemplo de seu codigo, sem uma explicação plausivel. como vc fez agora.
e no seu caso não é dica e sim uma rotina.
vc deseja uma rotina que verifique se o programa tarifador esta em execução, caso não esteja
então fecha a execução do programa recepção, certo?
sendo para este tipo de verificação, na logica sempre o programa recepção será
sempre o primeiro a ser aberto, ou seja ele sempre estará em execução.
muito bem, vc deseja esta rotina como aplicativo separado?.
ou vc esta pretendendo implantar ela onde? no programa recepção? que seria a logica correta.
quando ele for aberto verifica se o tarifador esta em execução, se não, ele
fecha, se sim, nenhuma ação.
se for uma rotina separada para este tipo de vericação, esta rotina e o programa
recepçao terão que serem iniciados juntos com o windows, que entra na dica que te passei
usando o regedit do windows, criando uma sequencia no rum para o recepção com valor 0
e uma sequencia para a nova rotina com o valor 1, para iniciar apos o recepção.
ficando o programa recepção sendo iniciado automaticamente sem precisar do usuario
ativar( abrir ) ele ao ligar o micro.
observe que tratei o recepção e o tarifador como programas e não como aplicativos,ok.
pois para esta rotina estaremos tratando de executaveis, programas já instalados no micro.
e minha sugestão é que esta verificação, seja implantada no Apliacativo Recepção, disse aplicativo.
apos implantada esta rotina, basta vc substtiuir o executavel do programa recepção, no micro onde
esteja instalado, e assim a nova rotina entra em ação.
o exemplo de seu codigo, sem uma explicação plausivel. como vc fez agora.
e no seu caso não é dica e sim uma rotina.
vc deseja uma rotina que verifique se o programa tarifador esta em execução, caso não esteja
então fecha a execução do programa recepção, certo?
sendo para este tipo de verificação, na logica sempre o programa recepção será
sempre o primeiro a ser aberto, ou seja ele sempre estará em execução.
muito bem, vc deseja esta rotina como aplicativo separado?.
ou vc esta pretendendo implantar ela onde? no programa recepção? que seria a logica correta.
quando ele for aberto verifica se o tarifador esta em execução, se não, ele
fecha, se sim, nenhuma ação.
se for uma rotina separada para este tipo de vericação, esta rotina e o programa
recepçao terão que serem iniciados juntos com o windows, que entra na dica que te passei
usando o regedit do windows, criando uma sequencia no rum para o recepção com valor 0
e uma sequencia para a nova rotina com o valor 1, para iniciar apos o recepção.
ficando o programa recepção sendo iniciado automaticamente sem precisar do usuario
ativar( abrir ) ele ao ligar o micro.
observe que tratei o recepção e o tarifador como programas e não como aplicativos,ok.
pois para esta rotina estaremos tratando de executaveis, programas já instalados no micro.
e minha sugestão é que esta verificação, seja implantada no Apliacativo Recepção, disse aplicativo.
apos implantada esta rotina, basta vc substtiuir o executavel do programa recepção, no micro onde
esteja instalado, e assim a nova rotina entra em ação.
GOSTEI 0
Edson Melo
01/10/2012
meus amigos ta mei dificil que voces entendam minha questao.
sempre dice que o programa que fica na recepção, não pode ser aberto enquanto o programa chamado tarifador que e o responsavel por pegar as ligações feitas pelos hospede nao estiver em uso, ou seja so poderei usar o programa que esta na recepção do hotel que e o responsavel pela hospedagem do hospede quando o programa tarifador ja estiver em uso, e no encerramento do dia sera o contrario so poderei fechar o programa tarifador depois de fechar o programa da recepcao.
mas se nao der para melhorar a rotina mostrada logo acina , tudo bem fica valendo o quebra galho que fiz, não ficou muito bom mas funciona e e isso que vale.
agradeço o esforço e a boa vontade de me ajudarem
ate breve
sempre dice que o programa que fica na recepção, não pode ser aberto enquanto o programa chamado tarifador que e o responsavel por pegar as ligações feitas pelos hospede nao estiver em uso, ou seja so poderei usar o programa que esta na recepção do hotel que e o responsavel pela hospedagem do hospede quando o programa tarifador ja estiver em uso, e no encerramento do dia sera o contrario so poderei fechar o programa tarifador depois de fechar o programa da recepcao.
mas se nao der para melhorar a rotina mostrada logo acina , tudo bem fica valendo o quebra galho que fiz, não ficou muito bom mas funciona e e isso que vale.
agradeço o esforço e a boa vontade de me ajudarem
ate breve
GOSTEI 0
Thiago Schnell
01/10/2012
1)O problema do erro ao iniciar provavelmente é porque o banco de dados ai não está pronto para receber conexões
então while bancoProntoPraConectar do application.processmessages
2)por isso preciso que a rotina verifique se o programa tarifador esta ligado, se estiver deixe abrir o programa do hotel, se não tiver não deixe ser executado o programa do hotel
R:(aqui vc faz o seguinte vc vai criar uma mutex e vai deixa rodar normalmente porem invisivel e vc vai colocar no seu programa antes de fazer qualquer coisa para verificar se há alguma instancia do mutex registrado que no caso foi registrado e está em modo de aguardo )
emquanto o programa tarifador nao for aberto
R:(aqui vc fazer fazer uma verificacao se o prog1 estiver aberto vc vai fazer isso SENDMESSAGE(prog1.handle,minhamessage,0,0) e la quando ele receber essa minhamessage ele ira mostrar o form que no caso estava invisivel)
. e mesmo assim o programa tarifador não pode ser fechado
R:(aqui vc vai colocar no onclose do programa se o tarifador estiver aberto cancela o fechamento)
enquanto o programa do hotel estiver em uso
att,
Thiago Schnell.
então while bancoProntoPraConectar do application.processmessages
2)por isso preciso que a rotina verifique se o programa tarifador esta ligado, se estiver deixe abrir o programa do hotel, se não tiver não deixe ser executado o programa do hotel
R:(aqui vc faz o seguinte vc vai criar uma mutex e vai deixa rodar normalmente porem invisivel e vc vai colocar no seu programa antes de fazer qualquer coisa para verificar se há alguma instancia do mutex registrado que no caso foi registrado e está em modo de aguardo )
emquanto o programa tarifador nao for aberto
R:(aqui vc fazer fazer uma verificacao se o prog1 estiver aberto vc vai fazer isso SENDMESSAGE(prog1.handle,minhamessage,0,0) e la quando ele receber essa minhamessage ele ira mostrar o form que no caso estava invisivel)
. e mesmo assim o programa tarifador não pode ser fechado
R:(aqui vc vai colocar no onclose do programa se o tarifador estiver aberto cancela o fechamento)
enquanto o programa do hotel estiver em uso
att,
Thiago Schnell.
GOSTEI 0
Marcos Iwazaki
01/10/2012
tenta fazer o seguinte
cria um projeto novo
coloca um listbox c nome listbox1
e um botao
copia esta função
Function EnumWindowsProc (Wnd: HWND; lb: TListbox): BOOL; stdcall;
var caption: Array [0..128] of Char;
begin
Result := True;
if IsWindowVisible(Wnd) and
((GetWindowLong(Wnd, GWL_HWNDPARENT) = 0) or
(HWND(GetWindowLong(Wnd, GWL_HWNDPARENT)) = GetDesktopWindow))and
((GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW) = 0)
then
begin
SendMessage( Wnd, WM_GETTEXT, Sizeof(caption),integer(@caption));
lb.Items.AddObject( caption,TObject( Wnd ));
end;
end;
coloca esta chamada da função no click do seu botão.
procedure TForm1.btnClick(Sender: TObject);
begin
EnumWindows( @EnumWindowsProc, integer( listbox1 ));
end;
-------------------
Isto vai listar todaas as janelas aberta no momento.
o que vc faz é pegar o nome exato da sua aplição que vai aparece no listbox
dae vc altera a função para q se achar aquele nome quer dizer q seu programa esta aberto.
espero ter ajudado
T+
cria um projeto novo
coloca um listbox c nome listbox1
e um botao
copia esta função
Function EnumWindowsProc (Wnd: HWND; lb: TListbox): BOOL; stdcall;
var caption: Array [0..128] of Char;
begin
Result := True;
if IsWindowVisible(Wnd) and
((GetWindowLong(Wnd, GWL_HWNDPARENT) = 0) or
(HWND(GetWindowLong(Wnd, GWL_HWNDPARENT)) = GetDesktopWindow))and
((GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW) = 0)
then
begin
SendMessage( Wnd, WM_GETTEXT, Sizeof(caption),integer(@caption));
lb.Items.AddObject( caption,TObject( Wnd ));
end;
end;
coloca esta chamada da função no click do seu botão.
procedure TForm1.btnClick(Sender: TObject);
begin
EnumWindows( @EnumWindowsProc, integer( listbox1 ));
end;
-------------------
Isto vai listar todaas as janelas aberta no momento.
o que vc faz é pegar o nome exato da sua aplição que vai aparece no listbox
dae vc altera a função para q se achar aquele nome quer dizer q seu programa esta aberto.
espero ter ajudado
T+
GOSTEI 0
Gilvanio Gonçalves
01/10/2012
Edson, na Logica acretido que a rotina pra vc seria o seguinte:
como os recepcionistas sempre abrem somente o programa recepção,
deixando prog Tarifador sem acesso.
01 - o certo é uma rotina no programa recepção que ao iniciar( ser aberto)
ele verifica na inicilizaÇào se o Tarifador esta em execução se não ele
aciona( abre o tarifador).
junto uma outra rotina se caso o recepcionista
for fechar o prog recepÇào ele recebe um aviso(mensagem) que o programa
recepção não pode ser fechado, programa tarifador em atividade).
02- ou a rotina assim :
quando o recepcionista for abrir o programa Hotel(recepção) e o tarifador
não estiver(Aberto) ele recebe Um Aviso(Mensagem) Este programa só pode ser aberto
somente apos o programa tarifafador estiver em execuÇão, OK!.
se caso o recepcionista
for fechar o prog recepção ele rebebe um aviso(mensagem) que o programa recepção não
pode ser fechado, programa tarifador em atividade).
03- mas como te disse desde o inicio, vc pode forçar que o programa tarifador
seja iniciado automaticamente alguns segundos depois do windows ser carregado.
e se for preciso uma rotina nele que faz ele abrir o recepÇào também segundos
apos o tarifador já estiver em execução, e tendo a rotina se o recepÇào receber
ordem para fechar:(mensagem) que o programa recepção não pode ser fechado!!!!.
programa tarifador em atividade).
e adotar a rotina se o tarifador for fechado ele fecha o recepÇào?
assim não tem como o tarifador não ser executado.
se uma destas opções te servir, eu te passo o codigo a ser implementado, ok.
como os recepcionistas sempre abrem somente o programa recepção,
deixando prog Tarifador sem acesso.
01 - o certo é uma rotina no programa recepção que ao iniciar( ser aberto)
ele verifica na inicilizaÇào se o Tarifador esta em execução se não ele
aciona( abre o tarifador).
junto uma outra rotina se caso o recepcionista
for fechar o prog recepÇào ele recebe um aviso(mensagem) que o programa
recepção não pode ser fechado, programa tarifador em atividade).
02- ou a rotina assim :
quando o recepcionista for abrir o programa Hotel(recepção) e o tarifador
não estiver(Aberto) ele recebe Um Aviso(Mensagem) Este programa só pode ser aberto
somente apos o programa tarifafador estiver em execuÇão, OK!.
se caso o recepcionista
for fechar o prog recepção ele rebebe um aviso(mensagem) que o programa recepção não
pode ser fechado, programa tarifador em atividade).
03- mas como te disse desde o inicio, vc pode forçar que o programa tarifador
seja iniciado automaticamente alguns segundos depois do windows ser carregado.
e se for preciso uma rotina nele que faz ele abrir o recepÇào também segundos
apos o tarifador já estiver em execução, e tendo a rotina se o recepÇào receber
ordem para fechar:(mensagem) que o programa recepção não pode ser fechado!!!!.
programa tarifador em atividade).
e adotar a rotina se o tarifador for fechado ele fecha o recepÇào?
assim não tem como o tarifador não ser executado.
se uma destas opções te servir, eu te passo o codigo a ser implementado, ok.
GOSTEI 0
Gilvanio Gonçalves
01/10/2012
Edson, caso vc tenha ficado confuso, ou não tenha entedido a logica que postei para vc.
na pratica seria assim:
programa (hotel)recepção só abre se tarifador estiver em execução, se não Exibi a mensagem, este programa só
pode ser executado Apos o programa tarifador estiver aberto oK! fecha tela de viso ao clicar em ok, e não faz nada.
a mensagem este programa só pode ser executado Apos o programa tarifador estiver aberto oK!
ao clicar no ok, mensagem, deseja que o programa tarifador seja aberto! sim ou não, se sim, abre o tarifador
automaticamente apos a mensagem e libera pra ele abrir o recepção, ou abre taf, e recp, juntos.
se Prog Tarifador for fechado, ele fecha o recepção, dando um viso vc deseja mesmo fechar este programa!,
este processo ira fechar o programa Hotel ok!, Confirma, sim ou não.
é isto analise a logica e ma fale.
e uma coisa, no seu caso é uma rotina e não ajuda com procedure!.
na pratica seria assim:
programa (hotel)recepção só abre se tarifador estiver em execução, se não Exibi a mensagem, este programa só
pode ser executado Apos o programa tarifador estiver aberto oK! fecha tela de viso ao clicar em ok, e não faz nada.
a mensagem este programa só pode ser executado Apos o programa tarifador estiver aberto oK!
ao clicar no ok, mensagem, deseja que o programa tarifador seja aberto! sim ou não, se sim, abre o tarifador
automaticamente apos a mensagem e libera pra ele abrir o recepção, ou abre taf, e recp, juntos.
se Prog Tarifador for fechado, ele fecha o recepção, dando um viso vc deseja mesmo fechar este programa!,
este processo ira fechar o programa Hotel ok!, Confirma, sim ou não.
é isto analise a logica e ma fale.
e uma coisa, no seu caso é uma rotina e não ajuda com procedure!.
GOSTEI 0
Edson Melo
01/10/2012
ola thiago, obrigado por me responder, vou tentar sua dica, depois te respondo.
quanto a voce socram , sua sugestao e exatamente o que a minha rotina acima faz. so que ela fecha o programa se ele estiver em uso, preciso alterar para que faca o seguinte so verifique se esta em uso ou nao.
mas obrigado. vou tentar as sugestoes de todos.
quanto a voce socram , sua sugestao e exatamente o que a minha rotina acima faz. so que ela fecha o programa se ele estiver em uso, preciso alterar para que faca o seguinte so verifique se esta em uso ou nao.
mas obrigado. vou tentar as sugestoes de todos.
GOSTEI 0
Edson Melo
01/10/2012
gilvanio, a procedure ou rotina ja esta pronta , mostro ela no inicio, so quero é que alguem me ajude a muda-la para que somente verifique se o o programa esta em uso e se for o caso me devolva true ou false, sei que para isso o mais serto seria uma funcao, mas ate ai e facil e so transformar a rotina acima em funcao. mesmo assim te agradeço pela paciencia e boa vontade em me atender e ajuda com meu problema
obrigado
obrigado
GOSTEI 0
Edson Melo
01/10/2012
gilvano te respondendo
programa (hotel)recepção só abre se tarifador estiver em execução, se não Exibi a mensagem, este programa só
pode ser executado Apos o programa tarifador estiver aberto oK!
R= esta certo
fecha tela de viso ao clicar em ok, e não faz nada.
R= outra vez certo
a mensagem este programa só pode ser executado Apos o programa tarifador estiver aberto oK!
R= outar vez certo
ao clicar no ok, mensagem, deseja que o programa tarifador seja aberto! sim ou não, se sim, abre o tarifador
automaticamente apos a mensagem e libera pra ele abrir o recepção,
R= seria uma opcao boa e esta correto, no meu caso tenho que abrir o tarifador manualmente.
ou abre taf, e recp, juntos.
R= Nao primeiro tenho que abrir tarifador somente depois e que abro o da recepcao
se Prog Tarifador for fechado, ele fecha o recepção,
R= No meu caso não cada um e aberto e fechadoo independente, pois tenho a opção de trabalhar com um ou com outro, claro que obedecendo a regra 1) Recepcao nao pode ser usado sem o tarifador estar aberto 2) tarifador nãopode ser fecjhado sem o da recepcao estar fechado
dando um viso vc deseja mesmo fechar este programa!,
este processo ira fechar o programa Hotel ok!, Confirma, sim ou não.
r= fica valendoa resposta anterior
programa (hotel)recepção só abre se tarifador estiver em execução, se não Exibi a mensagem, este programa só
pode ser executado Apos o programa tarifador estiver aberto oK!
R= esta certo
fecha tela de viso ao clicar em ok, e não faz nada.
R= outra vez certo
a mensagem este programa só pode ser executado Apos o programa tarifador estiver aberto oK!
R= outar vez certo
ao clicar no ok, mensagem, deseja que o programa tarifador seja aberto! sim ou não, se sim, abre o tarifador
automaticamente apos a mensagem e libera pra ele abrir o recepção,
R= seria uma opcao boa e esta correto, no meu caso tenho que abrir o tarifador manualmente.
ou abre taf, e recp, juntos.
R= Nao primeiro tenho que abrir tarifador somente depois e que abro o da recepcao
se Prog Tarifador for fechado, ele fecha o recepção,
R= No meu caso não cada um e aberto e fechadoo independente, pois tenho a opção de trabalhar com um ou com outro, claro que obedecendo a regra 1) Recepcao nao pode ser usado sem o tarifador estar aberto 2) tarifador nãopode ser fecjhado sem o da recepcao estar fechado
dando um viso vc deseja mesmo fechar este programa!,
este processo ira fechar o programa Hotel ok!, Confirma, sim ou não.
r= fica valendoa resposta anterior
GOSTEI 0