Autor Beitrag
nina
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 62



BeitragVerfasst: Do 08.05.03 12:04 
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

ausblenden Quelltext
1:
memo.lines.Delete('<RDF:li>www.google.de</RDF:li>');					


Danke!

Nina
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 550

Win XP Prof.
Mandrake 10.0

D6
BeitragVerfasst: 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:
ausblenden 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.

_________________
If accidentally read, induce vomitting.
nina Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 62



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 550

Win XP Prof.
Mandrake 10.0

D6
BeitragVerfasst: 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.:
ausblenden 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;

_________________
If accidentally read, induce vomitting.
nina Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 62



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1206
Erhaltene Danke: 1



BeitragVerfasst: 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

_________________
Ha! Es compiliert! Wir können ausliefern!
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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.

_________________
Gruß
Hansa


Zuletzt bearbeitet von hansa am Fr 09.05.03 02:21, insgesamt 1-mal bearbeitet
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 09.05.03 02:20 
Dann kukc mal in diesen Thread:
www.delphi-forum.de/...ght=portscanner+goto
Willst du mir da jetzt erzählen, dass Mathias eien Totsünde begangen hat?
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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.

_________________
Gruß
Hansa
nina Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 62



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 550

Win XP Prof.
Mandrake 10.0

D6
BeitragVerfasst: Fr 09.05.03 12:24 
Dann lässt du das böse break weg.
Oder habe ich deine Frage falsch verstanden?

_________________
If accidentally read, induce vomitting.
nina Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 62



BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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:

ausblenden 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.

_________________
Gruß
Hansa
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 62



BeitragVerfasst: 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>www.google.de</RDF:li>;
Zeile21 <RDF:li>www.freenet.de</RDF:li>;
Zeile22 <RDF:li>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
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 62



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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.

_________________
Gruß
Hansa