Abrir mesmo Form mas restringindo de acordo com o caption
Bom dia!!!
Vou tentar explicar o que eu estou precisando fazer .. Tenho em meu sistema um modulo de Agenda de Compromissos que ao agendar os compromissos tenho a possibilidade de solicitar que ele me avise com alguns minutos antecedencia ... e estes minutos é configurado pelo usuario ... até ai tudo blz ta funcionando blzinha!!! Quando chega a hora do sistema notificar o usuario sobre o compromisso o que o sistema faz? O sistema cria um Form com as informações referente ao compromisso que ele esta notificando ... tipo: IDCOMPROMISSO, DESCRICAO, DATA, HORA .... ETC. Até aqui tambem tudo certo, o sistema funciona Blz.
-> O problema que estou tendo entra agora: Quando o usuario esta trabalhando e o sistema cria o Form ... automaticamente o usuario ve a notificacao e decide o que fazer, dar a baixa ou agendar para mais tarde ... O meu problema entra agora, quando o usuario nao esta perto do computador e permanece muito tempo longe o sistema vai criando varios Forms com o mesmo compromisso ... eu nao quero que isso aconteca ... entao gostaria de saber como faço para antes do sistema criar o form verificar se ja existe um form com aquele compromisso ja criado ... Obs.: No caption do Form eu coloco a descricao do compromisso entao pensei se nao é possivel fazer alguma coisa partindo daí ...
Eu estou usando o Delphi7 e os formularios dos compromissos sao do tipo fsMDIChild
Se alguem puder me ajudar agradeço desde já.
valew
Vou tentar explicar o que eu estou precisando fazer .. Tenho em meu sistema um modulo de Agenda de Compromissos que ao agendar os compromissos tenho a possibilidade de solicitar que ele me avise com alguns minutos antecedencia ... e estes minutos é configurado pelo usuario ... até ai tudo blz ta funcionando blzinha!!! Quando chega a hora do sistema notificar o usuario sobre o compromisso o que o sistema faz? O sistema cria um Form com as informações referente ao compromisso que ele esta notificando ... tipo: IDCOMPROMISSO, DESCRICAO, DATA, HORA .... ETC. Até aqui tambem tudo certo, o sistema funciona Blz.
-> O problema que estou tendo entra agora: Quando o usuario esta trabalhando e o sistema cria o Form ... automaticamente o usuario ve a notificacao e decide o que fazer, dar a baixa ou agendar para mais tarde ... O meu problema entra agora, quando o usuario nao esta perto do computador e permanece muito tempo longe o sistema vai criando varios Forms com o mesmo compromisso ... eu nao quero que isso aconteca ... entao gostaria de saber como faço para antes do sistema criar o form verificar se ja existe um form com aquele compromisso ja criado ... Obs.: No caption do Form eu coloco a descricao do compromisso entao pensei se nao é possivel fazer alguma coisa partindo daí ...
Eu estou usando o Delphi7 e os formularios dos compromissos sao do tipo fsMDIChild
Se alguem puder me ajudar agradeço desde já.
valew
Mmoreira
Curtidas 0
Respostas
Night_man
26/07/2006
tenta fazer o seguinte
for Idx := 0 to Screen.FormCount - 1 do begin if (Screen.Forms[Idx].Caption = ´Seu Caption´) then begin // end; end;
GOSTEI 0
Marco Salles
26/07/2006
Amigo , voce disse que esta trabalhando com fsMDIChild.....
Com voce esta destruindo esses forms ?????
Acho que no evento OnClose desses forms voce fazer
e na hora de cria-los
Acho que resolve.....
Com voce esta destruindo esses forms ?????
Acho que no evento OnClose desses forms voce fazer
Action:=Cafree; NomeDoForm:= nil;
e na hora de cria-los
if NomeDoForm = nil begin NomeDoForm:= TNomeDoForm.Create(nil); NomeDoForm.Show; end
Acho que resolve.....
GOSTEI 0
Mmoreira
26/07/2006
NiGHT_MaN,
Bom dia!
Cara sua rotina nao resolveu meu problema pelo seguinte motivo .. Eu só posso criar o Form quando: Screen.Forms[Idx].Caption <> ´Seu Caption´
Ai vem o problema, com esta rotina ele esta criando o form com o mesmo caption varias vezes porque eu poderei ter varios forms abertos no meu sistema entao ele vai verificar caption de form por form: Screen.Forms[ 0 ].Caption Screen.Forms[ 1 ].Caption Screen.Forms[ 2 ].Caption .... etc. E o caption nao sendo igual ele vai criando os forms, entendeu ???
Ainda nao resolvi este problema, vou continuar tentando e assim que tiver algo posto aqui no forum!!!!
valew
Bom dia!
Cara sua rotina nao resolveu meu problema pelo seguinte motivo .. Eu só posso criar o Form quando: Screen.Forms[Idx].Caption <> ´Seu Caption´
Ai vem o problema, com esta rotina ele esta criando o form com o mesmo caption varias vezes porque eu poderei ter varios forms abertos no meu sistema entao ele vai verificar caption de form por form: Screen.Forms[ 0 ].Caption Screen.Forms[ 1 ].Caption Screen.Forms[ 2 ].Caption .... etc. E o caption nao sendo igual ele vai criando os forms, entendeu ???
Ainda nao resolvi este problema, vou continuar tentando e assim que tiver algo posto aqui no forum!!!!
valew
GOSTEI 0
Mmoreira
26/07/2006
Isso esta dificil porque existe um loop rodando de acordo com a quantidade de itens encontrados em um clientDataSet ... tipo assim:
Desta maneira ai ele esta criando o form apenas uma vez mas para apenas um compromisso, se eu tiver mais de um registro no ClientDataSet ele nao vai criar um form para cada compromisso pois eu faço uma verificação se o form ja existe ... Tenho que eliminar isso e fazer que o sistema crie um form para cada compromisso contido no CDS e nao repita um form com um compromisso que ja esteja criado ...
First; while not Eof do begin if fmCompromissoEdita = nil then begin fmCompromissoEdita := TfmCompromissoEdita.Create(self); fmCompromissoEdita.Operacao := ´Edita´; fmCompromissoEdita.IdCompromisso := FieldByName( ´IDCOMPROMISSO´ ).AsInteger; fmCompromissoEdita.edtDescricao.Text := FieldByName( ´DESCRICAO´ ).AsString; fmCompromissoEdita.Caption := FieldByName( ´DESCRICAO´ ).AsString; fmCompromissoEdita.calendarioData.Date := FieldByName( ´DATA´ ).AsDateTime; fmCompromissoEdita.dtPickerHora.Time := FieldByName( ´HORA´ ).AsDateTime; if FieldByName( ´ALERTA´ ).AsString = ´S´ then fmCompromissoEdita.checkAvisar.Checked := true else fmCompromissoEdita.checkAvisar.Checked := false; fmCompromissoEdita.edtMinutos.Text := IntToStr( FieldByName( ´ANTECIPAR´ ).AsInteger ); fmCompromissoEdita.UpDown1.Position := FieldByName( ´ANTECIPAR´ ).AsInteger; end; Next; end;
Desta maneira ai ele esta criando o form apenas uma vez mas para apenas um compromisso, se eu tiver mais de um registro no ClientDataSet ele nao vai criar um form para cada compromisso pois eu faço uma verificação se o form ja existe ... Tenho que eliminar isso e fazer que o sistema crie um form para cada compromisso contido no CDS e nao repita um form com um compromisso que ja esteja criado ...
GOSTEI 0
Marco Salles
26/07/2006
Kra to aqui tb meu :evil: :P
[b:20e1cac529]Acho que no evento OnClose desses forms voce fazer[/b:20e1cac529]
e na hora de cria-los
Código:
Acho que resolve se forem vários form para cada tipo de Compromissos
Amigo , voce disse que esta trabalhando com fsMDIChild.....
Com voce esta destruindo esses forms ?????
[b:20e1cac529]Acho que no evento OnClose desses forms voce fazer[/b:20e1cac529]
Código: Action:=Cafree; NomeDoForm:= nil;
e na hora de cria-los
Código:
if NomeDoForm = nil begin NomeDoForm:= TNomeDoForm.Create(nil); NomeDoForm.Show; end
Acho que resolve se forem vários form para cada tipo de Compromissos
GOSTEI 0
Mmoreira
26/07/2006
Marco Salles,
Cara eu estou destruindo os forms exatamente como vc postou ai. O meu problema mesmo esta sendo na hora da criação, pra nao repetir os compromissos ...
valew
Cara eu estou destruindo os forms exatamente como vc postou ai. O meu problema mesmo esta sendo na hora da criação, pra nao repetir os compromissos ...
valew
GOSTEI 0
Marco Salles
26/07/2006
Marco Salles,
Cara eu estou destruindo os forms exatamente como vc postou ai. O meu problema mesmo esta sendo na hora da criação, pra nao repetir os compromissos ...
valew
mas mesmo com este teste ele ainda cria o formulário
if NomeDoForm = nil begin NomeDoForm:= TNomeDoForm.Create(nil); NomeDoForm.Show; end
GOSTEI 0
Mmoreira
26/07/2006
agora nao esta criando justamente por causa deste codigo aqui:
Mas assim nao estou tendo o resultado esperado, pois ele tem que ir criando os forms de acordo com os compromissos que tenho ... o que ele nao pode fazer é simplesmente isso:
Suponhamos que eu tenha um form com o seguinte caption:
LIGAR PARA O CORREIO AS 13 HORAS
Entao eu poderia criar forms para outros compromissos mas para este nao porque o form ja estaria criado ...
if fmCompromissoEdita = nil then begin
Mas assim nao estou tendo o resultado esperado, pois ele tem que ir criando os forms de acordo com os compromissos que tenho ... o que ele nao pode fazer é simplesmente isso:
Suponhamos que eu tenha um form com o seguinte caption:
LIGAR PARA O CORREIO AS 13 HORAS
Entao eu poderia criar forms para outros compromissos mas para este nao porque o form ja estaria criado ...
GOSTEI 0
Marco Salles
26/07/2006
então uma idéia :
Logo ele ira destruir e depois quando der o Tempo ele ira Criar novamente...
if NomeDoForm = nil then
begin
NomeDoForm:= TNomeDoForm.Create(nil);
NomeDoForm.Show;
end
else
begin
NomeDoForm.release; //Ou Release não sei qual é o melhor
NomeDoForm:=nil;
Logo ele ira destruir e depois quando der o Tempo ele ira Criar novamente...
GOSTEI 0
Marco Salles
26/07/2006
então uma idéia :
[b:3c41a8a528]Outra idéia[/b:3c41a8a528] e destruir estes forms de acordo com umtempo definido
aonde voce define o ´tempo de vida´ desse form na propreidade Interval de um OnTimer
Citação:
Logo ele ira destruir e depois quando der o Tempo ele ira Criar novamente...
if NomeDoForm = nil then begin NomeDoForm:= TNomeDoForm.Create(nil); NomeDoForm.Show; end else begin NomeDoForm.release; //Ou Release não sei qual é o melhor NomeDoForm:=nil;
[b:3c41a8a528]Outra idéia[/b:3c41a8a528] e destruir estes forms de acordo com umtempo definido
procedure TNomeDoForm.Timer1Timer(Sender: TObject); begin close; end;
aonde voce define o ´tempo de vida´ desse form na propreidade Interval de um OnTimer
GOSTEI 0
Mmoreira
26/07/2006
Eu preciso fazer a verificação atravez do Caption do do Form ... não pode ser pelo nome.
GOSTEI 0
Jáder Medeiros
26/07/2006
Cara, se você ver minhas mensagens de outros tópicos vai perceber que sou fã da classe TStringList.
Você vai criar uma variável global do tipo TStringList em seu formulário principal. Crie o objeto na criação do seu formulário principal e destrua-a ao destruir seu formulário principal.
Crie uma função que receba por parâmetro o texto que irá ficar no Caption do formulário ´lembrete´. A função testará se na variável da classe TStringList existe algum objeto com o nome do Caption. Se existir, pegue o índice do formulário ´lembrete´ e exiba-o, se não, crie ele da forma tradicional e acrescente-o definindo o Caption como nome do objeto.
Segue abaixo um exemplo.
Você vai criar uma variável global do tipo TStringList em seu formulário principal. Crie o objeto na criação do seu formulário principal e destrua-a ao destruir seu formulário principal.
Crie uma função que receba por parâmetro o texto que irá ficar no Caption do formulário ´lembrete´. A função testará se na variável da classe TStringList existe algum objeto com o nome do Caption. Se existir, pegue o índice do formulário ´lembrete´ e exiba-o, se não, crie ele da forma tradicional e acrescente-o definindo o Caption como nome do objeto.
Segue abaixo um exemplo.
unit Unit1;
interface
uses
Forms, Classes;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
end;
var
Form1: TForm1;
Forms: TStringList;
Procedure Exibe(pDescricao: String);
implementation
uses
Unit2;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Forms := TStringList.Create
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Forms.Free
end;
Procedure Exibe(pDescricao: String);
var
vForm: TForm2;
begin
if Forms.IndexOf(pDescricao) < 0 then begin
Application.CreateForm(TForm2,vForm);
vForm.Caption := pDescricao;
vForm.Show;
Forms.AddObject(pDescricao,vForm)
end else
TForm2(Forms.Objects[Forms.IndexOf(pDescricao)]).Show
end;
end.GOSTEI 0
Mmoreira
26/07/2006
Jader,
Cara a StringList salvou minha vida, sua sugestão me atendeu perfeitamente .... Problema resolvido.
SALVE A STRINGLIST!!!!!!!!!!
Valew pela força.
Cara a StringList salvou minha vida, sua sugestão me atendeu perfeitamente .... Problema resolvido.
SALVE A STRINGLIST!!!!!!!!!!
Valew pela força.
GOSTEI 0