Abrir mesmo Form mas restringindo de acordo com o caption

Delphi

26/07/2006

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


Mmoreira

Mmoreira

Curtidas 0

Respostas

Night_man

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

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

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

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


GOSTEI 0
Mmoreira

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:

        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

Marco Salles

26/07/2006

Kra to aqui tb meu :evil: :P

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

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


GOSTEI 0
Marco Salles

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

Mmoreira

26/07/2006

agora nao esta criando justamente por causa deste codigo aqui:

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

Marco Salles

26/07/2006

então uma idéia :

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

Marco Salles

26/07/2006

então uma idéia :

Citação:
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...


[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

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

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.

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

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.


GOSTEI 0
POSTAR