![]() |
Richedit/Memo "nachprogrammieren"
Hi!
Es geht eigentlich darum ein Ausgabefeld ähnlich einem Memo oder Richedit zu programmieren. Also diese Standard-Sachen Text anzeigen (eingeben muss nicht sein), markieren, scrollen etc. Ist es realistisch, dass man das selbst nachprogrammieren kann? Falls ja, könnt ihr mir ein paar Ansätze geben? Danke und Ciao Frederic |
Re: Richedit/Memo "nachprogrammieren"
Hallo,
ich bin gerade dabei, sowas ähnliches zu programmieren. Ich wollte eine Komponente, in der ich spezielle Text-Formatierungen vornehmen kann, die es im RichEdit nicht gibt. Ich habe ungefähr 'ne Woche dafür gebraucht, auch wenn die ganze Sache noch nicht ganz fertig ist (das Ganze flimmert ab und zu, ich will noch ![]() Was willst Du denn genau damit machen (Textformatierun, Graphiken darstellen, Aufzählungen...), vielleicht kann ich Dir ja den ein oder anderen Tipp geben. Gruß xaromz |
Re: Richedit/Memo "nachprogrammieren"
Hi!
Es soll eigentlich nur Text darstellen können, keine allzugroßen Spielereien. Hauptknackpunkt ist, dass ein Memo bzw. Richedit CR und LF nicht richtig interpretiert. Ich kann kein LF machen, wenn ich nicht auch ein CR mache und genau das soll aber unterstützt werden. Ciao Frederic |
Re: Richedit/Memo "nachprogrammieren"
Moin Frederic,
also Dein Problem hat mit der Bedienung im RichEdit/Memo nichts zutun, also schreib keine Komponente mit dem Aufwand. Bei Delphi sind ja die Sourcen dabei, also kann man sowas nachprogrammieren aber Dir scheint eher ein Ausgabefilter zu fehlen und da reicht was abgeleitetes. Im übrigen wird ja vielfach auf Synedit und RichView verwiesen, was Deinem Problem aber nciht nahekommt. Grüße // Martin |
Re: Richedit/Memo "nachprogrammieren"
Hallo,
Zitat:
Gruß xaromz |
Re: Richedit/Memo "nachprogrammieren"
Hi!
Nein, es soll eben nicht dem Windows-Standard angeglichen werden (also der Text verändert werden), sondern es soll so dargestellt werden, wie es kommt. Deswegen meine Frage... Ciao Frederic |
Re: Richedit/Memo "nachprogrammieren"
Zitat:
Wenn du schon eine eigene Komponente machen willst, dann ersetze doch einfach nur die Routine LoadFromStream so, dass LFs korrekt interpretiert werden. Anderer Ansatz wäre z.B. die Meldungen WM_SETTEXT/EM_REPLACESEL zu überschreiben und hier die LF -> CR/LF Behandlung einzubauen. Also WM_SETTEXT(Text) wird einfach zu EM_SETSEL(0,-1)+EM_REPLACESEL(Text) und in EM_REPLACESEL baust du dann das ganze modifizierte Handling ein. [Nachtrag] Habe gerade mal in die VCL-Quellen geschaut - normalerweise sollte auch ein TMemo mit CR/LF oder nur CR oder nur LF umgehen können (ungetestet). Wenn's um das Speichern geht: da müsstest du nur vorher
Code:
setzen und die Datei wird im Unix-Format abgespeichert.
Memo1.Lines.LineBreak := #10;
|
Re: Richedit/Memo "nachprogrammieren"
Hi!
Es verhält sich selstam: Gebe ich (sowohl bei Memo als auch bei Richedit) manuell also mit ALT+010 bzw. ALT+013 ein, dann macht er bei beiden (!) ein LF UND ein CR - also gänzlich falsch interpretiert. Lese ich Daten vom ComPort aus, werden dort #10 und dann #13 gesendet: Daraufhin stellen mir Richedit und Memo 2 unlesbare Zeichen (diese Balken) dar. Kommt hingegen ein #13 und dann #10 dann wird korrekt ein Zeilenumbruch gemacht. Man sieht also, dass diese Implementierung "Schrott" ist. Entweder muss ich diesen Teil ändern (wo sollte ich da ansetzen?) oder ganz neu.... Ciao Frederic P.S.: Oder es gibt ne Komponente, die es kann..... |
Re: Richedit/Memo "nachprogrammieren"
Du hättest aber auch dazu schreiben können, dass du die Zeichen *EINZELN* an das Control schicken willst.
Ich hatte jetzt erst noch ein paar Dinge geschrieben, aber eigentlich hängt die Antwort davon ab, *WIE* du die Zeichen in das Memo setzt. Also: wie setzt du die Zeichen, die du vom Comport holst, in das Memo? [Nachtrag] Noch eine Idee: kannst du nicht einfach #13 ignorieren, d.h. nicht an das Memo weiterleiten, und statt dessen bei #10 immer #13#10 senden? |
Re: Richedit/Memo "nachprogrammieren"
Hi!
Problem ist, dass die Zeichen nicht einzeln behandelt werden. Momentan gehe ich hin und mache immer nur
Delphi-Quellcode:
Es kann jetzt passieren, dass nur ein LF kommt, dann soll auch NUR ein LF gemacht werden, eben ohne CR (von CR steht dann da ja nix). Genauso soll aber auch ein CR behandelt werden, wenn nur ein CR kommt.
Memo1.Text:=Memo1.Text + ch; //ch: char
Das Memo nimmt bei dieser zeichenweise "Eingabe" immer nur #13#10 als Zeilenwechsel mit CR, aber er soll es auch anders können. Zum Nachtrag: Das verändert ja wieder den Text, es zu umgehen ist ja einfach, da mach ich ein Str_Replace und gut ist, aber dann interpretiert er die ankommenden Zeichen falsch. Ciao Frederic |
Re: Richedit/Memo "nachprogrammieren"
Zitat:
Zitat:
Zitat:
Das Problem ist einfach, dass das Control nicht dafür entworfen wurde, dass ihm ein "halber" Zeilenumbruch geschickt wird. Schon mal daran gedacht, Daten und Darstellung einfach zu trennen?
Delphi-Quellcode:
[Nachtrag]
var strDaten: string;
strDaten := strDaten + Zeichen; Memo1.Text := AdjustLineBreaks(strDaten); andere Variante, wenn man .Lines.Text setzt, dann ist das AdjustLineBreaks schon mit drin:
Delphi-Quellcode:
var strDaten: string;
strDaten := strDaten + Zeichen; Memo1.Lines.Text := strDaten; |
Re: Richedit/Memo "nachprogrammieren"
moin,
klar geht sowas und das ist auch gar nicht schwer. Ich weis nicht in wie weit du dich schon mit den Zeichnen-Funktionen von Windows beschäftigt hast, aber in der regel sollte es nicht allzu lange dauern. Du brauchst: - eine TStringList - ein Bild / Canvas zur Ausgabe - zwei Scrollbalken Der Rest ist Berechnung. TextHeight() - berechnet die Höhe eines Strings in Pixel TextWidth()- brechnet die Breite eines Strings in Pixel TextOut() - mal den Text auf eine Grafik |
Re: Richedit/Memo "nachprogrammieren"
Zitat:
Zitat:
Zitat:
Verwende ich AdjustLineBreaks, dann wird ja auch wieder etwas dargestellt, was so nicht im "Text" steht, z.B. CR/LF, obwohl nur CR da ist... @bigg: Und wie siehts mit markieren aus? Und kopieren, und einfügen?? Ciao Frederic |
Re: Richedit/Memo "nachprogrammieren"
Hallo,
Zitat:
Aber zurück zum Thema: Ein Speichern der eingehenden Zeichen in einem String, evtl. mit Filterung und anschließender Darstellung dieses Strings scheint mir der beste Weg für das Problem zu sein. Gruß xaromz |
Re: Richedit/Memo "nachprogrammieren"
Hi!
@Xaromz: Kannst du mir mal deine Komponente zeigen? Was bringt mir eine Speicherung? Wie stell ich dann ein LF ohne CR dar? Ciao Frederic |
Re: Richedit/Memo "nachprogrammieren"
Zitat:
Zum Markieren benötigst du zwei Punkte und dann wird wiederum gezeichnet. Zum Einfügen benötigst du einen Punkt, änderst die Daten in der Liste und zeichnest dein Memo neu. |
Re: Richedit/Memo "nachprogrammieren"
Hallo,
ich hab meine Komponente grad nicht da, die ist auf meinem Rechner im Büro. Meine Komponente nimmt im Grunde genommen einfach beide Zeichen und stellt beide als Zeilenumbruch dar, jedoch nur, wenn nach einem #10 kein #13 kommt und umgekehrt Also folgendermaßen: #65#10#65 -> A, Zeilenumbruch, A #65#13#65 -> A, Zeilenumbruch, A #65#10#13#65 -> A, Zeilenumbruch, A #65#13#10#65 -> A, Zeilenumbruch, A #65#10#10#65 -> A, Zeilenumbruch, Zeilenumbruch, A #65#13#13#65 -> A, Zeilenumbruch, Zeilenumbruch, A Das ist natürlich willkürlich gewählt und lässt sich im Quelltext einfach anpassen. Gruß xaromz |
Re: Richedit/Memo "nachprogrammieren"
Hi!
Es wär echt klasse, wenn du sie mir mal geben könntest. Du machst aber keinen CR ohne LF? Ciao Frederic |
Re: Richedit/Memo "nachprogrammieren"
Zitat:
Zitat:
Um das hinzukriegen solltest du dir die aktuelle Zeile und Spalte im Memo merken und die Zeichen jeweils Positionsweise hinzufügen bzw. bei CR machst du "Spalte:=1" und LF machst du "Zeile:=Zeile+1" und bei anderen Zeichen ersetzt du es und machst "Spalte:=Spalte+1". Danach musst du das Caret neu setzen. Muss jetzt leider weg, sonst könnte ich dir eben ein paar Zeilen hinschreiben. |
Re: Richedit/Memo "nachprogrammieren"
Hi!
Ja, Flocke! Genau das! Würde man es ganz durchziehen, müsste man das auch mit dem #8 machen, es geht mir aber erstmal nur um die Zeilenwechsel! Das Memo unterstützt aber nicht von Haus aus, dass man Zeile:=Zeile+1 macht und dann die Spalte noch stimmt, oder? Ciao Frederic |
Re: Richedit/Memo "nachprogrammieren"
Hallo,
also eine Terminal-Ausgabe kann mein Edit auch nicht, da musst Du wohl doch alles puffern und den Puffer anpassen. Allerdings kann mein Edit einfügen/überschreiben, Du kannst also bei einem CR den Cursor an den Anfang der Zeile setzen und ab da einfach überschreiben. Da mein Edit aber einen automatischen Zeilenumruch implementiert und nicht erst bei einem CR bzw. LF umbricht glaube ich nicht, dasss meine Komponente für Dich so richtig geeignet ist. Aber wenn Du willst kann ich Dir mal meine aktuelle Version posten (geht aber erst morgen, s. o.). Gruß xaromz |
Re: Richedit/Memo "nachprogrammieren"
Hi!
Ja, poste mal, wär super! Danke. Ciao Frederic |
Re: Richedit/Memo "nachprogrammieren"
Liste der Anhänge anzeigen (Anzahl: 2)
Ich poste hier einfach mal eine kleine Demo.
- bisher funktioniert nur das vertikale Scrollen - Dateien können geladen werden - die Schriftart kann angepasst werden - Aktuelle Zeilenangabe |
Re: Richedit/Memo "nachprogrammieren"
Hi!
Super Sache, danke! Hast du einen Ansatz zum markieren? Ciao Frederic |
Re: Richedit/Memo "nachprogrammieren"
Ja, du benötigst zunächst einmal einen Anfangspunkt.
Der Punkt setzt sich aus der aktuellen Position der rechten Scrollbar sowie den Koordinaten des Editors (Editor) zusammen. Dann haben wir eine Koordinate. |
Re: Richedit/Memo "nachprogrammieren"
Hi!
Ja.... Und dann? Ciao Frederic |
Re: Richedit/Memo "nachprogrammieren"
... und drückst dann die linke maustaste (also onclick), ziehst die Maustaste wohin du willst, ermittelst den aktuellen punkt ueber mousemove und rufst dann malen auf. :)
|
Re: Richedit/Memo "nachprogrammieren"
Hi!
aha, ok. Jetzt zu meinem eigentlichen Problem nochmal zurück. Das liegt ja nur indirekt in der Ausgabe eigentlich... Problem ist ja folgendes, es wird jetzt eine Stringlist zeilenweise ausgegeben. Angenommen, der ankommende "Text" sieht so aus: Zitat:
Delphi-Quellcode:
Nur, wenn in der Stringlist jetzt nur drinsteht:
123
456 [0] 123 [1] 456 Wie soll die das dann wissen/wie soll ich das wissen. Klar, es ist eine Frage, wie ich es in die Stringliste schreibe, aber wie soll ich das machen? Ciao Frederic |
Re: Richedit/Memo "nachprogrammieren"
Hallo Frederic,
kleine Zwischenfrage: welche Bedeutung hat denn diese Ausgabe - du hast ja im opener gesagt, dass Eingabe kein Thema sei. Ist das sowas wie ein Monitor, der die auf dem Port eingehenden Daten mitschreibt? Wieviel willst du da mitschreiben, d.h. wie groß soll das mitgeschnittene Fenster sein - in Zeilen? Warum willst du in den mitgeschnittenen Daten markieren können? Unter ganz bestimmten Randbedingungen wäre dann ein echtes Konsolfenster sinnvoll, das du auch als child window in deiner form halten könntest. Das Konsolfenster weiß schon von sich aus, wie es mit ASCII control umgehen muss... Grüße vom marabu |
Re: Richedit/Memo "nachprogrammieren"
Hi!
Konkret geht es darum, Ausgaben darzustellen, die mir ein kleiner fußballspielender Roboter (siehe Signatur) auf dem Com-Port sendet. Eine Zeile sieht beispielsweise so aus: Zitat:
Da fragt man sich ja jetzt eigentlich, wozu die ganzen Verrenkungen; mit nem Memo sollte das doch gehen. Ja, geht es eigentlich, ABER wir haben Perfektionisten im Team :wink: und im Moment ein Terminal, das zwar sonst nix kann, aber CR und LF richtig interpretiert. Also soll das neue das bitte auch können. (Das Terminal ist zwar OS, aber erstens C(++ ?) und zweitens sehr unübersichtlich) So, dann noch was zum Konsolenfenster: Habe eben mal eine neue Kosolenanwendung gemacht und dort mal getestet: Nach meinen Tests wirds da auch nicht "richtig" gemacht, oder reden wir von unterschiedlichen Dingen? Ciao Frederic |
Re: Richedit/Memo "nachprogrammieren"
Ich hatte zwar an eine GUI-Anwendung mit Konsolfenster als child window gedacht, aber von der Funktionalität her ist das egal. Von der Dokumentation her bin ich davon ausgegange, dass auch LF richtig interpretiert wird.
Zitat:
Eines ist mir allerdings immer noch nicht klar. Welchen Sinn macht ein einzelnes LF (ohne CR) in deinem Datenstrom? Eine einwandfreie Umsetzung würde einen Zeilenwechsel unter Beibehaltung der Spalte verursachen. Wozu? Zur Ansteuerung von Bildschirmpositionen auf einem Terminal stehen in der Regel spezielle Steuersequenzen zur Verfügung. marabu |
Re: Richedit/Memo "nachprogrammieren"
Beim Begriff "Terminal" ist dann doch noch was eingefallen.
Bei der ICS-Suite von F. Piette ( ![]() Zitat:
|
Re: Richedit/Memo "nachprogrammieren"
Bei Async Professional von TurboPower ist eine VT100 Terminal Komponente dabei - die sollte ein LF auch korrekt handhaben können.
marabu |
Re: Richedit/Memo "nachprogrammieren"
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich häng hier jetzt mal meine Edit-Komponente rein (Achtung: ist noch Baustelle), aber ich glaub nicht, dass Dir das groß weiterhilft, da das Ganze erstens sehr speziell für meine Bedürfnisse ist und zweitens eben ein (relativ) normales Memo ist und kein Terminal. Ich hab leider keine Dokumentation dafür, nur ein paar Zeilen, wie man Formatierungen einfügen kann. Wenn Du das benutzen willst musst Du Dir eben die Verarbeitung von Steuerzeichen selbst basteln (Die Methode AddCharacter ist da evtl. ein guter Start). Gruß xaromz |
Re: Richedit/Memo "nachprogrammieren"
Hi!
Danke für die Tipps! Ciao Frederic |
Re: Richedit/Memo "nachprogrammieren"
Hi!
Zitat:
Perfekt! Wunderbar! Vielen Dank. Ciao Frederic |
Re: Richedit/Memo "nachprogrammieren"
Hallo zusammen
wenn man die Steuerzeichen #10#13 extra interpretieren will dann müsste das doch in etwa so aussehen
Delphi-Quellcode:
bei #10 wird in die nächste Zeile an die Position der vorigen gegangen
curLine := Memo1.Lines.Count-1;
if c = #10 then begin Memo1.Lines.Append(StringOfChar(#32,length(Memo1.Lines[curLine])); end else if c = #13 then begin Memo1.Lines.Delete(curLine); Memo1.Lines.Append(''); end else Memo1.Text := Memo1.Text + c; bei #13 wird die momentane Zeile gelöscht und an Position 1 gesprungen sonst wird Memo1 Text weiter geschrieben. Gruß Stefan |
Re: Richedit/Memo "nachprogrammieren"
Hi!
Nein, so wäre das nicht korrekt! So wie ich das sehe fügst du Leerzeichen ein, oder? Das verändert ja wiederum den Inhalt. Ciao Frederic |
Re: Richedit/Memo "nachprogrammieren"
Also wenn ich so was basteln wollte würde ich wahrscheinlich erstmal die Daten separat "speichern" (eg. String/list) dann kannste mit denen jonglieren wie du willst .. z.b. bei CR den Cursor (separat merken ??) auf Zeilenstart stellen und dann alle ankommenden Zeichen den Rest überschreiben lassen :gruebel:
naja .. sollte eigentlich nicht allzu schwer sein :gruebel: .. (PS: hab im Mittelteil des threats n bissl übersprungen kann also sein, daß der Vorschlag schon kam und abgewiesen wurde :roll:) |
Re: Richedit/Memo "nachprogrammieren"
@fkerber
wenn es hier um die Darstellung im Memo geht sind doch die Spaces egal. Das memo mag es glaube ich (was sie Darstellung angeht) nicht so gerne wenn da lauter #0 stehen. Auserdem lassen sich die ja mit commaText auch wieder rausmachen. Gruß Stefan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz