TMemo und Autoscroll.

Rund um die LCL und andere Komponenten
Mathias
Beiträge: 6910
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

TMemo und Autoscroll.

Beitrag von Mathias »

Wen ich Daten hinten an einem Memo anfüge, hätte ich gerne, das man einstellen kann, ob der Text automatisch scrollen soll oder nicht.
Ich hatte mich folgender massen beholfen, aber dies funktioniert nur, wen man den ganzen Text immer neu ins Memo schreibt.
Aber auch nicht perfekt, bei deaktivierten AutoScroll, wird immer auf die erste Zeile gesprungen.

Code: Alles auswählen

procedure TSerial_Monitor_Form.Timer1Timer(Sender: TObject);
var
  StringCount: integer;
  s: string;
begin
  Timer1.Enabled := False;
  s := GetString;  // Zufällig erzeugter String
 
//  StringCount := Memo1.Lines.Count - 1;
//  Memo1.Lines[StringCount] := Memo1.Lines[StringCount] + s;
 
  Memo1.Lines.Text := Memo1.Lines.Text + s;
 
  if AutoScroll_CheckBox1.Checked then begin
    Memo1.SelStart := -2; // Behelf
  end;
  Timer1.Enabled := True;
end;  
Befülle ich aber effizienter, in dem ich dies nur mit der letzen Zeile mache, dann hat SelStart gar keinen Einfluss mehr.
Wen ich am Memo nicht mache, läuft es wie mit aktivierten AutoScroll. Aber sobald ich mal mit der Maus im Memo rumklicke, bleibt das Bild stehen.
Und egal, was ich es mache, ein AutoScroll kommt nicht mehr.

Code: Alles auswählen

begin
  Timer1.Enabled := False;
  s := GetString;  // Zufällig erzeugter String
 
  StringCount := Memo1.Lines.Count - 1;
  Memo1.Lines[StringCount] := Memo1.Lines[StringCount] + s;
 
//  Memo1.Lines.Text:=Memo1.Lines.Text+s;
 
  if AutoScroll_CheckBox1.Checked then begin
    Memo1.SelStart := -2; // Behelf
  end;
  Timer1.Enabled := True;
end;   
Hat jemand eine Idee, wie man dies lösen könnte.
Notfalls würde ich statt eine Memo ein SynEdit Feld nehmen.

Im Anhang noch der ganze Code.
Dateianhänge
Memo_Test.zip
(126.11 KiB) 100-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

sstvmaster
Beiträge: 582
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 3.8
CPU-Target: 32+64bit
Wohnort: Dresden

Re: TMemo und Autoscroll.

Beitrag von sstvmaster »

Ich könnte dir folgende Lösung anbieten:

Code: Alles auswählen

 
  TSerial_Monitor_Form = class(TForm)
...
  private
    stopscrolling: boolean; // -> neu
...
end;
 
procedure TSerial_Monitor_Form.FormCreate(Sender: TObject);
begin
  stopscrolling:=false; // -> neu  
...
end;
 
procedure TSerial_Monitor_Form.Timer1Timer(Sender: TObject);
var
  s: string;
begin
  Timer1.Enabled := False;
  s := GetString;  // Zufällig erzeugter String
 
  // --> neu
  if stopscrolling then Memo1.Lines.BeginUpdate;
  Memo1.Lines.Append(s);
  if stopscrolling then Memo1.Lines.EndUpdate; 
 
  if AutoScroll_CheckBox1.Checked then begin
    stopscrolling:=true;
  end else begin
    stopscrolling:=false;
  end;
  // --> neu ende
 
  Timer1.Enabled := True;
end;
 
Demo siehe Anhang.
Dateianhänge
Memo_Test2.zip
(127.25 KiB) 94-mal heruntergeladen
LG Maik

Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)

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

Re: TMemo und Autoscroll.

Beitrag von Mathias »

Ich habe deine Idee ausprobiert, funktioniert bei mir nicht. Der gleiche Effekt, wie bei meiner

Code: Alles auswählen

  Memo1.Lines[StringCount] := Memo1.Lines[StringCount] + s;
Version.

Code: Alles auswählen

Memo1.Lines.Append(s);
Funktioniert sowieso nicht, da dies immer eine Zeilenumbruch mit gibt.
Macht das gleiche wie:

Code: Alles auswählen

Memo1.Lines.Add(s)
Wäre eine Idee gewesen mit :

Code: Alles auswählen

BeginUpdate;
EndUpdate;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

sstvmaster
Beiträge: 582
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 3.8
CPU-Target: 32+64bit
Wohnort: Dresden

Re: TMemo und Autoscroll.

Beitrag von sstvmaster »

Komisch, bei mir hört das Memo auf zu scrollen und fängt wieder bei der letzten Zeilen wieder an.

Laz 2.0.8/3.0.4
LG Maik

Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)

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

Re: TMemo und Autoscroll.

Beitrag von Mathias »

Windows oder Linux ?
Ich habe Linux.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

sstvmaster
Beiträge: 582
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 3.8
CPU-Target: 32+64bit
Wohnort: Dresden

Re: TMemo und Autoscroll.

Beitrag von sstvmaster »

Ähm, Window, Sorry (P.S. siehe Signatur)
LG Maik

Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)

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

Re: TMemo und Autoscroll.

Beitrag von Mathias »

Da habe ich mal gehört, das die beiden OS dies anders abarbeiten.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

sstvmaster
Beiträge: 582
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 3.8
CPU-Target: 32+64bit
Wohnort: Dresden

Re: TMemo und Autoscroll.

Beitrag von sstvmaster »

LG Maik

Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TMemo und Autoscroll.

Beitrag von Winni »

Hi!

Also das hier funktioniert mit Linux/gtk2.
Keine Ahnung, was Windows da macht.

Code: Alles auswählen

 
procedure TForm1.Timer1Timer(Sender: TObject);
var i : integer;
    sel: Integer;
    s : string;
begin
sel := Memo1.SelStart;
s := '';
for i := 1 to 10 do s := s+chr(random(64)+33);
s := s +' ';
Memo1.Text := Memo1.text + s;
if Autoscroll_CheckBox1.checked then Memo1.SelStart := length(Memo1.Text) else
   Memo1.SelStart := sel;
end;                                                
Grüße
Winni

sstvmaster
Beiträge: 582
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 3.8
CPU-Target: 32+64bit
Wohnort: Dresden

Re: TMemo und Autoscroll.

Beitrag von sstvmaster »

Hi Winni, das funktioniert auch unter Windows.
Aber es flackert mächtig im Verlgeich zu meiner Version.
LG Maik

Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)

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

Re: TMemo und Autoscroll.

Beitrag von Mathias »

Das ist genau, was ich verhindern will.
Hast du mal überlegt, was memo1.text := memo1.text + s macht ?
Es wird jedes mal der ganze Text kopiert und intern wird auf Lines geplitet.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TMemo und Autoscroll.

Beitrag von Winni »

Hi!


Dann must Du eben für jeden neuen string eine neue Zeile in dem Memo benutzen:

Memo1.lines.add(s);

Winni

PS: Bei meiner Version flackert in gtk2/Linux garnix.

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

Re: TMemo und Autoscroll.

Beitrag von Mathias »

Hast du mein erster Post nicht gesehen ?
Da schreibe ich in die letzte Zeile.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TMemo und Autoscroll.

Beitrag von Winni »

Mathias hat geschrieben:Das ist genau, was ich verhindern will.
Hast du mal überlegt, was memo1.text := memo1.text + s macht ?
Es wird jedes mal der ganze Text kopiert und intern wird auf Lines geplitet.
Wenn die Komponente halbwegs schlau ist, zeigt sie aber nur an, was geändert wurde, wie in gtk2.

Das Memo ist aber ein Windows-Stiefkind, das ein schlechtes Design von Windows 3.1 ist.
Seitdem ist nur die Kapazität von 16 Bit auf 32 Bit erhöht worden bei der Einführung von Windows 95.

TMemo ist leider ungeeignet als Editor. An allen Ecken Ärger.
Wenn man was Listenmäßiges braucht, sollte man eine Listbox nehmen.
Wenn man einen Textverarbeiter braucht sollte man RichMemo nehmen.
Wenn man einen Editor zum Coden braucht, sollte man SynEdit nehmen.

Das erspart viel Zeit und Ärger.

Winni

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

Re: TMemo und Autoscroll.

Beitrag von Mathias »

Hat sich das mit Win10 gebessert ?
In Win 8.1 sieht das Notepad immer noch aus wie bei Win 3.0. Völlig unbrauchbar.

Ich werde mal SynEdit probieren. Kann man sich verlassen, das SynEdit bei Lazarus dabei ist. Und auch installiert ist ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten