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/)
-   -   Memo in einer Komponente verwenden (https://www.delphipraxis.net/175016-memo-einer-komponente-verwenden.html)

Ookami 24. Mai 2013 18:33


Memo in einer Komponente verwenden
 
Hallo Programmierer,

ich hätte gerade mal wieder ein Problem, wie folgt:

Ich stricke mir gerade eine Komponente zusammen, in der ich aus kosmetischen Gründen und der Einfachheit halber ein TMemo integrieren möchte.

Was mich schon mal gestört hat, ist das, dass ich von aussen keinen Zugriff auf die Lines erhalte.
Das könnte ich ja umgehen, wäre nicht so schlimm. Nicht doll, aber eben verschmerzbar.

Dass ich aber innerhalb der Komponente nicht auf die Memo zugreifen kann, stört mich dann schon.

ein bisschen Code zum Verständniss

Delphi-Quellcode:
     
           TMBMemo            = class(TGraphicControl)
           private
              fErrorMessage   : String;        
              fLines          : TStringList;
         fMemo           : TMemo;
              Procedure AnalyseText;
            public
              constructor Create(AOwner: TComponent); override;
              destructor Destroy; override;
              procedure Paint; Override;
            published
              Procedure SetMessage (Const Value : TStringList);
              procedure Clear;
              Property Point : TPoint Write GetPoint;
              Property SearchWord : String Read fWort;
              Property Memo : TMemo write fMemo;
Das Memo aus dem Property-Teil habe ich wieder rausgenommen, da ich von aussen nicht auf die Lines zugreifen kann. Kennt hier jemand ne Möglichkeit?

Jetzt aber zum 2. und auch dem Haupt-Problem


Deklaration im Constructor
Delphi-Quellcode:
constructor TMBWebMemo.Create(AOwner: TComponent);
begin
     inherited;
     Try
        MyHandle  := WndHandle;
        WndHandle := FindWindow('TLoader',NIL);
        fLines    := TStringList.Create;
   fMemo     := TMemo.Create(self);
        fMemo.ScrollBars := ssHorizontal;
        fMemo.Parent := Self.Parent;   // hab ich versucht, wegen des fehlenden Parent!
                                        // kein Erfolg damit
        Width := 300;
        Height:= 400;
        fErrorMessage := 'TMBMemo: Create succesful';
        SendMessage(WndHandle, WM_CompError, 0, lParam(PChar(fErrorMessage)));
     Except
       fErrorMessage := 'TMBMemo: Create failed';
       SendMessage(WndHandle, WM_CompError, 0, lParam(PChar(fErrorMessage)));
     End;
     WndHandle := MyHandle;
     fErrorMessage  := '';
end;

in einer anderen Prozedur knallt es dann aber an der Stelle
Delphi-Quellcode:
        for i := 0 to Self.fBlocks.Count - 1 do
        Begin
             fBlock := fBlocks[i];
             fMemo.Lines.Add (fBlock.Eintrag);  <<<== und hier knallt es mit der Meldung
                                                        "Control has no parent window"
             for j := 0 to fMemo.Lines.Count - 1 do
             Begin
                  Self.fBlock.EintragList.Add(fMemo.Lines[j]);
             End;
             j := Self.fBlock.EintragList.Count;
        End;
Beim Thema Font kannte ich das schon und hab es auch lösen können. Dummerweise weiss ich mir an dieser Stelle nicht zu helfen.

Ich danke allen schon mal im Voraus.

DeddyH 24. Mai 2013 19:08

AW: Memo in einer Komponente verwenden
 
Und wenn Du SetParent (geerbt von TControl) überschreibst? Innerhalb dessen kannst Du ja dann den Parent des Memos setzen.
Delphi-Quellcode:
procedure TMBMemo.SetParent(AParent: TWinControl);
begin
  inherited;
  fMemo.Parent := Parent;
end;

Ookami 24. Mai 2013 19:20

AW: Memo in einer Komponente verwenden
 
Hallo DeddyH,

et jeht. Gott kann die Welt einfach sein, wenn man auf den richtigen Weg geleitet wird.
Auf die Idee bin ich nicht gekommen, da ich dem Objekt den Parent eigentlich schon übergeben habe.
Diesen dann auch an das Memo weitergeleitet habe.
Nu ja, wie auch immer, es funktioniert.

Danke.

Ich lass die Frage dennoch offen, da der erste Teil noch im Raume steht.

DeddyH 24. Mai 2013 19:26

AW: Memo in einer Komponente verwenden
 
So wie es oben steht hast Du eine WriteOnly-Property deklariert. Da Du das Memo aber selbst erzeugst, sollte es IMO eigentlich eine ReadOnly-Property sein.
Delphi-Quellcode:
Property Memo : TMemo read fMemo;

Ookami 24. Mai 2013 19:57

AW: Memo in einer Komponente verwenden
 
Hi,

danke für deine Antwort, und absolutes Sorry. Das war mein Fehler.
Ich hatte es mit read geschrieben, bevor ich es wieder gelöscht hatte.

Nur konnte ich eben auf die Zeilen nicht zugreifen.

Also ...Lines.Add('Text'); hat nicht funktioniert.

Vorher ein Memo befüllt und dann ...Memo := AnderesMemo; hat funktioniert.
Wie gesagt, ich habe mir anders beholfen, wollte aber dennoch wissen, ob es nicht doch noch eine andere Lösung gibt.

Bummi 24. Mai 2013 20:45

AW: Memo in einer Komponente verwenden
 
Hat es einen besonderen Grund dass Du Deinen Komponente von TGraphicControl ableitest, wenn Du ein Wincontrol darin verwenden willst?

Ginko 24. Mai 2013 21:08

AW: Memo in einer Komponente verwenden
 
Das mit dem Parent hatte ich mal so gemacht (bei einer anderen Klasse):
Delphi-Quellcode:
constructor TMBWebMemo.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Parent := AOwner as TWinControl;

  fMemo:= fMemo.Create(AOwner);
  fMemo.Parent:= AOwner as TWinControl;
...
end;
eventuell hilft das ja?

Ookami 24. Mai 2013 22:01

AW: Memo in einer Komponente verwenden
 
Hallo Bummi,

das mit der TGraphicControl ist deswegen, weil ich darauf zeichne.
Das Memo, das ich verwende ist nur aus purer Faulheit verwendet.
Schließlich sind Zeilenumbrüche dort schon ausreichend behandelt.
Speziell dann, wenn man die Größe des Fonts laufend ändert.

Die eigentliche Darstellung des Textes erfolgt dann grafisch, wird also auf dem Canvas der Klasse gezeichnet. Die Klasse entstand nur deswegen, weil ich Dinge mit dieser Klasse anstellen will und muss, die mit einem Memo nicht darzustellen sind.

Hi Ginko,

das mit dem Parent hat sich erledigt. Dieser Teil der Frage ist beantwortet.
Inzwischen hat sich auch der andere Teil der Frage geklärt. Vermutlich hing das mit dem fehlenden Parent zusammen. Bin mir nicht sicher, aber es funktioniert.



Trotzdem danke an alle.


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