Entwickler-Ecke
Sonstiges (Delphi) - Eintrag in Memo löschen
nina - Do 08.05.03 12:04
Titel: Eintrag in Memo löschen
Hallo!
Ich möchte in einem Memofeld eine bestimmte Zeile löschen. Ich habe auch schon verschiedene Sachen Probiert, allerdings bringt er mir dann immer diese Fehlermeldung!
Inkompatible Typen: 'Integer' und 'String'
Ich habe auch schon in der Hilfe nachgeschaut wie ich diesen Fehler wieder beheben kann, hab allerdings nichts gefunden!
Weiss jemand wie ich diesen Fehler wieder wegkriege?
Momentan versuche ich so diese Zeile zu löschen
Quelltext
1:
| memo.lines.Delete('<RDF:li>www.google.de</RDF:li>'); |
Danke!
Nina
Delete - Do 08.05.03 12:19
Also bei mir erwartet die Methode Delete die Zeilennummer, der zu löschenden Zeile. Womit sich deine Fehlermeldung erklären läßt und warum es so nicht geht.
Ex0rzist - Do 08.05.03 12:20
Hallo,
Memo.Lines.Delete() erwartet als Parameter die Zeilennummer. Also musst du erst überprüfen, in welcher Zeile der Text steht.
Die ganze Prozedur sieht dann z.Bsp. so aus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin For i := 0 to Memo1.Lines.Count-1 do begin If Memo1.Lines[i] = '<RDF:li>www.google.de</RDF:li>' then Memo1.Lines.Delete(i); end; end; |
Dabei ist zu beachten, dass jede Zeile, in der der Text vorkommt, gelöscht wird. Um das zu umgehen baust du am besten eine Boolesche Variable ein.
nina - Do 08.05.03 12:33
Das mit der Nummer hab ich bereits gemacht! Es hat auch gefunzt, allerdings löscht er mir die Zeilen die anschliessend noch kommen auch noch!
Hast Du das dann mit der Booleschen Variable gemeint?
Wenn ja, was ist das für eine Variable? Und leg ich die genauso an wie eine string Variable?
Sorry, aber ich bin noch nicht so gut in Delphi!
Nina
Ex0rzist - Do 08.05.03 12:45
Mir ist gerade azfgefallen, dass du gar keine Variable brauchst
Du musst einfach nur ein
break einfügen.
Z.Bsp.:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin For i := 0 to Memo1.Lines.Count-1 do begin If Memo1.Lines[i] = '<RDF:li>www.google.de</RDF:li>' then begin Memo1.Lines.Delete(i); break; // verlässt die Schleife end; end; end; |
nina - Do 08.05.03 13:01
Oh Mann! Ich hoffe das ich das mit dem Programmieren bald besser hinkriege!
Danke für die schnelle Hilfe!
Nina
neojones - Do 08.05.03 13:54
Anmerkung: Es gibt viele Firmen, die die Verwendung von Break und Exit sowie Goto in Programmen verbieten, mit der Ausnahme der Verwendung von Break und Exit bei der Verwendung von 2 ineinander verschachtelten Schleifen.
Viele Grüße,
Matthias
Delete - Do 08.05.03 17:52
Das zu verbieten halte ich für übertrieben. Die Empfehlung, wenn es geht, es zu vermeiden, würde ich für sinnvoller betrachten.
hansa - Fr 09.05.03 02:17
neojones hat folgendes geschrieben: |
Anmerkung: Es gibt viele Firmen, die die Verwendung von Break und Exit sowie Goto in Programmen verbieten... |
Da hat er Recht :!: und das hat gute Gründe. Ergibt bei "Gewohnheitstätern" und dann eventuell noch wechselnden Spaghetticode und die Fa. ist am Ende pleite. Wär ich Chef, dürfte es keiner machen. Und wenn einer mit GOTO noch anfängt, dr wäre auf der schwarzen Liste vorgemerkt. Aber wie Luckie sagt : Ausnahmen bestätigen die Regel !
Eine solche Ausnahme habe ich aber in zig-tausend Zeilen Code noch nie gebraucht. Na gut, habe mir das von vorneherein nicht angewöhnt.
[EDIT]das war etwas zu schnell. Man braucht sowas eventuell, in einer FOR Schleife. Ich benutze diese deshalb NICHT, wenn tatsächlich ein Umstand dazu führen würde, daß ein Durchlaufen bis zum Ende Quatsch ist. Stattdessen sollte man eine WHILE oder REPEAT Schleife verwenden und ein Abbruchkriterium genau definieren und auswerten.
hansa - Fr 09.05.03 02:29
Hi Luckie,
das da war mir klar. 8) Hier ist die Rede von Anfängern. Soll eventuell MS-Basic wieder eingeführt werden und die sich einen solchen Stil angewöhnen? Natürlich kann man mit Break aus der FOR Schleife raus, aber es gibt drei Schleifen-Typen, wovon die FOR wohl die einfachste ist. Und die kann man sehr schön mit break, exit usw. aushebeln. Das schlimme ist, finde mal den Fehler! Für Anfänger ist das gaaaanz einfach die einfachste Möglichkeit und die schlechteste für zu lernen. So, guck mir den Beitrag an.
nina - Fr 09.05.03 08:39
Huhu!
Das mit dem löschen einer Zeile klappt super!
Aber was mach ich, wenn es mehrere Zeilen hintereinander sind!?
Vor allem können es immer unterschiedlich viele Zeilen hintereinander zu löschen sein!
nina
Ex0rzist - Fr 09.05.03 12:24
Dann lässt du das böse break weg.
Oder habe ich deine Frage falsch verstanden?
nina - Fr 09.05.03 12:36
Ich hab mich wahrscheinlich ein bischen falsch ausgedrückt! Sorry!
Was ich meine ist, das ich z.B. nur die Zeilen 20, 21, 22, und 23 gelöscht haben möchte! Die wo dahinter kommen nicht!
Da ich aber auch noch das Problem hatte, dass sich die Zeilennummer immer wieder ändert, arbeite ich momentan mit pos. Das geht allerdings auch nur wenn ich die ganze Zeile ausschreibe! Da in der Zweiten allerdings was anderes steht, weiss ich hier nicht weiter!
Beispiel:
Quelltext
1:
| posi := Pos(' <RDF:li>www.google.de</RDF:li>', memo.lines.Strings[i]); |
In der zweiten Zeile würde dann statt dem google z. B. freenet stehen usw. usw.!
Das meinte ich mit weitere Zeilen löschen?
Weiss jemand Rat!
nina
hansa - Fr 09.05.03 12:51
Ich würde langsam mal in Betracht ziehen, ein zweites Memo zu benutzen und da alles reinschreiben, was NICHT gelöscht werden soll. Also:
Quelltext
1: 2: 3: 4: 5:
| for For i := 0 to Memo1.Lines.Count-1 do begin ... if not loeschen then Memo2.Lines.Add (Memo1.Lines.Text); end; |
Das da kann man gut lesen. Wird es mit dem delete komplizierter, kommt man eventuell schnell mit dem Index der Zeilen durcheinander.
Delete - Fr 09.05.03 13:01
Wenn man wüsste, was nina zu tun gedenkt, könnte man evtl. eine bessere Lösung anbieten. Vielleicht sogar ganz ohne Memo?
Aber dazu müsste man eben wissen, warum diese Einträge im Memo stehen, was das Programm eigentlich tun soll, usw.
nina - Fr 09.05.03 13:06
Mein Problem ist, dass ich nicht weiss, was ich statt dem google.de einsetzten kann! Beispiel: In der Datei steht
Zeile20 <RDF:li>
http://www.google.de</RDF:li>
Zeile21 <RDF:li>
http://www.freenet.de</RDF:li>
Zeile22 <RDF:li>
http://www.lycos.de</RDF:li>
Ich möchte nun Zeile 20 bis 22 gelöscht haben!
Momentan benutze ich den oberen Code! Er löscht mir damit allerdings nur die google Zeile (verständlich)!
Meine Frage wäre nun ob es in Delphi was gibt, dass ich zwischen die zwei geschlossenen Klammern setzen kann? Ich habe es schon ('', usw.) porbiert aber es hat alles nichts gebracht!
Wäre die zweite Memo dafür wirklich geschickter? Brauche ich dafür nicht auch den oben genannten Code damit er mir erkennt welche Zeilen in der ersten Memo bleiben sollen und welche in die zweite gehen sollen?
Sorry, falls ich ganz falsch liege!
Nina
Delete - Fr 09.05.03 13:12
nina hat folgendes geschrieben: |
Meine Frage wäre nun ob es in Delphi was gibt, dass ich zwischen die zwei geschlossenen Klammern setzen kann? |
Ja,
Format lässt sich beispielsweise dafür nutzen
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| const szFmtString = "<RDF:li>%s</RDF:li>"; szSearch : array[1..3]of string = ('www.google.de', 'www.freenet.de', 'www.lycos.de'); var i : integer; begin for i := 1 to length(szSearch) do ShowMessage(Format(szFmtString,[szSearch[i]])); end; |
nina - Fr 09.05.03 13:15
Also mein Programm soll den Inhalt der Adressleiste aus dem Netscape und aus Mozilla löschen! Diese Einträge befinden sich in einer Datei mit der Endung .rdf.
Da ich bereits ein Memo auf dem Programm habe, war ich der Meinung das ich diese Datei dort rein laden könnte!
Er ladet mir diese genannte Datei auch in diese Memo. Es wäre auch kein Problem diese genannten Zeilen zu löschen wenn sie immer an der gleichen Stelle stehen würden, allerdings ist das ja nicht so. Bei jedem Neustart von Netscape und einem neuen Eintrag in der Adressleist, verändert die Zeilenposition!
Der Rest steht eins weiter oben!
Ich hoffe das ist gut genug erklärt!
Nina
hansa - Fr 09.05.03 13:17
Also nochmals gaaannz langsam zum Mitschreiben. :lol: Das zweite Memo ist ein "Hilfsmemo", das nur dazu dient , die Werte die TATSÄCHLICH gebraucht werden aufzunehmen. Ich kam auf die Idee, als ich selber mit den Indices in so einem Fall durcheinanderkam. So und nun kommts: ist das zweite Memo gefüllzt, so machst Du das erste leer und schaufelst das Hilfmemo zeilenweise wieder in das erste. Wenn Du das zweite Memo noch auf visible := false setzt, merkt mans nicht mal.
nina - Fr 09.05.03 13:34
@hansa:
Ich weiss was Du mit diesen zwei Memos meinst, aber ich muss doch bestimmt irgendwo angeben welche Zeilen bleiben sollen und welche Zeilen in die andere Memo sollen?
Und genau da weiss ich nicht weiter!
@Mathias:
Mit Arrays habe ich noch nichts gemacht! Aber wenn ich das richtig verstanden habe, dann hast Du drei Felder angelegt und mit den jeweiligen Adressen gefüllt? Sollte das so sein: Ich kenne die Adressen nicht die in dieser Datei abgespeichert werden. Ich weiss nur diesen Bereich!
<RDF:li></RDF:li>;
Sobald eine neue Adresse eingegeben wird füllt er die zwischen die zwei Klammern!
Wenn ich falsch liebe, dann bitte ich um Erklärung!
Ich entschuldige mich schon mal im voraus für die "dummen" Fragen und für die noch blöderen Erklärungen von mir!
Nina
Ex0rzist - Fr 09.05.03 13:48
Du musst doch dann nur noch zeilenweise durchgehen und überprüfen, ob irgendwo ein "<RDF:li>" vorkommt. Wenn ja --> Zeile löschen (ich nehme mal an, dass pro Zeile nur ein Eintrag in der Datei existiert).
nina - Fr 09.05.03 14:00
Das hab ich auch schon probiert! Macht er allerdings auch nicht. Er löscht nur dann wenn er die ganze Zeile ausgeschrieben kriegt! :crying:
Nina
Hier ist mal mein ganzer Code! Vielleicht hilft das was!
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| memo.Lines.LoadFromFile(Pfadname)
for i := 0 to memo.Lines.count-1 do begin if memo.lines[i] = ' <RDF:li>' then begin //posi := Pos('<RDF:li>', memo.lines.Strings[i]); memo.lines.Delete(i); end; end; //for i.... |
Delete - Fr 09.05.03 15:10
nina hat folgendes geschrieben: |
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| memo.Lines.LoadFromFile(Pfadname)
for i := 0 to memo.Lines.count-1 do begin if memo.lines[i] = ' <RDF:li>' then begin //posi := Pos('<RDF:li>', memo.lines.Strings[i]); memo.lines.Delete(i); end; end; //for i.... | |
Dass du keinen Erfolg hast, wundert mich nicht. Du prüfst
Quelltext
1:
| if memo.lines[i] = ' <RDF:li>' |
sagst aber selbst, dass eine Zeile z.B. so aussehen kann
Quelltext
1:
| <RDF:li>www.google.de</RDF:li> |
Warum also nicht
Quelltext
1:
| if(pos('<RDF:li>',memo.lines[i]) > 0) then |
Ich würde aber rückwärts durch die Schleife gehen. Luckie hat
hier [
http://www.delphi-forum.de/viewtopic.php?t=11042] übrigens auch den Grund dafür genannt.
< --- schnibbel ------------>
nina hat folgendes geschrieben: |
Also mein Programm soll den Inhalt der Adressleiste aus dem Netscape und aus Mozilla löschen! Diese Einträge befinden sich in einer Datei mit der Endung .rdf. |
Das dachte ich mir: XML. Die RDF-Dateien des Mozilla sind im XML-Format. Du solltest dich daher am besten mit einem Parser beschäftigen. Ab Delphi 6 ist eine XML-Komponente dabei. Bei älteren Delphi-Versionen kannst du z.B. die Typbibliothek von Microsoft oder einen anderen freien XML-Parser benutzen.
Der Vorteil: du kannst das Dokument mit seiner kompletten Struktur laden und alle Knoten mit dem Namen "<RDF:li/>" in eine interne Liste (Nodelist) laden. Du könntest dann alle gefundenen Knoten löschen.
Ist der Knotentext noch wichtig (etwa google), dann kannst du in einer simplen for-Schleife alle gefundenen Knoten durchlaufen und nur die entfernen, die die gewünschten Begriffe aufweisen. Dann speicherst du die Datei neu ab. Fertig.
Ich denke, diese Lösung ist weitaus eleganter als der Umweg über ein oder sogar zwei Memos.
Grüße.
nina - Fr 09.05.03 15:53
Das mit dem
if memo.lines[i] = ' <RDF:li>'
habe später geändert und vergessen es im vorum zu ändern! Es hat aber trotzdem nicht funktioniert gehabt. Aber jetzt funzt es, denn es lag nur an der Schleife! :dance:
Oh Mann, war das eine schwere Geburt!
Vielen Danke noch mal an alle für Eure Hilfe und die Geduld für solche Leute wie mich, die an manchen Tagen echt auf dem Schlauch stehen :lol: !!! Sorry!
Nina
Ex0rzist - Sa 10.05.03 02:44
Kein Problem. Wir haben alle mal klein angefangen ... und werden auch noch weiter wachsen. :wink:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!