Suche so etwas wie RichEdit
-
- Beiträge: 423
- Registriert: Di 5. Feb 2008, 12:45
- OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
- CPU-Target: 64Bit
- Kontaktdaten:
Suche so etwas wie RichEdit
Hi,
also ich möchte einfach nur in dem Info Text (muss nicht editierbar sein) meines Programms mal was fett, bunt und mal etwas größer/kleiner schreiben.
Kennt ihr irgendeine Komponente die das kann?
Gruß Alexander
also ich möchte einfach nur in dem Info Text (muss nicht editierbar sein) meines Programms mal was fett, bunt und mal etwas größer/kleiner schreiben.
Kennt ihr irgendeine Komponente die das kann?
Gruß Alexander
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu
www.alexanderroth.eu
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Also eine Komponente kann ich dir außer dem WebBrowser keine anbieten.
Aber ich habe eine Funktion geschrieben die sowas kann. Leider finde ich sie im Moment nicht.
Aber ich werde sie weiter suchen.
Wie gesagt es gibt in Lazarus eine WebBrowser Komponente die das kann. Aber dann müsste der Text als HTML vorliegen.
Evlt. unterstützt sie ja auch Streams oder so.
habe sie doch gefunden:
Du musst sie aber noch anpassen. Evlt. hilft sie dir ja schon weiter.
sie kann solche Text da stellen:
rotertext
allerdings solltest du dir dann meine uColorList runter laden die es hier im Forum gibt.
denn vor jedem red kommt ein pl_
das könntest du anpassen. nach cl.
Aber ich habe eine Funktion geschrieben die sowas kann. Leider finde ich sie im Moment nicht.
Aber ich werde sie weiter suchen.
Wie gesagt es gibt in Lazarus eine WebBrowser Komponente die das kann. Aber dann müsste der Text als HTML vorliegen.
Evlt. unterstützt sie ja auch Streams oder so.
habe sie doch gefunden:
Du musst sie aber noch anpassen. Evlt. hilft sie dir ja schon weiter.
sie kann solche Text da stellen:
rotertext
allerdings solltest du dir dann meine uColorList runter laden die es hier im Forum gibt.
denn vor jedem red kommt ein pl_
das könntest du anpassen. nach cl.
Code: Alles auswählen
function NextWord(var FirstIndex, LastIndex: Integer; var at:widestring; Soruce, SubStr:widestring): string;
begin
LastIndex:=PosExt(SubStr,Soruce,FirstIndex)-1;
result:=copy(Soruce,FirstIndex,abs(LastIndex-FirstIndex));
at:=copy(Soruce,LastIndex,Length(SubStr)+1);
FirstIndex:=PosExt(SubStr,Soruce,LastIndex)+1;
end; // NextWord
function NextHtml(var FirstIndex, LastIndex: Integer;
var aCommand:widestring; const asoruce: widestring): String;
begin
lastindex:=PosExt('<',asoruce,FirstIndex);
// writeln(Firstindex,'\',Length(asoruce));
if LastIndex > 0 then begin
result:=Copy(asoruce,FirstIndex,abs(LastIndex-FirstIndex)-1);
FirstIndex:=PosExt('>',asoruce,LastIndex);
aCommand:=Copy(asoruce,LastIndex,abs(LastIndex-(FirstIndex-1)));
end
else begin
aCommand:='';
result:=Copy(asoruce,FirstIndex,Length(asoruce));
end;
end; // NextHtml
{
Text Formatierung:
<br> Manueller Zeilen Umbruch
<fg> Text Farbe(font.color)
<bg> Text Hintergrund Farbe(brush.color)
<fs> Text Style, Fett, Kusif, Unterstriechen(Font.Style)
<fn> Schrift Art
<pn> Rand Farbe z.b. bei eine Linen(pen.Color)
<hr> Zeichnet eine Linen
}
procedure TPlutoDrawText.DrawText(const tx, ty: Integer; const aText: widestring);
var
px, py, pw, ph, l, p,u,ph2,t,j,FontI, Level:Integer;
str1:Widestring;
str3,str4:String;
str2:widestring;
command, value:Widestring;
TmpFG, TmpBG, TmpPN,TmpBG2:TColor;
TmpFS, NewFS:TFontStyles;
TmpFN:String;
aText2:String;
isText,isText2:Boolean;
isList:Boolean;
begin
px:=tx; py:=0; l:=1; p:=1; ph:=0;
Level:=px;
aText2:=aText;
// DelSteuerzeichen(aText);
isText:=False;
repeat
str1:=NextHtml(l,p,str2,aText2);
ph2:=Canvas.TextHeight(str1);
if ph2 > ph then ph:=ph2;
until p = 0;
l:=1; p:=1; pw:=0; ph:=ph+2;
repeat
str1:=NextHtml(l,p,str2,aText2);
pw:=canvas.TextWidth(str1);
if pw > 0 then canvas.FillRect(px,py-1,px+pw,py+ph);
isText2:=str1 <> '';
if str1 <> '' then isText:=True;
str1:=DelSteuerzeichen(str1);
if islist then begin
str1:=TrimLeft(str1);
// str1:=TrimRight(str1);
end;
canvas.TextOut(px,py,str1);
Canvas.font.Style:=TmpFS;
tmpfs:=[];
str2:=LowerCase(str2);
u:=pos('=',str2)-1;
j:=1; t:=1;
if u > -1 then begin
repeat
str3:=GetTokenExt(str2,' ','"',j);
command:=LowerCase(GetToken(GetTokenExt(str3,'=','"',1),'=',1));
Value:=LowerCase(GetToken(GetTokenExt(str3,'=','"',2),'"',2));
// Writeln('Value:[',Value+']');
// writeln('Str3:[',str3,']');
if Command = 'pn' then begin
TmpPN:=Canvas.pen.Color;
Canvas.Pen.Color:=String2ToColor('pl_'+Value);
end; // Command = fg
if Command = 'fg' then begin
TmpFG:=Canvas.Font.Color;
Canvas.Font.Color:=String2ToColor('pl_'+Value);
end; // Command = fg
if Command = 'bg' then begin
TmpBG:=Canvas.Brush.Color;
Canvas.Brush.Color:=String2ToColor('pl_'+Value);
end; // Command = bg
if command = 'fn' then begin
end; // fn
if Command = 'fs' then begin
TmpFS:=Canvas.Font.Style; NewFS:=[];
// writeln(Value);
for FontI:=1 to NumToken(value,',') do begin
str4:=GetToken(Value,',',FontI);
if str4 = 'b' then include(Newfs, fsBold);
if str4 = 'i' then include(Newfs, fsItalic);
if str4 = 'u' then include(Newfs, fsUnderline);
if str4 = 's' then include(Newfs, fsStrikeOut);
end;
canvas.Font.Style:=Newfs;
end;
inc(j);
until str3 = '';
end; // u > 0
px:=px+pw;
if u = -1 then begin
command:=LowerCase(str2);
if command ='list' then begin
px:=level;
isList:=True;
end;
if command = 'addlevel' then begin
TmpBG2:=Canvas.brush.Color;
Canvas.brush.Color:=clBlack;
if isText2 then py:=py+ph+1;
inc(level,10);
px:=level;
// if not isText2 then
Canvas.FillRect(px-5,py,px,py+5);
Canvas.brush.Color:=TmpBG2
end;
if command = '/addlevel' then begin
if isText2 then py:=py+ph+1;
dec(level,10);
px:=level;
end;
if command ='/list' then begin
px:=level;
isList:=False;
end;
if command = 'br' then begin
py:=py+ph+1;
px:=level;
end;
if command = 'hr' then begin
if isText then
py:=py+ph+1;
px:=tx;
Canvas.MoveTo(0,py);
Canvas.LineTo(canvas.ClipRect.Right,py);
py:=py+3;
end;
if command = '/fg' then Canvas.Font.Color:=TmpFG;
if command = '/bg' then Canvas.Brush.Color:=TmpBG;
if command = '/pn' then Canvas.Pen.Color:=TmpPN;
if command = '/fs' then begin
end;
if command = '/' then begin
Canvas.Font.Color:=TmpFG;
Canvas.Brush.Color:=TmpBG;
Canvas.Pen.Color:=TmpPN;
// Canvas.font.Style:=TmpFS;
// tmpfs:=[];
end;
end; // u = -1
until p = 0;
end;
MFG
Michael Springwald
Michael Springwald
-
- Lazarusforum e. V.
- Beiträge: 2808
- Registriert: Fr 22. Sep 2006, 10:38
- OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
- Wohnort: Hessen
- Kontaktdaten:
Re: Suche so etwas wie RichEdit
Hallo Alexander!alexander hat geschrieben:also ich möchte einfach nur in dem Info Text (muss nicht editierbar sein) meines Programms mal was fett, bunt und mal etwas größer/kleiner schreiben.
Kennt ihr irgendeine Komponente die das kann?
Bei so ziemlich allen textausgebenden Komponenten gibt es die Eigenschaft "Font", bei der sich Schriftart, Schriftgröße, Schriftstil, u.s.w. an die eigenen Bedürfnisse anpassen lässt.
Viele Grüße, Euklid
-
- Beiträge: 370
- Registriert: Di 6. Feb 2007, 09:29
- OS, Lazarus, FPC: L0.9.29 SVN:24607 FPC 2.4.0-32 bit @ Win XP SP3
- CPU-Target: 32bit i386, ARM
- Wohnort: Oberösterreich
Hi,
also ich möchte einfach nur in dem Info Text (muss nicht editierbar sein) meines Programms mal was fett, bunt und mal etwas größer/kleiner schreiben.
Aber ich denke doch, dass ein RichEdit gemeint ist, sagt ja auch der Titel. Warum gibt es sowas in Lazarus eigentlich nicht? Kennt sowas denn nur Windows?Bei so ziemlich allen textausgebenden Komponenten gibt es die Eigenschaft "Font", bei der sich Schriftart, Schriftgröße, Schriftstil, u.s.w. an die eigenen Bedürfnisse anpassen lässt.
(Wenn ich darüber nachdenke: ich habe auf Linux noch nixgefunden, das Wordpad-Ähnlichkeit hat und out-of-the-box dabei ist.)
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Ich denke das liegt daran das es sowas nicht in GTK1 oder GKT2 gibt. Sowas habe ich nur in QT gefunden.
Ich selbst bin seit einigen Tagen dabei eine solche Komponente zu erstellen. Ich bin schon fast so weit sie zu veröffentlichen. Es geht allerdings noch viele Funktionen wie das Scrollen/Markieren nicht. Aber dafür kann man schon den Cursor steuern, Texte bearbeiten und soweiter.
Die Maus Funktionen habe ich auch noch nicht eingebaut. Es ist ja auch nur ein Prototyp. Aber ich denke ihr könnt davon ausgehen das ich ihn in den nächsten Tagen veröffentliche.
Das wesentliche geht aber auch noch nicht: Unterschiedliche Farben da zu stellen wie halt im RichEdit. Aber dafür ist vorgesorgt.
Der Schwerpunkt liegt erstmal bei den einfachen aufgaben.
Dieser Klasse ist im Moment der vielversprechende Anssatzt.
eine solche Komponente zu erstellen. Ich habe auch vor eine RichEdit kompatible Komponente zu erstellen mit Hilfe meiner Editor Klasse.
Aber das kann ich noch hinziehen. Das Problem ist das zusammen spiel der einzelnen Funktionen wie ich gesehen habe.
Jede Zeile ist eine eigene TObjectList alle Zeilen werden von einer TObjectList verwaltet.
Das macht viele einfacher aber auch aufwendiger. Jeder Buchstabe ist dabei ein Object. in der jeweiligen ObjectList der Zeil.
Eine andere Lösung ist mir dafür einfach nicht eingefallen.
Ich denke die heutigen Rechner sollten damit zu recht kommen.
Beim schreiben verbraucht meine Komponente weniger CPU-zeit als z.b. Synedit oder Gedit.
Weil ich nur die Aktuelle Zeile neu zeichne. das bringt aber auch wieder ein Problem mit sich:
Was ist wenn der user unterschiedlich große Buchstaben haben möchte ?
Dann muss ich wieder alles neu zeichnen aber nur einmal.
@Euklid
das geht aber leider nicht immer bei allen komponente bei einige gibt es Probleme.
z.b. ich meine schon beim Memo oder Edit.
Ich selbst bin seit einigen Tagen dabei eine solche Komponente zu erstellen. Ich bin schon fast so weit sie zu veröffentlichen. Es geht allerdings noch viele Funktionen wie das Scrollen/Markieren nicht. Aber dafür kann man schon den Cursor steuern, Texte bearbeiten und soweiter.
Die Maus Funktionen habe ich auch noch nicht eingebaut. Es ist ja auch nur ein Prototyp. Aber ich denke ihr könnt davon ausgehen das ich ihn in den nächsten Tagen veröffentliche.
Das wesentliche geht aber auch noch nicht: Unterschiedliche Farben da zu stellen wie halt im RichEdit. Aber dafür ist vorgesorgt.
Der Schwerpunkt liegt erstmal bei den einfachen aufgaben.
Dieser Klasse ist im Moment der vielversprechende Anssatzt.
eine solche Komponente zu erstellen. Ich habe auch vor eine RichEdit kompatible Komponente zu erstellen mit Hilfe meiner Editor Klasse.
Aber das kann ich noch hinziehen. Das Problem ist das zusammen spiel der einzelnen Funktionen wie ich gesehen habe.
Jede Zeile ist eine eigene TObjectList alle Zeilen werden von einer TObjectList verwaltet.
Das macht viele einfacher aber auch aufwendiger. Jeder Buchstabe ist dabei ein Object. in der jeweiligen ObjectList der Zeil.
Eine andere Lösung ist mir dafür einfach nicht eingefallen.
Ich denke die heutigen Rechner sollten damit zu recht kommen.
Beim schreiben verbraucht meine Komponente weniger CPU-zeit als z.b. Synedit oder Gedit.
Weil ich nur die Aktuelle Zeile neu zeichne. das bringt aber auch wieder ein Problem mit sich:
Was ist wenn der user unterschiedlich große Buchstaben haben möchte ?
Dann muss ich wieder alles neu zeichnen aber nur einmal.
@Euklid
das geht aber leider nicht immer bei allen komponente bei einige gibt es Probleme.
z.b. ich meine schon beim Memo oder Edit.
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 370
- Registriert: Di 6. Feb 2007, 09:29
- OS, Lazarus, FPC: L0.9.29 SVN:24607 FPC 2.4.0-32 bit @ Win XP SP3
- CPU-Target: 32bit i386, ARM
- Wohnort: Oberösterreich
Du sagst aber dazu:Ich selbst bin seit einigen Tagen dabei eine solche Komponente zu erstellen. Ich bin schon fast so weit sie zu veröffentlichen.
- Es geht allerdings noch viele Funktionen wie das Scrollen/Markieren nicht.
- Die Maus Funktionen habe ich auch noch nicht eingebaut.
- Das wesentliche geht aber auch noch nicht: Unterschiedliche Farben da zu stellen wie halt im RichEdit.
Sei mir nicht böse, aber wenn es so einfach wäre, so was CROSSPLATTFORM zu implementieren, dann hätte das Lazarus-Team das wohl schon gemacht, oder liege ich da falsch?
Pluto, ernsthaft: ist ein kleines funktionierendes Teil nicht besser, als ein großes mit Löchern so groß wie Mondkrater und Bugs so groß wie bei Starship Troopers? Warum denkst du, habe ich hier bisher nur Fragen gestellt und nix veröffentlicht? Nicht weil ich nicht programmiere, aber weil ich nix rausgebe, das nicht annähernd funktioniert. Release early, release often mag zwar ein OpenSource-Leitspruch sein, aber bis auf die Knochen will ich micht nicht blamieren.....
-
- 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:
Ich würde dir das TIpHtmlPanel empfehlen, ist eigentlich ganz einfach und du kannst deinen Dialog direkt als html einbinden. Und html (ohne css) wird eigentlich gut verarbeitet und dargestellt.
Wenns denn wirklich RTF sein soll, schau dir mal das an:
http://wiki.lazarus.freepascal.org/RichView" onclick="window.open(this.href);return false;
Wenns denn wirklich RTF sein soll, schau dir mal das an:
http://wiki.lazarus.freepascal.org/RichView" onclick="window.open(this.href);return false;
Johannes
-
- Beiträge: 423
- Registriert: Di 5. Feb 2008, 12:45
- OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
- CPU-Target: 64Bit
- Kontaktdaten:
Das ist kein Problem. Wie heißt sie?pluto hat geschrieben:Wie gesagt es gibt in Lazarus eine WebBrowser Komponente die das kann. Aber dann müsste der Text als HTML vorliegen.
@1.: Ist das die Kompo von der Pluto spricht?monta hat geschrieben:Ich würde dir das TIpHtmlPanel empfehlen, ist eigentlich ganz einfach und du kannst deinen Dialog direkt als html einbinden. Und html (ohne css) wird eigentlich gut verarbeitet und dargestellt.
Wenns denn wirklich RTF sein soll, schau dir mal das an:
http://wiki.lazarus.freepascal.org/RichView" onclick="window.open(this.href);return false;
Ich finde TIpHtmlPanel nicht in der KomponentenTabelle, in welchem Package ist es? Damit ich es hineinkompilieren kann. EDIT: Habe es gefunden: TurboPower
@2.: habe ich mir angeschaut, bringt aber Fehler ist anscheinend wohl eher für Delphi als Lazarus....
hmmm ich habe keine Ahnung von Editoren, aber wenn du einen Text reinlädst, der 10000 Zeichen hat, dürfte das mit 10000 Objekten nicht sehr speicherlastig und langsam werden?pluto hat geschrieben:Jede Zeile ist eine eigene TObjectList alle Zeilen werden von einer TObjectList verwaltet.
Das macht viele einfacher aber auch aufwendiger. Jeder Buchstabe ist dabei ein Object. in der jeweiligen ObjectList der Zeil.
Gruß Alexander
EDIT
Also ich habe mir jetzt mal das Beispiel angeschaut, und um eine HTML Seite zu laden braucht man anscheinend sooooooooooooooo viel Code.
Kann man nicht irgendwo einfach irgendwo loadfromfile machen?
Das ist echt extrem umständelich:
Code: Alles auswählen
procedure TMainForm.MainFormCreate(Sender: TObject);
begin
OpenHTMLFile('index.html');
end;
procedure TMainForm.IpHtmlPanel1HotClick(Sender: TObject);
var
NodeA: TIpHtmlNodeA;
NewFilename: String;
begin
if IpHtmlPanel1.HotNode is TIpHtmlNodeA then begin
NodeA:=TIpHtmlNodeA(IpHtmlPanel1.HotNode);
NewFilename:=NodeA.HRef;
OpenHTMLFile(NewFilename);
end;
end;
procedure TMainForm.HTMLGetImageX(Sender: TIpHtmlNode; const URL: string;
var Picture: TPicture);
var
PicCreated: boolean;
begin
try
if FileExists(URL) then begin
PicCreated := False;
if Picture=nil then begin
Picture:=TPicture.Create;
PicCreated := True;
end;
Picture.LoadFromFile(URL);
end;
except
if PicCreated then
Picture.Free;
Picture := nil;
end;
end;
procedure TMainForm.OpenHTMLFile(const Filename: string);
var
fs: TFileStream;
NewHTML: TSimpleIpHtml;
begin
try
fs:=TFileStream.Create(Filename,fmOpenRead);
try
NewHTML:=TSimpleIpHtml.Create; // Beware: Will be freed automatically by IpHtmlPanel1
NewHTML.OnGetImageX:=@HTMLGetImageX;
NewHTML.LoadFromStream(fs);
finally
fs.Free;
end;
IpHtmlPanel1.SetHtml(NewHTML);
except
on E: Exception do begin
MessageDlg('Unable to open HTML file',
'HTML File: '+Filename+#13
+'Error: '+E.Message,mtError,[mbCancel],0);
end;
end;
end;
Code: Alles auswählen
TSimpleIpHtml = class(TIpHtml)
public
property OnGetImageX;
end;
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu
www.alexanderroth.eu
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
@bembulak
Das ist mir alles bewusst. Ich sehe es auch als Spaß am Programmieren an. Wenn dabei was rauß kommt ist es gut, wenn nicht hatte ich mein Spaß.
Aber im Moment sieht es recht gut aus.
Eigentlich schon. Aber die ObjectList ist schon zimlich schnell wie immer alle sagen, wenn alles läuft kann ich sie problemlos austauschen gegen eine Doppelt Verkette Liste. Da hatte ich mal was geschrieben.
Das ist immer die frage wie man die Buchstaben verwaltet.
Das ist mir alles bewusst. Ich sehe es auch als Spaß am Programmieren an. Wenn dabei was rauß kommt ist es gut, wenn nicht hatte ich mein Spaß.
Aber im Moment sieht es recht gut aus.
Ich sehe das etwas anders. Evlt. hilft es ja irgendeinen weiter. Wenn nicht dann nicht. Das spielt für meine keine rolle.aber bis auf die Knochen will ich micht nicht blamieren.....
hmmm ich habe keine Ahnung von Editoren, aber wenn du einen Text reinlädst, der 10000 Zeichen hat, dürfte das mit 10000 Objekten nicht sehr speicherlastig und langsam werden?
Eigentlich schon. Aber die ObjectList ist schon zimlich schnell wie immer alle sagen, wenn alles läuft kann ich sie problemlos austauschen gegen eine Doppelt Verkette Liste. Da hatte ich mal was geschrieben.
Das ist immer die frage wie man die Buchstaben verwaltet.
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 423
- Registriert: Di 5. Feb 2008, 12:45
- OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
- CPU-Target: 64Bit
- Kontaktdaten:
Doch das ist es. Wenn kein Beispiel dabei wäre, wäre die Komponente fast nicht nutzbar, da keiner spontan auf so einen Code kommt.Christian hat geschrieben:Ja braucht man, und ?
Ist doch nicht viel.
LodfromFile versteht hingegen jeder....
Na ja, seis drum, ich habe jetzt den Code und die Komponenten in eine neue Komponente zusammengefasst und mir selbst nun ein LoadFromFile gebastelt....
Danke @all
Bye
Alexander
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu
www.alexanderroth.eu
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Das ist kein Argument !!! Die Komponente Parst doch die HTML Datei sowieso. Dann könnte die auch so an die Bilder kommen. Ich weiß aber nicht ob ich diese Komponente meint. Ich meine eine die ich verbinden muss mit einer anderen.nicht wie kommt die Komponente dann an Bilder ?
Und da ist das laden eine Zeile !!!
Ach ja und die Komponente die ich meine versteht meine ich bis HTML3 und auch mit CSS Unterstützung.
MFG
Michael Springwald
Michael Springwald