AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Form + Frame = ActiveContol = nil

Ein Thema von haentschman · begonnen am 2. Nov 2016 · letzter Beitrag vom 4. Nov 2016
Antwort Antwort
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
4.789 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

Form + Frame = ActiveContol = nil

  Alt 2. Nov 2016, 17:22
Delphi-Version: 10 Seattle
Hallöle...

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
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

Geändert von haentschman ( 2. Nov 2016 um 17:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.516 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Form + Frame = ActiveContol = nil

  Alt 2. Nov 2016, 17:46
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu ( 2. Nov 2016 um 17:48 Uhr)
  Mit Zitat antworten Zitat
einbeliebigername

Registriert seit: 24. Aug 2004
130 Beiträge
 
Delphi XE8 Professional
 
#3

AW: Form + Frame = ActiveContol = nil

  Alt 2. Nov 2016, 21:39
Hallo,

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.
Mit freundlichen Grüßen, einbeliebigername.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.516 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Form + Frame = ActiveContol = nil

  Alt 2. Nov 2016, 22:11
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.
if Screen.ActiveControl = {Self.}Edit1 then ...
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.516 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Form + Frame = ActiveContol = nil

  Alt 2. Nov 2016, 22:12
[doppelpost deleted]
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
4.789 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

AW: Form + Frame = ActiveContol = nil

  Alt 4. Nov 2016, 11:18
Danke...

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

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

Danke...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.516 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Form + Frame = ActiveContol = nil

  Alt 4. Nov 2016, 13:44
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 04:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf