Zitat von
Basic-Master:
Was mache ich falsch?
Du übergibst immer die selbe Variable (FMyList).
Du baust dir da nämlich lauter Speicherlecks.
Die TSelectionTextList-en solltest du in einer TObjectList verwalten. Und deinen String von oben auch irgendwo verwalten.
Delphi-Quellcode:
uses
Contnrs;
type
TJviCodeItems = class(TForm)
private
FItems: TObjectList;
jviCode: TJvInspector;
public
constructor Create(AInspector: TJvInspector);
destructor Destroy; override;
procedure Clear;
function AddCombo(eName, eCategory, eValue: String; eValues: array of string): TJvCustomInspectorItem;
function Add...
end;
TStringWrapper = class(TObject)
public
Value: string;
constructor Create(const AValue: string);
end;
implementation
{ TJviCodeItems }
constructor TJviCodeItems.Create(AInspector: TJvInspector);
begin
inherited Create;
jviCode := AInspector;
FItems := TObjectList.Create;
end;
destructor TJviCodeItems.Destroy;
begin
Clear;
FItems.Free; // alle Items freigeben
inherited Destroy;
end;
procedure TJciCodeItems.Clear;
begin
jviCode.Clear; // damit die Zeiger nicht ins leere zeigen
FItems.Clear;
end;
function TJviCodeItems.AddField(eName, eCategory, eValue: String): TJvCustomInspectorItem;
var
i: integer;
eParent: TJvCustomInspectorItem;
Item: TStringWrapper;
begin
eParent := nil;
for i := 0 to jviCode.Root.Count -1 do
begin
if (jviCode.Root.Items[i].DisplayName = eCategory) and (jviCode.Root.Items[i] is TJvInspectorCustomCategoryItem) then
begin
eParent := jviCode.Root.Items[i];
Break; // nicht unnötig Rechenzeit verschleudern
end;
end;
if eParent = nil then
begin
eParent := TJvInspectorCustomCategoryItem.Create(jviCode.Root, nil);
eParent.DisplayName := eCategory;
end;
if eName <> '' then
begin
Item := TStringWrapper.Create(eValue); // StringWrapper erzeugen, damit der String erhalten bleibt
FItems.Add(Item); // und das Item in die Liste eintragen, damit kein Speicherleck entsteht
Result := TJvInspectorVarData.New(eParent, eName, TypeInfo(String), @Item.Value);
jviCode.Root.Sort;
eParent.Expanded := True;
end
else
begin
Result := nil;
jviCode.Root.Sort;
end;
end;
... // für das TSelectionTextList braucht man keinen Wrapper, weil es bereits ein Objekt ist.
{ TStringWrapper }
constructor TStringWrapper.Create(const AValue: string);
begin
inherited Create;
FValue := AValue;
end;