RichEdit Zeile einfügen
-
wie kann ich in einer RichEdit nicht am Ende sondern mittendrin einfügen?
thx mosta
-
Was könnte "Einfügen" wohl auf Englisch heissen?
-
insert
-
das Funktioniert nicht und ich will endlich den Zeilevorschub reinkriegen. Ich
hab es nur so hingekriegt das er den Vorschub in die letzte Zeile einfügt.void __fastcall TfrmMainStatic::RichEdit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { int icount = PageControl1->ActivePage->TabIndex; if(Key==VK_RETURN) { AnsiString temp=""; int pos = EingabeFeld[icount]->CaretPos.y;//herausfinden der Zeile int zae = EingabeFeld[icount]->Lines->Strings[pos].LastDelimiter(" "); /* suchen nach letztem Leerzeichen (muss überarbeited werden denn wenn Leerzeichen indem Text Teil/Code enthalten ist fängt er dort an)*/ for(int x=0;x<zae;x++) { temp=temp+" "; } EingabeFeld[icount]->Text.Insert(temp,pos); //er fügt nichts ein }
[ Dieser Beitrag wurde am 17.05.2003 um 18:43 Uhr von mosta editiert. ]
-
Vielleicht erklärst du uns erst nochmal was du eigentlich genau machen willst.
-
also ich will einen ZEilenvorschub in meinen Editor einbringen ungefähr so:
for(...) { <-Leerzeichen->cout <<"Hallo"; <-Leerzeichen->|//nach drücken der Entertaste soll hier weiter geschreiben werden }
[ Dieser Beitrag wurde am 17.05.2003 um 19:07 Uhr von mosta editiert. ]
-
Das ist doch kein Zeilenvorschub sondern Einrücken. Keineswegs perfekt, aber ein Anfang (OnKeyDown):
if (Key == VK_RETURN) { int line_nr = RE->CaretPos.y; String line_txt = RE->Lines->Strings[line_nr-1]; int lz = 1; for (lz; lz <= line_txt.Length(); lz++) if (line_txt[lz] != ' ') break; if (lz > 1) { RE->Lines->Strings[line_nr] = line_txt.SubString(1, lz-1) + RE->Lines->Strings[line_nr]; RE->SelStart -= RE->Lines->Strings[line_nr].Length() - (lz - 1); } }
-
Immer der Ärger mit der letzten Zeile:
if (Key == VK_RETURN) { int line_nr = RE->CaretPos.y, lz = 1; String line_txt = RE->Lines->Strings[line_nr], lzs = ""; for (lz; lz <= line_txt.Length(); lz++) if (line_txt[lz] != ' ') break; if (lz > 1) { for (int i=0;i<lz-1;i++) lzs = lzs + " "; // Nutzlos, Zeile muß ersetzt werden RE->Lines->Text.Insert(lzs,RE->SelStart); } }
Die Knobelkur hat Spaß gemacht. Aber jetzt muß ich doch mit dem Hut rumgehen.
-
bei beiden Varianten macht er garnichts. Er erzeugt keine neue Zeile. Der Vorschub Funktioniert nur er erstellt keine Zeile
[ Dieser Beitrag wurde am 18.05.2003 um 15:43 Uhr von mosta editiert. ]
-
Wenn die Zeile, in der du enterst, mit Leerzeichen beginnt, wird eine Neue Zeile gebildet, und tzs enthält die entsprechenden Leerzeichen. Ruf mal statt der letzten Zeile lzs in einer Mesage ab. Das muß nur insertet werden, dann sollte es stimmen. Also nur die wirksame Abschlußzeile, wie ich geschrieben hab, das war's dann.
-
Original erstellt von <Omega-X>:
[QB]... RE->Lines->Text.Insert(lzs,RE->SelStart); } }
QB]
lzs wird doch schon "Inserted" oder?
-
@mosta, ich weiß es, aber die App weiß es nicht. Sie kennt den String, führt aber nur den Zeilenvorschub aus. Es muß also eine Codezeile gefunden werden, die wirksam ist. Oder funktioniert es bei dir?
Mit @Jansens Code hatte ich es mal beinahe geschafft. Die Leerzeichen wurden gesetzt. Dafür wurde aber wahlweise die Zeile darüber oder die darunter leergelöscht. Also die Zeile blieb, aber kein Inhalt mehr. Diese Unart konnte ich nicht wegbekommen, also suchte ich nach einem anderen Weg.
-
also weist du es auch nicht
-
Was weiß ich nicht? Genau das, was ich dir gesagt hab, weiß ich sehr wohl. Weitergehendes weiß ich sehr wohl nicht.
Aber du knobelst selbst gar nicht mit!
Die Fragen, die du hier stellst, sagen, daß du dich auf die Antworter verläßt. Du siehst, dein erwatetes Wunschergebnis kommt nicht, und fertig.
Wohlan, mit Zeichen statt der Leerzeichen sieht die Geschichte wieder anders aus. Also bau ich die erst mal ein, dann will ich sie gegen die Leerzeichen ersetzen. Beide Altionen laufen allerdings in verschiedenen zeilen.
Jetz kann mal jemand anderes knobeln, bis mir der Kopf nicht mehr drüselt.
-
Ich wollte nur die Fronten klären. Nimm doch nicht alles so persönlich
-
RE->Lines->Text.Insert(lzs,RE->SelStart);
wieso funktioniert das nicht. Es soll doch nur an der Cursor Stelle denn Text einfügen.
-
Aus der Borland Hilfe:
AnsiString& __fastcall Insert(const AnsiString& str, int index);
Was glaubst du wird da zurückgegeben?
-junix
-
Ach was @most, ich nehm's doch gar nicht persönlich
. Hatte nur irgendwie gedacht, von dir kommen auch mal ein paar Überlegungen. Deine Worte klingen so, als wartest du nur. Aber ich glaub, du siehst gar nicht, was passiert. Die Aufgabe kann so gar nicht gelingen... wegen dem VK_RETURN!
Ole, Problem erkannt = Problem gebann.
Damit es perfekt wird, brauch ich den
SubString(RE->SelStar,[ZeilenEnde][bis zum nächsten \n]).Aber möglichst ohne Schleifenarbeit. Ist das realisierbar? Hab keinen Weg gefunden. Wo sind die String->Koryphäen?
-
Denkfehler.
SubString(RE->SelStar,ZeilenEnde) wird gebraucht.
-
War doch nicht so schlimm mit der Schleife, als ich erst gedacht hatte. Aber fertig ist es noch nicht. In der 1. Zeile würde Text zerstört. Hab keinen Plan, also hier normales entern.
@Junix, Insert kann nur mit Zeichen gehen, Leerzeichen werden durch das VK_RETURN gelöscht (frag mich nicht warum, sag mir's lieber
).
Roger, \n wird gezielt eingesetzt, VK_RETURN wird am Schluß gelöscht.
Daher Einschränkung: Function nur im OnKeyPress möglich.
Keine Leerzeichen am Zeilenanfang sondern Tab's? NULL Problemo.
Cursor nicht am Zeilenende sondern irgendwo in der Zeile? Wird berücksichtigt.
Bleiben noch Wünsche offen? a.) 1.Textzeile, b.) Function muß ein- und ausschaltbar gemacht werden oder VK_BACK bemühen. c.) FAQ? Sicher nicht. Sowas schreibt man in 5 min :p d.) ?
Code? Wenn's unbedingt sein muß...:
void __fastcall TChild::REKeyPress(TObject *Sender, char &Key) { if (Key == VK_RETURN) { int line_nr = RE->CaretPos.y, lz = 1, start, i; String line_RE = RE->Lines->Strings[line_nr], lzs = ""; // Function würde Text löschen if (line_nr == 0) return; // Leerzeichen am Zeilenanfang else if (line_nr > 0 && RE->Lines->Strings[line_nr].SubString(0,1) == ' ') { // wieviele Leerzeichen? for (lz; lz <= line_RE.Length(); lz++) if (line_RE[lz] != ' ') break; // wenn Leerzeichen am Anfang if (lz > 1) { // LeerzeichenString für die EnterZeile zusammenbauen for (i=0;i<lz-1;i++) lzs = lzs + " "; // aktuelle ZeilenNr erfassen line_nr = RE->CaretPos.y; // CursorPosition erfassen start = RE->SelStart; // Cursor ans Zeilenende jagen und wieder auf start zurücksetzen int check = RE->CaretPos.y; while (RE->CaretPos.y < check) RE->SelStart++; // OperationsEndpunkt erfassen int end = RE->SelStart; RE->SelStart = start; // String für die EnterZeile zusammensetzen RE->Lines->Strings[line_nr] = RE->Lines->Strings[line_nr].SubString(0,RE->CaretPos.x)+ "\n"+lzs+RE->Lines->Strings[line_nr].SubString(RE->CaretPos.x+1, end-RE->CaretPos.x); // Cursor in der EnterZeile hinter die Leerzeichen plazieren RE->SelStart = start + lz; // oben haben wir \n befohlen, VK_RETORN auf 0 setzen Key = 0; } } // dto. für TABstobs am Zeilenanfang else if (line_nr > 0 && RE->Lines->Strings[line_nr].SubString(0,1) == '\t') { for (lz; lz <= line_RE.Length(); lz++) if (line_RE[lz] != '\t') break; if (lz > 1) { for (i=0;i<lz-1;i++) lzs = lzs + "\t"; line_nr = RE->CaretPos.y; start = RE->SelStart; int check = RE->CaretPos.y; while (RE->CaretPos.y < check) RE->SelStart++; int end = RE->SelStart; RE->SelStart = start; RE->Lines->Strings[line_nr] = RE->Lines->Strings[line_nr].SubString(0,RE->CaretPos.x)+ "\n"+lzs+RE->Lines->Strings[line_nr].SubString(RE->CaretPos.x+1, end-RE->CaretPos.x); RE->SelStart = start + lz; Key = 0; } } } }
Ob das ganze auch kürzer geht?
[ Dieser Beitrag wurde am 19.05.2003 um 10:23 Uhr von Jansen editiert. ]