Webseitenmarkiertes direkt ins TDBVRichViewEdit kopieren

General TRichView support forum. Please post your questions here
Post Reply
j&b
Posts: 201
Joined: Mon Sep 05, 2005 1:35 pm

Webseitenmarkiertes direkt ins TDBVRichViewEdit kopieren

Post by j&b »

Ich möchte einen markierten Bereich (enthält formatierten Text und eine Grafik) über Strg+c kopieren und über Strg+v in mein TDBVRichViewEdit-Memo einfügen (ohne den Zwischenschritt über WORD gehen zu müssen).
Ich habe es mit KI so weit hinbekommen, dass der markierte Text mit den Schriftattributen zu 9x % korrekt ins Memo übergeben wird. Eine im Text enthaltene Grafik wird zwar in die Zwischenablage übernommen, aber nicht ins Memo übergeben.
Wer hat einen Code für W11, D7, TDBVRichViewEdit Version v24.0.1, der beides ins Memo übergibt?
j&b
Posts: 201
Joined: Mon Sep 05, 2005 1:35 pm

Re: Webseitenmarkiertes direkt ins TDBVRichViewEdit kopieren

Post by j&b »

Zum besseren Verständnis:

Es soll heißen:
Markiertes aus Webseiten direkt ins TDBVRichViewEdit kopieren

Beispiel siehe ganz unten

Mein Code sieht bisher so aus:

1.
unit xxx;
interface
uses
Windows, Messages, ...., jpeg,clipbrd, RVClipboard, RVFile, ...

2.
procedure TForm1.FormCreate(Sender: TObject);
var ...
begin
...
//zusätzlich:
memo.AcceptPasteFormats := memo.AcceptPasteFormats + [rvddHTML]; //HTML-Einfügen dauerhaft erlauben
memo.Options := memo.Options + [rvoShowGridLines];
//memo.HTMLImportOptions := memo.HTMLImportOptions + [rvhtmlioNoImages];
memo.OnImportFile := nil; //stellt sicher, dass kein altes Event im Hintergrund aktiv ist:
end; //of FormCreate

3.
procedure TForm1.memoPaste(Sender: TCustomRichViewEdit; var DoDefault: Boolean);
var //memo (TDBRichViewEdit) - Ereignisse - OnPaste doppelklicken
HtmlFormatID: Word;
DataHandle: THandle;
DataPtr: Pointer;
HtmlStr: String;
CleanStr: String;
StartPos, EndPos: Integer;
begin
// 1. Registriert das Windows-HTML-Format
HtmlFormatID := RegisterClipboardFormat('HTML Format');

if memo.CanPasteHTML then begin
// 2. Zwischenablage öffnen und das echte HTML auslesen
Clipboard.Open;
try
if Clipboard.HasFormat(HtmlFormatID) then begin
DataHandle := Clipboard.GetAsHandle(HtmlFormatID);
if DataHandle <> 0 then begin
DataPtr := GlobalLock(DataHandle);
try
HtmlStr := PChar(DataPtr);
finally
GlobalUnlock(DataHandle);
end;
end;
end;
finally
Clipboard.Close;
end;

// 3. DER ABSTURZ-FILTER: Alle <img...>-Tags restlos aus dem Text löschen
//wg. Bereichprüfungsfehler + (anschließend -OK+F9-) Unbekannte Bilddateierweiterung (.webp?v=1762252438)
CleanStr := HtmlStr;
while Pos('<img', LowerCase(CleanStr)) > 0 do begin
StartPos := Pos('<img', LowerCase(CleanStr));
EndPos := Pos('>', Copy(CleanStr, StartPos, MaxInt));
if EndPos > 0 then
Delete(CleanStr, StartPos, EndPos)
else
Delete(CleanStr, StartPos, 5);
end;

// 4. DER ENTSCHEIDENDE SCHRITT: Zwischenablage vollständig bereinigen
Clipboard.Open;
try
Clipboard.Clear; // Vernichtet das störende RTF-Format des Browsers samt der Bildfehler!

// ' sauberes' HTML zurückschreiben
DataHandle := GlobalAlloc(GMEM_MOVEABLE, Length(CleanStr) + 1);
if DataHandle <> 0 then begin
DataPtr := GlobalLock(DataHandle);
try
Move(PChar(CleanStr)^, DataPtr^, Length(CleanStr) + 1);
finally
GlobalUnlock(DataHandle);
end;
SetClipboardData(HtmlFormatID, DataHandle);
end;
finally
Clipboard.Close; // Gibt die Tastatur sofort wieder für Windows frei!
end;

// 5. Parser übernimmt sauberes HTML - Ein Absturz in RVClasses ist unmöglich, da keine Bilder mehr existieren!
memo.PasteHTML;
DoDefault := False;
end;
end;

procedure TForm1.memoImportFile(Sender: TCustomRichView; const Location: TRVUnicodeString; out Content: TStream);
begin //memo (TDBRichViewEdit) - Ereignisse - OnImportFile doppelklicken
Content := nil; //Stream auf nil etzen
end;
Attachments
WebMarkiertes.jpg
WebMarkiertes.jpg (54.82 KiB) Viewed 133 times
Sergey Tkachenko
Site Admin
Posts: 18203
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Re: Webseitenmarkiertes direkt ins TDBVRichViewEdit kopieren

Post by Sergey Tkachenko »

Aus welcher Anwendung kopieren Sie das Dokument?
Welches Bildformat hat es? Falls es WebP ist: Verfügt Ihre Anwendung über eine Grafikklasse, die WebP unterstützt?

Wenn Sie Delphi 7 verwenden, ist mir leider nicht bekannt, wie man WebP-Unterstützung hinzufügt. Möglicherweise bieten einige Drittanbieterklassen diese Funktion. In neueren Delphi-Versionen wird diese Unterstützung von Skia bereitgestellt. Sie müssen Skia aktivieren und die Unit RVSkia in Ihr Projekt einbinden.

---

Which application are you copying the document from?
What image format is it? If it's WebP, does your application have a graphics class that works with WebP?

If you're using Delphi 7, unfortunately, I don't know how to add WebP support. Perhaps some third-party classes support it.
In newer versions of Delphi, this support is provided by Skia. You need to enable Skia and include the RVSkia unit in your project.
j&b
Posts: 201
Joined: Mon Sep 05, 2005 1:35 pm

Re: Webseitenmarkiertes direkt ins TDBVRichViewEdit kopieren

Post by j&b »

Aus welcher Anwendung kopieren Sie das Dokument?

Meinen Sie den geposteten Code oder die Grafik?
Der Code ergab sich aus dem Dialog mit Googles KI-Modus.
Prompt:
1. Markiertes (Strg+c) aus einer Webseite ins Delphi 7 TDBRichViewEdit einfügen
2. Wenn Rückmeldung: Prompt: Markiertes enthält formatierten Text und Grafiken

Nach wirklich vielen Vorschlägen und Tests, ergab sich der einzige fehlerfreie Code, allerdings ohne Grafiken (siehe Prozedure 3. und 4. (procedure TForm1.memoPaste)

Die kopierte Ausschnitt stammt von
https://solarhandel24.de/products/arli- ... 3ea7&_ss=r
(langsam nach unten scrollen, rechter Seitenrand)
und wurde mittels Strg+c kopiert und (sofort) über Strg+v ins TDBRIchViewEdit eingefügt.

Hintergedanke:
Kann man das Einfügen erst in WORD, dann erneutes Kopieren (Strg+c) mit anschließendem Einfügen (Strg+v) in die TDBRIchViewEdit-Komponente nicht umgehen.

Welches Bildformat hat es? Falls es WebP ist: Verfügt Ihre Anwendung über eine Grafikklasse, die WebP unterstützt?
Bildformat weiß ich nicht. WebP habe ich wohl nicht.

Zu WebP sagt Googles KI (Prompt: Unterstützt Delphi 7 biw. TrichView Action WebP)
Delphi 7 und ältere Versionen von TRichView bzw. RichViewActions bieten keine native, direkte Unterstützung für das WebP-Format.
Wichtige Details
• Keine Hausmittel: Delphi 7 hat keine eingebauten Klassen zum Laden von WebP-Dateien (wie es sie für JPEG oder BMP gibt).
• TRichView-Limitierung: WebP-Unterstützung wurde erst in neueren TRichView-Versionen (ab Version 22.0) über die Integration von Skia4Delphi hinzugefügt. Diese modernen Bibliotheken setzen jedoch neuere Delphi-Versionen voraus. [1, 2, 3, 4]
Workarounds
• Sie können WebP-Bilder manuell über eine externe Drittanbieter-Bibliothek für Delphi (z. B. eine Delphi-Portierung von Google libwebp) in ein von Delphi 7 unterstütztes Format (wie Bitmap oder JPEG) konvertieren.
• Das konvertierte Bild lässt sich danach problemlos in TRichView einfügen. [1, 2]

Ist der von der KI-skizziete Weg realistisch? Ich frage nur, weil ich keine Lust mehr habe, stundenlang Vorschläge zu testen, die dann doch nicht fehlerfrei (oder umsetzbar) sind.
Sergey Tkachenko
Site Admin
Posts: 18203
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Re: Webseitenmarkiertes direkt ins TDBVRichViewEdit kopieren

Post by Sergey Tkachenko »

eider ist dieser Code nicht sinnvoll.

Bevor PasteHTML aufgerufen wird, entfernt er sämtliche <img>-Tags aus dem HTML. Deshalb ist es nicht überraschend, dass im eingefügten Inhalt keine Bilder mehr vorhanden sind.

Möglicherweise haben Sie die KI darum gebeten, dies zu tun, weil beim Einlesen der Bilder Exceptions aufgetreten sind. Diese Exceptions sind jedoch normal und zu erwarten. Sie werden von der Komponente intern behandelt und sind nur sichtbar, wenn Sie die Anwendung in der Delphi-IDE debuggen.

Sie entstehen, weil TRichView zunächst versucht, die Bilder so zu laden, als wären sie lokale Dateien. In den meisten Fällen befinden sich die Bilder jedoch auf einem entfernten Server und werden über HTTP- oder HTTPS-URLs referenziert. Ohne zusätzlichen Code kann TRichView diese Bilder daher nicht laden.

Für dieses Problem gibt es eine richtige Lösung, die ich weiter unten beschreiben werde. Das Entfernen aller Bilder (aller <img>-Tags) aus dem HTML ist jedenfalls nicht die richtige Vorgehensweise.

Ich möchte zunächst nur darauf hinweisen, dass überhaupt kein zusätzlicher Code erforderlich ist, wenn die Option rvddHTML in memo.AcceptPasteFormat enthalten ist. In diesem Fall wird HTML aus Webbrowsern beim Drücken von Strg+V automatisch in den Editor eingefügt.

Wenn Sie sicherstellen möchten, dass tatsächlich immer HTML eingefügt wird, können Sie die Tastenkombination selbst behandeln und einfach memo.PasteHTML aufrufen. Der gesamte übrige Code ist überflüssig.



Unfortunately, this code is not useful.

Before calling PasteHTML, it removes all <img> tags from the HTML. Therefore, it is not surprising that there are no images in the inserted content.

Perhaps you asked the AI to do this because you encountered exceptions while TRichView was trying to load images. However, these exceptions are normal and expected. They are handled by the component internally, and you will only notice them when debugging the application in the Delphi IDE.

These exceptions occur because TRichView first tries to load the images as if they were local files. In most cases, they are actually located on a remote server and referenced by HTTP or HTTPS URLs, so TRichView cannot load them without additional code.

There is a proper solution to this problem, which I will describe below. Removing all images (all <img> tags) from the HTML is definitely not the right approach.

For now, I would just like to point out that if the rvddHTML option is included in memo.AcceptPasteFormat, you do not need to write any code at all. Pressing Ctrl+V will automatically paste HTML from web browsers into the editor.

If you want to make sure that HTML is always used, you can handle the keyboard shortcut yourself and simply call memo.PasteHTML. The rest of the code is unnecessary.
Sergey Tkachenko
Site Admin
Posts: 18203
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Re: Webseitenmarkiertes direkt ins TDBVRichViewEdit kopieren

Post by Sergey Tkachenko »

Nun dazu, wie Bilder von entfernten Servern geladen werden können.

Dazu muss das Ereignis OnImportPicture behandelt werden. In diesem Ereignis werden die Bilder heruntergeladen. Am einfachsten geht das mit der Indy-Komponente TIdHTTP, die normalerweise standardmäßig mit Delphi installiert wird.

Wenn Sie RichViewActions verwenden, können Sie diese Funktionalität auch ohne eigenen Code aktivieren. Falls erforderlich, kann ich erklären, wie das gemacht wird.

Wenn Sie RichViewActions nicht verwenden, weisen Sie memo.OnImportPicture einen Ereignishandler zu und verwenden Sie beispielsweise folgenden Code:

Code: Select all

procedure TMyForm.memoImportPicture(
  Sender: TCustomRichView;
  const Location: TRVUnicodeString;
  Width, Height: Integer;
  var Graphic: TRVGraphic);
var
  Stream: TMemoryStream;
begin
  if (Pos('http://', AnsiLowerCase(Location)) = 1) or
     (Pos('https://', AnsiLowerCase(Location)) = 1) then
  begin
    Stream := TMemoryStream.Create;
    try
      try
        IdHTTP1.Get(Location, Stream);
        Stream.Position := 0;
        Graphic := RVGraphicHandler.LoadFromStream(Stream);
      except
        Graphic := nil;
      end;
    finally
      Stream.Free;
    end;
  end;
end;
Dieser Ereignishandler prüft, ob es sich bei der Bildadresse um eine HTTP- oder HTTPS-URL handelt. Ist dies der Fall, wird das Bild in einen Speicherstream heruntergeladen und anschließend mit RVGraphicHandler.LoadFromStream geladen.

Um das HTTPS-Protokoll zu unterstützen, platzieren Sie eine TIdSSLIOHandlerSocketOpenSSL-Komponente (IdSSLIOHandlerSocketOpenSSL1) auf dem Formular und weisen Sie sie der Eigenschaft IdHTTP1.IOHandler zu.
Setzen Sie außerdem:
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvSSLv23;
Dadurch kann TIdHTTP Bilder sowohl über HTTP- als auch über HTTPS-URLs herunterladen.



Now, let us look at how to load images from remote servers.

To do this, handle the OnImportPicture event and download the images there. The simplest way is to use the Indy TIdHTTP component, which is normally included with Delphi by default.

If you use RichViewActions, you can enable this functionality without writing any code. I can explain how to do that if necessary.

If you do not use RichViewActions, assign a handler to memo.OnImportPicture and use code similar to the following:

Code: Select all

procedure TMyForm.memoImportPicture(
  Sender: TCustomRichView;
  const Location: TRVUnicodeString;
  Width, Height: Integer;
  var Graphic: TRVGraphic);
var
  Stream: TMemoryStream;
begin
  if (Pos('http://', AnsiLowerCase(Location)) = 1) or
     (Pos('https://', AnsiLowerCase(Location)) = 1) then
  begin
    Stream := TMemoryStream.Create;
    try
      try
        IdHTTP1.Get(Location, Stream);
        Stream.Position := 0;
        Graphic := RVGraphicHandler.LoadFromStream(Stream);
      except
        Graphic := nil;
      end;
    finally
      Stream.Free;
    end;
  end;
end;
This handler checks whether the image location is an HTTP or HTTPS URL. If it is, the image is downloaded into a memory stream and then loaded using RVGraphicHandler.LoadFromStream.

To support HTTPS, place a TIdSSLIOHandlerSocketOpenSSL component (IdSSLIOHandlerSocketOpenSSL1) on the form and assign it to the IdHTTP1.IOHandler property.
Also set:
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvSSLv23;
This enables TIdHTTP to download images from both HTTP and HTTPS URLs.
Sergey Tkachenko
Site Admin
Posts: 18203
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Re: Webseitenmarkiertes direkt ins TDBVRichViewEdit kopieren

Post by Sergey Tkachenko »

Von den im Web üblichen Bildformaten unterstützt Delphi 7 nur JPEG (über die Klasse TJPEGImage). Für andere Bildformate werden Bibliotheken von Drittanbietern benötigt.

Ich empfehle insbesondere:
- TPngObject von Gustavo Huffenbacher Daud
- TGifImage von Anders Melander

Download-Links sowie den Code, mit dem sich diese Klassen in TRichView verwenden lassen, finden Sie hier:
https://www.trichview.com/forums/viewtopic.php?t=89

Was WebP betrifft, sollte Ihr Ansatz, WebP-Bilder vor dem Laden in TRichView in ein anderes Format zu konvertieren, tatsächlich funktionieren. Ich habe kurz recherchiert und festgestellt, dass libwebp bereits nach Delphi portiert wurde. Der Code für die Konvertierung kann im Ereignis OnImportPicture eingefügt werden, bevor das Bild in TRichView geladen wird.

Bevor Sie diesen Aufwand betreiben, sollten Sie jedoch zunächst klären, wie wichtig die Unterstützung von WebP für Ihren Anwendungsfall überhaupt ist. Möglicherweise enthalten Ihre Dokumente gar keine WebP-Bilder.



The next issue is image formats.

Among the image formats commonly used on the web, Delphi 7 only supports JPEG (through the TJPEGImage class). Support for other image formats requires third-party libraries.

In particular, I recommend:
- TPngObject by Gustavo Huffenbacher Daud
- TGifImage by Anders Melander

You can find download links and the code required to make these classes work with TRichView here:
https://www.trichview.com/forums/viewtopic.php?t=89

As for WebP, your idea of converting WebP images to another format before loading them into TRichView should indeed work. I did a quick search and found that libwebp has already been ported to Delphi. The conversion code could be added to the OnImportPicture event before the image is loaded into TRichView.

However, before implementing this, it would be worth determining how important WebP support actually is for your application. It is quite possible that your documents do not contain any WebP images at all.
Sergey Tkachenko
Site Admin
Posts: 18203
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Re: Webseitenmarkiertes direkt ins TDBVRichViewEdit kopieren

Post by Sergey Tkachenko »

Um festzustellen, welche Bildformate Ihr HTML tatsächlich verwendet, empfehle ich den folgenden Test.

Laden Sie dieses kleine Hilfsprogramm herunter und starten Sie es:

https://www.trichview.com/support/files ... ofile2.zip

Kopieren Sie den gewünschten Ausschnitt aus Ihrem Webbrowser, starten Sie das Programm und klicken Sie auf „Paste HTML to File“.

Der Inhalt der Zwischenablage wird als Clipboard.html gespeichert.

Bitte senden Sie mir diese Datei an [email protected]. Ich werde prüfen, welche Bildformate darin verwendet werden, und Ihnen die am besten geeignete Lösung empfehlen.



To determine which image formats are actually used in your HTML, I recommend the following test.

Download and run this utility:
https://www.trichview.com/support/files ... ofile2.zip

Copy the desired fragment from your web browser, start the utility, and click "Paste HTML to File".
The HTML content from the clipboard will be saved as Clipboard.html.

Please send this file to richviewgmailcom, and I will check which image formats it contains and advise you on the best solution.
j&b
Posts: 201
Joined: Mon Sep 05, 2005 1:35 pm

Re: Webseitenmarkiertes direkt ins TDBVRichViewEdit kopieren

Post by j&b »

zugeschickt als eMail, da die Ergebnis-Datei clipboard.html sich nicht anhängen ließ
Attachments
clipboard-html.doc
(22 KiB) Downloaded 1 time
clipboard-html.doc
(22 KiB) Not downloaded yet
Sergey Tkachenko
Site Admin
Posts: 18203
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Re: Webseitenmarkiertes direkt ins TDBVRichViewEdit kopieren

Post by Sergey Tkachenko »

Anhand der Datei sehe ich zwei Probleme.

Erstens verwendet das Bild eine HTTPS-URL. Zweitens ist es im WebP-Format.

Wie ich bereits geschrieben habe, müssen Bilder mit einer HTTPS-URL zuerst heruntergeladen werden. Ich habe bereits erklärt, wie das geht.

Es gibt aber noch ein weiteres Problem. Delphi 7 wird mit einer alten Version von Indy geliefert. Wenn Sie versuchen, das Bild herunterzuladen, kann folgende Fehlermeldung erscheinen:

Could not load SSL library

Falls dieser Fehler auftritt, sollten Sie eine neuere Version von Indy herunterladen und die alte Version aus Delphi 7 ersetzen.

Leider kann ich nicht erklären, wie Indy installiert oder aktualisiert wird, da dies nicht zum technischen Support für TRichView gehört.



From the attached file, I can see two problems.

First, the image uses an HTTPS URL. Second, it is in WebP format.

As I said before, images with HTTPS URLs must be downloaded first. I already explained how to do this.

However, there is another problem. Delphi 7 comes with an old version of Indy. When you try to download the image, you may get this error:

Could not load SSL library

If this happens, the best solution is to download a newer version of Indy and replace the old one included with Delphi 7.

Unfortunately, explaining how to install or upgrade Indy is outside the scope of TRichView technical support.
Sergey Tkachenko
Site Admin
Posts: 18203
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Re: Webseitenmarkiertes direkt ins TDBVRichViewEdit kopieren

Post by Sergey Tkachenko »

Die Verwendung von libwebp zur Konvertierung von WebP-Bildern in ein anderes Format, zum Beispiel JPEG, ist eine gute Lösung für ältere Delphi-Versionen, in denen Skia nicht verwendet werden kann.

Die Delphi-Version von libwebp finden Sie hier:
https://github.com/Wykerd/delphi-webp

Wir benötigen nur zwei Dateien:
- src\libwebp.pas — dieses Unit muss zum Projekt hinzugefügt werden;
- bin\x86\libwebp.dll — diese Datei muss in den Ordner der EXE-Datei kopiert werden.

Zusätzlich füge ich das Unit Webp2Jpeg.pas bei. Ich habe dort eine Funktion hinzugefügt, die ein WebP-Bild in ein TJPEGImage konvertiert.

Mit der WebP-Unterstützung muss der Ereignishandler OnImportPicture wie folgt geändert werden:

Code: Select all

procedure TForm1.memoImportPicture(Sender: TCustomRichView;
  const Location: TRVUnicodeString; Width, Height: Integer;
  var Graphic: TGraphic);
var
  Stream: TMemoryStream;
begin
  Stream := TMemoryStream.Create;
  try
    if FileExists(Location) then
      try
        Stream.LoadFromFile(Location);
      except
      end
    else if (Pos('http://', AnsiLowerCase(Location)) = 1) or
       (Pos('https://', AnsiLowerCase(Location)) = 1) then
      try
        IdHTTP1.Get(Location, Stream);
      except;
      end;
    if Stream.Size = 0 then
      exit;

    Stream.Position := 0;
    if RVGraphicHandler.GetDataGraphicType(Stream.Memory^, Stream.Size) = rvgtWebP then
      Graphic := WebPToJpeg(Stream)
    else
      Graphic := RVGraphicHandler.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;


Using libwebp to convert WebP images to another format, such as JPEG, is a good solution for old Delphi versions that cannot use Skia.

The Delphi version of libwebp is available here:
https://github.com/Wykerd/delphi-webp

We only need two files:
- src\libwebp.pas — add this unit to the project;
- bin\x86\libwebp.dll — copy this file to the folder containing the application EXE file.

I am also attaching the Webp2Jpeg.pas unit. I added a function to this unit that converts a WebP image to TJPEGImage.

With WebP support added, the OnImportPicture event handler should be changed as follows:

<code>
Attachments
Webp2Jpeg.pas
(1.46 KiB) Downloaded 1 time
j&b
Posts: 201
Joined: Mon Sep 05, 2005 1:35 pm

Re: Webseitenmarkiertes direkt ins TDBVRichViewEdit kopieren

Post by j&b »

Ich habe dein Ereignis ".memoImportPicture(Sender: ...) ausgetauscht gegen

procedure TForm1.memoImportPicture(Sender: TCustomRichView;
const Location: TRVUnicodeString; Width, Height: Integer;
var Graphic: TGraphic);
var //Von Google KI-Modus, weil if RVGraphicHandler. unbekannt ist
Stream: TMemoryStream;
Header: array[0..3] of Char;
Jpg: TJPEGImage;
begin
Graphic := nil;
Stream := TMemoryStream.Create;
try
// 1. Bildquelle laden (lokal oder aus dem Web)
if FileExists(Location) then
begin
try Stream.LoadFromFile(Location); except end;
end
else if (Pos('http://', AnsiLowerCase(Location)) = 1) or
(Pos('https://', AnsiLowerCase(Location)) = 1) then
begin
DownloadURLToStream(Location, Stream);
end;

if Stream.Size < 12 then
Exit;

Stream.Position := 0;

// Wir lesen die ersten 4 Bytes für die Formatprüfung
Stream.Read(Header, 4);
Stream.Position := 0;

// 2. Erkennen, ob es sich um ein WebP-Bild handelt (Beginnt mit 'RIFF')
if (Header[0] = 'R') and (Header[1] = 'I') and (Header[2] = 'F') and (Header[3] = 'F') then
begin
// Wenn es ein WebP ist: Über Sergeys Unit in ein JPEG umwandeln
Graphic := WebPToJpeg(Stream);
end
else
begin
// Wenn es ein Standard-JPEG/Grafik ist: Direkt per Delphi-Klasse laden
Jpg := TJPEGImage.Create;
try
try
Jpg.LoadFromStream(Stream);
Graphic := Jpg; // Erfolgreich geladen, an TRichView übergeben
except
Jpg.Free; // Falls es kein gültiges JPG war (z.B. ein BMP oder PNG)
Graphic := nil;
end;
except
Graphic := nil;
end;
end;
finally
Stream.Free;
end;
end;

weil "RVGraphicHandler.GetDataGraphicType" ein unbekannter Bezeichner ist.

Google KI sagte dazu:

Wenn RVFuncs bereits in Ihrer uses-Klausel steht, aber Delphi den RVGraphicHandler trotzdem als „Undefinierten Bezeichner“ bemängelt, bedeutet das: In Ihrer TRichView-Version (v24.0.1 unter Delphi 7) existiert die Variable RVGraphicHandler unter diesem Namen noch nicht oder liegt in einer anderen Unit.Wir können den Code so umschreiben, dass wir den RVGraphicHandler überhaupt nicht mehr brauchen.Wir nutzen stattdessen die Standard-Grafikklassen von Delphi und TRichView direkt:Für WebP-Bilder nutzen wir wie gehabt Sergeys Funktion, die ein sauberes TJPEGImage liefert.Für Standard-Bilder (wie normale JPEGs) lassen wir Delphi das Bild über einen integrierten Mechanismus direkt in eine Standard-Grafikklasse (TJPEGImage oder TBitmap) einlesen.Die Lösung ohne RVGraphicHandler:Ersetzen Sie die Prozedur memoImportPicture in Ihrem Hauptformular durch diesen Code: siehe oben.

Was sagst du dazu?

PS: Zumindest lassen sich sich jetzt Grafiken und formatierter Text direkt ins TDBRichViewEdit einfügen.
Sergey Tkachenko
Site Admin
Posts: 18203
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Re: Webseitenmarkiertes direkt ins TDBVRichViewEdit kopieren

Post by Sergey Tkachenko »

RVGraphicHandler ist im Unit RVGrHandler definiert, nicht in RVFuncs.

Ihr Code unterstützt nur JPEG und WebP. HTML kann jedoch auch Bilder in anderen Formaten enthalten.

Deshalb empfehle ich, wieder den von mir vorgeschlagenen Code zu verwenden und zusätzlich die bereits erwähnten Drittanbieter-Klassen für PNG und GIF einzubinden.



RVGraphicHandler is defined in the RVGrHandler unit, not in RVFuncs.

Your code supports only JPEG and WebP. However, HTML may contain images in other formats.

For this reason, I recommend returning to the code I suggested and adding third-party classes for PNG and GIF support, as I explained earlier.
j&b
Posts: 201
Joined: Mon Sep 05, 2005 1:35 pm

Re: Webseitenmarkiertes direkt ins TDBVRichViewEdit kopieren

Post by j&b »

Danke für den Hinweis. Habe ich gemacht.
Ich scheine aber das Glück zu haben immer die richtigen stellen auf einer Webseite zu markieren, so dass 'Fehler' auftreten:

memoImportPicture.docx
(248.58 KiB) Downloaded 4 times
Die dazugehörige URL:
https://www.google.com/search?sca_esv=f ... ARgBIAEoAQ
Sergey Tkachenko
Site Admin
Posts: 18203
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Re: Webseitenmarkiertes direkt ins TDBVRichViewEdit kopieren

Post by Sergey Tkachenko »

Leider kann ich nicht genau dieselbe Seite reproduzieren. Google passt die Suchergebnisse individuell an, deshalb sehe ich andere Bilder als Sie.

Soweit ich verstehe, werden einige Bilder geladen und andere nicht. Aus den Informationen, die Sie mir geschickt haben, kann ich nicht erkennen, bei welchem Bildformat das Problem auftritt.

Um das festzustellen, brauche ich dieselben Daten, um die ich Sie bereits gebeten habe: Kopieren Sie den Inhalt im Browser, speichern Sie ihn mit dem Hilfsprogramm als Clipboard.html und schicken Sie mir diese Datei.

P.S. Ich hoffe, Sie haben die Unterstützung für GIF und PNG mit den von mir empfohlenen Drittanbieter-Klassen hinzugefügt. Zusammen mit JPEG gehören diese Formate zu den am häufigsten verwendeten Bildformaten im Internet.




Unfortunately, I cannot reproduce exactly the same page. Google customizes search results, so I see different images than you do.

As I understand it, some images are loaded and some are not. From the information you sent me, I cannot determine which image format causes the problem.

To find this out, I need the same data I asked for earlier: copy the content from the browser, use the utility to save it as Clipboard.html, and send this file to me.

P.S. I hope you have added GIF and PNG support using the third-party classes I recommended earlier. Together with JPEG, these are the most common image formats used on the Internet.
Post Reply