MdiChild olan bir formu normal form gibi gosterebilirmiyim

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Burhan_ast
Üye
Mesajlar: 143
Kayıt: 15 Haz 2003 08:33
Konum: Almaty, Kazakhstan

MdiChild olan bir formu normal form gibi gosterebilirmiyim

Mesaj gönderen Burhan_ast »

Merhabalar,

Mdi child olarak surekli olarak kullandigim bir formu baska bir formda Normal form gibi showmodal ile goruntuleyip kullanicinin o formdan baska bir seyle ugrasmasini engelleyebilirmyiim, bunu sunun icin kullanacagim, renk diye bir mdichild formum var ve burda renkkleri tutuyorum, fakat stok karti eklerken buradan renk kismi var ve burda butona basildiginda renk formumumu normal form gibi acip renk secimi yaptirmak istiyorum, bu secim sirasindada pencereyi kapatmadan baska bir islem yapmasini istemiyorum kullanicinin,

Tsk,

Burhan Cakmak
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Bu M$ ın bir kararı. MDI formlar ShowModal olarak açılamazlar.

Arşivimde ancak Windowsu kandırarak bu tarz bir modal gösterme yapılabileceği yazıyor. Örnek kodu ekte gönderiyorum. Ama ben dinlersen, formu fsNormal yap, daha iyi :)

Kod: Tümünü seç

unit Childwin;

interface

uses Messages, Windows, Classes, Graphics, Forms, Controls, ExtCtrls, 
StdCtrls;

type
  TMDIChild = class(TForm)
    Button1: TButton; // creates a modal instance of this form
    Edit1: TEdit;
    Button2: TButton; // closes form with Modalresult mrOK
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    FModal: Boolean;

    Procedure EnableSiblings( enable: Boolean );
    Procedure WMSyscommand( Var msg: TWMSyscommand ); message WM_SYSCOMMAND;
  public
    { Public declarations }
    Procedure ShowMDIModal;
  end;

implementation
uses dialogs;
{$R *.DFM}

procedure TMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  If FModal Then Begin
    Action := caNone;
    FModal := False;
    EnableSiblings( true );
  End
  Else
    Action := caFree;
end;

procedure TMDIChild.EnableSiblings(enable: Boolean);
var
  i: Integer;
begin
  with Application.Mainform do
    for i:= 0 to MDIChildCount - 1 do
      If MDIChildren[i] <> Self Then
        MDIChildren[i].Enabled := enable;
end;

procedure TMDIChild.ShowMDIModal;
begin
  FModal := True;
  MOdalresult := mrNone;
  EnableSiblings( false );
  repeat
    Application.HandleMessage;
    if Application.Terminated then ModalResult := mrCancel else
      if ModalResult <> 0 then Close;
  until ModalResult <> 0;
end;

procedure TMDIChild.Button1Click(Sender: TObject);
begin
  With TMDIChild.Create( Application ) Do
  try
    ShowMDIModal;
    If ModalResult = mrOK Then
      Self.Edit1.Text := edit1.text;
  finally
    Close
  end;
end;

procedure TMDIChild.Button2Click(Sender: TObject);
begin
  Modalresult := mrOK;
end;

procedure TMDIChild.WMSyscommand(var msg: TWMSyscommand);
begin
  if FModal and ((msg.cmdtype and SC_CLOSE) = SC_CLOSE) Then
    Modalresult := mrCancel
  Else
    inherited;  
end;

end.
Kolay gelsin.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

formu create ettikten sonra her turlu ozelligi ile oynayabilirsiniz. Yani mdichild olan stilini normal e donusturup ve gerekli ise diger ozellikleri ile de oynarak daha sonra showmodal ile modal olarak gosterebilirsiniz gibime geliyor.... Bir deneyin isterseniz....

kolay gelsin...
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

MDI Child formlar ile normal formların DefWindProc ları windows core içinde farklıdır. Aynı şekilde normal form olarak hazırladığınız bir formu alıp bir MDIForm içine sokmaya kalkışırsanız da aynı durum sözkonusudur. Windows pencere yöneticisi bir pencerenin nasıl bir yapısı olduğuna pencerelerin internal structure larında tuttukları ExStyle adlı değişkenle karar verir. Eğer exstyle dword değişkenin 8. biti 1 ise bu pencere bir MDIChild dir diye düşünür. Yönetici WM_ mesajlarını aktarırken de alakasız bileşenlere alakasız mesajlar geçmesin diye kontrol eder. Misal WM_MDITILE gönderilirken tutup bunu tüm bileşenlere göndermez. Bu mesajı ancak MDIForm a gönderir. Konuyu çok fazla dallandırıp budaklandırmamak için daha detaya girmiyorum. Window u show etmeden önce internal yapısını modal bir pencere gibi değiştirip wnd proc içinde de normal MDIChild pencerelerin kontrol etmediği kontrolleri ekleyerek yapabilirsiniz. Ama bana sorarsanız bu kadar kastırmayın (Bunları Progress 4GL ile normal pencereleri MDIForm ve MDIChild a dönüştürmek zorunda kaldığımda yapmıştım zira kendiliğinden bu yapıyı desteklemiyordu, inanın yıpratıcı bir iş) aynı pencereden bir tane de normal yapın.

Kolay gelsin,
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
Cevapla