Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Textstelle kopieren
DaVinciFF7 - Mo 29.09.08 21:14
Titel: Textstelle kopieren
Hallihallo.
Ich soll als Hausaufgabe in Informatik ein Programm modifizieren, sodass man in eine Memobox einen Text eingeben kann und dieser dann in 3er Stücke zerhackt wird und die Tripel in einen Suchbaum einsortiert werden. Das sieht bei mir momentan so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure zerstueckeln; var i:integer; begin if i<length(form1.memo1.Text) then form1.eingabe.text:=form1.memo1.text(i to i+2); i:=i+1; eingabebtnclick; zerstueckeln; else end; |
eingabe ist ein Editfeld, wo man normalerweise Begriffe eingibt, die dann, sobald man auf den btn klickt, in den Suchbaum einsortiert werden. Deshalb auch der Prozeduraufruf "eingabebtnclick".
Er hat nur irgendwie ein Problem mit der Stelle "form1.eingabe.text:=form1.memo1.text(i to i+2)"
Es kommt immer die Fehlermeldung "missing operator or semicolon".
Wie kann ich den denn dazu bringen, dass er in das Editfeld die Buchstaben von i bis i+2 aus dem Memofeldtext einsetzt?
Dankeschön im Vorraus :)
Moderiert von
Christian S.: Delphi-Tags hinzugefügt
Die Muhkuh - Mo 29.09.08 21:20
Hi,
schau Dir dazu mal die Funktion Copy an.
DaVinciFF7 - Mo 29.09.08 21:22
Mit copy hab ichs auch schon probiert, das müsste dann ja so aussehen:
Delphi-Quelltext
1:
| form1.eingabe:=copy(form1.memo1.text,i to i+2); |
oder nicht?
Moderiert von
Tino: Delphi-Tags hinzugefügt
Die Muhkuh - Mo 29.09.08 21:27
Schau Dir die Hilfe zu Copy mal genau an ;-)
Marc. - Mo 29.09.08 21:28
DaVinciFF7 hat folgendes geschrieben: |
Mit copy hab ichs auch schon probiert, das müsste dann ja so aussehen:
form1.eingabe:=copy(form1.memo1.text,i to i+2);
oder nicht? |
Das Schlüsselwort
to findet nur bei der For-Schleife Verwendung! :zwinker:
Copy erwartet zudem drei Parameter, den Ursprungstext, die Startpostion und die Länge des zu kopierenden Stückes.
Grüße,
Marc.
DaVinciFF7 - Mo 29.09.08 21:30
Ok dankeschön, ich versuchs nochmal :)
jaenicke - Mo 29.09.08 21:32
Um genau zu sein: to gibts nur bei einer for-Schleife.
// EDIT:
Wie schnell doch die Zeit vom Aufruf der Seite bis zur Antwort vergeht...
Die Muhkuh - Mo 29.09.08 21:33
jaenicke hat folgendes geschrieben: |
| Um genau zu sein: to gibts nur bei einer for-Schleife. |
Schrieb Marc zwei Beiträge weiter oben auch :zwinker:
[edit]Jetzt editiert er auch noch :P[/edit]
DaVinciFF7 - Mo 29.09.08 21:36
Ok an dem Copy meckert er nicht mehr rum, habe jetzt aber ein weiteres Problem.
Ich will nämlich die Prozedur "eingabebtnclick" aufrufen, aber er sagt dann
"undeclared identifier: 'eingabebtnclick'"
Wenn ich noch ein Tform1. davorsetze kommt
"not enough actual parameters"
Was muss ich tun, damit er einfach diese Prozedur startet?
Die Muhkuh - Mo 29.09.08 21:38
Versuch mal:
Delphi-Quelltext
1:
| eingabebtnclick(Self); |
DaVinciFF7 - Mo 29.09.08 21:50
Da kommt die Fehlermeldung
"undeclared identifier 'self'"
Die Muhkuh - Mo 29.09.08 21:56
Das war jetzt auch nur total ins Blinde geraten.
Wie schaut denn die Prozedur bzw. der Prozedurenkopf aus?
DaVinciFF7 - Mo 29.09.08 21:58
Die Prozedur eingabebtnclick sieht so aus:
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TForm1.EingabeBtnClick(Sender: TObject); begin if Eingabe.text<>'' then Baum.einfuegen(Baum, Eingabe.text); Eingabe.clear; ActiveControl:=Eingabe; end; |
ich hab auch schon probiert, (sender: TObject); dahinter zu setzen, aber dann sagt er "undeclared identifier 'sender'"
Moderiert von
Tino: Delphi-Tags hinzugefügt
Die Muhkuh - Mo 29.09.08 22:00
Entweder Du machst nun Deine Prozedur zerstueckeln zu einer Methode der Form oder Du rufst EingabeBtnClick(nil); auf.
DaVinciFF7 - Mo 29.09.08 22:03
Was genau meinst du? oO
Wie soll ich denn die Prozedur zu einer Methode machen?
Delete - Mo 29.09.08 22:08
Delphi-Quelltext
1: 2: 3: 4:
| procedure Blubb; begin ShowMessage('Hallo Welt'); end; |
So ist das eine Prozedur.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type TFormBla = class(TForm) private procedure Blubb; ... end; ... procedure TFormBla.Blubb; begin ShowMessage('Hallo Welt'); end; |
So ist das eine Methode von TFormBla.
Die Muhkuh - Mo 29.09.08 22:09
Du machst aus dem:
Delphi-Quelltext
1:
| procedure zerstueckeln; |
das hier:
Delphi-Quelltext
1:
| procedure TForm1.zerstueckeln; |
Und der Rest hat ja Detlef (ab ins Bett!) geschrieben :P
Delete - Mo 29.09.08 22:10
*Hehe* :mrgreen:
DaVinciFF7 - Mo 29.09.08 22:13
Nja da hat sich immernoch nichts geändert ^^
Die Muhkuh - Mo 29.09.08 22:14
Zeig am besten mal Deinen gesamten Code. Wenn Du es richtig umgesetzt hast, sollte es funktionieren.
Delphi-Tags nicht vergessen.
DaVinciFF7 - Mo 29.09.08 22:17
OK Ich habs geschafft^^ ich hätte nur die prozedur zerstueckeln festlegen und ein "(Sender: TObject)" dahintersetzen müssen ^^ geht jetzt soweit...
Jetzt hab ich zwar immer einen stackoverflow, weil er scheinbar meine if-schleife ignoriert, aber egal xD
wie mach ich das denn mit den delphi tags?
Die Muhkuh - Mo 29.09.08 22:19
Es gibt keine If-Schleife!!! :zwinker:
Die Tags
[delphi]procedure Blubb;
begin
end;[/delphi]
Einfach ein [delphi][/delphi] um Deinen Code drum rum.
DaVinciFF7 - Mo 29.09.08 22:22
xDXD ok ja ich habs nicht so mit begrifflichkeiten, außerdem steht auf nem flipchart in unserem computerraum ganz groß "Die If-Schleife in Delphi"
^^
ja das mit dem Stack Overflow isn bisschen blöd...ich schreib mal kurz die prozeduren, die damit zusammenhängen rein:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TForm1.EingabeBtnClick(Sender: TObject); begin if Eingabe.text<>'' then Baum.einfuegen(Baum, Eingabe.text); Eingabe.clear; ActiveControl:=Eingabe; end;
procedure TForm1.zerstueckeln(Sender: TObject); var i:integer; begin if i+2<length(form1.memo1.Text) then form1.eingabe.text:=copy(form1.Memo1.text,i,i+2); i:=i+1; EingabeBtnClick(sender); zerstueckeln(sender) end;
procedure TForm1.Button1Click(Sender: TObject); begin if memo1.text<>'' then zerstueckeln(sender); end; |
Die Muhkuh - Mo 29.09.08 22:26
Das Problem liegt an zerstückeln, das ins unendliche laufen wird.
Du deklarierst eine lokale Variable "i" und greifst direkt danach drauf zu, ohne sie zu initialisieren (der Compiler sollte das sowieso melden). Das kann nicht funktionieren.
Entweder Du initialisiert die Variable mit *etwas und darfst sie aber nicht lokal deklarieren oder Du machst aus dem ganzen eine For-Schleife (oder auch While-Schleife) und zerstückelst damit. Letzteren Weg würde ich bevorzugen.
DaVinciFF7 - Mo 29.09.08 22:28
Dann sieht das so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.zerstueckeln(Sender: TObject); var i:integer; begin while i+2<length(form1.memo1.Text) do form1.eingabe.text:=copy(form1.Memo1.text,i,i+2); i:=i+1; EingabeBtnClick(sender); zerstueckeln(sender); end; |
Hab aber immernoch nen Stackoverflow
EDIT:
Ich glaub, der Fehler ist, dass i ja nicht festgelegt wird am anfang...wenn ich das aber rekursiv mache, kann ich ja nicht sagen
und dann den anderen kram, weil er die dann ja immer wieder auf 1 macht....
Die Muhkuh - Mo 29.09.08 22:32
Ich wiederhole mich nur ungerne :zwinker:
Die Muhkuh hat folgendes geschrieben: |
Du deklarierst eine lokale Variable "i" und greifst direkt danach drauf zu, ohne sie zu initialisieren (der Compiler sollte das sowieso melden). Das kann nicht funktionieren.
|
Ich würde Dir noch empfehlen, das eine oder andere Grundlagentutorial zu lesen, bevor Du "wie wild" drauf los legst :zwinker:
Da Du übrigens eine Methode draus gemacht hast, kannst Du innerhalb der Methode auf das "form1." verzichten.
DaVinciFF7 - Mo 29.09.08 22:34
Die Muhkuh hat folgendes geschrieben: |
Ich wiederhole mich nur ungerne :zwinker:
Die Muhkuh hat folgendes geschrieben: | Du deklarierst eine lokale Variable "i" und greifst direkt danach drauf zu, ohne sie zu initialisieren (der Compiler sollte das sowieso melden). Das kann nicht funktionieren.
|
Ich würde Dir noch empfehlen, das eine oder andere Grundlagentutorial zu lesen, bevor Du "wie wild" drauf los legst :zwinker:
Da Du übrigens eine Methode draus gemacht hast, kannst Du innerhalb der Methode auf das "form1." verzichten. |
xD
Ja das mit dem Grundlagentutorial ist so ne sache^^
Ich leg ja nicht wie wild drauf los, prinzipiell hab ich ja einigermaßen Ahnung und das ist ja ne Hausaufgabe für den ganzen Kurs.
Ich müsste ja i einfach nur am Anfang auf 1 setzen, aber das ist ja dann blöd mit der Rekursion in der Prozedur.
Vorschläge?^^
EDIT:
Und nein ich kann nicht drauf verzichten^^ wenn ich das tue, kommt immer die Fehlermeldung "undeclared identifier"
EDIT2:
oh kann ich doch xD
nagel - Mo 29.09.08 22:35
DaVinciFF7 hat folgendes geschrieben: |
| xDXD ok ja ich habs nicht so mit begrifflichkeiten, außerdem steht auf nem flipchart in unserem computerraum ganz groß "Die If-Schleife in Delphi" |
Durchstreichen. Sofort. ;)
DaVinciFF7 - Mo 29.09.08 22:42
Habs jetzt mal nicht-rekursiv probiert, dann läuft das programm aber einfach und hört auch nciht mehr auf. sieht so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.zerstueckeln(Sender: TObject); var i:integer; begin i:=1; while i+2<length(memo1.Text) do eingabe.text:=copy(Memo1.text,i,i+2); i:=i+1; EingabeBtnClick(sender); end; |
LexXis - Mo 29.09.08 23:23
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.zerstueckeln(Sender: TObject); var i:integer; begin i:=1; while i+2<length(memo1.Text) do begin eingabe.text:=copy(Memo1.text,i,i+2); i:=i+1; EingabeBtnClick(sender); end; end; |
;)
DaVinciFF7 - Di 30.09.08 09:59
Ok dankeschön, es geht jetzt :)
problem solved würd ich sagen :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!