Hallo Sven,
InsertObject() ist eine Methode der Schnittstelle IRichEditOle. Du musst sie nicht selbst aufrufen, wenn du JvRichEdit.InsertGraphic() verwendest, wie du es ja bereits getan hast:
Delphi-Quellcode:
procedure TDemoForm.InsertButtonClick(Sender: TObject);
begin
with JvRichEdit do
begin
Lines.Add('first line');
Lines.Add('second line');
Lines.Add('');
SelStart := MaxInt;
InsertGraphic(Image.Picture.Graphic, False);
Lines.Add('');
Lines.Add('last line');
end;
end;
Über SelStart kannst du die Graphic an jeder beliebigen Stelle einfügen. Anschließend kannst du die Grafiken (und jedes andere
OLE-Object) so finden und ersetzen:
Delphi-Quellcode:
procedure TDemoForm.ReplaceButtonClick(Sender: TObject);
var
u: IUnknown;
reole: IRichEditOle;
i, n: Integer;
obj: TREObject;
begin
FillChar(obj, SizeOf(obj), 0);
obj.cbStruct := SizeOf(obj);
with JvRichEdit do
begin
Perform(EM_GETOLEINTERFACE, 0, Integer(@u));
if Succeeded(u.QueryInterface(IID_IRICHEDITOLE, reole)) then
begin
n := reole.GetObjectCount;
ShowMessage(Format('%d objects found', [n]));
for i := 0 to Pred(n) do
begin
if Succeeded(reole.GetObject(i, obj, REO_GETOBJ_NO_INTERFACES)) then
begin
SelStart := obj.cp;
SelLength := 1;
SelText := Format('<object %d>', [Succ(i)]);
end else ShowMessage('yikes');
end;
end;
end;
end;
Vergiss meinen Hinweis auf die Schnittstelle IRichEditOleCallBack, deren Methode DeleteObject() dient nicht zum Löschen, sondern ist ein Event Handler, den du implementieren kannst.
Getippt und nicht getestet.
Gute Nacht