Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: CASE Statement of ActiveMDIChild

  Alt 28. Okt 2011, 19:40
Ich vermute mal, du hast das MDI- und OOP-Konzept nicht verstanden ...

MDI = Multiple Document Interface
Jede MDIChild-FormKlasse kann also mit mehr als einer Instanz in deinem Programm rumschwirren.

Was kümmert dich also die Instanz? Die Klasse ist da wesentlich spannender.

Delphi-Quellcode:
if ActiveMDIChild.ClassType = TForm1 then
  TForm1( ActiveMDIChild ).MacheWasGibtsNurInTForm1;
if ActiveMDIChild.ClassType = TForm2 then
  TForm2( ActiveMDIChild ).MacheWasGibtsNurInTForm2;
Und wenn dein Beispiel funktioniert noch einfacher:
Delphi-Quellcode:
if Assigned( ActiveMDIChild ) then
  ShowMessage( ActiveMDIChild.Caption );
oder auch
Delphi-Quellcode:
if Assigned( ActiveMDIChild ) then
  ShowMessage( ActiveMDIChild.ClassName );
was funktioniert ist auch
Delphi-Quellcode:
case IndexText( ActiveMDIChild.ClassName, [ 'TForm1', 'TForm2' ] ) of
  0 : ShowMessage( 'Ja, es ist eine Instanz von TForm1' );
  1 : ShowMessage( 'Schon wieder eine Instanz von TForm2' );
end;
Es bietet sich übrigens an so eine MDI-Anwendung mit unterschiedlichen MDIChilds etwas strukturierter aufzubauen.

Delphi-Quellcode:
type
  TFormSupportOption = ( fsoSave, fsoPrint );
  TFormSupportOptions = set of TFormSupportOption;

  TMDIBaseForm = class( TForm )
  private
    fOptions : TFormSupportOptions;
  public
    function Supporting( Option : TFormSupportOption ) : Boolean;
    procedure Print( Sender : TObject ); virtual;
    procedure Save( Sender : TObject ); virtual;
  end;

function TMDIBaseForm.Supporting( Option : TFormSupportOption ) : Boolean;
begin
  Result := Option in fOptions;
end;

procedure TMDIBaseForm.Print( Sender : TObject );
begin
  // In den echten Forms ableiten (wenn nötig)
end;

procedure TMDIBaseForm.Save( Sender : TObject );
begin
  // In den echten Forms ableiten (wenn nötig)
end;
In der MDIForm kannst du dann die Actions einfach so setzen:
Delphi-Quellcode:
procedure MainForm.PrintActionExecute( Sender : TObject );
begin
  if ( ActiveMDIChild is TMDIBaseForm ) then
    ( ActiveMDIChild as TMDIBaseForm ).Print( Sender );
end;

procedure MainForm.PrintActionUpdate( Sender : TObject );
begin
  PrintAction.Enabled := ( ActiveMDIChild is TMDIBaseForm ) and ( ActiveMDIChild as TMDIBaseForm ).Supporting( fsoPrinting );
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (28. Okt 2011 um 19:55 Uhr)
  Mit Zitat antworten Zitat