Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Form Deactivate
#1
Merhaba yine bir sorun ile sizlerleyim elimden geldiğince izah etmeye çalışacağım,

Bir Main formum var(WindowsState). Bu form üzerinde show olarak açılan diğer formlarım mevcut. Formlarım normal form böyle olmak zorunda. MainFormda altta pencereleri gösteren benim yazdığım bir componentim var. Bunun amacı form minimize edildiğinde veya hide edildiğinde pencereye son form görüntüsü ile ekleyerek formlar arasında pencereden gezmek.

Formlar minimize edildiğinde pencereye ekliyorum. Veya aşağıdan pencereye tıklanarak gizliyse gösterilmesini, gösteriliyor ise formun gizlenmesini ve pencereler arası geçişi yapıyorum.

GmjpQN.png

Bir form gösteriliyor iken Ana forma tıklanırsa veya deactive arka plana düşürtülürse küçültülüp pencerelere eklenecek. Peki bunuda yapıyorum sıkıntı yok. Kodumuz şu;

procedure TFrmAltForm.FormDeactivate(Sender: TObject);
Var Ind     : Integer;
   xBuldum : Boolean;
begin
 if xSKScreensHotForm <> nil then
 begin
   xBuldum := False;
   for Ind := 0 to Pred(xSKScreensHotForm.SKItems.Count) do
   begin
     if xSKScreensHotForm.SKItems[Ind].IsForm = Self then
     begin
       xBuldum := True;
       Break;
     end;
   end;
   if not xBuldum then
     xSKScreensHotForm.AddItem(Self,GetFormScreensHot(Self));
   Hide;
 end;
end;

Formu deactive duruma gelince aşağı menüye eklendi ve gizlendi. sonra menüden tıklandı ve form açıldı. Buraya kadarda sorun yok. Sorun bundan sonra.
Tekrar alt menüye tıklanınca form gizlenmiyor ve gösteriliyor. Peki kodumuz ne?

procedure TScreenImageButton.Click;
begin
 inherited;
 if IsForm <> nil then
 begin
   if IsForm.Showing then
     IsForm.Hide
   else
     IsForm.Show;
 end;
end;

Hatanın nerede olduğunu biliyorum fakat aklıma gelen bir çözümüm yok. 
Hatamız şu form gözüküyor iken alt pencereden tıklanıp gizlenilmeye çalışılırsa önce deactivate çalışıyor gizleniyor. Sonra butonun click olayı çalışıyor ve bakıyor ki gizli tekrardan gösteriyor. Yani butonlarım main formda olduğu için tıklanıldığı anda diğer form deactivate'e düşüyor.

Bunun için nasıl bir yol izlenilmeli.
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla
#2
FormDeactivate olayında çağırdığınız Hide kodunu remarklayıp, aşağıdaki gibi bir kod ile denermisiniz:

  TThread.CreateAnonymousThread(
    procedure
   begin
       Sleep(50);

     TThread.Queue(
       nil,

       procedure
       begin
         Hide;
       end
     );
   end
 ).Start;
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#3
(08-04-2019, Saat: 16:54)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: FormDeactivate olayında çağırdığınız Hide kodunu remarklayıp, aşağıdaki gibi bir kod ile denermisiniz:

  TThread.CreateAnonymousThread(
    procedure
   begin
       Sleep(50);

     TThread.Queue(
       nil,

       procedure
       begin
         Hide;
       end
     );
   end
 ).Start;
Bilgisayar basina gecince deneyim @Tuğrul HELVACI
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla
#4
(08-04-2019, Saat: 16:54)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: FormDeactivate olayında çağırdığınız Hide kodunu remarklayıp, aşağıdaki gibi bir kod ile denermisiniz:

  TThread.CreateAnonymousThread(
    procedure
   begin
       Sleep(50);

     TThread.Queue(
       nil,

       procedure
       begin
         Hide;
       end
     );
   end
 ).Start;

@Tuğrul HELVACI hocam,
Konu ile pek alakası olmasa da kullandığınız kodda aklıma takılan bir soruyu sorayım.
Thread içinde kullandığınız SysUtils kütüphanesine ait Sleep() metodu ile TThread class metodunda yer alan TThread.Sleep() arasında bir fark var mı?
Sleep veya TThread.Sleep'i nerelerde kullanmak daha doğru olacaktır?
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#5
@Tuğrul HELVACI hocam, yine üstadlığını gösterdi Smile O iş tamamdır hocam 50 yetmedi 100'de anlaştık. Hocam aklıma sleep gelmişti denemiştim yememişti tabiki thread ile sleep gelmemişti birşey daha öğrendik saolun.
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla
#6
(08-04-2019, Saat: 17:24)Fesih ARSLAN Adlı Kullanıcıdan Alıntı:
(08-04-2019, Saat: 16:54)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: FormDeactivate olayında çağırdığınız Hide kodunu remarklayıp, aşağıdaki gibi bir kod ile denermisiniz:

  TThread.CreateAnonymousThread(
    procedure
   begin
       Sleep(50);

     TThread.Queue(
       nil,

       procedure
       begin
         Hide;
       end
     );
   end
 ).Start;

@Tuğrul HELVACI hocam,
Konu ile pek alakası olmasa da kullandığınız kodda aklıma takılan bir soruyu sorayım.
Thread içinde kullandığınız SysUtils kütüphanesine ait Sleep() metodu ile TThread class metodunda yer alan TThread.Sleep() arasında bir fark var mı?
Sleep veya TThread.Sleep'i nerelerde kullanmak daha doğru olacaktır?

Merhaba üstad, esasen Windows işletim sistemi açısından bir fark yok. Sizin de göreceğiniz üzere her ikisi de; kernel32.dll içindeki Sleep metoduna yönleniyorlar. Lâkin, TThread.Sleep işletim sisteminin windows olmaması durumunda da kullanılabiliyor. Aradaki tek fark bu, benim bildiğim kadarı ile.

Ayrıca belirtmek isterim ki, normalde Sleep çağrımını hiç yapmamak en iyisidir. Çünkü Sleep çağrımı ile işletim sistemine; "kardeş ben şu köşede şu kadar milisaniye bir uyuyayım, vakti gelince beni uyandırırsın" demektir. Tabii her zaman istediğiniz zaman kadar sonra uyandırılacağınız kesin değildir, biraz zaman sapması olabilir. Bu mesele işletim sisteminin iç yapısı (Round Robin/Scheduling) ile ilgilidir.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#7
(08-04-2019, Saat: 18:54)narkotik Adlı Kullanıcıdan Alıntı: @Tuğrul HELVACI  hocam, yine üstadlığını gösterdi Smile O iş tamamdır hocam 50 yetmedi 100'de anlaştık. Hocam aklıma sleep gelmişti denemiştim yememişti tabiki thread ile sleep gelmemişti birşey daha öğrendik saolun.

Estağfirullah, sadece bir olay çağrımının içinde iken başka çağrımların yapılmasının sıkıntılara neden olabileceğini biliyorum. Bu nedenle, o olay çağrımından çıkmanızı ve buna müteakip yine ana thread içinde ne yapmak istiyorsanız onu yapmanızı sağlayacak kodu paylaştım sadece. Aynı işlevselliği PostMessage ile de sağlayabilirdiniz. Maksat ana thread bloklanmasın, asenkron olarak ilerlesin ve ana thread'in mesaj kuyruğuna istediğimiz işi yapan bir mesaj bırakabilelim.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Form create buton visible durumu Yeliz 6 423 01-02-2019, Saat: 14:07
Son Yorum: Yeliz
  Form Kapatma olayında diğer kontrolleri atlatma cinarbil 6 621 21-12-2018, Saat: 09:19
Son Yorum: cinarbil
  MDIChild Form Sorunu nevzatc 1 324 27-11-2018, Saat: 01:18
Son Yorum: ihalilcoban
  yazıcı için form tasarımı yapmak. Bay_Y 4 724 17-07-2018, Saat: 16:01
Son Yorum: engerex
  form içindekiler arsl01 2 455 16-07-2018, Saat: 14:40
Son Yorum: arsl01



Konuyu Okuyanlar: 1 Ziyaretçi