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.