Fórum Abrir mesmo Form mas restringindo de acordo com o caption #326127
26/07/2006
0
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
Curtir tópico
+ 0Posts
26/07/2006
Night_man
for Idx := 0 to Screen.FormCount - 1 do begin if (Screen.Forms[Idx].Caption = ´Seu Caption´) then begin // end; end;
Gostei + 0
26/07/2006
Marco Salles
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
27/07/2006
Mmoreira
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
27/07/2006
Mmoreira
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
27/07/2006
Marco Salles
[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
27/07/2006
Mmoreira
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
27/07/2006
Marco Salles
mas mesmo com este teste ele ainda cria o formulário
if NomeDoForm = nil begin NomeDoForm:= TNomeDoForm.Create(nil); NomeDoForm.Show; end
Gostei + 0
27/07/2006
Mmoreira
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
27/07/2006
Marco Salles
Logo ele ira destruir e depois quando der o Tempo ele ira Criar novamente...
Gostei + 0
27/07/2006
Marco Salles
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
27/07/2006
Mmoreira
Gostei + 0
27/07/2006
Jáder Medeiros
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
27/07/2006
Mmoreira
Cara a StringList salvou minha vida, sua sugestão me atendeu perfeitamente .... Problema resolvido.
SALVE A STRINGLIST!!!!!!!!!!
Valew pela força.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)