Hi Leute,
für mein aktuelles Thema scheinen sich Collections geradezu anzubieten. Nutze ich sonst eher selten. Nun tut sich ein Problem auf, dass wie folgt aussieht.
Klicke ich im
OI meiner Kompo auf den button hinter meiner eingebundenen Collection, so öffnet sich mit dem Editorfenster für neue Item die im Titel angegebene Fehlermeldung. Quittiere ich diese mit OK, so schließt sich auch das Editorfenster und ich kann keine Item hinzufügen (Editorfenster ist ja weg). Das alles zur Designzeit. Implementiere ich meine Kompo zur Laufzeit, so liefert ein Add ein ungültiges Item zurück (nil).
was ist da los?
Hier die wichtigsten Code-Ausschnitte:
Delphi-Quellcode:
TKollektorItem = class(TCollectionItem)
private
FC0: Real;
FC1: Real;
FC2: Real;
FHersteller: String;
FName: String;
protected
public
constructor Create(Collection: TCollection); override;
procedure AddPropsfromLine(Line : String);
published
property C0 : Real read FC0 write FC0;
property C1 : Real read FC1 write FC1;
property C2 : Real read FC2 write FC2;
property Hersteller : String read FHersteller write FHersteller;
property Name : String read FName write FName;
end;
TKollektorItems = class(TCollection)
private
FSeyMathObj : TSeyMathObj;
function GetItem(Index: Integer): TKollektorItem;
procedure SetItem(Index: Integer; const Value: TKollektorItem);
protected
public
constructor create(AOwner : TSeyMathObj);
function Add: TKollektorItem;
Function GetKollektorItem(KollTyp : String) : TKollektorItem;
property Items[Index: Integer]: TKollektorItem read GetItem write SetItem;
default;
end;
TSeyMathObj = Class(TComponent)
private
FKollektorItems: TKollektorItems;
FKollektorFileName: String;
procedure SetKollektorFileName(const Value: String);
procedure SetKollektorItems(const Value: TKollektorItems);
protected
procedure LoadKollektorItems; virtual;
public
constructor Create(AOwner : TComponent); override;
Destructor Destroy; override;
// Listen
Procedure GetKollektorNames(NameList : TStringList; incl_Herst : Boolean = False);
// Berechnungen
Function GetWirkungsgrad(KollTyp : String; Tm, Ta, GK : Real):Real;
published
property KollektorItems : TKollektorItems read FKollektorItems write SetKollektorItems;
property KollektorFileName : String read FKollektorFileName write SetKollektorFileName;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Seysol', [TSeyMathObj]);
end;
{ TSeyMathObj }
constructor TSeyMathObj.Create(AOwner: TComponent);
begin
inherited create(AOwner);
FKollektorItems := TKollektorItems.Create(self);
LoadKollektorItems;
end;
procedure TSeyMathObj.SetKollektorItems(const Value: TKollektorItems);
begin
FKollektorItems.Assign(Value);
end;
{ TKollektorItems }
function TKollektorItems.Add: TKollektorItem;
begin
Result := TKollektorItem(inherited Add);
end;
constructor TKollektorItems.create(AOwner: TSeyMathObj);
begin
inherited create(TKollektorItem); // edit oki
FSeyMathObj := AOwner;
end;
function TKollektorItems.GetItem(Index: Integer): TKollektorItem;
begin
Result := TKollektorItem(inherited GetItem(Index));
end;
procedure TKollektorItems.SetItem(Index: Integer;
const Value: TKollektorItem);
begin
inherited SetItem(Index, Value);
end;
{ TKollektorItem }
constructor TKollektorItem.Create(Collection: TCollection);
begin
inherited create(Collection);
FC0 := 0;
FC1 := 0;
FC2 := 0;
FHersteller := '';
FName := '';
end;
Ich dachte da kann man nicht viel falsch machen, zumal ich zwar selten, aber eben auch nicht zum ersten mal mit collection arbeite. was ich hier falsch mache hab ich aber bis jetzt aber noch nicht gefunden.
gruß oki