Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Form + Frame = ActiveContol = nil (https://www.delphipraxis.net/190746-form-frame-%3D-activecontol-%3D-nil.html)

haentschman 2. Nov 2016 16:22

Delphi-Version: 10 Seattle

Form + Frame = ActiveContol = nil
 
Hallöle...:P

Ich habe meinen Frames einen Container (TForm) wegen dem "ENTER zum nächsten Control" verpaßt. Nur das Perform(WM_NEXTDLGCTL, 0, 0) wird nur auf das erste Control losgelassen. Wieso ist das ActiveControl des ContainerForms immer nil?
Was fehlt? :?

PS: TabStop ist kontrolliert und Active :wink:
Delphi-Quellcode:
class function TdAV_FormFactory.CreateFormContainer(ChildFrame: TfrBase): TfoContainer; // entspricht TForm + diverse Events
begin
  Result := TfoContainer.Create(nil, ChildFrame);
  Result.Align := alClient;
  Result.BorderStyle := bsNone;
  ChildFrame.Parent := Result; // eingebettet :-)
end;
Delphi-Quellcode:
procedure TfoContainer.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); // wird bei jedem Tastendruck, auch aus dem Frame, ausgeführt
var
  aMsg: TMsg;
begin
  if (Key = VK_RETURN) and (not (Self.ActiveControl is TAdvMemo)) then // hier ist ActiveControl = nil *grübel* - das sollte das letzte Control sein?
  begin
    FChildFrame.ParentFormKeyDown(Self, Key);
    Perform(WM_NEXTDLGCTL, 0, 0); // wird zwar ausgeführt aber läuft ins Leere immer auf das erste Control des Frames
  end;
  if Key = VK_ESCAPE then
  begin
    Self.Close;
  end;
end;
Crosspost DT: https://forum.delphi-treff.de/index....tiveContol-nil

himitsu 2. Nov 2016 16:46

AW: Form + Frame = ActiveContol = nil
 
Deine Container-Form liegt doch wiederum auf einer weiteren Form?

Die "ActiveForm" ist dabei immer die TopLevel-Form und nur das aktive Fenster hat in der VCL ein ActiveCrontrol ... SubForms müssen in das ActiveControl des TopForm schauen.
Bzw. ActiveControl wird über SetFocus-Messages vom Windows angesteuert und da das Control verlinkt. Und diese Funktion schreibt den Wert immer nur in ActiveForm rein und nicht in die Form, auf der das Control liegt, drum ist es bei SubForms halt NIL.

einbeliebigername 2. Nov 2016 20:39

AW: Form + Frame = ActiveContol = nil
 
Hallo,

Zitat:

Zitat von himitsu (Beitrag 1352468)
Und diese Funktion schreibt den Wert immer nur in ActiveForm rein und nicht in die Form, auf der das Control liegt, drum ist es bei SubForms halt NIL.

Und deshalb haben Frames gar kein ActiveControl. Es wäre schlicht immer NIL.

Ich hatte auch schon das Problem und würde mir da ein anderes Verhalten wünschen.

Aktuell kann man entweder sich nach oben durch die Frames und Forms bis zum äußersten Form durch hangeln und dessen ActiveControl benutzen oder man baut sich seine eigenen Basis-Form und Basis-Frame Klassen und implementiert das mit dem ActiveControl etwas anders. Habe schon beides ausprobiert. Aber die erste Variante ist, glaube ich, als einzige über die Zeit übrig geblieben.

himitsu 2. Nov 2016 21:11

AW: Form + Frame = ActiveContol = nil
 
Man kann sich auch selber ein ActiveControl schreiben, welches auf die TopForm weiterleitet.
Delphi-Quellcode:
type
  TActiveCompHelper = class helper for TCustomForm
  private
    function GetMyActiveControl: TWinControl;
    procedure SetMyActiveControl(const Value: TWinControl);
  public
    property MyActiveControl: TWinControl read GetMyActiveControl write SetMyActiveControl;
  end;

function TActiveCompHelper.GetMyActiveControl: TWinControl;
{begin
  // nur die eigene Form
  Result := GetParentForm(Self, True).ActiveControl;
  if GetParentForm(Self, False) <> GetParentForm(Result, False) then
    Result := nil;
end;}
var
  P: TWinControl;
begin
  // SubForms erlaubt
  Result := GetParentForm(Self, True).ActiveControl;
  P     := GetParentForm(Result, False);
  while Assigned(P) and (P <> Self) do
    Result := GetParentForm(P.Parent, False);
  if not Assigned(P) then
    Result := nil;
end;

procedure TActiveCompHelper.SetMyActiveControl(const Value: TWinControl);
begin
  GetParentForm(Self, True).ActiveControl := Value;
end;
Will man aber nur wissen, was das ActiveControl ist, egal wo, um es mit einer Componente der eigenen Form zu vergleichen, dann kann man auch global werden.
Delphi-Quellcode:
if Screen.ActiveControl = {Self.}Edit1 then ...

himitsu 2. Nov 2016 21:12

AW: Form + Frame = ActiveContol = nil
 
[doppelpost deleted]

haentschman 4. Nov 2016 10:18

AW: Form + Frame = ActiveContol = nil
 
Danke... :P

Ich habe ein wenig umgestellt und nun ActiveControl der MainForm benutzt. So funkioniert das... :thumb:

PS: Das gilt nicht für Modale Forms welche aus der MainForm angezeigt werden? Richtig?

Danke...

himitsu 4. Nov 2016 12:44

AW: Form + Frame = ActiveContol = nil
 
Zitat:

Zitat von haentschman (Beitrag 1352639)
PS: Das gilt nicht für Modale Forms welche aus der MainForm angezeigt werden? Richtig?

Jupp.

Das gilt nur für Fenster, die in andere Fenster eingebettet sind.
Form.Parent <> nil


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