Suche so etwas wie RichEdit

Rund um die LCL und andere Komponenten
alexander
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

Beitrag von alexander »

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
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu

pluto
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)

Beitrag von pluto »

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.

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

Euklid
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

Beitrag von Euklid »

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?
Hallo Alexander!

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

bembulak
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

Beitrag von bembulak »

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.
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.
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?

(Wenn ich darüber nachdenke: ich habe auf Linux noch nixgefunden, das Wordpad-Ähnlichkeit hat und out-of-the-box dabei ist.)

pluto
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)

Beitrag von pluto »

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.
MFG
Michael Springwald

bembulak
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

Beitrag von bembulak »

Ich selbst bin seit einigen Tagen dabei eine solche Komponente zu erstellen. Ich bin schon fast so weit sie zu veröffentlichen.
Du sagst aber dazu:
  • 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.
Was hat das dann für einen Sinn? Fame bekommst du nur, wenn der Versuch gut ist. Sonst hagelts wieder nur konstruktive Kritik und das Projekt schläft ein.
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.....

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:

Beitrag von monta »

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;
Johannes

alexander
Beiträge: 423
Registriert: Di 5. Feb 2008, 12:45
OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von alexander »

pluto hat geschrieben:Wie gesagt es gibt in Lazarus eine WebBrowser Komponente die das kann. Aber dann müsste der Text als HTML vorliegen.
Das ist kein Problem. Wie heißt sie?
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;
@1.: Ist das die Kompo von der Pluto spricht?
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....
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.
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?

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;
kleine Klasse:

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

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Ja braucht man, und ?
Ist doch nicht viel.

Und dir Komponente funktioniert tadellos.

Für deinen Infodialog reichen aber warscheinlich auch TLabel.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
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)

Beitrag von pluto »

@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.
aber bis auf die Knochen will ich micht nicht blamieren.....
Ich sehe das etwas anders. Evlt. hilft es ja irgendeinen weiter. Wenn nicht dann nicht. Das spielt für meine keine rolle.
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

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Ja aber kündige doch nicht immer vollmundig irgendwelche Sachen an die dann doch nie existieren. Spiel halt für dich damit rum und gut is. Die Editor Komponente kündigst du schon seit nem Jahr an.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

alexander
Beiträge: 423
Registriert: Di 5. Feb 2008, 12:45
OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von alexander »

Christian hat geschrieben:Ja braucht man, und ?
Ist doch nicht viel.
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.
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

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

LoadFromFile geht schlichtweg nicht wie kommt die Komponente dann an Bilder ? Das ist schon ein recht guter weg. Und es ist ja eben ein Beispiel da...
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
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)

Beitrag von pluto »

nicht wie kommt die Komponente dann an Bilder ?
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.

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

alexander
Beiträge: 423
Registriert: Di 5. Feb 2008, 12:45
OS, Lazarus, FPC: Linux, Lazarus svn, FPC svn
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von alexander »

pluto hat geschrieben: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.
Und wie heißt sie?
Du magst Freiheit? Gönne es auch deinem Computer mit Linux!
www.alexanderroth.eu

Antworten