Richedit... Text formatiert abspeichern(schnellstmöglich)



  • Hey all.

    Ich Programmiere gerade an einem Texteditor Namens "myNote - Write in your style", der ein MINI-Word werden soll. Also die betonung liegt auf mini.

    Aber darum geht es -in diesem Thread- nicht.

    Hier soll es um das Speichern des formatierten Textes aus dem Richedit gehen.

    Ich habe einen Algorithmuss der immer 2 Buchstaben auf deren Formatierung vergleicht, das geht bei kurzen Texten gut, bei mehr als (WORD) 1 Seite dauert es schon 5 - 10 Sekunden bei (WORD) 6 Seiten dauert es schon rund 20 Sekunden.
    Wie kann das beschleunigt werden?
    Soll der Text, der im Richedit angezeigt wird, parallel noch im RAM gespeichert sein, so dass ich dann nur die verkettete Liste speichern muss?



  • Zeig code



  • Von der aktuellen Methode?

    void saveMnd( void )
    {
    	int 		i,
    				aktPos,
    				tmp						= 0;
    	bool 		isEnd					= false;
    	CHARRANGE 	myRange;
    	CHARFORMAT 	nextFormat				= { 0 },
    				actuallyFormat			= { 0 };
    	TEXTRANGE 	myTextRange;
    	char		buff[buffSize]			= { 0 },
    				formString[buffSize*22]	= { 0 };
    	FILE 		*myFile					= NULL;
    
    	myTextRange.lpstrText = buff;
    	myTextRange.chrg.cpMax = -1;
    	myTextRange.chrg.cpMin = 0;
    
    	if( NULL != ( myFile = fopen( "./myFile.mnd", "w+" ) ) )	//datei öffnen
    	{
    		i = aktPos = 0;
    		tmp = SendMessage( myPaper, EM_GETTEXTRANGE, 0, (LPARAM)&myTextRange );
    		myRange.cpMin = aktPos;
    		myRange.cpMax = aktPos+1;
    
    		tmp = GetWindowTextLength( myPaper );	//die anzahl der vorhandenen Buchstaben erhalten
    
    		while( aktPos < tmp )	//bis zum letzten Buchstaben alle kopieren
    		{
    			memset( buff, 0, sizeof(buff) );
    			isEnd = false;
    			i = 0;
    
    			while( aktPos < tmp && !isEnd && i < buffSize )
    			{
    				myRange.cpMin = aktPos;		//den zu selektierenden Bereich setzen
    				myRange.cpMax = aktPos+1;
    
    				actuallyFormat.cbSize = sizeof(CHARFORMAT);
    				nextFormat.cbSize = sizeof(CHARFORMAT);
    
    				SendMessage( myPaper, EM_EXSETSEL, 0, (LPARAM)&myRange );	//text selektieren
    				SendMessage( myPaper, EM_GETSELTEXT, 0, (LPARAM)(buff+i) );	//selektierten text auslesen
    				SendMessage( myPaper, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&actuallyFormat );//Charformat auslesen
    
    				aktPos++;
    
    				myRange.cpMin = aktPos;		//den zu selektierenden Bereich setzen
    				myRange.cpMax = aktPos+1;
    				SendMessage( myPaper, EM_EXSETSEL, 0, (LPARAM)&myRange );		//text selektieren
    				SendMessage( myPaper, EM_GETSELTEXT, 0, (LPARAM)(buff+i+1) );	//selektierten text auslesen
    				SendMessage( myPaper, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&nextFormat );	//Charformat auslesen
    
    				if( isEqualCharFormat( &actuallyFormat, &nextFormat ) ) //wenn beide Charformate gleich sind
    				{
    					if( 0 == buff[i] && 13 == buff[i+1] ) //RETURN ersetzen
    					{
    						buff[i] = 11;
    						buff[i+1] = 12;
    						i += 2;
    						aktPos += 2;
    					}
    					else if( 0 != buff[i] || 0 != buff[i+1] )
    						i++; //i inkrementieren damit dieser Buchstabe nicht mehr überschrieben wird
    				}
    				else
    					isEnd = true;
    			}
    
    			if( '\0' != buff[0] ) //wenn das array nicht leer ist
    			{
    				getFormatString( buff, formString, &actuallyFormat ); 	//Text formatieren
    				fprintf( myFile, "%s\n", formString );					//formatierten Text in Datei schreiben
    			}
    		}
    
    		fclose( myFile );
    	}
    }
    

    isEqualCharFormat:

    bool isEqualCharFormat( CHARFORMAT *form1, CHARFORMAT *form2 )
    //this function checks if the tho CHARFORMATs are equal
    {
    	bool sameBold 		= false,
    		 sameUnderline 	= false,
    		 sameItalic 	= false,
    		 sameColor 		= false;
    
    	sameBold = (form1->dwEffects & CFE_BOLD ) == (form2->dwEffects & CFE_BOLD);					//check if the both are BOLD or not BOLD
    	sameItalic = (form1->dwEffects & CFE_ITALIC) == (form2->dwEffects & CFE_ITALIC);			//check if the both are ITALIC or not ITALIC
    	sameUnderline = (form1->dwEffects & CFE_UNDERLINE) == (form2->dwEffects & CFE_UNDERLINE);	//check if the both are UNDERLINE or not UNDERLINE
    	sameColor = form1->crTextColor  == form2->crTextColor;										//check if the textcolor is the same
    
    	if( sameBold && sameItalic && sameUnderline && sameColor )	//if everything is the same
    		return true;
    
    	return false;
    }
    

    getFormatString

    void getFormatString( char *text, char *formatText, CHARFORMAT *theFormat )
    //This function translate the formated text into normal text, with format-informations
    {
    	bool isItalic		= false,
    		 isBold			= false,
    		 isUnderline	= false;
    
    	int R				= 0,
    		G				= 0,
    		B				= 0;
    
    	R = (int)GetRValue( theFormat->crTextColor );	//Get the red colorvalue of the color
    	G = (int)GetGValue( theFormat->crTextColor );	//Get the yellow colorvalue of the color
    	B = (int)GetBValue( theFormat->crTextColor );	//Get the blue colorvalue of the color
    
    	isItalic = !( !( theFormat->dwMask & CFM_ITALIC ) || !( theFormat->dwEffects & CFE_ITALIC ) );			//check if its italic
    
    	isBold = !( !( theFormat->dwMask & CFM_BOLD ) || !( theFormat->dwEffects & CFE_BOLD ) );				//check if its bold
    
    	isUnderline = !( !( theFormat->dwMask & CFM_UNDERLINE ) || !( theFormat->dwEffects & CFM_UNDERLINE ) );	//check if its underline
    
    	//set the format-informations in the text
    }
    

    Da dieser Code warscheinlich "worst-case" ist brauch ich wohl nciht sagen dass ich ihn selbst geschrieben habe xD

    MFG


Anmelden zum Antworten