Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Memofeld in StringList einlesen? (https://www.delphipraxis.net/109765-memofeld-stringlist-einlesen.html)

Borschti 7. Mär 2008 09:43


Memofeld in StringList einlesen?
 
Hallo,

zur Zeit versuche Ich mich ein wenig mit Memofeldern auseinanderzusetzen, geht eigentlich auch ganz gut vorran ;)

Nur jetzt habe ich ein kleines Problem, also ich versuche, wie die Überschrifft schon sagt, den Inhalt meines Memofeldes in eine StringList einzulesen. Dies geschieht mit einer For-Schleife.

Delphi-Quellcode:
procedure TForm1.ColorButton1Click(Sender: TObject);
var text1: TStringList;
    i: Integer;
begin
text1 := TStringList.Create;

for i := 0 to Memo1.Lines.Count-1 do
 begin
  text1[i] := Memo1.Lines[i];
 end;

{for i := 0 to Text1.count do
 begin
  Memo2.Lines[i] := text1[i];
 end;}

end;
Den auskommentierten Teil bitte erstmal nicht beachten ^^

Also ich bekomme die Fehlermeldung: "Listenindex überschreitet das Maximum(0)".

So wie ich das verstehe ist das Maximum null, aber wieso? Ich habe insgesamt 10 Lines in Memo1.

Vielleicht ist auch irgendwas ziemlich simples schuld an dem Fehler, wie gesagt ist das erste mal das ich mit Memofeldern arbeite ;)

mfg
Alex

chrisw 7. Mär 2008 09:46

Re: Memofeld in StringList einlesen?
 
Delphi-Quellcode:
text1.add(Memo1.Lines[i]);
Es sind ja noch keine Strings in der Liste, nachdem du sie instanzierst. (Create)

DeddyH 7. Mär 2008 09:46

Re: Memofeld in StringList einlesen?
 
Möglichkeit 1:
Delphi-Quellcode:
text1 := TStringList.Create;

for i := 0 to Memo1.Lines.Count-1 do
begin
  text1.Add(Memo1.Lines[i]);
end;
Möglichkeit 2:
Delphi-Quellcode:
text1 := TStringList.Create;
text1.Assign(Memo1.Lines);

Borschti 7. Mär 2008 10:04

Re: Memofeld in StringList einlesen?
 
Danke euch beiden, hatte mir echt fast die Zähne dran ausgebissen ;)

RavenIV 7. Mär 2008 10:26

Re: Memofeld in StringList einlesen?
 
Zitat:

Zitat von Borschti
Danke euch beiden, hatte mir echt fast die Zähne dran ausgebissen ;)

Ein Wenig in der Hilfe geschaut und die Beispiele betrachtet.
Dann in der DP die Suchfunktion benutzt.
Und schon ist das Problem grösstenteils gelöst.

Coole Sache, nicht wahr?

Borschti 7. Mär 2008 11:35

Re: Memofeld in StringList einlesen?
 
Naja ich bins nochmal :lol:

Habe noch ein Problem ;) also es geht darum das ich meinem zweiten Memofeld nur dann die StringList (kommt aus dem ersten Memofeld) übergeben kann wenn es auch die gleiche Anzahl der Lines wie mein erstes Memofeld hat.

Um das anzugleichen benutze ich
Delphi-Quellcode:
Memo2.Lines := Memo1.Lines;
Allerdings glaub Ich das dann der Inhalt der Lines übergeben wird und nicht die Anzahl...hatte es mit Memo1.Lines.Count probiert aber naja wollte wohl nicht so wie ich ;)

Habe auch grade in der Delphihilfe nachgeschaut da hatte sich mein Verdacht eigentlich schon bestätigt, also ich suche etwas womit Ich die Anzahl der Lines des zweiten Memofeldes an die des ersten Memofeldes angleichen kann.

Schonmal danke im Vorraus.

mfg
Alex

s-off 7. Mär 2008 11:43

Re: Memofeld in StringList einlesen?
 
Hallo,

die kannst Du nicht 'einfach so angleichen'.

Da Lines.Count readonly ist, musst Du die schon explizit hinzufügen, bzw. entfernen.

Den Sinn Deines Vorhabens verstehe ich allerdings nicht nicht so ganz. Hilft Dir vielleicht die Text-Eigenschaft weiter? Wenn Du Memo1.Text := Memo2.Text setzt, dann werden logischerweise auch die Anzahl Strings angepasst.

Borschti 7. Mär 2008 11:56

Re: Memofeld in StringList einlesen?
 
Ja das es mit Lines.Count nicht klappt weiß ich, hab ja die Fehlermeldung gelesen ;)

Also Memo2.Text := Memo1.Text geht ja nicht weil dann auch die Textinhalte übernommen werden.

Ich erklär mal wofür ich das brauch, ist vllt einfacher zu verstehen dann.

Also ein Kunde benutzt in einer Tabelle für Artikel das Langtextfeld für verschiedene Infos, hier drückt er aber nach der Eingabe oft die Eingabetaste weil er denkt er würde so in das nächste Feld Springen, also er verwechselt es mit der Tab Taste.
Meine Aufgabe ist nun ein Programm zu schreiben welche die Spalte Langtext in mein erstes Memofeld einliest, dann die überflüssigen Zeilenumbrüche rauswirft und das ergebnis dann im zweiten Memofeld anzeigt.

Hoffe mein Vorhaben wurde ein wenig klarer :D

Meinst du mit explizit hinzufügen oder entfernen, dass ich das im Objektinspektor machen soll?

mfg
Alex

DeddyH 7. Mär 2008 11:58

Re: Memofeld in StringList einlesen?
 
Wieso nimmst Du nicht Assign? Beispiel siehe oben.

Borschti 7. Mär 2008 12:10

Re: Memofeld in StringList einlesen?
 
Hmm Assign würde doch das gleiche machen oder? Also würde doch auch den Textinhalt mit übertragen oder nicht?

s-off 7. Mär 2008 12:21

Re: Memofeld in StringList einlesen?
 
Zitat:

Zitat von Borschti
Hmm Assign würde doch das gleiche machen oder? Also würde doch auch den Textinhalt mit übertragen oder nicht?

Ja, würde es.

Euer Vorgehen finde ich allerdings ein bissel von hinten durch die Brust ins Auge.
Warum designed Ihr Eure Oberfläche nicht so, dass das Problem, das Ihr jetzt habt, gar nicht erst auftreten kann?

Edit:
Zitat:

Zitat von Borschti
Meinst du mit explizit hinzufügen oder entfernen, dass ich das im Objektinspektor machen soll?

Nein, ich meine damit, dass Du mit Lines.Delete bzw. Lines.Insert Zeilen hinzufügst, bzw. löschst.
Aber wie gesagt, ich würde in diesem Fall die Ursache beheben.

marabu 7. Mär 2008 12:26

Re: Memofeld in StringList einlesen?
 
Hallo Alex,

wenn keine harten Zeilenumbrüche im Memo erlaubt sind, dann kann man WantReturns abschalten. Wenn nur versehentlich am Ende angehängte Leerzeilen entfernt werden sollen, dann gibt es mehrere Möglichkeiten - hier eine:

Delphi-Quellcode:
with Memo do Lines.Text := Trim(Text);
Grüße vom marabu

Borschti 7. Mär 2008 12:33

Re: Memofeld in StringList einlesen?
 
Ist nicht komplett unser Programm, wir bieten unseren Kunden nur die Warenwirtschaft und einige speziell für sie entwickelte Applikationen an. Also die Warenwirtschaft selbst kommt nicht von uns.

@Marabu: Danke dir, Trim kannte ich bis jetzt auch noch nich ;)

NormanNG 7. Mär 2008 12:36

Re: Memofeld in StringList einlesen?
 
Hi,

und wenn mehrere CRLF drin sind, gehts auch so

Delphi-Quellcode:
  Memo2.Text := AnsiReplaceText( AnsiReplaceText( Memo1.Text, #13, #32 ), #10, '');

Borschti 7. Mär 2008 12:39

Re: Memofeld in StringList einlesen?
 
Danke euch allen für eure Hilfe :-D

Borschti 7. Mär 2008 12:48

Re: Memofeld in StringList einlesen?
 
Eine letzte Frage habe ich allerdings noch :oops:

Kann man die von Trim() entfernten Zeilenumbrüche irgendwie zählen, oder kann man die, die am Anfang oder Ende stehn direkt im String zählen?

mfg
Alex

Nuclear-Ping 7. Mär 2008 12:55

Re: Memofeld in StringList einlesen?
 
[OT]
Sorry, aber wenn ich sowas lese: Du programmierst - scheinbar als extrem blutiger Anfänger - SO für Kunden? :shock:

Wenn das geht, bewerbe ich mich demnächst auch als Pilot bei Germanwings, weil ich schon über 500 Flugstunden mitm A320 im MS Flusi hab. :thumb:
[/OT]

s-off 7. Mär 2008 12:56

Re: Memofeld in StringList einlesen?
 
Schau Dir SysUtils.Trim an, und bau Dir daraus Deine eigene Trim-Funktion.
Da der Rückgabewert ja schon belegt ist übergibst Du dann neben dem zu trimmenden String einen Var-Paramter vom Typ Integer, in dem Dir die Anzahl der gelöschten Zeilenumbrüche zurückgegeben werden.

Edit:
@Nuclear-Ping: ich denke mal, dass darüber noch jemand sein Händchen halten wird, und das nicht ungesehen released wird ;)

marabu 7. Mär 2008 13:01

Re: Memofeld in StringList einlesen?
 
Die Funktion liefert die Anzahl der entfernten Leerzeilen:

Delphi-Quellcode:
function TrimLines(s: TStrings): Integer;
begin
  Result := s.Count;
  s.BeginUpdate;
  s.Text := Trim(s.Text);
  s.EndUpdate;
  Result := Result - s.Count;
end;

Borschti 7. Mär 2008 13:03

Re: Memofeld in StringList einlesen?
 
Bin Auszubildender im ersten Jahr ;) und das ist ja nicht direkt für den, das verwenden Wir um das Feld ein wenig sauber zu halten^^

s-off 7. Mär 2008 13:13

Re: Memofeld in StringList einlesen?
 
Hallo Achim,
Zitat:

Zitat von marabu
Die Funktion liefert die Anzahl der entfernten Leerzeilen:

Delphi-Quellcode:
function TrimLines(s: TStrings): Integer;
begin
  Result := s.Count;
  s.BeginUpdate;
  s.Text := Trim(s.Text);
  s.EndUpdate;
  Result := Result - s.Count;
end;

das bringt ihm aber nichts, wenn er am Ende der Zeile nur einen Zeilenumbruch hat. Das,w as danach kommt, wird ja nicht als Zeile angesehen.
Der Umbruch wird zwar entfernt, gezählt werden aber nur tatsächlich entfernte Zeilen.

marabu 7. Mär 2008 13:31

Re: Memofeld in StringList einlesen?
 
Hallo Sascha,

Zitat:

Zitat von marabu
... Die Funktion liefert die Anzahl der entfernten Leerzeilen ...

Zitat:

Zitat von s-off
... gezählt werden aber nur tatsächlich entfernte Zeilen. ...

ich habe nie behauptet, dass ich mit TrimLines() die Zahl der entfernten Zeichen bestimme.

Freundliche Grüße

s-off 7. Mär 2008 13:45

Re: Memofeld in StringList einlesen?
 
Zitat:

Zitat von marabu
Hallo Sascha,

Zitat:

Zitat von marabu
... Die Funktion liefert die Anzahl der entfernten Leerzeilen ...

Zitat:

Zitat von s-off
... gezählt werden aber nur tatsächlich entfernte Zeilen. ...

ich habe nie behauptet, dass ich mit TrimLines() die Zahl der entfernten Zeichen bestimme.

Freundliche Grüße

Entschuldige, dass ich Dir etwas unterstellt habe, was Du nicht behauptet hast - wollte ich gar nicht.
Sollte nur ein Hinweis darauf sein, dass die Funktion nicht das macht, was Borschti sich wünscht.
Nichts für ungut.

Borschti 7. Mär 2008 15:09

Re: Memofeld in StringList einlesen?
 
Also danke euch erstmal für die Hilfreichen Antworten, ich werde mich gegebenenfalls nochmal in dem Thread melden falls noch Fragen aufkommen ;)

mfg
Alex


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