Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   SetFocus will nicht ... (https://www.delphipraxis.net/211235-setfocus-will-nicht.html)

Delphi.Narium 19. Aug 2022 14:48

AW: SetFocus will nicht ...
 
Zeig' doch einfach mal Deinen nicht funktionierenden Quelltext.

Dann haben wir eine Chance einen eventuell enthaltenen Fehler zu finden oder einen Verbesserungsvorschlag zu machen.

Die MainForm muss hinter dem Show für den Logger wieder in den Vordergrund gebracht werden und zwar in der Routine, die das Show für den Logger enthält, nicht in irgendem Event.

himitsu 19. Aug 2022 14:49

AW: SetFocus will nicht ...
 
Das Fenster ohne Fokusänderung anzeigen.

Also statt Show aka ShowWindow(SW_SHOW)
ein ShowWindow(SW_SHOWNOACTIVATE).

Delphi-Quellcode:
//FormLogger := TFormLogger.Create(Application); // oder Application.MainForm oder sonstwas
ShowWindow(FormLogger.Handle, SW_SHOWNOACTIVATE);
FormLogger.Visible := True; // das Visible der VCL noch umstellen ... nicht nur im internen WinControl
Deine LogForm hat doch Visible standardmäßig auf False?
(vor vielen vielen Jahren waren Forms gern Visible=True ... inzwischen sind sie Visible=False und werden dann erst sichtbar gemacht)


Alternativ auch noch bei den Controls (Memo) das TabStop auf False setzen.

TERWI 19. Aug 2022 15:25

AW: SetFocus will nicht ...
 
Der Logger hat schon immer Visible := false gehabt.
Wenn ich die Initialiserung des Loggers weglasse, geht auch alles wie gewünscht.
... also eher nur ein Problem bei 'visuellen OnlineDegugger'.

TabStop := false beim Memo des Loggers bringt auch nix:
Eine Tastatur eingabe wird nur mehr nicht angezeigt - in der MainForm kommt immer noch nix an.

Wie/wo wäre im Logger bei erzeugter Form SW_SHOWNOACTIVATE anzuwenden ?
Überhaupt notwendig wenn visible = false ?

Für Uwe: Ich initialisiere mein ges. Projekt in der MainForm so:
Delphi-Quellcode:
procedure TZatMAIN.FormActivate(Sender: TObject);
begin
  if FIsInit then exit; // avoid furthermore callings ti initialize
  Logger.SetMode(FDoLogWin, FDoLogFile);  // Show Window ? / Write LogFile ?
  Log('ACTIVATE', 'ForeGround: ' + booltostr(SetForegroundWindow(handle), true));
  // da kommt immer false...
  Self.BringToFront;
  Videopanel.SetFocus;
  // bringt beides nichts ...

  // .... weitere Init's

  FIsInit := true;
end;

Uwe Raabe 19. Aug 2022 15:35

AW: SetFocus will nicht ...
 
Hier funktioniert das ganz ohne Code.
  • VCL-Forms Application
  • Zweites VCL-Form dazu
  • Zweites Form im OI Visible := True
  • Zweites Form im den Projektoptionen ins Auto-Create aufnehmen

Das erste Form hat eine
Delphi-Quellcode:
TEdit
, das zweite ein
Delphi-Quellcode:
TMemo
. Wenn ich das Projekt starte, werden beide Forms angezeigt und das
Delphi-Quellcode:
TEdit
im ersten Form hat den Focus.

TERWI 19. Aug 2022 16:24

AW: SetFocus will nicht ...
 
Kurios.
Der Logger ist eigentlich eine ganz normale unit - keine Klasse.
Die Unit wir automatisch via
'initialization' LOGGER := TLOG.Create();
erzeugt (dann ist die var LOGGER immer da) und via
'finalization' FreeAndNil(LOGGER);
freigegeben.
Create erzeugt einen Thread mit FLogThread.FreeOnTerminate := true;

Die Form wird die erst auf Anfrage via SetMode erzeugt.
Dito falls ein Logfile gewünscht ist.

Bisher war das LogWin immer fsStayOnTop, damit ich das immer oben habe.
Änderung zu fsNormal brachte keine Änderung.
Wenn das Log-Fenster startet nach SetMode ist der Tastaturfocus immer dort im Memo.
Wenn kein Log-Fenster erzeugt wird, ist alles schön ....

Verstehe ich nicht.
Was wäre mit dem Versuch, der SetMode-Procedure das Handel der Mainform mitzugeben, damit der Logger das Fenster nach vorne holt ?
(wurde so vorgeschlagen ?!)
Was wäre da zu übergeben und im Logger aufzurufen ?
Ich hab keinen Plan ....

himitsu 19. Aug 2022 16:42

AW: SetFocus will nicht ...
 
Soeinen Mist wie fsStayOnTop sollte man eh dringen entsorgen.

Stattdessen benutzt man Delphi-Referenz durchsuchenPopupMode/PopupParent.

Wobei (leider) in aktuellen Delphis standardmäßig jede Delphi-Form zwanghaft an (vor) die MainForm gelegt wird.

TERWI 19. Aug 2022 17:10

AW: SetFocus will nicht ...
 
(Richtig) lesen bildet !
Es liegt eben NICHT an fsStayOnTop !!!
Wirklich sachdienliche wären hilfreich.

venice2 19. Aug 2022 17:22

AW: SetFocus will nicht ...
 
Zitat:

Zitat von TERWI (Beitrag 1510351)
(Richtig) lesen bildet !

Freundlichkeit auch!
Hättest du meine DLL getestet wäre dein Problem längst erledigt.
Aber da kein Kommentar dazu kam habe ich es wieder entfernt.

Jeder wie er will.

TERWI 19. Aug 2022 18:05

AW: SetFocus will nicht ...
 
Sorry vielmals, wenn das irgendwie in den falschen Hals gekommen ist.
War definitiv nicht böse oder sonst wie persönlich oder abwertend gemeint !

Nur:
Deine Code-Schnipsel haben nicht wirklich weitergeholfen

Und:
Zitat:

laden wo auch immer.
... tja, was wo genau ? Link(s) ?

Wenn man helfen möchte, sehe ich das grundsätzlich als absolut positiv an.
Aber wenn der zu Helfende im Nirwana selbst recherchieren soll (was [hoffentlich !] die meisten vorher machen), dann ... eher 'nicht so positiv'.

jaenicke 19. Aug 2022 19:29

AW: SetFocus will nicht ...
 
Es ist keine gute Idee so viel im OnActivate zu machen, schon gar nicht Änderungen am Fokus. Denn das OnActivate passiert ja gerade erst beim Anzeigen des Fensters. Du könntest dir z.B. selbst mit PostMessage eine Nachricht an dein Fenster schicken, die dann erst hinterher abgearbeitet wird, und dort diese Aktionen ausführen.

Aber auch ich kann das Problem nicht nachvollziehen. Ohne Beispielprojekt sehe ich nicht, wie ich hier zielgerichtet helfen könnte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:36 Uhr.
Seite 2 von 4     12 34      

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