![]() |
JvInspector: "Enum-Item" hinzufügen
Hallo,
ich habe mich heute mit der JvInspector-Komponente beschäftigt (JVCL 3.0), ein normales String-Item hinzufügen funktioniert mit der Funktion, die ich mir gecoded habe auch wunderbar, allerdings würde ich gerne ein Enum-Item (siehe TJvInspectorEnumItem) zu meinem JvInspector hinzufügen. Leider geht es nicht mal eben mit TJvInspectorEnumItem.Create, man müsste erst ein TJvInspectorVarData-Objekt mit den richtigen Parametern erzeugen (denke ich mal, ist beim Hinzufügen eines String-Items auch so). Nur wie jetzt der TypeInfo von diesem enum wäre, weiss ich nicht :wall: (set ist es nicht). Hier der Code zum erzeugen eines "normalen" String-Items:
Code:
Danke im Voraus
function AddField(eName, eCategory, eValue: String): TJvCustomInspectorItem;
var i: integer; eParent: TJvCustomInspectorItem; TempVar: Pointer; begin // frmMain ist mein Formular und jviCode der JvInspector eParent := nil; for i := 0 to frmMain.jviCode.Root.Count -1 do begin if (frmMain.jviCode.Root.Items[i].DisplayName = eCategory) and (frmMain.jviCode.Root.Items[i] is TJvInspectorCustomCategoryItem) then eParent := frmMain.jviCode.Root.Items[i]; end; if eParent = nil then begin eParent := TJvInspectorCustomCategoryItem.Create(frmMain.jviCode.Root, nil); eParent.DisplayName := eCategory; end; if eName <> '' then begin New(PString(TempVar)); PString(TempVar)^ := eValue; Result := TJvInspectorVarData.New(eParent, eName, TypeInfo(String), TempVar); frmMain.jviCode.Root.Sort; eParent.Expanded := True; end else begin Result := nil; frmMain.jviCode.Root.Sort; end; end; |
Re: JvInspector: "Enum-Item" hinzufügen
Zitat:
Dein Code sieht ja ziemlich kompliziert aus.
Delphi-Quellcode:
type
TMyEnum = (meNone, meTwo, meThree); var MyEnum: TMyEnum = meThree; MyString: string = 'Hallo'; procedure TForm1.FormCreate(Sender: TObject); begin TJvInspectorVarData.New(JvInspector1.Root, 'MyEnum', TypeInfo(TMyEnum), @MyEnum); TJvInspectorVarData.New(JvInspector1.Root, 'MyString', TypeInfo(string), @MyString); end; |
Re: JvInspector: "Enum-Item" hinzufügen
Hallo,
das New() in meiner Funktion ist notwendig, damit eben eine neue Variable erzeugt werden kann, die sich nicht sofort wieder ändert wenn man die Funktion mehr als 1 mal aufruft. Ich suche im Moment leider eher eine Möglichkeit, Strings wie "||" und "&&" [im Style einer ComboBox; wie eben Enums] hinzuzufügen, das geht aber leider mit type TMeinEnum = (...) nicht :( Trotzdem Danke für den Code :P |
Re: JvInspector: "Enum-Item" hinzufügen
Zitat:
Zitat:
Delphi-Quellcode:
type
TSelectionTextList = class(TStringList) private FSelected: Integer; function GetSelectedText: string; function GetSelected: Integer; procedure SetSelectedText(const Value: string); procedure SetSelected(const Value: Integer); public property Selected: Integer read GetSelected write SetSelected; property SelectedText: string read GetSelectedText write SetSelectedText; end; TJvInspectorSelectionTextListItem = class(TJvCustomInspectorItem) protected function GetDisplayValue: string; override; procedure GetValueList(const Strings: TStrings); override; procedure SetDisplayValue(const Value: string); override; procedure SetFlags(const Value: TInspectorItemFlags); override; end; { TSelectionTextList } function TSelectionTextList.GetSelected: Integer; begin if FSelected < -1 then FSelected := -1 else if FSelected >= Count then FSelected := Count - 1; Result := FSelected; end; function TSelectionTextList.GetSelectedText: string; begin if Selected >= 0 then Result := Strings[Selected] else Result := ''; end; procedure TSelectionTextList.SetSelected(const Value: Integer); begin FSelected := Value; GetSelected; // adjust FSelected end; procedure TSelectionTextList.SetSelectedText(const Value: string); begin FSelected := IndexOf(Value); end; { TJvInspectorSelectionTextListItem } function TJvInspectorSelectionTextListItem.GetDisplayValue: string; begin Result := TSelectionTextList(Data.AsOrdinal).SelectedText; end; procedure TJvInspectorSelectionTextListItem.GetValueList(const Strings: TStrings); begin Strings.Assign(TSelectionTextList(Data.AsOrdinal)); end; procedure TJvInspectorSelectionTextListItem.SetDisplayValue(const Value: string); begin TSelectionTextList(Data.AsOrdinal).SelectedText := Value; end; procedure TJvInspectorSelectionTextListItem.SetFlags(const Value: TInspectorItemFlags); begin inherited SetFlags(Value + [iifValueList]); end; procedure TForm1.FormCreate(Sender: TObject); begin FMyList := TSelectionTextList.Create; FMyList.Add('Blau'); FMyList.Add('Grün'); FMyList.Add('Weiß'); FMyList.Add('Gelb'); TJvCustomInspectorData.ItemRegister.Add(TJvInspectorTypeInfoRegItem.Create(TJvInspectorSelectionTextListItem, TypeInfo(TSelectionTextList))); TJvInspectorVarData.New(JvInspector1.Root, 'MyList', TypeInfo(TSelectionTextList), @FMyList); end; ... |
Re: JvInspector: "Enum-Item" hinzufügen
Zitat:
Zitat:
Zitat:
|
Re: JvInspector: "Enum-Item" hinzufügen
Hmm der Code funktioniert gut, allerdings versuche ich mir jetzt eine neue Funktion zu machen, die wie die AddField() im ersten Post werden soll, nur dass sie eben ein TSelectionTextList-Item adden soll... Hinzufügen geht auch ohne Probleme, wenn allerdings mehr als 2 Items davon mit der Funktion erstellt worden sind, sind die DisplayValues gleich und ändern sich auch wieder zu ein und dem selben Wert :roll:
Hier der Code:
Delphi-Quellcode:
Was mache ich falsch?
function AddCombo(eName, eCategory, eValue: String; eValues: array of string): TJvCustomInspectorItem;
var i: integer; eParent: TJvCustomInspectorItem; eFound: Boolean; begin // erst checken ob die kategorie schon existiert und wenn nicht hinzufügen... eParent := nil; for i := 0 to frmMain.jviCode.Root.Count -1 do begin if (frmMain.jviCode.Root.Items[i].DisplayName = eCategory) and (frmMain.jviCode.Root.Items[i] is TJvInspectorCustomCategoryItem) then eParent := frmMain.jviCode.Root.Items[i]; end; if eParent = nil then begin eParent := TJvInspectorCustomCategoryItem.Create(frmMain.jviCode.Root, nil); eParent.DisplayName := eCategory; end; // item hinzufügen if eName <> '' then begin FMyList := TSelectionTextList.Create; eFound := False; for i := 0 to High(eValues) do begin FMyList.Add(eValues[i]); if eValues[i] = eValue then eFound := True; end; if not eFound then FMyList.Add(eValue); FMyList.SelectedText := eValue; Result := TJvInspectorVarData.New(eParent, eName, TypeInfo(TSelectionTextList), @FMyList); frmMain.jviCode.Root.Sort; eParent.Expanded := True; end else begin Result := nil; frmMain.jviCode.Root.Sort; end; end; Danke im Vorraus |
Re: JvInspector: "Enum-Item" hinzufügen
Zitat:
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz