Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Warum ActiveObject=nil? (https://www.delphipraxis.net/147858-warum-activeobject%3Dnil.html)

alleinherrscher 17. Feb 2010 21:36


Warum ActiveObject=nil?
 
Ich möchte eine Anwendung relativ modular aufbauen. Dazu habe ich in dem Hauptformular eine PageControl. Die Einzelenen Tabs in der Pagecontrol möchte ich durch Formulare füllen, die in einer separaten PAS Datei gespeichert sind.

Um das Formular im Tab zu erstellen habe ich mir folgenden Code überlegt:


Delphi-Quellcode:

procedure TForm1.CreateTab(InstanceClass: TComponentClass; var Reference; aPageControl:tsPageControl);
var
  Instance: TComponent;
  TabSheet:TTabSheet;
begin

    TabSheet:=TTabSheet.Create(aPageControl);
    TabSheet.Parent:=aPageControl;
    Instance := TComponent(InstanceClass.NewInstance);
    TComponent(Reference) := Instance;
    Instance.Create(TabSheet);

    with TForm(Instance) do
    begin
     Parent:=TabSheet;
     Align:=alclient;
     Color:=self.Color;
     Show;
    end;

    with TabSheet do
    begin
      PageControl := aPageControl;
      Caption := TForm(Instance).caption;
    end;

end;
Ich kann nun ein Formular in einem Tab anzeigen lassen indem ich beim Formcreate meine Prozedure wie folgt aufrufe:

Delphi-Quellcode:
 CreateTab(TPersonendaten,foPersonendaten,sPageControl1); //foPersonendaten ist eine globale, private Variable vom Typ TPersonendaten

Das klappt auch alles wunderbar, alldings habe ich ein sehr großes Problem
Ich möchte durch die Objekte auf dem Formular mit dem ENTER Button springen. Dafür verwende ich normalerweise folgenden COde:

Delphi-Quellcode:

procedure TPersonendaten.SelektiereNaechstesControl(Sender: TObject; var Key: Char);
begin

if key = char(vk_return) then
 begin
  key:=#0;
  //if activeControl=nil then showmessage('Ä'); <-- Messagebox wird angezeigt....
  SelectNext(ActiveControl, true, true);
 end;

end;
Ist der Fokus auf einem Objekt, und drücke ich dann Enter, springt der Fokus nun immer auf das erste Objekt in der Taborder. Scheinbar ist das ActiveControl=nil.
Kann mir jemand sagen, woran dies liegt?


Herzlichen Dank und viele Grüße an alle,

Michael

Uwe Raabe 18. Feb 2010 07:21

Re: Warum ActiveObject=nil?
 
ActiveControl gibt das jeweils aktive Control im Form an. Da du in den TabSheets aber selbst wieder Forms unterbringst, hält jedes dieser Forms ein eigenes ActiveControl.

Übrigens läßt sich dein Code

Delphi-Quellcode:
Instance := TComponent(InstanceClass.NewInstance);
TComponent(Reference) := Instance;
Instance.Create(TabSheet);
auch übersichtlicher so schreiben:

Delphi-Quellcode:
   
Instance := InstanceClass.Create(TabSheet);
TComponent(Reference) := Instance;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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