Delphi-PRAXiS
Seite 2 von 2     12

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi letzten linebreak aus tstrings (trichedit.lines) entfernen (https://www.delphipraxis.net/184534-letzten-linebreak-aus-tstrings-trichedit-lines-entfernen.html)

DrUArn 7. Apr 2015 20:35

AW: letzten linebreak aus tstrings (trichedit.lines) entfernen
 
Hi, comm,

@ mann mann ... : natürlich schaue ich mir die Hilfen an. Aber nicht jeder versteht wie du alles sofort ....

In den Beispielen der Hilfe finde ich:

procedure TForm1.ComboBox1DropDown(Sender: TObject);
var
I: Integer;
begin
with ComboBox1 do
begin
Items.BeginUpdate; { Prevent repaints until done. }
....

Items.EndUpdate; {Reenable painting. }
end;
end;

Von meinem Verständnis: Teile ich der Liste mit, daß ich was ändern will (BeginUpdate), stellt sie sich solange nicht neu dar, bis ich mitteile, daß ich fertig bin (EndUpdate).

Delphi-Quellcode:
Procedure Test;
begin
RichEdit1.Lines.BeginUpdate;
RichEdit1.Clear;
i:=strtoint(editintegerpanel_ua1.ei.text);
for i := 0 to 1000 do TestRich1.Lines.Add(IntToStr(i));
RichEdit1.Lines.EndUpdate;
end;
In dem Beispiel wird aber mit jedem neuen Listeneintrag auch neu dargestellt, also die Liste hochgescrollt, bis der 1000ste Eintrag erreicht wird.

Damit nützt mir das BeginUpdate - EndUpdate hier nichts - keine Unterdrückung der Neudarstellung.

Aber auch LockWindowUpdate(richedit1.Handle) hilft da nicht.


Gruß uwe

Dalai 7. Apr 2015 20:48

AW: letzten linebreak aus tstrings (trichedit.lines) entfernen
 
Zitat:

Zitat von DrUArn (Beitrag 1296544)
Von meinem Verständnis: Teile ich der Liste mit, daß ich was ändern will (BeginUpdate), stellt sie sich solange nicht neu dar, bis ich mitteile, daß ich fertig bin (EndUpdate).

Korrekt, und das funktioniert auch.

Zitat:

Delphi-Quellcode:
Procedure Test;
begin
RichEdit1.Lines.BeginUpdate;
RichEdit1.Clear;
i:=strtoint(editintegerpanel_ua1.ei.text);
for i := 0 to 1000 do TestRich1.Lines.Add(IntToStr(i));
RichEdit1.Lines.EndUpdate;
end;
In dem Beispiel wird aber mit jedem neuen Listeneintrag auch neu dargestellt, also die Liste hochgescrollt, bis der 1000ste Eintrag erreicht wird.
Liegt wohl daran, dass du RichEdit1 zum Neuzeichnen sperrst, die Einträge aber in TestRich1 hinzufügst.

MfG Dalai

DrUArn 7. Apr 2015 21:04

AW: letzten linebreak aus tstrings (trichedit.lines) entfernen
 
@Dalei: Danke, Du hast recht! Schreibfehler.

Dann werde ich damit noch ein wenig experimentieren.

Gruß Uwe

Sir Rufo 7. Apr 2015 21:44

AW: letzten linebreak aus tstrings (trichedit.lines) entfernen
 
Zitat:

Zitat von DrUArn (Beitrag 1296550)
@Dalei: Danke, Du hast recht! Schreibfehler.

Dann werde ich damit noch ein wenig experimentieren.

Gruß Uwe

Manchmal hilft es auch den Quellcode vernünftig zu formatieren damit das Lesen und damit das Erkennen von Fehlern deutlicher und schneller ins Auge springt.
Delphi-Quellcode:
Procedure Test;
begin
  RichEdit1.Lines.BeginUpdate;
  RichEdit1.Clear;
  i := strtoint( editintegerpanel_ua1.ei.text );
  for i := 0 to 1000 do
    TestRich1.Lines.Add( IntToStr( i ) );
  RichEdit1.Lines.EndUpdate;
end;

DrUArn 7. Apr 2015 22:43

AW: letzten linebreak aus tstrings (trichedit.lines) entfernen
 
@Sir Rufo: ja, ist richtig.

Nun habe ich mit BeginUpdate und EndUpdate etwas propbiert, verhindert auch größtenteils das Flackern bei vielfachem Einfärben.

Eine interessante Beobachtung hier noch, die ich nicht erklären kann:
Delphi-Quellcode:
procedure TSimpCellRichEd_UA.SetEditModus(const EdMo: tcelleditmodi);
  var s:string;

begin
 try
  s:='';
  lines.beginupdate;
  case Edmo of
{1}   emedaslines_UA:
      begin
        for i := 0 to 1000 do
               s:=s+inttostr(i)+lines.linebreak;
        text:=s;
{--->}  wordwrap:=false;//lines.assign(strl);
      end;
{2}   emedasFreePos_UA:
      begin
        for i := 0 to 1000 do
               s:=s+'{'+inttostr(i)+'}'+dupestring(' ',3);
        text:=s;
{--->}  wordwrap:=true;
      end;
 finally

 preparetext;//Einfärben an sehr vielen Stellen

{
case Editmodus of
{1}  emEdasLines_UA: self.wordwrap:=false;
{2}  emEdasFreePos_UA: self.wordwrap:=true;
end;
}
 lines.endupdate;
end;
end;
Dies ist nur ein Auszug aus dem umfangreicheren Original.
Die Einträge werden also einmal wie ein Text, geklammert mit Zeilenumbruch dargestellt oder
Zeile für Zeile.
Lasse ich den Zeilenumbruch innerhalb der ersten Case-Schleife setzen {---->}, flimmert es beim Umrechnen von {2} nach {1},
und zwar nur dann, wenn Wordwrap vorher true war. Verlege ich das Setzen von wordwrap aus der ersten Case-Schleife in eine spätere (im Beispiel vor lines.endupdate), flimmerts nicht.


Das passiert auch, wenn ich bei {1} direkt Lines fülle (for i:=0 to 100 do lines.add(inttostr(i)));

Hebt vielleicht wordwrap:=false mein Beginupdate auf?


Gruß Uwe


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:47 Uhr.
Seite 2 von 2     12

Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf