Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   CASE Statement of ActiveMDIChild (https://www.delphipraxis.net/164109-case-statement-activemdichild.html)

Gandimann 28. Okt 2011 18:27

CASE Statement of ActiveMDIChild
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Friends,
eine dämliche Frage statt If Anweissung möchte ich mit CASE anweisung arbeiten damit komme ich aaaber leider nicht weiter ...
könnt Ihr bitte mir wegweisen...

DELPHI XE :

Problem:
anstatt diese Befehle:

if activeMDIchild(Form1) then
begin
...
End;
if activeMDIchild(Form2) then
begin
...
End;

MÖCHTE ich CASE Befehl wie folgt benutzen ..

procedure TForm1.btnCHECKClick(Sender: TObject);

begin

case ActiveMDIChild of
form2:ShowMessage('Form2 is active');
form3 : ShowMessage('Form3 is active');
form4 : ShowMessage('Form4 is active');
end;



es geht aber nicht...:evil::?:wink:

--------
Beispiel Project habe ich dran gehängt ...

DEanke im Voraus
Gandimann

Sir Rufo 28. Okt 2011 18:40

AW: CASE Statement of ActiveMDIChild
 
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;

Gandimann 28. Okt 2011 19:27

AW: CASE Statement of ActiveMDIChild
 
Danke Sir Rufo für dein Antwort:

meinst du So...

procedure TForm1.btnCHECKClick(Sender: TObject);
var
indextext : integer ;
begin
case IndexText( ActiveMDIChild.ClassName, [ 'TForm2', 'TForm3' ] ) of
0 : ShowMessage( 'Ja, es ist eine Instanz von TForm1' );
1 : ShowMessage( 'Schon wieder eine Instanz von TForm2' );
end;

kommen aber Fehlermeldungen ...-- !!


[DCC Error] Unit1.pas(70): E2066 Missing operator or semicolon
[DCC Error] Unit1.pas(70): E2001 Ordinal type required
[DCC Error] Unit1.pas(70): E2010 Incompatible types: 'Integer' and 'string'
[DCC Fatal Error] Project1.dpr(5): F2063 Could not compile used unit 'Unit1.pas'

Sir Rufo 28. Okt 2011 20:10

AW: CASE Statement of ActiveMDIChild
 
:arrow: Delphi-Referenz durchsuchenIndexText :cyclops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz