AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TJvRichEdit in Klasse verwenden

Ein Thema von Hobbycoder · begonnen am 29. Okt 2018 · letzter Beitrag vom 30. Okt 2018
Antwort Antwort
Hobbycoder

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

TJvRichEdit in Klasse verwenden

  Alt 29. Okt 2018, 19: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
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.269 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TJvRichEdit in Klasse verwenden

  Alt 29. Okt 2018, 19:35
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?
Heiko

Geändert von hoika (29. Okt 2018 um 19:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TJvRichEdit in Klasse verwenden

  Alt 29. Okt 2018, 19:59
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]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
928 Beiträge
 
#4

AW: TJvRichEdit in Klasse verwenden

  Alt 30. Okt 2018, 10:44
Danke euch beiden.

Createparented kannte ich noch gar nicht man lernt nie aus.

Das war genau das was ich suchte. Keine Speicherleaks mehr (Außer die, die FastMM von den Fremdkomponenten anmeckert. Aber dagegen kann ich nichts tun).
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:28 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