TRichEdit - String gefunden an die Positon + 10 Zeilen weiter gehen
-
hmm
also auf deinen code komme ich net klar.
also was ich habe :if(MehrfachAuswahl == 0) //wir haben nur ein objekt und brauchen nix mit dateinamen suchen^^ { AnsiString ErrorString; ErrorString = ErrorLB->Items->Strings[ErrorLB->ItemIndex]; TStringList *RichEditText; RichEditText = new TStringList; try { RichEditText->LoadFromFile(DateiNameLabel->Caption.c_str()); } catch(...) { ShowMessage("Fehler Beim Laden der Datei"); return; } for(int i=0 ; i<RichEditText->Count ; i++) { if(RichEditText->Strings[i] == ErrorString) { int FoundAt = Ausgabe->FindText(ErrorString, 0, Ausgabe->Text.Length(), TSearchTypes()<< stMatchCase); Ausgabe->SetFocus(); Ausgabe->SelStart = FoundAt; Ausgabe->SelLength = ErrorString.Length(); int zeile = Ausgabe->Perform(EM_LINEFROMCHAR,FoundAt,0); Ausgabe->Perform(EM_SCROLLCARET,0,0); delete RichEditText; return; } } ShowMessage("Nicht gefunden"); delete RichEditText; }ich kriege deinen leider auch nciht bei mir reingeformt
bin halt dern00b
-
so ich habe deins jetzt eingebaut bekommen.
2 sachen:
1. das brauch 10 sekunden. das ist nicht gut Oo
2. wenn ich mir einen fehler unten anzeigen lasse und dann wieder einen oben - dann geht das auch nichttrotzdem erstmal einen riesendank an dich

-
dern00b schrieb:
for(int i=0 ; i<RichEditText->Count ; i++) { if(RichEditText->Strings[i] == ErrorString) { ... delete RichEditText; return; } } ShowMessage("Nicht gefunden"); delete RichEditText;wieso so umständlich?
int iRow = RichEditText->IndexOf(ErrorString); if(iRow >= 0) { ... } else { ShowMessage("Nicht gefunden"); } delete RichEditText;mfg
BigNeal
-
hmmm
ich denke über deins noch nach....effektive programmierung. hm. damit habe ich mich noch nie ebschäftigt

-
10 Sekunden ???
Hat deine ErrorListe 10000 Einträge oder hast du noch einen 286er ?
Irgendwas ist da in deinem Code nicht korrekt.
Das Problem bei IndexOf: Es findet keine Teilstrings.Außerdem benötigst du die Zeile und nicht die Position im Text ...
-
ja bis zu 48.000 einträge

bei meinem ersten versuch, ging es schneller nur nicht mit den 10 zeilen
*ARGH*das sind logfiles die ich bearbeite... können bis zu 70.000 zeilen haben *OMG*
-
das paket an logfiles ist 96 MegaByte groß (!!!!)
purer text....
und das ist nur ein kunde. und die haben ein paar mehr
-
remark schrieb:
Das Problem bei IndexOf: Es findet keine Teilstrings.
will er das?
if(RichEditText->Strings[x] == ErrorString)remark schrieb:
Außerdem benötigst du die Zeile und nicht die Position im Text ...
und was gibt TStringList::IndexOfzurück?
mfg
BigNealedit: Strings[ i] (ohne Space will er nicht akzeptieren
)
-
remark schrieb:
... ErrorListe 10000 Einträge
ne es geht net um die errorliste. das sind so 2000 zeilen oder so
es geht ja um die ausgabe des ganzen logfiles. das sind bis 70000zeilen
-
BigNeal schrieb:
remark schrieb:
Das Problem bei IndexOf: Es findet keine Teilstrings.
will er das?
Wenn ich mir normale LogFiles anschaue dann braucht er das.
Ja, sorry TStringList::IndexOf liefert dir die Zeile.
-
dern00b schrieb:
ne es geht net um die errorliste. das sind so 2000 zeilen oder so
es geht ja um die ausgabe des ganzen logfiles. das sind bis 70000zeilenUnd wo genau ist da jetzt das Problem? Die Übergabe der Daten an das RichEdit, oder das Positionieren innerhalb des RE?
[Edit]
Wenn es um die Performance des Einfügens in das RichEdit geht: http://www.c-plusplus.net/forum/viewtopic-var-t-is-115295-and-postdays-is-0-and-postorder-is-asc-and-start-is-10.html
-
joey, ich wähle ien logfile aus.
dann wird mir unten in der listbox die fehlerwertung ausgegeben. errors - abstürze - etc.
oben in der richedit wird das file angezeigtwenn ich jetzt in der listbox (ErrorLB) einen fehler anklicke, möchte ich ihn oben in der richedit anzeigen. das heißt die richedit soll solange scrollen bis der fehler zu sehen ist. allerdings soll er in die mitte positioniert werden. so pi mal daumen +10 zeilen.
verstehst du mein problem?
-
Die Lösung ist doch schon gepostet worden?!?
Aber damit das ganze auch noch funktioniert, wenn sich die Größe des RichEdit ändert:
int zeile; int anzahl_sichtbarer_zeilen = RichEdit1->Height / Form1->Canvas->TextHeight(Edit1->Text); zeile = RichEdit1->Lines->IndexOf(Edit1->Text); Label1->Caption = AnsiString(zeile); RichEdit1->SelStart = RichEdit1->Perform(EM_LINEINDEX, 0, 0); RichEdit1->Perform(EM_SCROLLCARET, 0, 0); RichEdit1->SelStart = RichEdit1->Perform(EM_LINEINDEX, zeile + anzahl_sichtbarer_zeilen / 2, 0); RichEdit1->Perform(EM_SCROLLCARET, 0, 0); RichEdit1->SelStart = RichEdit1->Perform(EM_LINEINDEX, zeile, 0); RichEdit1->SelLength = RichEdit1->Lines->Strings[zeile].Length(); RichEdit1->Perform(EM_SCROLLCARET, 0, 0);Das ist nur grob hingepfuscht, funktioniert aber grundsätzlich und sollte als Anhaltspunkt genügen. Die Optimierungen überlasse ich Dir. Du solltest auch nicht den Canvas von Form1 nehmen, sondern einen eigenen erstellen und diesem die Texteigenschaften aus dem RichEdit zuweisen. So funktioniert das nur mit der Standardschriftart und garantiert nicht mehr, wenn Du die Schriftart oder -größe änderst.
-
joa da geht
ich versuche es noch zu verstehen aber eine riesendicken dank
leider gibt es keinen knutsch smiley :=
-
Joe_M. schrieb:
int anzahl_sichtbarer_zeilen = RichEdit1->Height / Form1->Canvas->TextHeight(Edit1->Text);
zeile = RichEdit1->Lines->IndexOf(Edit1->Text);sorry aber ich verstehe das nicht. Edit1 doesnt exist bei mir.
ich klicke ja doppelt in die listbox wo die fehler ausgegeben werden
-
Sorry. Das ist der Suchtext, der gefunden werden soll. Kannst auch eine belibiege Zeile aus dem RE nehmen. Es geht nur darum, die Größe einer Zeile in Pixel zu erhalten, um berechnen zu können, wie viele Zeilen in dem RE sichtbar sind.
-
ja und ich kriege es net hin eine aussem richedit zu nehmen
also das geth schon erstmal nur wenn ich die font veränder klappt es net mehr
-
Joe_M. schrieb:
Du solltest auch nicht den Canvas von Form1 nehmen, sondern einen eigenen erstellen und diesem die Texteigenschaften aus dem RichEdit zuweisen. So funktioniert das nur mit der Standardschriftart und garantiert nicht mehr, wenn Du die Schriftart oder -größe änderst.
Verwendest Du denn einen eigenen Canvas? Weist Du diesem die richtige Schriftart und Größe zu?
-
da weiß ich ehrlich geasgt nix mit anzufangen^^
ich habe halt meine richedit und kann via fontdialog auch den font verändern
-
Tja, dann schau mal in der Hilfe unter TCanvas nach.
Versuchs erst mal selbst. Wenn Du es nicht hinbekommst, kannst Du ja einen neuen Thread zu diesem Thema erstellen.