Einzelnen Beitrag anzeigen

jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

Re: JvInspector: "Enum-Item" hinzufügen

  Alt 14. Aug 2005, 22:10
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;
  Mit Zitat antworten Zitat