Czy da się okno MDIChild wyświetlić jako modalne?

0

Czy da się okno MDIChild wyświetlić jako modalne - blokujące inne okna aż do momentu wykonania na nim jakiejś akcji? Macie jakiś przykład kodu?

0

Ciężkie, ale możliwe, jak sądzę. Przeszukaj sobie modułu Forms i Controls pod kątem "focus" (nie całe słowo). Tylko po co Ci to. Na pewno można inaczej i łatwiej załatwić Twoja potrzebę.

2

zmień mu FormStyle na fsNormal i pokaż przez ShowModal - w czym problem?
Masz nawet kod

procedure TForm1.btnMdiChildClick(Sender: TObject);
begin
  with TForm.Create(Application) do
  begin
    FormStyle := fsMDIChild;
    Show;
  end;
end;

procedure TForm1.btnModalClick(Sender: TObject);
begin
  with TForm.Create(Application) do
  begin
    FormStyle := fsNormal;
    ShowModal;
  end;
end;
0

Kontynuując, to po co Ci to MDI? Co chcesz dzięki temu uzyskać? Bo nic mi do głowy nie przychodzi. Nie widzę korzyści używania stylu formy fsMDIChild. No ale ja stary już jestem i wzrok nie ten ;-) .

0
Sadam2 napisał(a)

Kontynuując, to po co Ci to MDI?

A co za różnica - @artiii potrzebuje to tak zrobić, więc jeśli to możliwe to niech sobie wyświetla modalnie okna i używa MDI; Inne rozwiązanie można co najwyżej dodatkowo podsunąć, a nie zmieniać tematyki wątku na szukanie innego odpowiednika;

Zresztą rozwiązanie zostało już podane, więc nie ma co ciągnąć wątku niepotrzebnie.

0
furious programming napisał(a):
Sadam2 napisał(a)

Kontynuując, to po co Ci to MDI?

A co za różnica - @artiii potrzebuje to tak zrobić, więc jeśli to możliwe to niech sobie wyświetla modalnie okna i używa MDI; Inne rozwiązanie można co najwyżej dodatkowo podsunąć, a nie zmieniać tematyki wątku na szukanie innego odpowiednika;

Zresztą rozwiązanie zostało już podane, więc nie ma co ciągnąć wątku niepotrzebnie.

MDIChid to nie to samo, co fsMDIChild. Modalne to nie to samo, co fsModal. Dla mnie okno może być MDIChild bądź nie. Może być modalne bądź nie. Ale jak w Delphi łatwo (bo w innym języku, nie ważne w jakim, to nawet wiem jak) zrobić okno, które będzie i modalne i MDIChild to nie wiem. I na takie pytanie tutaj odpowiedź nie padła. A, IMHO, o to szło pytającemu. I może moje myślenie o fokusie jest głupie. Nie wiem. No ale skoro tak mnie skrytykowałeś, to teraz podaj przepis na okno MDIChild i modalne jednocześnie. I nie musi być tak prosty.

0

NIE DA SIĘ ZROBIĆ OKNA MDICHILD MODALNEGO!! To jest tak jakbyś chciał narysować czerwoną linię zielonym pisakiem albo kwadratowe koło. Dowolną formę można pokazać jako modalną (czyli taką, która blokuje jakiekolwiek akcje poza nią samą) albo jako MDIChild (czyli jedno z okienek, pomiędzy którymi możesz się przełączać) kilkoma linijkami kodu (masz wyżej) bez konieczności projektowania ich oddzielnie do jednego czy drugiego zastosowania.

0

Skoro w aplikacji, zresztą sprzedawanej w Polsce, napisanej w innym niż Delphi, języku, pracującej praktycznie w każdym systemie małomiękkiego (chyba tylko na Windows Phone nikt nie próbował) da się to zrobić i to nawet prosto, to może w Delphi też się da, choć może już nie tak prosto.
Ta aplikacja jest napisana w języku spoza tego forum, jak sądzę. Tu chyba nikt o PowerBuilderze nie pisze. Ale ona jest MDI. Taka zaszłość historyczna. Osobiście to mi się to nie podoba. Ale jest jak jest, a tego to zmieniać już nie będę. Zostanie MDI.
Czasami dorabiam coś w Delphi. Jak z rok temu przymierzałem się to modalnego MDIChild, to myślałem o fokusie. Może źle. Może trzeba inaczej. Wtedy dałem sobie spokój. Miałem pilniejsze sprawy.

1

Ale jak to ma wg Ciebie wyglądać?? Nie wiem screena daj, opisz, narysuj, film nagraj, cokolwiek bo dla mnie okno modalne to takie, które blokuje wszystkie inne okna aplikacji i tyle. Jak chcę takie pokazać to robię mu FormStyle na fsNormal i pokazuje przez ShowModal zamiast Show. Zachowuje się dokładnie tak jak tego po nim oczekuje - czyli blokuje całkowicie pozostałe okna aplikacji i nie pozwala się przesłonić przez inne okno. Czym by się od takiego działania miało różnić to okno "MDIChild modalne"? Cały czas piszesz, że na pewno się da ale co się ma na pewno dać?

0

Jak to jak. Jak modalny child. Wrócę do tematu później - zrobię przykładową aplikacyjkę i załączę. Teraz jestem w pracy :-\ .

1

CZYLI JAK?? Bo idea MDIChild jest taka, że je MOŻNA PRZEŁĄCZAĆ a Modal taka, że jego NIE MOŻNA PRZEŁĄCZAĆ. Czyli co ma być jednocześnie otwarte i zamknięte, puste i pełne, żywe i martwe, eee a nie tu mamy kota Schrodingera. Czyli dopóki się okno nie pojawi to nie wiem jakie jest??

0
abrakadaber napisał(a):

Bo idea MDIChild jest taka, że je MOŻNA PRZEŁĄCZAĆ a Modal taka, że jego NIE MOŻNA PRZEŁĄCZAĆ.

Gdyby to była prawda, to po co były by dwa kwalifikatory. Przecież przy dwóch mamy cztery możliwe stany: false i false, false i true, true i false oraz true i true.
Ideę MDI wymyślił małomiękki. Potrzebował tego dla systemów 9x. Poczytaj sobie, po co mu to było. Jak będziesz czytał u niego, to odsuń na bok (mentalnie) wciskanie kitu.

0

Miales dac przyklad dzialania tego twojego wynalazku. Widac masz czas na pisanie dyrdymalow ale na przyklad juz nie

0
abrakadaber napisał(a):

Miales dac przyklad dzialania tego twojego wynalazku. Widac masz czas na pisanie dyrdymalow ale na przyklad juz nie

Trochę kultury. Napisałem, że jestem w pracy. Mi płacą za pracę. A jak nie będę pracował, to ...
Przykład w Delphi załączony. Skompilowana aplikacja i źródełka. Rozmiary okien ustawione celowo - aby lepiej było widać, co to jest MDI. Okienka przecież można przełączać. Co prawda ze względu na celowo ustawione rozmiary nie jest to aż tak proste, ale można. Czyli niby małomiękki prawdę napisał. O wspólnej przestrzeni, istocie MDI, też napisał, ale jakoś to nie za bardzo rzuca się w oczy. Chyba, że czytający umie czytać ze zrozumieniem :-).

2

no ale co to jest???? Przecież ja wiem jak działa i wygląda MDI. Co chciałeś tym kodem udowodnić? No i pytanie najważniejsze - gdzie tam jest to MDIChild modalne bo ja pojęcia nie mam.

BTW
dYxWgxM.png

Żadne z okien z tego "przykładu" nie jest modalne! Tu masz definicję okna modalnego z wiki

WIki napisał(a)

w systemach okienkowych okno nie pozwalające na obsługę zdarzeń dotyczących pozostałych okien danej aplikacji. Wówczas żadne inne okno aplikacji nie reaguje na działania użytkownika

Dalej czekam na ten opis/przykład/rysunek/wideo o co ci tak naprawdę chodzi

dodanie obrazka do załączników i treści posta - @furious programming

0
artiii napisał(a):

Czy da się okno MDIChild wyświetlić jako modalne - blokujące inne okna aż do momentu wykonania na nim jakiejś akcji? Macie jakiś przykład kodu?

Pewnie można...
Wsadzasz te całe mdi, razem z frame i client w dialog, który odpalasz modalnie.... no i gotowe.

0

Ja dalej czekam

0
abrakadaber napisał(a):

Ja dalej czekam

Moim zdaniem mimo tendencyjnego wręcz przykładu na MDI nadal nie rozumiesz, co to jest MDI. Napisałeś

abrakadaber napisał(a):

Bo idea MDIChild jest taka, że je MOŻNA PRZEŁĄCZAĆ a Modal taka, że jego NIE MOŻNA PRZEŁĄCZAĆ

I skoro nie widziałeś całego dziecka, to od razu zmaksymalizowałeś główne okno. Brawo, brawo, jesteś bardzo sprytny. No ale można dziecko przesunąć na brzeg, tak, że widać tylko jego część, a reszta będzie "poza kadrem". Dziecko nigdy nie przykryje ramki ojca. Przycisku, którym zostało wygenerowane też nie.

Ideą MDI jest korzystanie ze wspólnych zasobów, głownie GDI. Na systemach 9x było to ważne. A że można przełączać, to tylko takie gadanie małomiękkiego. Dzisiaj takie gadanie nazywane jest marketingiem. Ja się wychowałem w czasach, gdy było to nazywane wciskaniem kitu. Przecież przy stylu fsNormal też możesz przełączać. I możesz zrobić ShowModal. W Delphi dla MDI ShowModal pluje Ci nieciekawym komunikatem. A takie "fucky" MDIChildModal jest wykonalne. W Delphi. A kod poniżej:

dpr:

program MDI_Modal;

uses
  Forms,
  uMain in 'uMain.pas' {fMain},
  uChild in 'uChild.pas' {fChild},
  uMDIChild in 'uMDIChild.pas' {MDIChild};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TfMain, fMain);
  Application.Run;
end.

uMain.dfm:

object fMain: TfMain
  Left = 0
  Top = 0
  Caption = 'Main'
  ClientHeight = 378
  ClientWidth = 644
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  FormStyle = fsMDIForm
  Menu = MainMenu1
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object MainMenu1: TMainMenu
    Left = 64
    Top = 40
    object mMDIChild: TMenuItem
      Caption = 'MDIChild'
      OnClick = mMDIChildClick
    end
    object ModalMDIChild: TMenuItem
      Caption = 'Modal MDIChild'
      OnClick = ModalMDIChildClick
    end
  end
end

uMain.pas:

unit uMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus;

type
  TfMain = class(TForm)
    MainMenu1: TMainMenu;
    mMDIChild: TMenuItem;
    ModalMDIChild: TMenuItem;
    procedure mMDIChildClick(Sender: TObject);
    procedure ModalMDIChildClick(Sender: TObject);
  private
    FIsModal: Boolean;
    procedure SetIsModal(const Value: Boolean);
  public
    property IsModal: Boolean read FIsModal write FIsModal;
  end;

var
  fMain: TfMain;

implementation

uses
  uChild, uMDIChild;

{$R *.dfm}

procedure TfMain.mMDIChildClick(Sender: TObject);
begin
  if FIsModal then exit;
  with TfChild.Create(self) do Show;
end;

procedure TfMain.ModalMDIChildClick(Sender: TObject);
begin
  if FIsModal then exit;
  with TfModalChild.Create(Application) do
  try
    ShowMDIModal;
  finally
    Close
  end;
end;

end.

uChild.dfm:

object fChild: TfChild
  Left = 0
  Top = 0
  Caption = 'MDI Child'
  ClientHeight = 195
  ClientWidth = 325
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  FormStyle = fsMDIChild
  OldCreateOrder = False
  Visible = True
  PixelsPerInch = 96
  TextHeight = 13
end

uChild.pas:

unit uChild;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TfChild = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  fChild: TfChild;

implementation

{$R *.dfm}

end.

uModalChild.dfm:

object fModalChild: TfModalChild
  Left = 0
  Top = 0
  Caption = 'Modal MDIChild'
  ClientHeight = 195
  ClientWidth = 325
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  FormStyle = fsMDIChild
  OldCreateOrder = False
  Visible = True
  OnClose = FormClose
  PixelsPerInch = 96
  TextHeight = 13
end

uModalChild.pas

unit uModalChild;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TfModalChild = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    procedure EnableSiblings( enable: Boolean );
    procedure WMSyscommand( Var msg: TWMSyscommand ); message WM_SYSCOMMAND;
  public
    { Public declarations }
    procedure ShowMDIModal;
  end;

var
  fModalChild: TfModalChild;

implementation

uses uMain;

{$R *.dfm}

procedure TfModalChild.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 TfModalChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if fMain.IsModal then begin
    Action := caNone;
    fMain.IsModal := false;
    EnableSiblings(true);
  end else
    Action := caFree;
end;

procedure TfModalChild.ShowMDIModal;
begin
  fMain.IsModal := 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 TfModalChild.WMSyscommand(var msg: TWMSyscommand);
begin
  if fMain.IsModal and ((msg.cmdtype and SC_CLOSE) = SC_CLOSE) then
    ModalResult := mrCancel
  else
    inherited;
end;

end.

Pomysł taki podał Peter Below z TeamB kilkanaście lat temu. I jak sam pisał, nie jest to doskonałe, ale ... Ten child jest MDI i jest modal. No ale , jak widać, trzeba by jeszcze trochę nad tym popracować. No ale pytający to pewnie już tego posta nawet nie przeczyta.

0
abrakadaber napisał(a):

Ja dalej czekam

Hmm... Żeby nie było nieporozumień. Czekam ;).

0

@kAzek:
Nie umiem wstawiać komentarzy, więc odpowiadam tu. Cieszę się, że dobrze się bawisz. Od siebie dodam, że obie pętle są autorstwa PB. Zresztą tak, jak cała idea realizacji w Delphi modalnego MDI Child. Ja to tylko przystosowałem. Bardzo nieznacznie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1