RichEdit Zeile einfügen
-
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. ]
-
if (line_nr == 0) return;
Was soll das denn? Demnach würden Leerzeichen am Anfang der ersten Zeile ignoriert!?
Text1 __Text2 __Text3
Wenn jetzt der Cursor hinter Text2 gesetzt und Enter gedrückt wird entsteht vor Text3 eine zusätzliche, ungewollte Leerzeile (Unterstriche = Leerzeichen).
- Den Leerzeichen-String kannst du ja wohl gleich in der ersten Leerzeichen-Testschleife zusammenbauen.
-
-
Hab es doch begründet. Bezieh ich die 1.Textzeile mit ein, wird der Text hinter den Cursor gelöscht, anstatt in die entstandene Zeile übernommen zu werden. Hab keinen Plan, wie das zu vermeiden wäre.
-
Nachdem sogar der ich das soweit hinbekommen hat, trau ich jedem Spieler zu, daß er die Function für jedes beliebige Zeichen erweitern kann.
lzs = ""; initialisiert, da läßt sich für den Zeilenanfang jedes Zeichen einstellen. -
Danke @Jansen. Da es so geht und richtig ist, werte ich meinen Ansatz sogar als diletantisch.
for (lz; lz <= line_txt.Length(); lz++) if (line_txt[lz] != ' ') break; else lzs = lzs + " ";
der oben declarierte int i entfällt.
-
@Jansen, ich geb mich keinerlei Illusionen hin. Ohne dein Basisgerüst wär ich chancenlos gewesen oder hätte sehr lange dran gekaut. Ich dank dir sehr. Die Aufgabe war / ist teilweise immer noch herrlicher Lehrstoff zum Üben der Methoden von AnsiString. - Hat abgesehen vom anfänglichen Drüselkopf Spaß gemacht.
-
Mein Notepad hat nun eine weitere interessante Function - die später auch gut in eine rtf-Textverarbeitung paßt... falls ich sowas mal bau.
-
-
zu 1) Dass du das begründet hast ändert doch nichts an dem Umstand, dass die Lösung damit untauglich ist. Oder willst du dem Benutzer vorschreiben, wo er automatische Einrückungen erwarten darf und wo nicht? Da hilft also nur weiter "drüseln", im BCB-Editor funktioniert's ja auch.
zu 2) Ich verstehe nicht so recht, was deine Erklärung mit dem von mir gezeigten "Bug" zu tun hat. Und wenn es um universelle Lösung für beliebige Zeichen geht dann sollte das Ganze nach Möglichkeit auch ohne doppelten Code auskommen.
Du hast die FAQ in's Spiel gebracht, also sollte die Lösung auch einigermassen wasserdicht sein.
-
zu1) Ich begründe nur meine Unfähigkeit, @Jansen. 'n kleicher Tip aus der Runde, vielleicht auch mal 'ne Codezeile, ansonsten heißt es erst mal Suchen. Ich find keinen Anhaltspunkt.
zu2) Bei mir wirkt sich das nicht als Bug aus. Ich erhalte keine zusätzliche Leerzeile. Die Bedingungen sind nicht true, VK_RETURN wirkt ganz normal. Man müßte dann die Zeile manuell mit dem Unterstrich beginnen.
Hast Recht. Doppelter Code ist sowieso nie sinnvoll. Werd nachher gleich drangehen.
Über '_', '-' (vielleicht auch '+', '*', was käme noch infrage?)) hab ich mir mal Gedanken gemacht. Das entscheidende Kriterium dürfte sein, daß direkt davor ein '\n' zu sein hat, wenn das Zeichen eine Aufzählung einleiten soll. Bei vorangestellten ' ' oder '\t' wird man aber auch ein '\n' direkt davor sicher nicht prüfen brauchen.
-Oh ich armer ich.
Mußte grad dran denken, daß solche Textausrichtungen noch fehlen. Sonst hätte ich die FAQ gar nicht erwähnt. Für mich hier lokal mach ich da sowieso keinen Unterschied. Nur reifer Code ist akzeptabler Code. Was heute nicht gelingt, wird morgen wieder in Angriff genommen. Für die "Vitrine" kommen dann nur noch die Kommentare dazu.
Gebraucht wird also auf jeden Fall die Lösung für die erste Zeile.
-
Ole, ich wär dann soweit. '+', '-' und '_' werden nach '\t' oder ' ' oder am Zeilenanfang nach '\n' miterfasst. Wenn ich noch den '*' mit aufnehmen soll, werden die Bedingungsketten recht lang. Weiß nicht, ob sowas Nachteile haben kann.
Wer stiftet die Lösung für die 1. Zeile?
Text nach Cursor darf nicht abgeschnitten werden. Ich find keinen Hinweis, warum es das macht.
-
Ich komm mit deinem Code nicht klar. Weil er bei mir nicht die Eigenschaften zeigt die du hier berichtest. Er fügt 2 Zeilen ein nachdrücken der Enter Taste , wobei in der ersten Zeile kurzzeitig der Zeilenvorschub AMrkiert sichtbar ist. Ich kuck mir das morgen nochmal genauer an aber zurzeit hinke ich irgendwie hinterher?