Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Memo mit Textobjekten gesucht (https://www.delphipraxis.net/160597-memo-mit-textobjekten-gesucht.html)

Opa Knack 22. Mai 2011 04:27

Memo mit Textobjekten gesucht
 
Hallo,

kennt jemand von euch eine Memo-Komponente für D2006, bei der Textteile als Objekte gehandhabt werden?

Da die Frage vielleicht ein wenig wirr klingt (bin noch von gestern wach), hier noch die Erläuterung:

Ich möchte einen "Textbaukasten" bereitstellen, der mit einzelnen Satzbestandteilen (aus einem TreeView) per Drag&Drop befüllt werden kann. Diese Bestandteile sollen anschließend noch in sich gekapselt sein, sollen also noch "im Stück" innerhalb des Textes verschoben werden können. Wenn der Gesamttext also "Satz 1. Satz 2. Satz 3." lautet, sollen es möglich sein, den Baustein "Satz 2." eigenständig zu verschieben, zu ändern oder zu löschen, ohne dass das Hintergrundwissen, dass der Satz 2 als eigenständiger Baustein gehandhabt wird, haben zu müssen.

Ich habe es bisher mit einer Listbox versucht (habe hierbei allerdings Probleme bei der Mehrzeiligkeit, wenn ich die Texte aus dem TreeView herüberziehe, sowie mit dem Markieren des gerade eingefügten Bausteins), mit einem Treeview (hier konnte ich keine mehrzeiligen Texte einbinden) sowie mit dem Virtual StringTree (womit ich mich einfach nicht anfreunden kann). Dann habe ich noch dynamisch erzeugte Label verwendet (wobei wieder die mehrzeiligen Inhalte Probleme machten) und ein StringGrid ausprobiert (ohne Worte). Wie der geneigte Leser sieht: Es muss nicht UNBEDINGT eine Memo-Kompo sein...

So langsam bin ich mit meinem Latein am Ende und kann nur noch hoffen, dass sich jemand meiner erbarmt... (und bitte, bitte nicht den Hinweis "Nimm VST" - mit dem Ding kann ich einfach nicht).

Danke und Gute Nacht
Opa

stahli 22. Mai 2011 08:39

AW: Memo mit Textobjekten gesucht
 
Ich habe mal vor 100 Jahren etwas selbst geschrieben, indem ich Adressen (also kurze Texte) zerlegt und in mehrere Panels, bzw. deren Captions geschrieben habe (für jedes Wort also ein erzeugtes Panel).
Der User konnte dann die Panels verschieben und so die Reihenfolge der Wörter ändern.
Das sollte dazu dienen, die Adressen zu überarbeiten.

Twaddler 22. Mai 2011 13:43

AW: Memo mit Textobjekten gesucht
 
Ich denke auch, dass du das selbst implementieren musst.
An deiner Stelle würde ich eine Art "Verzeichniss" erstellen, in dem Verzeichnet ist, von welchem bis zu welchem Zeichen der Textbaustein xy geht. Mit der Cursorposition kannst du dann den Textbaustein auslesen und weiterverarbeiten. Z.b. über einen Button hinter den nächsten Baustein schieben ;)

Opa Knack 23. Mai 2011 00:19

AW: Memo mit Textobjekten gesucht
 
Hallo,

die Idee mit den Captions hatte ich auch schon, habe es allerdings mit Labels umgesetzt. Da die Texte jedoch über mehrere Zeilen gehen können, wurde es ein wenig schwierig, da ständig irgendwo irgendwas neu berechnet werden musste.

Im Moment versuche ich das Ganze mithilfe des Webbrowsers umzusetzen, indem ich die Bausteine mit Kommentaren versehe und den Quelltext auslese. Wirklich zufrieden bin ich allerdings bisher auch nicht.

Falls also noch jemand eine Idee hat: Ich bin für jeden Tipp dankbar.

Gruß
Opa

Sir Rufo 23. Mai 2011 01:05

AW: Memo mit Textobjekten gesucht
 
Nun so schwer sollte das nicht sein mit TMemo, folgendes Konzept würde ich vorschlagen:

Das Memo-Feld darf allerdings primär nur zur Anzeige des Textes und zur Feststellung der Cursor-Position verwendet werden.
Alle Eingaben in das Memofeld müssen umgeleitet werden in die Klasse, die alle verwendeten Textbausteine enthält.

Mal ein Gedankenkonstrukt für das Einfügen eines Zeichens (ungestestet und ohne Bereichsprüfung).
Weiterhin fehlt die Behandlung von DEL/BS und der Zwischenablage (Einsetzen, Ausschneiden).

Die anderen Methoden müssten natürlich noch ausprogrammiert werden :)
Delphi-Quellcode:
TTextSet = class
private
  // Speicher auf die Memo-Referenz
  FMemo : TMemo;
  // Speicher für die Textbausteine
  FParts : array of string;
protected
  // Das Memofeld mit den Text-Inhalten füllen
  procedure RefreshMemo;
public
  // Das referenzierte Memo-Feld übergeben
  property Memo : TMemo read FMemo write SetMemo;
  // Ein Zeichen Key an der Stelle KeyPos einfügen
  procedure AddKey( Key : Char; KeyPos : integer );
  // einen Textbaustein verschieben
  procedure MovePart( FromIndex, ToIndex : integer );
  // Textbaustein hinzufügen
  procedure AddPart( Index : integer; const PartText : string );
  // Textbaustein entfernen
  procedure DelPart( Index : integer );
end;

procedure TTextSet.AddKey( Key : Char; KeyPos : integer );
begin

  // Textbaustein ermitteln
  idx := Low( FParts );
  tpos := 0;
  while ( tpos + Length( FParts[ idx ] < KeyPos ) do
    begin
      Inc( tpos, Length( FParts[ idx ] ) );
      Inc( idx );
    end;

  // Zeichen im Textbaustein einfügen
  Insert( Key, FParts[ idx ], KeyPos - tpos );
 
  // Das Memofeld aktualisieren
  RefreshMemo;

  // Den Cursor im Memo platzieren
  Memo.SelStart := KeyPos + 1;

end;

ConnorMcLeod 23. Mai 2011 03:03

AW: Memo mit Textobjekten gesucht
 
Zitat:

Zitat von Opa Knack (Beitrag 1102145)
kennt jemand von euch eine Memo-Komponente für D2006, bei der Textteile als Objekte gehandhabt werden?

Da fällt mir spontan nur eine Lösung ein, die den Text intern entweder als Richtext oder als XML speichert. Bei beiden sind selbstdefinierte Eigenschaften möglich. Wobei mir XML als schnelle Lösung vorkommt und Richtext als sophisticated wegen der Textformatierung (fett, kursiv, Farben etc.).

Oder eben Dein Ansatz mit HTML und die Objekteigenschaften in Kommentaren ablegen und das Ganze in einem erweiterten WebBrowser.

Die Darstellung im GUI kann ein abgeleitetes TMemo oder TRichText oder TWebBrowser sein, das im Hintergrund die Maus und den Cursor beobachtet und Deine speziellen Dinge tut.

Pro Satzteil ein neues Objekt halte ich bez der Performance für problematisch, auch wenn es nur TLabels sind.

PS: die WPTools können das. Userdefinierte Objekte im Text mit speziellen Verhaltensweisen meine ich. Aber die haben
1) einen Preis
2) eine ganz eigene Philosophie in der Bedienung, die manches Mal Wutausbrüche auslöst ;-)

Opa Knack 23. Mai 2011 23:35

AW: Memo mit Textobjekten gesucht
 
@Sir Rufo: Den Gedanken hatte ich auch schon. Problematisch wird's, wenn die Textbausteine verändert werden können, da es dann nicht mehr funktionieren würde. Momentan habe ich knapp 1500 Bausteine, welche durch Individualisierung natürlich immens potentiert werden können...

@Connor: Momentan versuche ich die Webbrowserlösung umzusetzen, da dank HTML und CSS einige "Effekte" (wie das Hervorheben einzelner Bausteine) leichter vonstatten geht. Die WPTools habe ich mir angeschaut, aber allein schon dank des Preises hoffe ich, dass es auch noch einfachere Lösungen gibt. Zur Bedienung kann ich nichts sagen, aber das hört sich für mich so an, als wären die Komponenten für mich ähnlich dem VST einsetzbar :-)

Wie gesagt: Jede Idee ist willkommen. Irgendwie muss es doch funktionieren...

Gruß
Opa


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz