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 TJvRichEdit in Klasse verwenden (https://www.delphipraxis.net/198388-tjvrichedit-klasse-verwenden.html)

Hobbycoder 29. Okt 2018 18:24

TJvRichEdit in Klasse verwenden
 
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.

hoika 29. Okt 2018 18:35

AW: TJvRichEdit in Klasse verwenden
 
Hallo,
schaue doch einfach mit FastMM4 nach Deinen MemLeaks.
Ich sehe zumindestens keine.

Statt dem Form könntest Du eigentlich auch direkt Application übergeben ?

Hier
https://stackoverflow.com/questions/...ining-a-parent

wird ein anderer Constructor aufgerufen.
Ist hier zur TRichEdit direkt, aber vielleicht das TJ ja auch so einen Constructor?

DeddyH 29. Okt 2018 18:59

AW: TJvRichEdit in Klasse verwenden
 
Wenn ich mal ein RichEdit brauche, ohne es anzeigen zu wollen, erzeuge ich es mit CreateParented(HWND_MESSAGE). Das sollte auch mit dem JvRichEdit funktionieren.

[edit] Oops, das stand ja auch in dem SO-Thread, sry [/edit]

Hobbycoder 30. Okt 2018 09:44

AW: TJvRichEdit in Klasse verwenden
 
Danke euch beiden.

Createparented kannte ich noch gar nicht ;-) man lernt nie aus.

Das war genau das was ich suchte. Keine Speicherleaks mehr :-D (Außer die, die FastMM von den Fremdkomponenten anmeckert. Aber dagegen kann ich nichts tun).


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