Memo/RichEdit Start/Endzeile der Markierung



  • Wie lässt sich die Start und Endzeile markierten Textes auslesen ?

    Bisher habe ich so auf das RicheEdit-Objekt zugegriffen.
    RichEdit1->Lines->Strings[248].SubString(42,1)

    Oder Zeilenübergreifend:
    RichEdit3->Text.SubString(RichEdit3->SelStart+1,RichEdit3->SelLength)
    So genügen die Informationen der Eigenschaft SelStart und SelStart.

    Das hat allerdings den Nachteil,
    daß die Selektion bei Änderung eines einzelnen Zeichens
    schon nicht mehr stimmt.



  • Hallo

    Mit den Eigenschaften TRichEdit::SelLength und TRichEdit::SelStart kannst du generell die Auswahl auslesen. Welche Zeilen das sind must du allerdings manuell bestimmen.

    bis bald
    akari



  • Wie währe das am elegantesten ?
    Zeilenumbrüche suchen und zählen ?



  • Zeilenumbrüche suchen eher nicht; TStringList::Count liefert das gleiche Ergebnis.
    Aber sonst, wie Du schon geschrieben hast, zählen mit TStringList::Count und TStringList::Lines::Length



  • Wie sieht das in Anweisungsform aus ?



  • Hi,

    Wenn du keine hohen Ansprüche stellst, kannst du die Win-API aussen vorlassen.
    Greife auf die Mausereignisse zurück.

    in den Header :

    private:
       int bY, eY;
    

    in cpp:

    void __fastcall TForm1::RichEdit1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
       bY  =  RichEdit1->CaretPos.y + 1;
    }
    
    void __fastcall TForm1::RichEdit1MouseUp(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
       eY  =  RichEdit1->CaretPos.y + 1;  
    }
    

    mfg
    Peter



  • wie ist dann die zeile ermittelbar (x ?) ?

    RichEdit1->CaretPos.x hmm gut



  • Hi,

    CaretPos.y ist die Zeile.
    Bei MouseDown hast du die Startzeile als bY, dann markierst du Text und lässt
    die Mousetaste los. Ergo MouseUp und Endzeile als eY.

    mfg
    Peter



  • achso danke für die Info dann war es zufall das es so klappt da ich vorher ja den Text Makiere. 🙂



  • Hallo, hatte vor kurzem ein ähnliches Problem.

    Habs dann so gelöst. Funktioniert super.

    int GetLineNum( int *Start, int *End, int ScopeGlobal) {
    
    	int SelStart, SelEnd, Start_X, Start_Y, End_X, End_Y;
    
    	if (ScopeGlobal == 0){
    		*Start = 0;
    		*End = Form1->RichEdit1->Lines->Count;
    	}
    	else{
    		// Selected Text Start / End
    		SelStart = Form1->RichEdit1->SelStart;
    		SelEnd = SelStart + Form1->RichEdit1->SelLength;
    
    		Form1->RichEdit1->SelStart = SelStart;
    		Start_X =	Form1->RichEdit1->CaretPos.x;
    		Start_Y =	Form1->RichEdit1->CaretPos.y;
    
    		Form1->RichEdit1->SelStart = SelEnd;
    		End_X =	Form1->RichEdit1->CaretPos.x;
    		End_Y =	Form1->RichEdit1->CaretPos.y;
    
    		if ((Start_X==End_X) && (Start_Y==End_Y)){
    			*Start = *End = 0;
    			return 1;
    		}
    		else{
    			*Start = Start_Y;
    			*End = End_Y;
    		}
    	}
    
    	return 0;
    }
    

    /Edit akari : cpp-Tags hinzugefügt.



  • Hallo

    Bitte beim nächsten Mal für Code die cpp-Tags benutzen. sfds

    bis bald
    akari


Anmelden zum Antworten