Einzelnen Beitrag anzeigen

Hobbycoder

Registriert seit: 22. Feb 2017
930 Beiträge
 
#1

TJvRichEdit in Klasse verwenden

  Alt 29. Okt 2018, 18:24
Hi,

ich möchte gerne TJvRichedit in einer Klasse verwenden. Explizit geht es mir darum: Ich habe eine RTF-Text in einem Stream, den ich mit TJvRichedit in ein Picture umwandeln möchte.
Logischerweise kann ich in der Klasse kein TJvRichedit.Create(nil) erstellen: EInvalidOperation 'Element hat kein übergeordnetes Fenster'.

(TJvRichedit deshalb, weil ich die RTF's auch in diesem erzeugen).

Zur Zeit mache ich das (vor allen Dingen erst mal, um zu testen ob es funktioniert) so, dass ich mir einfach eine TForm erzeuge, die dem JvRichedit als Parent zuordne und nach dem SaveToPicture wieder freigebe.
Delphi-Quellcode:
var
  q: TUniQuery;
  t: TTerminrtftext;
  re: TJvRichEdit;
  f: TForm;
begin
  q:=TUniQuery.Create(nil);
  f:=TForm.Create(nil);
  re:=TJvRichEdit.Create(f);
  re.Parent:=f;
  re.Width:=2000;
  re.WordWrap:=False;
  try
    self.Clear;
    q.Connection:=Con;
    q.SQL.Text:='Select * from rtftexte where betriebguid=:betriebguid order by ID';
    q.Params.ParamValues['betriebguid']:=Betriebguid.ToString;
    q.Active:=True;
    while not q.Eof do
    begin
      t:=self.Items(TTextType(q.FieldByName('texttype').AsInteger));
      if t<>nil then
      begin
        t.ID:=q.FieldByName('ID').AsInteger;
        t.guid:=StringToGUID(q.FieldByName('guid').AsString);
        t.betriebguid:=StringToGUID(q.FieldByName('betriebguid').AsString);
        t.texttype:=TTextType(q.FieldByName('texttype').AsInteger);
        t.text.Position:=0;
        (q.FieldByName('text') as TBlobField).SaveToStream(t.text);
        t.text.Position:=0;
        re.Lines.LoadFromStream(t.text); //t.text=TMemoryStream
        re.SaveToImage(t.pic); //t.pic=TPicture
      end;
      q.Next;
    end;
    q.active:=False
  finally
    q.Free;
    re.Free;
    f.Free;
  end;
Das scheint zwar im ersten Moment zu funktionieren, erscheint mir aber als fehlerhafte Lösung. (Gefühlt habe ich seitdem Memoryleaks, aber da bin ich noch am erkunden).

Wie könnte für sowas eine bessere Lösung aussehen?

PS: Zusätzlich sollte ich erwähnen, dass o.g. Prozedur in einem eigenen Thread läuft.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat