pre-Alpha Text Editor Komponente Version: 00.00.00

Vorstellungen von Programmen, welche mit Lazarus erstellt wurden.
pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Windows weiter und so sieht man nichts, wie es wirklich implementiert ist :-(.

Das habe ich mir schon gedacht und unter Lazarus ist das nix anders. Nur halt das es GKT1 oder GTK2 oder sonst was geleitet wird. Aber dafür sind die Synedit Komponenten eine kleine Hilfe zwischendurhc.

Danke unter CharWidht kann ich mir schon was vorstellen. Damit meinst du die Cursor Breite und mit CharHei.. dann die Cursor Höhe. Naja bei mir ist der Cursor abhänig von den Buchstaben Hoch und auch breit... hat so gesehen keine Feste Breite und Höhe.

Ich denke mit ClientWidth wird die sichtbare Breite des Fensters gemeint.

Danke nochmal für die PDF Datei, die wahr sehr aufschlussreich.
(Kein wunder das es bei mir nicht geklappt hat.)

Aber ich glaube so gesehen meinen wir das gleiche.
Wenn ich das bild richtig deutet verwendest du eine Schrift art mit Festen Buchstaben Breite.

Eine StringList würde eigentlich auch Ausreichen, aber ich habe jetzt jetzt anders gemacht
MFG
Michael Springwald

Aleks36
Beiträge: 11
Registriert: Di 22. Apr 2008, 11:12
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Beitrag von Aleks36 »

CharWidth und CharHeight bezeichnen die Breite und Höhe eines Buchstabens in der aktuellen Schrift, nicht die Cursorgrösse. Und ja: ClientWidth und ClientHeight bezeichnen die Grösse des Fensters. Im Gegensatz zu den normalen Width und Height Eigenschaften werden bei den Client-Varianten noch der Rahmen und die Scrollbalken abgezogen. Dadurch gibt Width die Breite des ganzen Fensters an und ClientWidth die Breite des (weissen) Editierbereichs in der Mitte.

Das Beispiel habe ich mit fester Buchstsbenweite erläutert. Tatsächlich verwende ich aber auch Schriften mit variabler Buchstabenweite. Dadurch wird die Umrechnung in den CalcXXX Funktionen etwas komplizierter: für die X-Koordinate muss man den Text der aktuellen Zeile auslesen und mit TextWidth die entsprechende Breite berechnen etc. Am Prinzip ändert sich aber nicht viel.

Eine StringList würde eigentlich auch Ausreichen, aber ich habe jetzt jetzt anders gemacht.

Die StringList ist bei mir nur ein Platzhalter. Zuerst wollte ich, dass die Oberfläche läuft und nun mache ich mich daran, den eigentlichen TextBuffer darunter zu schreiben. Wenn du bereits eine andere Lösung hast: umso besser!

Aber dafür sind die Synedit Komponenten eine kleine Hilfe zwischendurhc.

Mir sind die SynEdit-Komponenten viel zu umfangreich! Einer der Gründe, warum ich einen eigenen Editor schreibe ist eben, dass ich eine kompakte Variante will, die in einer Unit Platz hat und sich auf das Nötigste beschränkt.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Aber gibt es für Delphi nicht genügend Edit Komponenten ?

Das mit den Scrollen ist einfach zu unverständlich noch für mich. Bis her habe ich alle Probleme lösen können.
Aber beim scrollen hört es im Moment auf. Evlt. schaffe ich es ja doch noch mit der Zeit.

Letztendlich mache ich das auch so wie du: Eine Klasse kümmert sich um die User eingaben und eine weitere um das da stellen. Für das da stellen habe ich mir zwei Proceduren geschrieben:
eine DrawLine, zeichnet die Angegebene Zeile Neu, und einmal DrawRows zeichnet alle Linen neu und gibt den Linen einmal eine PY Position das es die Tatsächliche Position im TextBuffer und einmal eine SY Position für das Zeichnen auf dem Bildschrim, das gleiche habe ich für PX und SX.

Ich möchte die TObjectListen später durch Doppelt Verkettete Listen ersetzen, da habe ich mir mal eine Klasse geschrieben, die allerdings noch einige kleinere Fehler enthält.

Das Problem ist einfach, wenn ein Problem für mich zu lange dauert kann ich das Projekt gleich vergessen, weil ich dann meistens nicht weiter mache, bis mir halt eine Lösung einfällt, was dauern kann.

Ich habe mir das eigentlich so vorgestellt bei meine Editor Komponente: Eine einfache Memo Variante die evlt. etwas mehr kann als das Standard Memoe, dann eine erweitere die Texte unterschiedliche da stellen kann,
zum Schluss eine SynEdit ähnliche Komponente, die Sorucen Higleiten kann, da wollte ich versuchen auf die UniSyn
Dateien zurückzugreifen die verstehen über 300 Sprachen. Das währe für mich nicht schlecht.

Eigentlich ist das Scrollen im Moment die größere Hürde.

Also ist CharWidth und CharHeight die Breite und Höhe der jeweiligen Buchstaben bei dir ?

Das mit ClientWidth habe ich mir schon fast so gedacht, aber ich wusste es nicht genau.
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Da ich immer noch große Probleme mit dem Scrollen habe, wollte ich euch mal was fragen:
Wenn ich ein neues Projekt auf machen würde, und mich dort nur auf die kern Funktionen Konzentrieren würde, dazu zählen für mich folgende:
01 - Zwei Klassen erstellen(TPlutoEditorTextBuffer, TPlutoEditor)
02 - Texte Laden und da stellen
03 - Text Cursor hinzufügen und nur mit den Pfeiltasten Steuerbar
04 - Die Scroll Balken vorbereiten das die schonmal angezeigt werden

Für die Zeilen Verwaltung würde ich diesmal erstmal nur eine TStringList verwenden.
Ich würde mich bein Code Schreiben auch mehr mühe geben als sonst und so gut es geht alles Kommentieren !

Wenn ich soweit währe, was ca in 4 bis 6 tagen der Fall währe, würde dann jemand die Scroll Funktionen einbauen für mich ? Weil ich verstehe einfach nicht wie das geht. Mein Ziel ist es ein Standard Scroll Verhalten hinzubekommen wie z.b. von SynEdit, GEdit, NodePad.

Dazu würden folgende Probleme für mich zählen:
01 - Die Scrollbalken Größe(Breite und Höhe) zu berechnen
02 - Die Scrollbalken Position abhängig von der Cursor Position:
ist die CursorY Variable bei der ersten oder Letzten Sichtbaren Zeile z.b. soll um eine Zeile entsprechend gescrollt werden. Setzte ich die Cursor Position z.b. wenn jemand die Sprungmarken benutzt oder die Such Funkion
muss die Scroll Position entsprechend angepasst werden also ausgerechnet werden.


Ich hoffe ich habe nix vergessen.

Das Währe richtig toll. Natürlich würde ich denjenigen auch erwähren im Info Dialog mit all seinen Gewünschten angaben.

Ich hoffe euch ist bewusst das mein Projekt
A) Auf freiwilliger Bases entsteht
B) Das ich damit kein Geld Verdienen möchte bzw. Verdienen in welche Form auch immer
C) Das ich das Projekt nur aus eigener Interesse gestartet habe
D) Das mit das Projekt für Spätere Projekte als Vorlage dienen könnte/würde z.b. bei einer ListBox.
Weil ein Memo und eine Listbox unterscheiden sich meiner Meinung nach nicht viel. Vom Programmieren her.
Nach außen hin evlt. schon etwas mehr.
E) Wenn das Projekt ein Erfolgt wird, es evlt. ein nutzen für andere User haben könnte/würde

Daher währe alles was ich den demjenigen anbieten könnte ein Eintrag im Info Dialog und in den ReadMe Datei und natürlich ein Großes Danke Schön für die Arbeit. Mehr ist leider im Moment nicht drin. Für mich würde es natürlich viel bedeuten, wenn sich dazu jemand überwinden könnte. Ach ja: Die Zeit spielt dabei keine große rolle.
Hauptsache die Scroll Funktion Funktioniert irgendwann Zuverlässig und Effizient !
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Ich habe gestern noch angefangen mit dem Projekt und Heute weiter gemacht. Ich werde wohl keine 3-4 Tage brauchen. Evlt. lade ich das Projekt heute Abend oder Morgen hoch mal sehen.

Ich Buffere diesmal den Text nicht, aber später wenn das Scroll eingebaut ist werde ich den Text doch noch Buffern.
Weil es flimmert doch leicht wenn ich den z.b. den Cursor nach Rechts oder Links bewege.

Und wie gesagt ich halte das Projekt recht einfach und Konzentriere mich auch nur auf die wesentlichen aufgaben.

Ich habe noch ein Punkt vergessen zu nennen: Ich möchte das Scrollen natürlich auch verstehen. Das Scrollen an sich ist für mich kein Problem mehr, aber in Verbindung mit den Scroll Balken schon. Leider :(
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Da ich nicht alles doppelt haben wollte, habe ich meinen Ersten Beitrag angepasst. Dort gibt es auch das Test Projekt, wegen meinem Scroll Problem. Hier habe ich den Anhang gelöscht !!!
Zuletzt geändert von pluto am Mo 12. Mai 2008, 13:20, insgesamt 3-mal geändert.
MFG
Michael Springwald

Aleks36
Beiträge: 11
Registriert: Di 22. Apr 2008, 11:12
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Beitrag von Aleks36 »

Versuch mal, den WM_SIZE-Event abzufangen und da die ScrollBars entsprechend zu setzen. Vielleicht kannst du den Code auch in den ReSize-Handler hineinschreiben.

Code: Alles auswählen

type
  TPlutoEditor = class(TCustomControl)
  private
    procedure WMSize(var Message: TWMSize); message WM_SIZE;
  end;
 
procedure TPlutoEditor.WMSize(var Message: TWMSize);
begin
  inherited;
  UpdateScrollBars;
end;

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Hast recht daran hat es gelegen, jetzt werden beide Scrollbalken angezeigt.
Aber bei meinem Scroll Problem bin ich leider noch nicht viel weiter.

Ich habe gesehen das es inzwischen drei mal runter geladen wurde, was sagt ihr zu den Sorucen ? und zu meiner Bitte ?

Erstmal danke für den Tipp Aleks36, ich habe die sorucen noch nicht wieder aktualisiert da ich der Meinung bin das lohnt sich noch nicht richtig oder ?
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

So ich habe jetzt die gleiche Frage noch mal im DelphiGL Forum gestellt:
http://www.delphigl.com/forum/viewtopic ... 2453#62453

Ich habe auch nochmal die alte Version upgedatet.
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: pre-Alpha Text Editor Komponente Version: 00.00.00

Beitrag von pluto »

An der Komponente arbeite ich immer noch. In letzter Zeit habe ich einiges eingebaut. Hier mal eine kurze Liste mit den neu hinzugekommen Funktionen
  • Gatter Komplett überarbeitet. Jede Spalte kann praktisch anders aussehen. Es gibt eine GatterStyle liste z.b. steht da drin das in der ersten Spalte der Hintergrund Rot sein soll in der zweiten Grün und in der letzten Blau.
    Im ersten Eintrag. Im zweiten könnte was anders drin stehen. Dann wird dieses Muster wiederholt
  • Das Konfig Dialog habe ich entsprechend angepasst.
  • Es kann auch in das Vorschau Fenster geklinkt werden. Um z.b. die Gatter Farben zu ändern.
  • Die neuen Gatter Dastellungs Style können auch gespeichert und geladen werden.

Jede Gatter-Spalte unterstützt folgende Style-Attriebutte:
  1. kann umschlossen sein, von einem Vireck
  2. Jede seite vom Viereck kann eingestellt(Rand Farbe, Rand Style) werden, oder versteckt werden.
  3. Jeder Spalte kann eine andere Hintergrund Farbe haben
  4. Jede Spalte kann eine andere Text Farbe haben

Bisher dürfte dieses Projekt mein "längstes" Projekt sein. Ich hoffe bis ende das Jahres folgende Funktionen noch einzubauen:
  1. CodeFolding(düfte keine Probleme machen)
  2. Reundo(das habe ich glaube ich fast verstanden, wie das arbeitet)
  3. Drucken(Das habe ich noch nie gemacht)
  4. Code-Syntax-Hervorhebungen.
  5. Ein Context Menu mit allen zu Verfügung stehenden Funktionen
  6. Eine einfache Möglichkeit die Komponente mit einer Komplett Fertigen Symboleiste zu verbinden
  7. Pro Spalte Hinweise oder Kometrare einzufügen
  8. Eine Ersetzten Funktion
  9. Unicode Unterstützung(Sollte eigentlich schon Funktionieren. Ich nutzte überall im Projekt WiedeStrings, reicht das aus? und ich verwende statt Char TUTF8Char)
  10. Wordwarp
Wenn ihr noch Vorschläge habt, könnt ihr sie gerne hier nennen, oder sie mir per PM mitteilen. Ich würde mich aufjedenfall freuen.

Eine Vorteil dürfte noch sein, dass die Kometare Bunt gestaltet werden können und auch mit den Schrift Stylen. Leider sind andere Schrift Namen oder Größen nicht möglich, wegen der Scroll Funktion. Aber ich glaube das ist bei so einer Komponente auch nicht unbedingt notwendig.

PS: Gibt es eigentlich die Möglichkeit Linen einzufügen in einem Beitrag ? z.b. wie mit
? oder so ?
MFG
Michael Springwald

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: pre-Alpha Text Editor Komponente Version: 00.00.00

Beitrag von monta »

pluto hat geschrieben:PS: Gibt es eigentlich die Möglichkeit Linen einzufügen in einem Beitrag ? z.b. wie mit
? oder so ?

Ja, gibt es:

Code: Alles auswählen

[hr][/hr]
Johannes

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: pre-Alpha Text Editor Komponente Version: 00.00.00

Beitrag von theo »

pluto hat geschrieben:[*]Reundo(das habe ich glaube ich fast verstanden, wie das arbeitet)


Stell dir das mal nicht zu einfach vor. Ich hatte die letzen Monate kaum Zeit um an WOPR weiterzuarbeiten, aber Undo / Redo ist immer noch einer der Knackpunkte.

Du musst ja mit jeder Aktion etwas in den Undo Stack schreiben. Also bei Buchstaben-tippen, Formatierungs-Aktionen, Löschen. Copy-Paste etc.
Das einfachste wäre natürlich, immer das ganze Dokument vor einer Aktion in den Undo Stack zu kopieren.
Das braucht aber bei einem Multi-Level Undo/Redo System viel zu viel Speicher. (es können ja z.B. die 100 letzten Aktionen im Stack sein und das Dokument kann zig Seiten haben)
Also muss man versuchen, nur den bearbeiteten Teil zu speichern.
Deshalb muss der Undo Stack schon etwas mehr können, nämlich wissen, welcher Art die Aktion war, den teilweisen Inhalt speichern und die Quelltextpositionen (Start, Ende) sowie die Selection-Position behalten.

Bei WOPR habe ich folgende Arten:

Code: Alles auswählen

TUndoReasons = (urSelection, urDeleteSelection, urCaretPara, urCaretParaUp, urCaretParaDown, urCaretInsertPara, urInsertChar, urInsertBlock, urDoc);


Damit lassen sich bei mir alle "Undo-Gründe" definieren, welche die "Kleinst-machbaren" Einheiten ergeben.

Ein Undo-Stack-Item hält bei WOPR folgende Informationen (in Bearbeitung):

Code: Alles auswählen

TUndoItem = class
  private
    fAReference: Integer;
    fBReference: Integer;
    fUndodoc: TDocument;
    fReason: TUndoReasons;
    fText: TWoprString;
    fSelPosA: integer;
    fSelPosB: integer;
    fLevel: Byte;
    fAppend: Boolean;
  public
    constructor Create;
    destructor Destroy; override;
  end;


Das geht ja noch und funzt auch. (über zig Stufen hinweg).
Nur aus diesen Differenzdaten auch wieder ein Redo zu machen, bereitet mir noch Kopfschmerzen.

Aus den vorhandenen Undo Daten lässt sich so kein Redo machen, also muss Redo wieder differenziert vorgehen, und gleichzeitig die Undo Daten wieder speichern aber auf dem Redo Stack, da diese vom Undo Stack gelöscht werden müssen.

Du siehst, ich bin verwirrt. ;-)

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: pre-Alpha Text Editor Komponente Version: 00.00.00

Beitrag von pluto »

aber Undo / Redo ist immer noch einer der Knackpunkte.

Da hast du recht, undo war nicht leicht. Aber ich denke das ich das richtig eingebaut habe.
Ich würde fast sagen es läuft ca zu 95% zuverlässig.
Allerdings ist mein Projekt auch nicht mit deinem zu vergleichen. Wenn wir schonmal dabei sind:
Habe ich reundo richtig verstanden ?
Reundo stellt doch das wieder her, was Undo Rückgängig gemacht habe, beispiel:
Ich füge bei mir alles in eine TOBjectList ein. Es gibt verschiedene Typen. Wenn ich jetzt undo auslöse, wird in allen Fällen ein Item aus der Liste gelöscht. Das Letzte. Um reundo hinzubekommen, müsste ich doch nur bevor das letzte Item gelöscht wird, speichern in eine Reundo List.
Hier habe ich mir auch etwas an Synedit Orientiert !

Nur aus diesen Differenzdaten auch wieder ein Redo zu machen, bereitet mir noch Kopfschmerzen.

Warum ? Wenn meine anmahne richtig ist, dürfte das ganze leicht sein. Beispiel:
Wenn ich ein Wort eintippe, muss ich bei Undo ja einzeln diese Buchstaben löschen. OOP löscht zwar dann das word, ich lösche aber einzeln die Buchstaben.
Bei Reundo brauchst du doch nur das gegenteil zu machen. Also den Buchstaben wieder anfügen. Ich speichere auch noch die Cursor Position, damit müsste es dann möglich sein auch genau da das Zeichen einzufügen wo es hinsollen.
Ich habe mir bei Undo folgende Gründe überlegt:
- Beim Tippen(Buchstabenweise)
- Beim Löschen(Buchstabenweise, kleiner untschied zwischen Delete(8) und Entf)
- Bei einer neuen Zeile*
- Wenn eine Zeile gelöscht wird*
- Wenn ein markierter bereich gelöscht wird.
- Ausschneiden/Einfügen

* Hier gibt es sich das Problem, das ich praktisch die Zeile teilen müsste wenn ich z.b. mitten in einem String eine neue Zeile anfügen möchte.

Später kommen dann noch ein oder zwei hinzu, aufjedenfall kommt noch die Möglichkeit hinzu das ich mit der Maus einen Markierten Bereich verschieben kann.

Aus den vorhandenen Undo Daten lässt sich so kein Redo machen

Das sehe ich anders. Genau habe ich mich damit noch nicht befasst. Aber ich meine, es müsste gehen, aus den gleichen Daten ein zu reundo machen. Du musst "nur" eine eigene Methode dafür erstellen.

Wenn wir uns nur auf den Text Konzentrieren. Du wirst auch noch andere "Objekte" haben z.b. Tabellen, und Grafiken und sowas.
Ich würde diese Liste auch noch gerne anzeigen lassen. Das habe ich einmal in den frühern Borland IDE's unter Dos gesehen oder war das ein der MS Editor von DOS? aufjedenfall habe ich das mal unter Dos gesehen.

Aber ich weiß da noch nicht so genau wie ich das machen könnte. Weil bisher arbeite ich die liste ja von Oben nach Unten ab.
Ich weiß jetzt nicht genau was passieren würde, wenn da aufeinmal was fehlen würde.... Ich glaube es müsste gehen.

Ich finde das Projekt recht intressant. Meins und deins.
Mein Nachfolger soll so ähnliche werden, wie deines. Da habe ich auch schon angefangen.
Diese Komponenten soll ja mehr in richtig SynEdit gehen.

PS: Wie weit bist du eigentlich mit deinem Projekt ?
kannst du das OpenOffice Format schon komplett laden und da stellen ?
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: pre-Alpha Text Editor Komponente Version: 00.00.00

Beitrag von theo »

pluto hat geschrieben:kannst du das OpenOffice Format schon komplett laden und darstellen ?


Nein, das wird wohl niemals alles unterstützen.

Jagged
Beiträge: 20
Registriert: So 21. Okt 2007, 11:05

Re: pre-Alpha Text Editor Komponente Version: 00.00.00

Beitrag von Jagged »

@theo - wegen Undo/Redo - schau Dir mal Programme an die diese Funktion verwenden. Dabei wird Dir auffallen das es sich anfühlt wie eine Liste die rückwärts abgearbeitet wird. Bei Photoshop sieht man das sehr gut. Also wenn während Du in deinem Programm bei Undo einen Schritt zurück in der Liste gehst, änderst Du diesen Eintrag einfach ab. Und schon wird daraus ein Redo Eintrag. Wenn der Benutzer Redo macht geht er in der Liste natürlich wieder einen Schritt vorwärst und verwendet diesen Redo-Eintrag. Würde der Benutzer jetzt aber eine Eingabe machen, springst Du in der Liste wieder ans Ende und packst einen neuen Undo Eintrag hinzu. Das wäre exakt das Verhalten das auch alle anderen Programme an den Tag legen.

Antworten