Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » ungepufferte texteingabe (editor)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
06.10.2009, 18:37 Uhr
~thacoga
Gast


hallo leute ich arbeite mit MS visual studio und bin grade an einen selbsterstellten texteditor
1.Die eingabe soll zeichenweise erfolgen mit getch();
2.man muss in der lage sein mit den pfeiltasten rechts,links im text zu laufen.
3.die POS1 taste soll dich an die erste stelle im text bringen
4.die ENDE taste soll dich an die letze stelle im text bringen
5.Die INSERT taste soll funktionsfähig sein also wenn ich mitten im text die insert taste drücke soll ich den text überschreiben o.ä.^^
6.und backspace natürlich soll auch funktionieren.
7.das was ein normaler texteditor so kann halt:P
soweit sogut hab ich es geschaft die pfeiltasten und das backspace zu programmieren, jetz weis ich aber nicht wie ich es schaffe insert oder ENDE u. POS1 hinzukriegen
ich bitte um schnelle hilfe da ich morgen das projekt fertig haben soll (in einer fertigen form abliefern soll^^)
hier is mein programm:


C++:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include "conscreen.h"
#pragma warning(disable:4996)
void eingabe(char t[], int len);

#define MAX 1000

void main()
{
    char text[MAX];
    eingabe(text,MAX);
    printf("\n\n%s\n\n",text);

}




void eingabe(char t[], int len)
{
    int i=0;
    int c;
    int x,y;
    int links=0,rechts=0;
    int pos1;
    int ende;

    GetXY(&x,&y);
    
    while((c=getch())!='\r')
    {
        if(c==8 && i<len)
        {
                //t[i]=c;
                putch('\b');
                putch(32);
                putch('\b');
                --i; --x;
        }
        else if(c==224)         // STEUERZEICHEN
        {
            c=getch();
        if(c==75 && i>0 && i<=len)    // LINKS-TASTE
        {
            --x;--links;--i;
            SetXY(x,y);
        }
        else if(c==77 && i<t[i])   // RECHTS-TASTE
        {
            ++x;++i;++rechts;
            SetXY(x,y);
        }
        else if(c==82)   // EINFG-TASTE
        {
        }
        else if(c==83)  // ENTF-TASTE
        {
        }
        else if(c==71 && i<len) // POS1-TASTE
        {
            pos1=0;
            --pos1;--x;
            SetXY(pos1+x,y);
        }
        else if(c==79) // ENDE-TASTE
        {
            ende=i;
            SetXY(ende,y);
        }
        }
        else if(i<len)
        {
            t[i]=c;
            ++i;++x;
            putch(c);
            t[i]=0;
        }

    }
    }



falls ihr es testen wollt und das ganze nicht nachvollziehen könnt die funktionen auch braucht setxy,getxy schreibt mir eine email
Sorrow_sof2@hotmail.com
danke thacoga.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.10.2009, 02:30 Uhr
Hans
Library Walker
(Operator)


Hi,

damit hättest Du Dich ein paar Tage eher melden sollen, dann hätte man Dir noch helfen können, die Übung erfolgreich abzuschliessen.

Das Problem mit den Tasten ist, dass man eine Möglichkeit braucht, wie man die Position des Cursors bzw. der Schreibmarke mit dem Text im Speicher "synchronisiert", d.h. wie man sich merkt, welche Cursorposition am Bildschirm welcher Stelle im Speicher entspricht.

Eine Möglichkeit wäre, sich den Ausgabebereich wie eine zweidimensionale Matrix vorzustellen, was Du ja anscheinend auch tust. Dann wäre die x-Koordinate jeweils die Spalte, in der ein Zeichen ausgegeben wird, und die y-Koordinate die jeweilige Zeile. Betrachten wir dazu mal folgende Darstellung:

Code:
0        1         2         3         4
1234567890123456789012345678901234567890
***********************************.....   1
*************************************...   2
*********************************.......   3
**********************************......   4
*************************************...   5
***********************************.....   6
**************************************..   7
*********...............................   8
**********************Q********.........   9
**********************************......  10
**************************************..  11
**************************..............  12

Ein möglicher Bildschirminhalt.
* = Textzeichen
. = Leerzeichen
Q = Cursorposition



Das wäre jetzt mal ein "Bildschirm" mit 12 Zeilen à 40 Zeichen. Wenn man jetzt davon ausgeht, das die Zeilen alle hintereinander im Speicher liegen, ergibt sich, dass der Speicherbereich 12 mal 40, also 480 Zeichen gross sein sollte, um den dargestellten Inhalt aufnehmen zu können. Der Cursor befindet sich an der Stelle, die mit "Q" gekennzeichnet ist. Dort soll das nächste Zeichen eingesetzt werden. Wie kommt man an diese Position im Speicher? - Der Cursor steht in der 23. Spalte der 9. Zeile. Man rechnet also 8 mal 40 plus 22 = 342. Warum jetzt 8 mal 40 und nicht 9 mal 40? - Weil der Cursor in der 9. Zeile steht; davor sind 8 ganze Zeilen von je 40 Zeichen. Von der 9. Zeile brauchen wir aber nur die Zeichen, die vor der Cursorposition stehen. Das sind 22. Da diese Zeichen nicht angerührt werden sollen, sondern erst dahinter etwas verändert werden soll, ist zu dem Ergebniss noch eins hinzu zu zählen, also 342+1=343. D.h. an der 343. Position im Speicher ist das nächste Zeichen zu schreiben.
Wenn dort noch nichts steht, kann man es einfach dahin schreiben. Wenn aber, wie in dem Beispiel, schon etwas da steht, und das nicht überschrieben werden soll, dann ist es sinnvoll, den nachfolgenden Inhalt um ein Zeichen weiter nach hinten zu verschieben, bevor man das Zeichen dort einfügt.


Mit der Taste "Pos1" würde die x-Koordinate jeweils auf den Zeilenanfang, d.h. 0 oder 1 gesetzt, je nach dem, wie man die Zählung beginnt. Im obigen Beispiel wäre es Eins.

Mit der Taste "Ende" würde in der aktuellen Zeile nach dem letzten Zeichen vor einem Zeilenumbruch gesucht, der Cursor dort hin gesetzt, und die x-Koordinate an diesen Wert angepasst, sofern das nicht schon beim Suchen passiert ist. (Auf Zeilenumbrüche hab ich in dem Bild oben verzichtet, weil man die dafür zuständigen Zeichen am Bildschirm ja auch nicht sieht, sondern nur ihre Wirkung.)

Und "insert" ist schwierig, weil Textteile zu verschieben sind. Dazu die folgenden Überlegungen: man braucht zuerst einmal die Position, an der etwas eingefügt werden soll. Dann ist die Frage, wieviel eingefügt werden soll. Nur ein Zeichen oder mehrere? Dem entsprechend kann man ab der Stelle, wo eingefügt werden soll, den ganzen nachfolgenden Speicherinhalt um ein Zeichen weiter nach hinten verschieben, und dann an der frei gewordenen Stelle ein weiteres einfügen.
Eine andere Möglichkeit wäre, den Text erst mal in einen Puffer zu schreiben, und wenn die "Insert"-Funktion abgeschaltet wird, den Pufferinhalt dahin zu kopieren, wo er hin soll. Dazu braucht man "nur" feststellen, wie viel im Puffer drin ist, den gesamten Speicherbereich der sich hinter der Einfügeposition befindet einmal um die Menge der gepufferten Zeichen nach hinten verschieben, und anschliessend den Pufferinhalt dahin zu kopieren, wo er hin soll.


Wenn der Text jetzt länger wird, als der "Bildschirm" gross ist, was in meinem Beispiel ja der Fall ist, denn dieser "Bildschirm" kann nur 480 Zeichen darstellen, während Dein Programm Platz für 1000 Zeichen bietet, bekommt man weitere Probleme. Dann ist nämlich die Frage zu klären, welcher Teil des im Speicher befindlichen Textes überhaupt angezeigt werden soll? - Wenn der Bereich bekannt ist, kann man damit anfangen, den Text ab dieser Position auf den Bildschirm auszugeben.
Die Frage nach "Word-wrapping", also dass man Wörter nicht irgendwo mitten drin trennt, sondern einen Zeilenumbruch setzt, wenn klar ist, dass das nächste Wort nicht mehr ganz in die Zeile passt, (was dann vorher zu prüfen wäre) lassen wir jetzt mal weg. Ich glaube, damit bin ich bin schon ein paar Schritte zu weit...

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 07.10.2009 um 02:40 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: