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?
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ę.
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;
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 ;-) .
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.
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.
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.
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.
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ć?
Jak to jak. Jak modalny child. Wrócę do tematu później - zrobię przykładową aplikacyjkę i załączę. Teraz jestem w pracy :-\ .
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??
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.
Miales dac przyklad dzialania tego twojego wynalazku. Widac masz czas na pisanie dyrdymalow ale na przyklad juz nie
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 :-).
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
Ż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
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.
Ja dalej czekam
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.
abrakadaber napisał(a):
Ja dalej czekam
Hmm... Żeby nie było nieporozumień. Czekam ;).
@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.