Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Richedit - Fokus auf letzte Zeilen halten(inaktives Fenster) (https://www.delphipraxis.net/136884-richedit-fokus-auf-letzte-zeilen-halten-inaktives-fenster.html)

Viktorii 9. Jul 2009 13:44


Richedit - Fokus auf letzte Zeilen halten(inaktives Fenster)
 
Hallo zusammen.

Ich habe ein Fenster mit einem RichEdit drauf. Mit RichEdit.Lines.Append() füge ich Zeilen hinzu.

Wenn der sichtbare Bereich des RichEdit voll ist und ich weiter Zeilen anfüge, erscheint der Scrollbalken, die ersten Zielen verschwinden nach oben und die letzten Zeilen sind sichtbar. So soll es auch sein.

Ist allerdings eine andere Anwendung aktiv und mein Fenster ist im Hintergrund, werden die Zeilen zwar angefügt (was ich am kleiner werden des Scrollbalken sehen kann) aber der Fokus ändert sich nicht und bleibt auf den erste Zeilen.

Sobald ich das Fenster ankilcke und es wieder aktiv machen, ändert sich auch der Fokus und zeigt die letzten Zeilen.

Wie bekomme ich es hin, dass sich der Fokus 'on the fly' ändert sobald Zeilen hinzugefügt werden und das Fenster im Hintergrund ist?

RichEdit.Refresh hat leider nicht geholfen.

Vielen Dank

Lannes 9. Jul 2009 14:28

Re: Richedit - Fokus auf letzte Zeilen halten(inaktives Fens
 
Hallo,

versuch mal das:
Delphi-Quellcode:
with RichEdit1 do
  begin
  Lines.Append(...);
  SelStart := Length(Text);
  Perform(EM_SCROLLCARET, 0, 0);
  end;
Aber wofür scrollen, wenn das Fenster im Hintergrund ist :gruebel:

Viktorii 9. Jul 2009 15:22

Re: Richedit - Fokus auf letzte Zeilen halten(inaktives Fens
 
Zitat:

Zitat von Lannes
Hallo,

versuch mal das:
Delphi-Quellcode:
with RichEdit1 do
  begin
  Lines.Append(...);
  SelStart := Length(Text);
  Perform(EM_SCROLLCARET, 0, 0);
  end;

Klappt leider nicht :(




Zitat:

Zitat von Lannes
Aber wofür scrollen, wenn das Fenster im Hintergrund ist :gruebel:

Ich habe eine Software welche mit meiner Anwendung kommuniziert. Nun gebe ich mir Debug-Informationen auf das RichEdit aus. Wenn ich nun die sendende Software (mit nicht maximiertem Fenster) bediene, möchte ich die Debug Infos in meiner Anwendung sofort sehen (ohne meine Anwendung zwischendurch wieder aktiv machen zu müssen).

Lannes 10. Jul 2009 07:39

Re: Richedit - Fokus auf letzte Zeilen halten(inaktives Fens
 
Hallo,

das Standardverhalten des RichEdit ist ein automatisches Scrollen beim Einfügen der Zeilen mit Append, auch dann wenn die Anwendung nicht aktiv ist.

Also wird das Scrollen durch etwas anderes verhindert, da fehlen jetzt Informationen um weiter helfen zu können. Wie ist denn die Kommunikation realisiert?

Hilft ein Aufruf von Application.ProcessMessages nach dem Einfügen mit Append?

Viktorii 10. Jul 2009 08:04

Re: Richedit - Fokus auf letzte Zeilen halten(inaktives Fens
 
Application.ProcessMessage hilft leider auch nicht.

Kann gut sein dass ich das Scrollen durch irgendetwas verhindere.

Dazu und zum Thema wie die Kommunikation realisiert ist möchte ich hierhin verweisen :-D

Lannes 10. Jul 2009 09:29

Re: Richedit - Fokus auf letzte Zeilen halten(inaktives Fens
 
Hallo,
Zitat:

Zitat von Viktorii
Kann gut sein dass ich das Scrollen durch irgendetwas verhindere.

Dann nimm doch mal "irgendetwas"(nicht unbedingt benötigtes) aus Deinem Code raus :wink:

Zitat:

Zitat von Viktorii
Dazu und zum Thema wie die Kommunikation realisiert ist möchte ich hierhin verweisen :-D

Denke nicht das es an der reinen Kommunikation -Empfang der Daten- liegt.

was mir noch so einfällt:
- RichEdit durch Memo ersetzen = Problem noch vorhanden?
- RichEdit.Invalidate?
- RichEdit.RePaint?

Viktorii 10. Jul 2009 10:20

Re: Richedit - Fokus auf letzte Zeilen halten(inaktives Fens
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hilft leider alles nicht.

TMemo hingegen macht es genau so wie ich es möchte. :gruebel:

Siehe Beispielprogramm im Anhang.

Lannes 10. Jul 2009 13:00

Re: Richedit - Fokus auf letzte Zeilen halten(inaktives Fens
 
Hallo,

Deine exe zeigt den Fehler.

Hab den Code mal mit DelphiTurbo nachgebaut, Scrollen ist OK.

In Deiner Projektdatei ist Application.MainFormOnTaskBar:=True; vorhanden.
Das gibt es erst ab Delphi 2007, hat mir das Inet verraten.
Das ist der einzige Unterschied zu meiner Programmversion.

Ob damit ein Zusammenhang besteht?

Viktorii 14. Jul 2009 07:30

Re: Richedit - Fokus auf letzte Zeilen halten(inaktives Fens
 
Seltsam. Bei mir tut's die exe....

Application.MainFormOnTaskBar:=True; auskommentieren hilft leider auch nicht.

Wollte das auch mal mit TurboDelphi probieren, aber scheinbar kann ich das nicht parallel zu Delphi 2009 installieren :?

Hat jemand vielleicht noch eine Idee?

Lannes 14. Jul 2009 08:14

Re: Richedit - Fokus auf letzte Zeilen halten(inaktives Fens
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

Deine exe funktioniert, ich meinte mit "zeigt den Fehler", das abweichende Scrollverhalten.

Was ist wenn Du Application.MainFormOnTaskBar auf False setzt?

Im Anhang mal das normale Verhalten des RichEdits(mit Turbo Delphi erzeugt).

Viktorii 14. Jul 2009 09:45

Re: Richedit - Fokus auf letzte Zeilen halten(inaktives Fens
 
Zitat:

Zitat von Lannes
Hallo,

Deine exe funktioniert, ich meinte mit "zeigt den Fehler", das abweichende Scrollverhalten.

Achso :oops: :-D


Zitat:

Zitat von Lannes
Was ist wenn Du Application.MainFormOnTaskBar auf False setzt?

Bringt leider auch nichts :(


Zitat:

Zitat von Lannes
Im Anhang mal das normale Verhalten des RichEdits(mit Turbo Delphi erzeugt).

Also bei mir verhält sich das schon besser als mein Kompilat, aber auch noch nicht genau so wie ich es dachte:

Ich starte die exe und mache ein anderes Fenster aktiv. Zu diesem Zeitpunkt ist der Scrollbalken noch nicht zu sehen. Sobald das Fenster voll ist, erscheint der Scrollbalken, aber der Fokus bleibt auf den ersten Zeilen.
Nun mache ich das Richedit-Fenster wieder aktiv. Der Fokus springt auf die letzen Zeilen.

Soweit alles wie bei mir. Dann verhält es sich aber anders/besser:

Wenn ich nun wieder ein anderes Fenster aktiv mache bleibt der Fokus auf den letzten Zeilen.


Ist das bei Dir auch so?



Aber leider wäre auch das kompilieren meiner Applikation mit TurboDelphi keine begehbarer Lösungsweg für mich :(

Lannes 14. Jul 2009 10:11

Re: Richedit - Fokus auf letzte Zeilen halten(inaktives Fens
 
Hallo,

ist bei mir auch so.
Kannst Du denn nicht ein Memo verwenden?

Mal ein Vorschlag, die Anwendung soll Dir doch in der nicht aktiven Anwendung die Debug-Informationen ausgeben. In dem Zustand interresieren doch nur die hinzugefügten Zeilen, die anderen sind ja nicht mehr sichtbar(nach oben weggescrollt).
Also, wenn die Anzahl der sichtbaren Lines belegt sind, entferne jeweils die erste Lines, bevor eine neue hinzugefügt wird. In einer StringList können im Hintergrund alle Debug-Informationen gesammelt und -bei Bedarf(Anwendung wird aktiviert)- im Richedit angezeigt werden.

Viktorii 15. Mär 2010 08:57

Re: Richedit - Fokus auf letzte Zeilen halten(inaktives Fens
 
Für alle die das selbe Problem haben... Habe nun die Lösung dank dieses Artikels hier

Delphi-Quellcode:
MyRichEdit.Lines.Append('gnümpf');
MyRichEdit.Perform(EM_LINESCROLL, 0, 1);   // <-- Des Rätsels Lösung
:thumb:

Panthrax 15. Mär 2010 10:13

Re: Richedit - Fokus auf letzte Zeilen halten(inaktives Fens
 
Delphi-Quellcode:
*.Perform(EM_SCROLL, SB_LINEDOWN, 0); // bei konstant einer Zeile
*.Perform(EM_LINESCROLL, 0, Offset); // mit Variable
Wenn das Steuerelement umgebrochene Zeilen enthält, ist eine Zeile zu wenig. Dann besser so:
Delphi-Quellcode:
var
  TopLineIndex: Integer;
  ScrollPos: Integer;
  PageSize: Integer;
begin
  PageSize := 14; // Anzahl sichtbare Zeilen
  ScrollPos := *.Lines.Count - PageSize;
    // erste sichtbare Zeile so justieren, dass die letzte Zeile sichbar ist

  TopLineIndex := *.Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
  *.Perform(EM_LINESCROLL, 0, ScrollPos - TopLineIndex);
end;


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