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/)
-   -   Memo Bricht in Lines um (https://www.delphipraxis.net/201310-memo-bricht-lines-um.html)

TomyN 10. Jul 2019 19:36

Memo Bricht in Lines um
 
Also,
eigentlich ist es ganz einfach.
Ich habe ein Memo, dem ich mit Add verschiedene Strings zuweise.
Code:
myMemo.Clear;
myMemo.Lines.Add('First Line');
i:= myMemo.Lines.Add('Something important');
myMemo.Lines.Add('***END***');
Nun möchte ich später irgendwann den zweiten Eintrag ersetzen, das mache ich ganz simple mit

Code:
myMemo.Lines[i]:= 'Even more important';
Das funktioniert auch wunderbar, solange das Memo keinen Zeilenumbruch macht, also wenn entweder der Text kurz genug ist oder myMemo.wordWrap auf FALSE gesetzt ist.
Im Netz finde ich immer nur den Hinweis, dass ein Umbruch im Memo keine Auswirkung auf die Lines hat, aber irgendwie funktioniert das nicht.
Übersehe ich was?

hoika 10. Jul 2019 19:48

AW: Memo Bricht in Lines um
 
Hallo,
ich würde das Memo nur zur Anzeige benutzen
und die Daten in einer StringList vorhalten.

Das Ersetzen erfolgt dann in der StringList
und per Memo.Lines.Assign dann zurück ins Memo.

TomyN 10. Jul 2019 19:58

AW: Memo Bricht in Lines um
 
Hi

Danke für den Tip. Das scheint einwandfrei zu funktionieren.
Bin aber dennoch etwas verwundert über das Verhalten des Memos.

Tomy

p80286 10. Jul 2019 21:22

AW: Memo Bricht in Lines um
 
Zitat:

Zitat von TomyN (Beitrag 1436453)
Bin aber dennoch etwas verwundert über das Verhalten des Memos.

Da es sich um eine Komponente zur Datenanzeige handelt, ist dieses Verhalten eigentlich irrelevant.
Relevant ist das Verhalten der Struktur, die der Datenhaltung dient, und da gibt es keine Möglichkeit von außen einzugreifen.

Gruß
K-H

TomyN 10. Jul 2019 21:31

AW: Memo Bricht in Lines um
 
Naja, nach meinem Verständnis bietet das Memo schon auch die Möglichkeit der Dateneingabe und auch einer Verwaltung ( Insert etc.. ) der zugewiesenen Daten, für mich schon Anzeichen einer 'Datenhaltung/Verwaltung'.

Ist halt Philosophie. Was mich wirklich wundert ist, dass im Netz immer behauptet wird, das die Anzeige die Stringlist (Lines) nicht verändern würde. Aber selbst bei einer Basisaufgabe einer Datenanzeige, nämlich der Reaktion auf eine geänderte Größe funktioniert diese Datenanzeigekomponente nicht korrekt....

p80286 10. Jul 2019 21:45

AW: Memo Bricht in Lines um
 
Zitat:

Zitat von TomyN (Beitrag 1436460)
Was mich wirklich wundert ist, dass im Netz immer behauptet wird, das die Anzeige die Stringlist (Lines) nicht verändern würde.

Zum einen ist die Wahrheit nicht demokratisierbar, will sagen wenn 99% der postings behaupten, das es bei Sonnenschein und einer Lufttemperatur von 25°C schneit ist das trotzdem Blödsinn.
Zum anderen werden die Daten, die angezeigt werden können, in einer TStrings kompatiblen Struktur abgelegt. das ist nicht dasselbe wie TStringlist!
(OK ist korinthenkackerisch verleitet abernicht zu vorschnellen Schlüssen)

Gruß
K-H

HolgerX 11. Jul 2019 04:19

AW: Memo Bricht in Lines um
 
Hmm...

Damit ein Memo die Zeilen NICHT an der sichtbaren Breite umbricht, stelle doch mal 'ScrollBars' auf 'ssBoth'...

Damit versucht dann das Memo die Textzeile komplett anzuzeigen und bricht erst sehr spät um..

TomyN 11. Jul 2019 06:53

AW: Memo Bricht in Lines um
 
Zitat:

Zitat von p80286 (Beitrag 1436461)
[

Zum anderen werden die Daten, die angezeigt werden können, in einer TStrings kompatiblen Struktur abgelegt. das ist nicht dasselbe wie TStringlist!
(OK ist korinthenkackerisch verleitet abernicht zu vorschnellen Schlüssen)

Gruß
K-H

Das Problem ist nicht die Nutzung von TStrings Lines ist ein TStrings-Objekt, so dass die TStrings-Methoden für Lines verwendet werden können, um Bearbeitungen, wie Zählen der Textzeilen sowie Hinzufügen, Löschen und Ersetzen von Zeilen, durchführen zu können. steht in der Dokumentation. Sondern das Problem ist, dass TMemo Strings nicht zum speichern der Daten sondern zum speichern der Anzeige nutzt.

DenkDirNix 11. Jul 2019 07:17

AW: Memo Bricht in Lines um
 
In einem TRichEdit konnte ich dieses Problem umgehen. Das sollte im TMemo analog funktionieren:

Code:
Memo.Lines.BeginUpdate;
Memo.WordWrap := false;
Memo.Lines[i] := ...
Memo.WordWrap := true;
Memo.Lines.EndUpdate;
Bin aber nicht sicher, wie sich das bei sehr großen Datenmengen auf die Laufzeit auswirkt.

Delphi.Narium 11. Jul 2019 10:03

AW: Memo Bricht in Lines um
 
Ein Memo hat die wunderliche Eigenschaft WordWrap.

Wenn man die im Objektinspektor (oder sonstwo im Quelltext) auf false setzt, findet keine automatischer Zeilenumbruch statt.

Der daraus resultierende Umbruch findet nur in der Anzeige statt. Auf die Eigenschaft von Lines (vom Typ TStrings) hat das keinen Einfluss.

Zitat:

Zitat von Delphi 7 Hilfe
VCL-Referenz
WordWrap (Eigenschaft von TCustomMemo)

TCustomMemo Siehe auch

Die Eigenschaft WordWrap bestimmt, ob der Text im Eingabefeld am rechten Rand umbrochen wird.

Delphi-Syntax:

property WordWrap: Boolean;

C++ Syntax:

__property bool WordWrap = {read=FWordWrap, write=SetWordWrap, default=1};

Beschreibung

Ist WordWrap auf true gesetzt, wird der Text im Eingabefeld entsprechend der Breite des Client-Bereichs am rechten Rand umbrochen. Der Umbruch wird lediglich auf dem Bildschirm angezeigt, der Text enthält keinerlei Zeilenumbrüche, die nicht explizit eingegeben wurden. Hat WordWrap den Wert false, wird eine separate Zeile nur dort angezeigt, wo explizit ein Zeilenumbruch in den Text eingefügt wurde.

Hinweis: Hat WordWrap den Wert true, wird keine horizontale Bildlaufleiste für das Eingabefeld benötigt.


TomyN 11. Jul 2019 19:23

AW: Memo Bricht in Lines um
 
Wenn dem so ist, warum passiert dann mit diesem Code
Code:
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
    lineIndex: Integer;
    //theList:  TStringList;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.lines.Add('The first line is a long line. Let us see what will happen');
  lineIndex:= Memo1.Lines.Add('This is the line of interest');
  Memo1.Lines.Add('******END******');
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  memo1.Lines[lineIndex]:= IntToHex(Random($1000),4) + ' New Text for the Test. Good Luck';
end;

end.
Das hier: https://www.youtube.com/watch?v=Cgy8GVSaJUc

p80286 11. Jul 2019 19:53

AW: Memo Bricht in Lines um
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1436488)
Ein Memo hat die wunderliche Eigenschaft WordWrap.

Irgendwie habe ich es so verstanden, daß wordwrap immer True sein soll, sonst wäre es ja auch zu einfach.

Gruß
K-H

TomyN 11. Jul 2019 19:55

AW: Memo Bricht in Lines um
 
Das Video ist mit Wordwrap := TRUE. Ansonsten werden halt nur die Anfänge der Zeilen angezeigt..

Schokohase 11. Jul 2019 19:59

AW: Memo Bricht in Lines um
 
Nur so als Hinweis:

Es gibt einen Unterschied zwischen VCL
Delphi-Quellcode:
TMemo
und FMX
Delphi-Quellcode:
TMemo
.

Bei VCL ist in der
Delphi-Quellcode:
Lines
-Eigenschaft der Inhalt analog zur Anzeige. (Das kann man auch schon zur DesignTime sehen. Lines Eigenschaft bearbeiten, schließen und wieder zum Bearbeiten öffnen).

Bei FMX wird die Lines-Eigenschaft durch
Delphi-Quellcode:
WordWrap
nicht verändert.

Delphi.Narium 12. Jul 2019 14:33

AW: Memo Bricht in Lines um
 
Zitat:

Zitat von TomyN (Beitrag 1436536)
Das Video ist mit Wordwrap := TRUE. Ansonsten werden halt nur die Anfänge der Zeilen angezeigt..

Genau das ist auch der Sinn von WordWrap in seinem Ursprung.

Wenn WordWrap = false, dann werden von allen Zeilen die Anfänge angezeigt, bis halt die Breite des Memos erreicht ist, der Rest befindet sich quasi rechts vom rechten Rand des Memos.

WordWrap = true sorgt jedoch dafür, dass man alles sehen kann, wenn also in einer Zeile der Text eigentlich breiter ist, als die zur Anzeige zur Verfügung stehenden Fläche, so wird an einer geeigneten Stelle links vom rechten Rand ein Zeilenumbruch eingefügt, um die Anzeige des vollständigen Textes zu ermöglichen.

Das Video zeigt also exakt, wie ein Memo mit WordWrap = True funktionieren soll, es zeigt exakt das gewünschte Verhalten.

TomyN 13. Jul 2019 10:10

AW: Memo Bricht in Lines um
 
Also ich würde ein anderes Verhalten erwarten.

Schokohase 13. Jul 2019 10:13

AW: Memo Bricht in Lines um
 
Zitat:

Zitat von TomyN (Beitrag 1436657)
Also ich würde ein anderes Verhalten erwarten.

Das Verhalten der Anzeige ist exakt so wie man es erwarten kann bei
Delphi-Quellcode:
WordWrap := true
: Die Zeilen werden umgebrochen.

Das Verhalten der
Delphi-Quellcode:
Lines
-Eigenschaft ist nicht unbedingt so wie man es erwarten könnte und ist auch bei
Delphi-Quellcode:
VCL
und
Delphi-Quellcode:
FMX
anders umgesetzt.

Ihr solltet klar werden worüber ihr sprechen wollt. Über die Anzeige oder die Auswirkungen auf die
Delphi-Quellcode:
Lines
-Eigenschaft. Sonst wird das mit der Kommunikation schwierig.


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