Eigene Komponente wird nicht sauber verarbeitet

Rund um die LCL und andere Komponenten
Antworten
Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Eigene Komponente wird nicht sauber verarbeitet

Beitrag von Lorca »

Hallo zusammen,

ich habe eine neue Komponente angelegt, welche ein Property für eine Item-Collection zur Verfügung stellen soll.
Nach der Installation würde ich erwarten, das bei einem Click auf dieses Property in der Komponentenliste des Objektinspectors
sich ein PopUp Fenster wie z.B. bei den Params einer Query öffnet, wo ich dann mehrere Einträge hinterlegen kann.
Egal was ich versuche bzw. ändere, ich erhalte immer diese Fehler Nachricht: Collection=NIL
Die Collection wurde im Constructor instanziiert.
Für alle beteiligten Klassen liegt eine Registrierung vor.
Ich habe keine Idee mehr, was ich da falsch mache.

Die ZIP Datei habe ich angehängt.

Vllt. kann ja jemand helfen.

Vielen Dank und Gruß
Lorca
TEST_Collection_Item.zip
(130.98 KiB) 45-mal heruntergeladen

wennerer
Beiträge: 507
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Eigene Komponente wird nicht sauber verarbeitet

Beitrag von wennerer »

Hallo Lorca,
ich weiß natürlich nicht was du genau machen willst, aber ich habe in der UNIT UCA_CL_Test_Componente; das hier auskommmentiert und ein override hinzugefügt:

Code: Alles auswählen

CONSTRUCTOR TCL_CA_Test_Componente.Create( io_Owner : TComponent );
BEGIN
  INHERITED Create( io_Owner );
  //mo_Collection := TCollection.Create( TCL_Collection_Item );
END ;    
und die unit UCO_CL_Test_Componente; so geändert:
unit UCO_CL_Test_Componente;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs
, UCA_CL_Test_Componente, UCA_Collection_Item
;

type

{ TCL_CO_Test_Componente }

TCL_CO_Test_Componente = class( TCL_CA_Test_Componente )
PRIVATE
FItem: TCollection;

PROTECTED

PUBLIC
CONSTRUCTOR Create( io_Owner : TComponent );override;
DESTRUCTOR Destroy; OVERRIDE;
PUBLISHED
PROPERTY Item_Collection : TCollection read FItem write FItem;
END;


PROCEDURE Register;

IMPLEMENTATION



PROCEDURE Register;
BEGIN;
{$I UCO_CL_Test_Componente_icon.lrs}
RegisterComponents('Test',[TCL_CO_Test_Componente]);
END;

{ TCL_CO_Test_Componente }

constructor TCL_CO_Test_Componente.Create(io_Owner: TComponent);
begin
inherited Create(io_Owner);
FItem := TCollection.Create(TCL_Collection_Item);
end;

destructor TCL_CO_Test_Componente.Destroy;
begin
inherited Destroy;
FItem.Free;
end;

{ TCL_CO_Test_Componente }

END.
Vergiss nicht in der destroy die Collection wieder freizugeben.
Collection.png
Collection.png (50.22 KiB) 766 mal betrachtet
Viele Grüße
Bernd
Dateianhänge
TEST_Collection_Item1.zip
(69.98 KiB) 48-mal heruntergeladen

Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Re: Eigene Komponente wird nicht sauber verarbeitet

Beitrag von Lorca »

Hallo zusammen,
hallo wennerer

ganz herzlichen Dank für Deine Antwort und Deine Hilfe. *freu*
Man, ich bin echt ein Schussel. Rödel fast eine Woche an den "mist" und sehe den Wald vor lauter Bäumen nicht mehr.
Erst durch Deine Hilfe ist mir aufgefallen, das mein Constructor nicht als override deklariert war. Und dank deines Hinweises mit dem Destroyer der Kollektion hast Du mich vor weiteren Problemen gerettet. Danke :)

Jedenfalls geht es jetzt in beiden Versionen. Die von Dir und meine mit dem Override

Vielen lieben Dank und Gruß
Lorca

Antworten