bir delphi bug'ı. ama daha çok çözümüyle ilgileniyorum.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
iqprog

bir delphi bug'ı. ama daha çok çözümüyle ilgileniyorum.

Mesaj gönderen iqprog »

1. form, ana formunuz mdiform.
2. form, childform mdichild.
3. form, normal bir form.

ana formun içinde childform açık duruyor. sonra siz normal form olan 3üncü formu showmodal olarak açtınız. aşağıda mdichild olan form da açık. normal form da showmodal olarak en tepede açık durur vaziyette. bu durumda ctrl F4 yaparsanız aşağıdaki mdichild form kapanıyor. enteresan di mi?

ama beni şuan ilgilendiren bunu engellemem gerek. çünkü devamında hatalar zinciri oluşuyor.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Burada yanlış bir uygulaman olmalı. Pencerelerin CreateParams ile oynadın mı ?

- Açtığın üçüncü form ShowModal olarak açılmışsa CTRL+F4 işe yaramaz. Alt+F4 ile bu MODAL formu kapatabilirsin, ondan sonra Modality sona erer.
Resim
Resim ....Resim
csyasar
Üye
Mesajlar: 646
Kayıt: 25 Şub 2004 10:14
Konum: Tokat

Mesaj gönderen csyasar »

@mrmarman'ın dediklerine ek olarak Ctrl+F4 bildiğim kadarıyla tabbed form kapatmaya yarıyor. child kapatma işine de yarıyor olabilir. istersen child'ın keydown olayına bi yordan yaz. devre dışı kalsın.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@csyasar

- Haklısın CTRL+F4 her ikisine de yarıyor. Yalnız ortada Modal bir form varsa bu kontrol ondan arkasında kalana geçmez. Bunu irdelemesini önerdim.

- Yani MdiChild'de bunu engeleyecek durum olması bile ortada bir sorun olduğuna delalet. Yani bir sorun yaratıp sonra o soruna başka türlü çözüm bulmak anlamsız. Sorunun kaynağına bakmak lazım demek istemiştim.
Resim
Resim ....Resim
iqprog

Mesaj gönderen iqprog »

arkadaşlar başka yöne kaymışsınız. ilginiz için teşekkürler yine de.

bir boş proje yaratıp deneseniz anlardınız.

sade bir şekilde tekrar anlatıyorum. hoş daha sade nasıl antacağım zaten sade anlatmıştım ama.

3 tane formumuz var.
1. ana form , tipi mdiform
2. child form, tipi mdichild
3. modal açılacak form, tipi normal

şimdi ana form açıldı haliyle. ondan sonra child form da açıldı, ne şekilde açıldığının önemi yok. sonra modal formumuz da açıldı, onun da nasıl açıldığının önemi yok modal açıldı işte.

şimdi nedir olay, modal bir form açılınca daha önce açılmış olan diğer formlara erişemezsiniz, ne tuşlarla ne fare ile.

neyse örneğime dönüyorum. siz program bu durumdayken kazara ya da bilerek neyse ctrl f4 tuşuna basarsanız ne olması gerekir? cevap vereyim hiç bi şey olmaması lazım. ama oluyor işte arkadaki child form minimize oluyor, bende minimize olduğu zaman kapat demişim o yüzden de kapanıyor. Neyse siz sıfır bir proje yapıp denerseniz minimize olayını göreceksiniz.

bu arada biraz araştırınca gerçekten böyle bir bug'ın olduğunu da buldum. buyrun linki
http://members.aye.net/~bstowers/delphi ... cl-MDI.htm
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Başa bir yer kaydığımız yok aslında. Bu taktirde Bu bug senin Delphi sürümünde olmalı... Sen Delphi 4 veya daha eskisini kullanıyorsun bu gösterdiğin sayfaya göre...

- Bir de diğer yandan oradaki bahsi geçen hatalar senin bahsettiğinden değil. Ya da ben yanlış anlıyorum. Seninle ilgili olanı buraya yazar mısın beraber tercüme edelim...

- Aşağıdaki de benim kod.

http://rapidshare.com/files/13751472/Fo ... l.zip.html

Bunu indir ve dene istersen bizde böyle bişey olmuyor ki, bu tip sorular sorduk.
Resim
Resim ....Resim
iqprog

Mesaj gönderen iqprog »

evet bu gönderdiğiniz exe'de sorun yok. sizde d7 var. bende d6. d6'dan sonra düzeltilmiş bug. yani ben de yanlış bir şey yapmıyormuşum.

d6 da forms.pas'da

function TApplication.IsMDIMsg(var Msg: TMsg): Boolean;
begin
Result := False;
if (MainForm <> nil) and (MainForm.FormStyle = fsMDIForm) and
(Screen.ActiveForm <> nil) then
Result := TranslateMDISysAccel(MainForm.ClientHandle, Msg);
end;

şeklindeki functionda aşağıdaki bir düzenleme yapmak gerekiyor ve tabi tekrar compile etmek gerekecek.

function TApplication.IsMDIMsg(var Msg: TMsg): Boolean;
begin
Result := False;
if (MainForm <> nil) and (MainForm.FormStyle = fsMDIForm) and
((Screen.ActiveForm = nil) or
(Screen.ActiveForm.FormStyle = fsMDIChild)) then
Result := TranslateMDISysAccel(MainForm.ClientHandle, Msg);
end;

bu arada d7'deki forms.pas'da TApplication.IsMDIMsgfunctionu nasıl onu da merak etmedim değil.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Bu arada hatırlatma, kodlarını CODE tagı içine al ki formatı bozulmasın.


Delphi 7 Forms.PAS

Kod: Tümünü seç

    function IsMDIMsg(var Msg: TMsg): Boolean;

Kod: Tümünü seç

function TApplication.IsMDIMsg(var Msg: TMsg): Boolean;
begin
  Result := False;
  if (MainForm <> nil) and (MainForm.FormStyle = fsMDIForm) and
     (Screen.ActiveForm <> nil) and (Screen.ActiveForm.FormStyle = fsMDIChild) then
    Result := TranslateMDISysAccel(MainForm.ClientHandle, Msg);
end;
Resim
Resim ....Resim
iqprog

Mesaj gönderen iqprog »

eveeeeeet sonunda çözüldü.

TApplication.IsMDIMsg(var Msg: TMsg)'ı d7'deki gibi yapınca probşem ortadan kalktı.

teşekkürler arkadaşlar. gıcık bir sorundan kurtuldum.
Cevapla