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 Bild in TRichEdit einfügen (https://www.delphipraxis.net/149110-bild-trichedit-einfuegen.html)

Schwedenbitter 14. Mär 2010 20:55


Bild in TRichEdit einfügen
 
Hallo,

ich benutze TurboDelphi und tue mich daher grundsätzlich schwer, zusätzliche Komponenten zu benutzen. Außerdem ist mein Programm mit mehreren tausend Zeilen schon fertig, so dass ich auch von daher gern bei TRichEdit bleiben möchte!

Wie bekomme ich dort ein Bild (z.B. TBitmap) hinein?

Ich habe im Netz nur Hilfen gefunden, wie man das mit fremden Komponenten machen kann. Einziger Strohhalm schien mir das hier. Davon ausgehen habe ich das probiert, was aber leider nicht klappt:
Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender: TObject);
Var
   Bild       : TImage;
Begin
   Bild:=TImage.Create(nil);
   Try
      Bild.Picture.Bitmap.LoadFromFile('test.bmp');
      RichEdit1.InsertControl(Bild);
   Finally
      Bild.Free;
   End;
End;
Kann mir bitte jemand helfen?

Gruß, Alex

Bernhard Geyer 14. Mär 2010 20:56

Re: Bild in TRichEdit einfügen
 
Das geht beim normalen TRichEdit nicht in älteren Delphi-Versionen. Das RichEdit von der JVCL würde das können, aber das kannst du ja nicth in der kostenlosen TurboDelphi-Version installieren. Müsstest das also per Code anlegen.

Schwedenbitter 14. Mär 2010 21:06

Re: Bild in TRichEdit einfügen
 
Hallo Bernhard

Zitat:

Zitat von Bernhard Geyer
... Müsstest das also per Code anlegen.

Das war mir schon (fast) selbst klar.
Zum einen habe ich in der Online-Hilfe keine Funktion gefunden, die mir hilfreich schien und zum anderen wurde das beim Suchen im Netz immer absehbarer.

Kann mir da jemand irgend welche Code-Vorschläge machen?
Hast das mit dem Stream (Siehe mein Link oben) schon einmal jemand probiert?


[EDIT]Gibt es irgendwo eine Anleitung, wie man Code von Visual C ++ nach Delphi übersetzt? Falls ja, dann könnte das hier mir und ggf. anderen helfen.[/EDIT]

Gruß, Alex

DeddyH 15. Mär 2010 08:49

Re: Bild in TRichEdit einfügen
 
Ich denke, Bernhard meint, dass Du die JVCL "installieren" sollst, d.h. bei TDE: Such-/Bibliothekspfad erweitern. Dann kannst Du die benötigten Komponenten per Code erzeugen und entsprechend initialisieren.

Schwedenbitter 16. Mär 2010 08:53

Re: Bild in TRichEdit einfügen
 
Hallo DeddyH,

es muss auch mit dem stink normalen TRichEdit funktionieren. Ich zitiere dazu nochmal meinen Link aus dem ersten Post wie folgt:
Zitat:

After quite a bit of searching the net, I found that there was no easy way to insert an image into a RichEdit. Inserting a bitmap as an object worked well enough, but the user can still open it up and edit it, and the image had to be an existing file ...
Der Fettdruck ist von mir. My english is not so good, but wenn ich das oben lese, dann scheint es zu klappen. Der Poster bemängel doch "nur", dass der Benutzer Änderungen vornehmen kann. Das wäre mir egal, wenn ich nur das Bild angezeigt bekäme.

TRichEdit bietet nun 4 in Betracht kommende Möglichkeiten:
  • Procedure InsertComponent();
  • Procedure InsertControl();
  • Function Lines.AddObject();
  • Procedure Lines.InsertObject();
Die ersten beiden Varianten will mein Compiler nicht; auch ein Cast (ausgehend von TBitmap) funktioniert bei mir nicht. TImage kann ich einfügen, bekomme es aber nicht angezeigt.
Bei den zweiten beiden Varianten, scheint es zu klappen. Nur sehe ich - ehrlich gesagt hatte ich auch nichts anderes erwartet - statt des Bildes nur den Text...

Ich habe bereits versucht, mich auf den delphipages anzumelden. Das hat mehr oder weniger auch geklappt. Ich kann mich einloggen. Aber da ich keine Mail zum Bestätigen bekommen habe, kann ich nichts posten :wall:

Mit den vorgeschlagenen Komponenten ist das so eine Sache. Ich hatte ja bereits geschrieben, dass mein Programm steht. Ich müsste dann wegen der einen Komponente meinen funktionieren Code abändern. Das tue ich nur sehr sehr ungern.

Ich brauchte also noch immer Hilfe.

Gruß, Alex

Bernhard Geyer 16. Mär 2010 09:01

Re: Bild in TRichEdit einfügen
 
Zitat:

Zitat von Schwedenbitter
es muss auch mit dem stink normalen TRichEdit funktionieren. Ich zitiere dazu nochmal meinen Link aus dem ersten Post wie folgt:
Zitat:

After quite a bit of searching the net, I found that there was no easy way to insert an image into a RichEdit.

Nö, muss es nicht. Unten spricht er von RxRichEdit und RichTextBox.

Der mitgelieferte Wrappre von TRichEdit geht um eine alte Version des Win32-Controls und das ist AFAIK der Grund wieso Bilder nicht unterstützt werden.
Lade doch mal ein vorhandenes RTF mit Bild. Es wird int TRichEdit nicht sichtbar sein. Also wirst du per Code auch keine sichtbar hinzufügen können.

Matze 16. Mär 2010 09:22

Re: Bild in TRichEdit einfügen
 
Vielleicht funktioniert folgender Umweg:

- dynamisch ein TImage erstellen
- Bitmap ins TImage laden
- TImage per "InsertControl()" dem RichEdit zuweisen.

Aber ob das geht, weiß ich nicht.

Schwedenbitter 16. Mär 2010 09:35

Re: Bild in TRichEdit einfügen
 
@ Matze
Zitat:

Zitat von Matze
Aber ob das geht, weiß ich nicht.

Eine sehr gute Idee :wink:, die ich auch schon probiert hatte und die leider nicht klappt :( .

@Bernhard Geyer
Stimmt - leider. Ich habe eine rtf-Datei mit Bild und Text geladen. Der Text wird angezeigt, das Bild nicht. Schade dass niemand schon eher auf diese "Beweisführung" gekommen ist, das hätte mir eine Menge Zeit und Tüftelei erspart.
Wo finde ich nochmal die unit(s) nur mit der / für die Komponente, die ich brauche? :-D Ich würde mir nur ungern die Gesamte Bibliothek runterladen und dann womöglich ewig nach der Komponente suchen...

Gruß, Alex

p80286 16. Mär 2010 10:11

Re: Bild in TRichEdit einfügen
 
Hallo zusammen,

ich hab ein wenig gespielt:
eine RTF-Datei mit Word erstellt (mit Bild),
In einen Richtext geladen (LoadfromFile)
eine weitere Zeile hinten dran gepackt (Lines.Add)
in anderer Datei gespeichert (SavetoFile)

und siehe da, das Bild ist weg;

Was aber auch durch die RTF-Definition gestützt wird. Der RTF-Interpreter darf, was er nicht kennt ignorieren, und das Delphi-RTF (Turbo/D2006) scheint keine Bilder zu kennen.

Wenn es reicht in die Ausgabe ein Bild zu packen, dann ist der Link aus #1 ein ganz guter Ausgangspunkt.

Gruß
K-H

Matze 16. Mär 2010 10:22

Re: Bild in TRichEdit einfügen
 
Zitat:

Zitat von Schwedenbitter
Wo finde ich nochmal die unit(s) nur mit der / für die Komponente, die ich brauche? :-D Ich würde mir nur ungern die Gesamte Bibliothek runterladen und dann womöglich ewig nach der Komponente suchen...

Die einzelnen Units gibt's im SVN der JVCL (JvRichEdit.pas).
Du wirst allerdings weitere Units benötigen, wie die Uses-Liste der JvRichEdit.pas zeigt:

Delphi-Quellcode:
uses
  JVCLVer, JvExStdCtrls;
Die JVCLVer.pas benötigt wiederum:

Delphi-Quellcode:
uses
  JclUnitVersioning;
...

Entweder du klickst dich da durch und sucht alles nötige heraus oder du installierst die gesamte JVCL (wobei diese evtl. etwas überteieben ist, wenn du nur das RichEdit benötigst).

Grüße, Matze

BUG 16. Mär 2010 10:26

Re: Bild in TRichEdit einfügen
 
Irgendwo habe ich mal gelesen, das RichEdit eine ActiveX Steuerelement ist und man die aktuelle Variante mit einem ActiveX-Import nutzten kann. Aber frag mich nicht wo das stand (oder ob das stimmt) :gruebel:

Schwedenbitter 16. Mär 2010 10:50

Re: Bild in TRichEdit einfügen
 
Erstmal Danke an alle Antwortenden!

Zitat:

Zitat von Matze
...
Entweder du klickst dich da durch und sucht alles nötige heraus oder du installierst die gesamte JVCL (wobei diese evtl. etwas überteieben ist, wenn du nur das RichEdit benötigst).

Ich werde mich dann wohl durchklicken müssen. Denn bei TurboDelphi kann ich keine Fremdkomponenten installieren.

Zitat:

Zitat von p80286
Wenn es reicht in die Ausgabe ein Bild zu packen, dann ist der Link aus #1 ein ganz guter Ausgangspunkt.

Die Ergebnisse bei Deinem Spiel hatte ich ja leider auch schon. Das ist ja das Problem.
Es reicht mir auch, das Bild nur in die Ausgabe zu packen. Wenn Du mir also sagen kannst, wie ich das mit dem Hinweis aus meinem Link schaffen kann, dass wäre das einfach grandios! :lol: Ich komme damit eben leider nicht weiter. Da ich den Link vor meinem ersten Post hatte, würde es diesen sonst nicht geben.

Nur zur Erklärung:
Ich habe ein Chat-Programm geschrieben. In diesem benutze ich sowieso schon farbige Kodierungen für Kopfzeilen wie "Sie schrieben an ...", "... schrieb am ... um ..." usw. Schön wäre es nur, wenn man so etwas wie Smilies einbauen könnte. Und genau hier komme ich eben nicht weiter...

Gruß, Alex

Matze 16. Mär 2010 10:57

Re: Bild in TRichEdit einfügen
 
Hier mal ein ganz anderer Ansatz. So würde ich es vermutlich machen:

Du könntest eine Browser-Komponente (EmbeddedWB, TWebBrowser, TMozillaBrowser, ...) für die Ausgabe nutzen. Flexibler als damit wirst du wohl nie sein.

Bei jedem Hinzufügen änderst du den HTML-Code:

Code:
<div>
    <h1 style="color: #FF0000, font-size: ...">Geschrieben von ...</h1>
    Chat-Text [img]./smilies/smile.gif[/img] ...
</div>
oder so in der Art. Das hat auch den Vorteil, dass du alle gängigen Grafikformate unterstützt etc. pp.
Du müsstest die Smiley-Codes dann durch <img ... /> ersetzen.

Grüße, Matze

Schwedenbitter 16. Mär 2010 13:19

Re: Bild in TRichEdit einfügen
 
Hallo,

die Idee mit dem TWebBrowser hat etwas für sich:

Ich sitze jetzt schon ewig daran, die Units für dir JvRichEdit.pas zu isolieren und in (m)ein Projekt-Verzeichnis zu kopieren. Das Problem ist aber, dass ich auch nach langem Suchen eine (möglicherweise später auch mehr) Datei nicht finden kann. Konkret geht es um die jcld10.inc. Und ohne die geht es nicht weiter...

Wenn ich Dich richtig verstehe, dann ändere ich die html-Seite und mache einfach ein reload?
Das setzt aber voraus, dass ich die Seite dann immer erstelle. Oder gibt es eine (mir unbekannte) Möglichkeit, html-Code dynamisch im Speicher oder gleich im Speicherbereich des TWebBrowser zu erzeugen?

Gruß, Alex

Matze 16. Mär 2010 13:33

Re: Bild in TRichEdit einfügen
 
Ich sehe auf Anhieb nur die jcl.inc. Die jcld10.inc (falls es die gibt) müsste auch irgendwo im JCL-Verzeichnis sein (nicht im JVCL-Verzeichnis).

Ich meine, dass es schon Themen bzgl. des Veränderns von HTML-Code hier gab. Suche einfach mal danach. Wirst du nicht fündig, dann erstelle bitte ein separates Thema, in dem du fragst, wie das funktioniert.

p80286 16. Mär 2010 13:50

Re: Bild in TRichEdit einfügen
 
Die Idee mit dem Webbrowser/HTML-Text finde ich auch gut, da es da relativ einfach ist eine Grafik zu integrieren.

Hier noch kurz zum Link aus #1
Delphi-Quellcode:
function BitmapToRTF(pict: TBitmap): string;
var
bi,bb,rtf: string;
bis,bbs: Cardinal;
achar: ShortString;
hexpict: string;
I: Integer;
begin
  GetDIBSizes(pict.Handle,bis,bbs);
  SetLength(bi,bis);
  SetLength(bb,bbs);
  GetDIB(pict.Handle,pict.Palette,PChar(bi)^,PChar(b b)^);
  [b]rtf := '{\rtf1 {\pict\dibitmap ';[/b] {------------------------"Header für Bilddaten}
{--------------- Auslesen Bilddaten und erstellen Bild-RTF-String (hexpict) -------}
  SetLength(hexpict,(Length(bb) + Length(bi)) * 2);
  I := 2;
  for bis := 1 to Length(bi) do
  begin
    achar := Format('%x',[Integer(bi[bis])]);
    if Length(achar) = 1 then
      achar := '0' + achar;
    hexpict[I-1] := achar[1];
    hexpict[I] := achar[2];
    Inc(I,2);
  end;
  for bbs := 1 to Length(bb) do
  begin
    achar := Format('%x',[Integer(bb[bbs])]);
    if Length(achar) = 1 then
      achar := '0' + achar;
    hexpict[I-1] := achar[1];
    hexpict[I] := achar[2];
    Inc(I,2);
  end;

  rtf := rtf + hexpict + ' }}'; {------ Zusammenführen}

  Result := rtf;
end;
(Das ist nicht auf meinem Mist gewachsen! von mir sind nur die Kommentare und ein wenig Format)

Was die Positionierung innerhalb der RTF-Datei angeht, solltest Du Dich am besten am (Word)-Original orientieren, Vorsicht, da gibt's auch Unterschiede (Shape und Image und..) aber ich hab die Details gerade nicht zur Hand.

Nimm die HTML-Lösung, die ist einfacher in den Griff zu kriegen.

Gruß
K-H

Grolle 16. Mär 2010 14:54

Re: Bild in TRichEdit einfügen
 
Hallo,
du könntest dir alternativ die HTML Controls von TMS ansehen, Für deinen Zweck sind die perfekt. Ich nutze diese auch für dynamischen Content. Infos z. B. hier ....

Viele Grüße ...

Schwedenbitter 16. Mär 2010 15:15

Re: Bild in TRichEdit einfügen
 
Zitat:

Zitat von p80286
Hier noch kurz zum Link aus #1

Den Code hatte ich bei mir bereits optimiert am Laufen. Wenn ich das einfügte und die rtf-Datei sofort speicherte, dann sah ich das Bild, wenn es z.B. mit dem WordPad von M$ geöffnet wurde. Daher hatte ich mich dann quasi in diese "Lösung" verbissen.

html hat aber auch einen entscheidenden Vorteil: Es spart Platz. Bei BitmapToRTF(); werden die Bildpunkte de facto als menschenlesbare Zahlenpaare gespeichert. Das kostet schon für jedes einzelne Bild immens Speicher und wenn dann mehr dabei sind eben mehr ... Ich hatte für meine Tests ein 125 KB Bild (bmp) genommen, wodurch die rtf-Datei nachher ca. 300 KB groß wurde. Da ich aber nur Smilies wollte, hatte ich mich auch damit schon abgefunden.

Mache mich jetzt auf die Suche nach einer Möglichkeit mit html, was mit TRichEdit wohl tatsächlich nichts mehr zu tun hat.

Danke an dieser Stelle schon einmal an alle Mithelfenden, auch wenn neue Ideen immer willkommen sind!

Gruß, Alex

Schwedenbitter 27. Jun 2011 21:00

AW: Re: Bild in TRichEdit einfügen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich antworte mir hier mal selber.
Das Problem habe ich jetzt etwas unorthodox gelöst. Hierzu benutze ich den Font 'Emoticons' von hier. Wenn dann jemand z.B. : - ) eingibt, wird diese Zeichenfolge durch das entsprechende Zeichen aus diesem und nebst diesem Font ersetzt. Lediglich Farbe kann er und damit auch meine Lösung nicht bieten. Aber vermutlich wäre das auch nur eine Frage, ob man das nicht mit einem Fonteditor noch nachholen könnte.

Anbei der Quelltext nebst exe zum Probieren für geneigte Leser ...

Gruß, Alex

himitsu 27. Jun 2011 22:35

AW: Bild in TRichEdit einfügen
 
Man kann den Internet Explorer / TWebBrowser die Bilddatan auch direkt im src-Attribut mitgeben oder man gibt im einen ResourceLink, womit er de Dilddatei direkt aus den EXE-Resourcen (oder irgendeiner anderen EXE/DLL) rauslesen kann.

Die Bilddateien muß man jedenfalls nicht direkt/einzeln auf der Platte rumliegen haben.

spartakus 29. Jun 2011 01:07

AW: Bild in TRichEdit einfügen
 
Liste der Anhänge anzeigen (Anzahl: 1)
wenn du nur einfach das Bild einfügen willst,
versucht mal so: (editieren wird nichts!)
Code:
procedure TForm1.Button2Click(Sender: TObject);
var
 Img: TImage;
begin
RichEdit1.Left := 10;
Img:= TImage.Create(RichEdit1);
Img.Left := 30;
Img.Top := 30;
Img.Picture.LoadFromFile('bild.bmp');
Img.Parent := RichEdit1;
 end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:42 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