pluto hat geschrieben:die Idee ist nicht schlecht... so wie ich die verstehe müsste ich "nur" die Paint Methode überladen bzw. eine komponente von TMemo ableiteten und dann die Paint procedure überladen.
Das vergiss mal lieber. Mit TMemo überpainten wirst du nicht glücklich, schon gar nicht cross-platform.
Wenn schon, dann auf Synedit aufbauen. Das ist wenigstens ein CustomControl und da kommst du an alle Infos ran.
Bei den Steuercodes muß man übrigens auch mit % abschließen, das sind dann also Macros der Form:
__bold = '%B%';
usw.. Das Leadout-Zeichen % sorgt dafür, das man einen Scanner benutzen kann, sonst würde man den Start der eigentlichen Zeichenkette nicht finden.
In diesem Fall sollte man ruhig mit doppeltem underscore arbeiten um die Macros eindeutig abzugrenzen. Du brauchst aber mit tödlicher Sicherheit einen Kellerautomaten um das richtig zu steuern. Der müßte wohl LIFO aufgebaut sein (last in first out), bei geschachtelten Anweisungen muß der schließlich richtig mitzählen können. Man löscht also immer bei autreten von %B% das zuletzt gespeicherte %B%, gibt es kein %B% im LIFO ist das eine neue Einleitung und wird auf den LIFO gepackt.
Die Tool-Bar muß dann alle Methoden enthalten um innerhalb des Strings die Steuercodes einzubauen. Die Paint-Methode muß den gesamten Text parsen und die LIFO-Struktur besitzen um den Text auf dem Canvas entsprechend zu formatieren. Das wird also nicht ganz einfach, das entsprechend zu bauen. Zusätzlich muß die Paint-Methode über die Möglichkeit verfügen, eine Art Fenster über den Text zu legen. Dadurch vermeidet man zuviel parsen zu müssen. Das Fenster sollte vorrausschauend arbeiten, also immer so groß sein, das mindestens 3 Seiten in der Größe des Canvas gehalten werden. Damit kann man eine Seite vor oder zurückscrollen. Beim Scrollen müssen dann die entsprechenden Mengen Text aus dem Stream gelesen werden.
Alles in Allem sollte das aber in wenigen Tagen realisierbar sein, zumindest im Grundaufbau. Dann muß man halt die zusätzlichen Codes und mime-magics einbauen um verschiedene Formate verarbeiten zu können.
Das ist übrigens kein Ansatz, das wurde für die Druckersteuerung immer so gemacht. Auf diese Weise kann man dem Drucker eine komplette Seite schicken und der setzte das dann entsprechend um. Dein "Drucker" wäre eben jetzt einfach die Paint-Methode von TMyEditor.
Zusätzlich brauchst du für den Stream noch die Möglichkeit Text einzufügen oder zu löschen, also 2 Methoden der Form:
function InsertIntoStream(Strm: TStream; SPos: Int64; In: string; SiteLen: integer): string;
function ExtractFromStream(Strm: TStream; SPos: Int64; Out: string; SiteLen: integer): string;
Die liefern als Ergebnis gleich wieder den String in der Länge zurück, wie er für die Darstellung gebraucht wird.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.
Deine Idee hat was nur kann ich mir es im Moment noch nicht so richtig vorstellen wie ich das schreiben muss. daher mache ich das jetzt mal anders mal sehen was dabei rauß kommt !
Währe nett wenn du ein kleines beispiel schreiben könntest muss ja nichts großes oder aufwendiges sein !
Ich habe ein anders Konzept... ich Denke das makieren ist mir jetzt klar geworden ich möchte beim makieren so vorgehen:
beim klicken wird die Zeile und das angeklickte Zeichen ermitteln. Beim OnMouveMove wird jetzt einfach immer nur wieder ein Zeichen ermittelt was unter dem Mauszeiger ist !
Sind die y werte beide TPoint Variabeln gleich. dann wird nur eine Zeile makiert* unterscheiden sie sich aber wird solange makiert bis die richtige Zeile und die richtige x Position gefunden wurden sind !
So komme ich schon mal an den gewünschten Text ran... Problem ist jetzt nur noch sichtbare makieren also der der makierte teil blau hinterlegt ist... dazu dachte ich mir folgendes:
Beim Hinzufügen einer Zeile zu der TSTringlist wird ein Array um 1 erhöht in diesem Array kommen die werte rein die markiert wurden sind also start Position und Endposition einer Zeile. beim zeichnen wird eine schleife gestartet welche diesem Array durchgeht und pro Eintrag wird ein Rect gezeichnet danach wird der eigentliche Text gezeichnet.
Problem dabei ist jetzt nur noch das füllen mit werten......
Ich hoffe ihr habt mein Prinzip verstanden....
ach ja ich gehe jetzt so vor:
ich habe zwei TStringlisten:
Lines, = enthält den Text vom User
DrawLinens = bekommt den Text zugewiesen wie er auf dem Bildschirm zu sehen ist... nur so komme ich wieder an den gewünschten Text ran.
jede andere Konfiguration kommt einfach in einer andere Zeile die werden hintereinander gezeichnet es sei denn AutoBreak ist an. dann wird ein Auto. Zeilen Umbruch gemacht.
Zum Markieren nochmal: da gibt es noch ein teil der mir vollkommen unklar ist und zwar das ändern einen Markieren Textes z.b. in die Farbe Rot oder Grün !
Ich habe da einen Vorschlag.
Weil ich immer wieder Probleme habe beim makieren wollte ich gerne fragen ob ihr das nicht übernehmen könnt ?
Dann kümmere ich mich um das Anzeigen(wie oben beschrieben) und einer von euch kümmert sich um das makieren.
Natürlich sollten wir dann noch klären ob das so überhaupt möglich ist...
ich möchte ja später nochmal die Schrift konfiguation ändern können d.h. ich hatte was auf rot gesetzt und das möchte ich auf grün haben....
und Aufzählungen, Grafiken(da wollte ich opBitmap nehmen), GUI- Komponenten, Verknüpfungen also eine art link Funktion sollen ja auch noch mit rein...
Kann man ja auch noch trennen nach Seite, Absatz, Text, Zeichen. Aufzählungen gehören dann zu Absatz. Die Schachtelung bleibt ja trotzdem erhalten, wird nur jeweils in einer Formatvariablen entsprechend gehalten. Gibt dann eben 4 mögliche Formatvariablen die beim Zeichnen jeweils abgefragt werden müssen. Die Formatvariablen müssen dann als Liste organisiert sein um den Kellerautomaten nachzubilden.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.
Als erstes brauchst du einen FontMetrics - Cache, sonst kriegst du die Geschwdigkeit nicht hin.
Dabei musst du dir bereits überlegen, ob du nur den ANSI Zeichensatz oder UNICODE / UTF8 gebrauchen willst.
Wie das Klassengerüst aussehen könnte habe ich hier schon mal geschrieben: http://www.lazarusforum.de/viewtopic.php?p=3403#3403" onclick="window.open(this.href);return false;
Die Buchstabendimensionen. Die Breite ist ja für jedes Zeichen anders, ausser bei fixen Fonts wie Courier. ein i braucht weniger Platz als ein W.
Da du das dauernd ausrechnen musst um die Caret-Postion zu bestimmen, und um den Zeilenumbruch durchzuführen, muss das schnell sein.
Da kannste nicht immer das Interface abfragen, sonst schlafen dir dir Füsse ein.
naja ich muss garnicht ständig die Caret Position abfragen nur wenn ich mit der Mausklick dann muss ich es. Wenn ich mit der Tastertur arbeite müsste das wesentlich leichter sein, die richtige Zeile/Spalte raus zu finden....
Pluto du hast keine Ahnung welchen Umfang sowas hat, du hast seit anfang an keinen Ahnung wie du es umsetzen sollst. Ich hab dir schon gesagt, das ich es nicht erklären werden dann kann ichs auch selber machen ich denke Theo gehts genauso. Du stellst immer die selben fragen (wie geht das mit dem markieren ...) lass es doch einfach.