Message Dialog Özelleştirme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Message Dialog Özelleştirme

Mesaj gönderen brs »

Selam Message Dialog kendime göre özelleştirdim fakat "ID_YES" butonuna bastığımda mesaj kutusu kapanıyor, kapanmasını nasıl engelleye bilirim...

Kod: Tümünü seç

procedure TForm2.KaydetClick(Sender: TObject);
Var
  AMsgDialog: TForm;
  AEdit: TEdit;
begin
  AMsgDialog := CreateMessageDialog(' Lütfen Yeni Kayıt İçin Giriş Yapınız!',
    mtCustom, [mbYes, mbNo]);
  TButton(AMsgDialog.FindComponent('Yes')).Caption := 'Kaydet';
  TButton(AMsgDialog.FindComponent('Yes')).Height := 25;
  TButton(AMsgDialog.FindComponent('Yes')).Width := 75;
  TButton(AMsgDialog.FindComponent('Yes')).Top := 75;
  TButton(AMsgDialog.FindComponent('Yes')).Left := 30;
  TButton(AMsgDialog.FindComponent('Yes')).Cursor := crHandPoint;

  TButton(AMsgDialog.FindComponent('No')).Caption := 'İptal';
  TButton(AMsgDialog.FindComponent('No')).Height := 25;
  TButton(AMsgDialog.FindComponent('No')).Width := 75;
  TButton(AMsgDialog.FindComponent('No')).Top := 75;
  TButton(AMsgDialog.FindComponent('No')).Left := 115;
  TButton(AMsgDialog.FindComponent('No')).Cursor := crHandPoint;

  AEdit := TEdit.Create(AMsgDialog);

  with AMsgDialog do
    try
      Caption := 'Yeni Kayıt';
      Height := 150;
      Width := 240;

      With AEdit do
      begin
        Parent := AMsgDialog;
        AutoSize := False;
        MaxLength := 100;
        Top := 40;
        Left := 10;
        Height := 25;
        Width := 200;
      end;

   if (ShowModal = ID_YES) then
    begin
     Form2.Caption:='dddddddddddddddddd';
    end;
   finally
    //Free;
   end;
 end;
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Message Dialog Özelleştirme

Mesaj gönderen mrmarman »

Merhaba.

- Mesaj kutusu, yapılış amacı gereği kapanması içindir bir diyalogtur.

- Zaten sen de ModalResult kontrol ettiğine göre bu RESULT'un dönmesi için kapanması şarttır.

- Eğer asıl sorun; kapanmasını engellemek değil de kendi koyduğun ve değer girilen TEDIT içindeki değeri almak ise aşağıdaki şekilde yapabilirsin.

Kod: Tümünü seç

Var
  xDeger : String;

Procedure TForm1.EditExit( Sender:TObject);
begin
  xDeger := TEdit( Sender ).Text;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
Var
  AMsgDialog: TForm;
  AEdit: TEdit;
begin
  AMsgDialog := CreateMessageDialog(' Lütfen Yeni Kayıt İçin Giriş Yapınız!',
    mtCustom, [mbYes, mbNo]);
  TButton(AMsgDialog.FindComponent('Yes')).Caption := 'Kaydet';
  TButton(AMsgDialog.FindComponent('Yes')).Height := 25;
  TButton(AMsgDialog.FindComponent('Yes')).Width := 75;
  TButton(AMsgDialog.FindComponent('Yes')).Top := 75;
  TButton(AMsgDialog.FindComponent('Yes')).Left := 30;
  TButton(AMsgDialog.FindComponent('Yes')).Cursor := crHandPoint;

  TButton(AMsgDialog.FindComponent('No')).Caption := 'İptal';
  TButton(AMsgDialog.FindComponent('No')).Height := 25;
  TButton(AMsgDialog.FindComponent('No')).Width := 75;
  TButton(AMsgDialog.FindComponent('No')).Top := 75;
  TButton(AMsgDialog.FindComponent('No')).Left := 115;
  TButton(AMsgDialog.FindComponent('No')).Cursor := crHandPoint;

  AEdit := TEdit.Create(AMsgDialog);
  AEdit.OnExit := EditExit;

  with AMsgDialog do
    try
      Caption := 'Yeni Kayıt';
      Height := 150;
      Width := 240;

      With AEdit do
      begin
        Parent := AMsgDialog;
        AutoSize := False;
        MaxLength := 100;
        Top := 40;
        Left := 10;
        Height := 25;
        Width := 200;
      end;

   if (ShowModal = ID_YES) then
    begin
     ShowMessage( xDeger );
    end;
   finally
    //Free;
   end;
end;
Resim
Resim ....Resim
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: Message Dialog Özelleştirme

Mesaj gönderen xxxjedixxx »

Merhaba,
Benim anladığım kadarıyla, dialog içindeki edit'e bir şey girilmemiş ise Evet (Kaydet) butonuna tıklanırsa dialog kapanmasın istiyorsun. Eğer ihtiyacın buysa, aradığın çözüm şu şekilde olabilir. Pointer kavramları konusunda bilgin nasıl bilmiyorum ama karışık gelirse diye açıklamaya çalıştım. Kodu kendim yazdım ve test ettim başarılı bir şekilde çalışıyor. Bir sorun olursa örnek projeyi atabilirim.

Kodu aldıktan sonra fomunun private bölümüne aşağıdaki procedure tanımını eklemeyi unutma

Kod: Tümünü seç

  ...
  private
    procedure DlgButtonClick(Sender: TObject);
  ...

Kod: Tümünü seç

procedure TForm1.DlgButtonClick(Sender: TObject);
begin
  if Trim(TEdit(Ptr(TButton(Sender).Tag)).Text) <> '' then // Butonun tag'ine sakladığımız edit'in adresinden Ptr fonksiyonu ile Edit'e ulaşıyoruz.
    TForm(TButton(Sender).Parent).ModalResult  :=  mrYes; // Edit dolu  ise modalresult'ı mrYes yaparak dialogun kapanmasını sağlıyoruz.
end;

procedure TForm1.Button1Click(Sender: TObject);
var AMsgDialog: TForm;
    AEdit: TEdit;
    DlgYesBtn: TButton;
begin
  AMsgDialog := CreateMessageDialog(' Lütfen Yeni Kayıt İçin Giriş Yapınız!', mtCustom, [mbYes, mbNo]);

  AEdit := TEdit.Create(AMsgDialog);
  with AEdit do
  begin
    Parent := AMsgDialog; AutoSize := False; MaxLength := 100;
    Top := 40; Left := 10; Height := 25; Width := 200;
  end;

  DlgYesBtn := TButton(AMsgDialog.FindComponent('Yes'));
  with DlgYesBtn do
  begin
    Caption := 'Kaydet'; Cursor := crHandPoint;
    Height := 25; Width := 75; Top := 75; Left := 30;
// Buraya dikkat,
    ModalResult := mrNone; // Dialog'un kapanmasını engelliyoruz.
    OnClick := DlgButtonClick; // Evet, buttonunun Onclick eventini bizim procedurümüze yönlendiriyoruz.
    Tag := LongInt(AEdit); //Click proceduründe kullanmak için Evet(kaydet) butonun Tag'ına Edit'in adresini yerleştiriyoruz.
  end;

  with TButton(AMsgDialog.FindComponent('No')) do
  begin
    Caption := 'İptal'; Cursor := crHandPoint;
    Height := 25; Width := 75; Top := 75; Left := 115;
  end;

  with AMsgDialog do
  begin
    Caption := 'Yeni Kayıt'; Height := 150; Width := 240;
    if (ShowModal = ID_YES) then
    begin
      ShowMessage(AEdit.Text);
    end;
  end;
  AEdit.Free;
  AMsgDialog.Free;
end;
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Message Dialog Özelleştirme

Mesaj gönderen mrmarman »

- Tekrar bakınca ben de öyle anladım.

- Yine siz AEdit.Text'i bir global string bir değişkene alın ki diyalog kapandığında girilen değer için top out'a çımasın değil mi :idea: Veri girişini kullanırken lazım olur..

DÜZELTME : Her mesajı kendi projemmiş gibi düşünüyorum sanırım.. :lol: Global değişkene gerek yok, Message Dialog özelleştirme deyince bağımsız bir procedure olarak düşündüm. @brs direkt button içinde kullanmaya devam ediyorsa zaten veri girişini de oradan kullanacak gibi görünüyor ki o zaman global değişkene gerek kalmıyor... AEdit.TExt'in bizatihi kendisini kullanıp en sonunda free edecektir. :oops:
Resim
Resim ....Resim
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: Message Dialog Özelleştirme

Mesaj gönderen brs »

Selam, mrmarman ve xxxjedixxx ilginize teşekkür ederim,

Yapmak istediğim şey edit boş ise ve birden fazla kayıt yapmak istediğinde kullanıcı dialog her seferinde yeniden açmaması için kapanmasını engellemekti...
xxxjedixxx arkadaşım tekrar teşekkür ederim.

Fakat edit içine giriş yapılsada dialog penceresinin kapanmasını nasıl engellerim yani birden fazla kayıt girişi olma ihtimali için :D
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: Message Dialog Özelleştirme

Mesaj gönderen xxxjedixxx »

O kadar açıklama yazdım ama dikkat etmemişsiniz. Önceki yazdığım koddaki DlgButtonClick prosedürüne bakarsanız, açıklamalarda sorduğunuz detayı yakalarsınız.

Kod: Tümünü seç

procedure TForm1.DlgButtonClick(Sender: TObject);
begin
  if Trim(TEdit(Ptr(TButton(Sender).Tag)).Text) <> '' then // Butonun tag'ine sakladığımız edit'in adresinden Ptr fonksiyonu ile Edit'e ulaşıyoruz.
    TForm(TButton(Sender).Parent).ModalResult  :=  mrYes; // Edit dolu  ise modalresult'ı mrYes yaparak dialogun kapanmasını sağlıyoruz.
end;
...
TForm(TButton(Sender).Parent).ModalResult := mrYes; // Bu satırı kaldırırsan diyalog kapanmaz.

Yani kayıt yaptırdığın kodları bu DlgButtonClick prosedürüne taşırsan işin görülecektir. Kayıt işin bitince modalresult değerini mryes yaparsın kapanır.

Kod: Tümünü seç

procedure TForm1.DlgButtonClick(Sender: TObject);
var Str: string;
begin
  Str := Trim(TEdit(Ptr(TButton(Sender).Tag)).Text); // Edit'e yazılan text
  if Str = '' then Exit;
  ...
  KayıtYap;
  ...
  if HerseyKaydedildi then
    TForm(TButton(Sender).Parent).ModalResult  :=  mrYes;
end;
...
Cevapla