![]() |
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:
Crosspost DT:
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; ![]() |
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. |
AW: Form + Frame = ActiveContol = nil
Hallo,
Zitat:
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. |
AW: Form + Frame = ActiveContol = nil
Man kann sich auch selber ein ActiveControl schreiben, welches auf die TopForm weiterleitet.
Delphi-Quellcode:
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.
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;
Delphi-Quellcode:
if Screen.ActiveControl = {Self.}Edit1 then ...
|
AW: Form + Frame = ActiveContol = nil
[doppelpost deleted]
|
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... |
AW: Form + Frame = ActiveContol = nil
Zitat:
Das gilt nur für Fenster, die in andere Fenster eingebettet sind. Form.Parent <> nil |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz