¿Wie scrolle ich per Programm eine TMemo?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
KOBOLD Messring GmbH
Beiträge: 155
Registriert: Mi 22. Aug 2007, 14:52
OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 65719 Hofheim am Taunus
Kontaktdaten:

¿Wie scrolle ich per Programm eine TMemo?

Beitrag von KOBOLD Messring GmbH »

Ich möchte per Programm an das Ende einer TMemo-Komponente scrollen, so dass die letzte Zeile sichtbar ist. Das macht diese leider nicht automatisch, wenn ich z.B. per
Memo1.Lines.Add ('******* Fertig *******');
was hinzufüge. Meine Memo-Komponente zeigt was das Programm macht, und am Ende soll es "Fertig" anzeigen. Leider sieht man das nicht, weil es nicht automatisch ans Ende scrollt.
ScrollBars steht auf "ssAutoVertical", das funktioniert auch so wie man denkt.
Die ScrollBars von TMemo sind vom Typ TMemoScrollBar und deren Funktion GetVertScrollBar liefert einen TControlScrollBar und all diese kennen keine Methode "Scroll". Laut Lazarus-Hilfe gibt es einen Typ TCustomScrollBar der Scrollen kann und "weiss" was Top und Bottom bedeutet, ¿¿nur leider hat der nichts mit der Memo-Komponente zu tun??
Habe nichts in der Foren-Suche oder bei Google gefunden,
¿Wie kann ich ans Ende meiner Memo1 scrollen?
Vielen Dank für Eure Hilfe

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: ¿Wie scrolle ich per Programm eine TMemo?

Beitrag von monta »

Also normalerweise wrd doch beim einfügen automatisch die neu eingefügte Zeile angezeigt und das Problem ist mehr, wieder nach oben zu Scrollen.
Wenn ich nur ssAutoVertical einstelle und anschließend fülle:

Code: Alles auswählen

for i := 0 to 100 do
  Memo1.Lines.Add('-Hallo-' + IntToStr(i));
Läuft das Memo automatisch nach unten durch und zeigt die letzte Zeile an...zumindest hier under Windows.

Ansonsten probier mal:

Code: Alles auswählen

Memo1.SelStart := Length(Memo1.Text);
nicht schön, aber du kommst nach unten ;)
Johannes

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: ¿Wie scrolle ich per Programm eine TMemo?

Beitrag von shokwave »

Hallo,

alternativ könnte man auch eine Listbox nehmen, den Itemindex auf die letzte Zeile setzen und mit "Listbox.MakeCurrentVisible;" anzeigen lassen.

Oder du fügst die neue Zeile einfach, mit "Memo.Lines.Insert(0, 'mein Text');", oben ein (umgekehrte Reihnfolge sozusagen).
mfg Ingo

KOBOLD Messring GmbH
Beiträge: 155
Registriert: Mi 22. Aug 2007, 14:52
OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 65719 Hofheim am Taunus
Kontaktdaten:

Re: ¿Wie scrolle ich per Programm eine TMemo?

Beitrag von KOBOLD Messring GmbH »

Also normalerweise wrd doch beim einfügen automatisch die neu eingefügte Zeile angezeigt
Ja, normalerweise tut es das auch, nur die letzte Zeile die ich einfüge, da scrollt er nicht, und

Code: Alles auswählen

Memo1.SelStart := Length(Memo1.Text);
geht auch nicht, es scrollt einfach nicht nach unten.

baba
Beiträge: 265
Registriert: Mi 4. Apr 2007, 17:47

Re: ¿Wie scrolle ich per Programm eine TMemo?

Beitrag von baba »

Moin, moin,

unter Windows geht es z.B. so:

Code: Alles auswählen

//------------------------------------------------------------------------------
procedure TFAW_Print1.BtnDownClick(Sender: TObject);
begin
  SendMessage(Memo1.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
end;
 
//------------------------------------------------------------------------------
procedure TFAW_Print1.BtnUpClick(Sender: TObject);
begin
  SendMessage(Memo1.Handle, WM_VSCROLL, SB_LINEUP, 0);
end;
 
//------------------------------------------------------------------------------
procedure TFAW_Print1.BtnFirstClick(Sender: TObject);
begin
   PostMessage(Memo1.Handle, WM_VSCROLL, SB_TOP, 0);
   Refresh;
end;
 
//------------------------------------------------------------------------------
procedure TFAW_Print1.BtnLastClick(Sender: TObject);
begin
   PostMessage(Memo1.Handle, WM_VSCROLL, SB_BOTTOM, 0);
   Refresh;
end;
 
//------------------------------------------------------------------------------
procedure TFAW_Print1.BtnPageDownClick(Sender: TObject);
begin
   PostMessage(Memo1.Handle, WM_VSCROLL, SB_PAGEDOWN, 0);
end;
 
//------------------------------------------------------------------------------
procedure TFAW_Print1.BtnPageUpClick(Sender: TObject);
begin
   PostMessage(Memo1.Handle, WM_VSCROLL, SB_PAGEUP, 0);
end;
... oder eben wie schon beschrieben so:

Code: Alles auswählen

FMain.Memo1.SelStart := Length(FMain.Memo1.Lines.Text);
Gruß
Baba.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: ¿Wie scrolle ich per Programm eine TMemo?

Beitrag von pluto »

währe der Letzte Beitrag nicht was für die WissenDB ?
MFG
Michael Springwald

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: ¿Wie scrolle ich per Programm eine TMemo?

Beitrag von monta »

Ja, irgendwie schon.

Die Frage ist doch vielmehr, warum scrollt er bei der letzten Zeile nicht nach unten, sieht ja fast wie ein Bug aus, bzw. irgend ne geheime Einstellung beim Memo :lol:

Geht es jetzt irgendwie?
Johannes

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: ¿Wie scrolle ich per Programm eine TMemo?

Beitrag von pluto »

Also unter GTK2 klappt das zu 95% ganz gut, es wird zwar nach untern gescrollt. Allerdings fehlt die letzte Zeile. Was sagen denn die Windows Nutzter dazu ?
MFG
Michael Springwald

Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ¿Wie scrolle ich per Programm eine TMemo?

Beitrag von Mathias »

Ich will auch ein Memo, das automatisch scrollt.
Gibt es unterdessen etwas eleganteres als die oben beschrieben Lösung mit SelStart ?

Es sollte hauptsächlich unter Linux gehen.

Es gibt noch was mit SendMessage, das sieht mir aber stark nach Windows aus.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: ¿Wie scrolle ich per Programm eine TMemo?

Beitrag von Michl »

Mathias hat geschrieben:Ich will auch ein Memo, das automatisch scrollt.
Bei mir (Windows) geht auch noch sowas:
- Scrollbars vom Memo auf ssAutoBoth stellen
- scrollen per Timer:

Code: Alles auswählen

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Memo1.VertScrollBar.Position := Memo1.VertScrollBar.Position + 1;
end; 

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ¿Wie scrolle ich per Programm eine TMemo?

Beitrag von Mathias »

Ich habe gerade etwas entdeckt.

Wen ich eines neues Memo erstelle, und anschliessend mit,

Code: Alles auswählen

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Memo1.Lines.Add(FloatToStr(time));
end;  
etwas reinschreibe, dann verschwindet der Cursor unten beim Memo, so wie oben beschrieben.

Lösche ich aber bei Eigenschaften/Lines/(TStrings) die Vorgabe Memo1, dann rollt der Text durch, so wie es hier gewünscht wird.
Aber klicke ich kurz ins Memo, dann bleibt der Text wieder stehen.

Führe ich aber zwischendurch Memo1.Clear aus, dann rollt der Text wider.
Somit muss es irgendwo eine Eigenschaft geben, wo man das Autorollen einstellen kann, nur die frage wo ?

Nachtrag:
Mit

Code: Alles auswählen

  Memo1.SelStart := -2;
fängt der Text auch wider an zu scrollen, aber auch nur bis zum nächsten Click.
-1 geht nicht, aber alles das kleiner/gleich -2 ist geht.

Das interessante dabei, wen ich SelStart auslese

Code: Alles auswählen

   ShowMessage(IntToStr(Memo1.SelStart)+ ' '+IntToStr(Length(Memo1.Text))); 
Dann kommt ein positiver Wert, der identisch ist mit der Text-Länge.

Ausgenommen ich starte das Programm neu und mache eine Abfrage, bevor ich ins Memo Klicke.
Dann kommt bei SelStart 0 und bei Length die Text-Länge.


Interessanterweise reagiert Window und Linux nicht gleich.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten