AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

JvInspector: "Enum-Item" hinzufügen

Ein Thema von Basic-Master · begonnen am 14. Aug 2005 · letzter Beitrag vom 14. Aug 2005
Antwort Antwort
Basic-Master

Registriert seit: 9. Mär 2003
Ort: Brilon
395 Beiträge
 
Delphi 2007 Enterprise
 
#1

JvInspector: "Enum-Item" hinzufügen

  Alt 14. Aug 2005, 02:03
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 (set ist es nicht).

Hier der Code zum erzeugen eines "normalen" String-Items:
Code:
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;
Danke im Voraus
Christian
  Mit Zitat antworten Zitat
jbg

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

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

  Alt 14. Aug 2005, 13:04
Zitat:
New(PString(TempVar));
Gibst du das auch irgendwo mal wieder frei?

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;
  Mit Zitat antworten Zitat
Basic-Master

Registriert seit: 9. Mär 2003
Ort: Brilon
395 Beiträge
 
Delphi 2007 Enterprise
 
#3

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

  Alt 14. Aug 2005, 16:04
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
Christian
  Mit Zitat antworten Zitat
jbg

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

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

  Alt 14. Aug 2005, 18:06
Zitat von Basic-Master:
das New() in meiner Funktion ist notwendig
Ob es notwendig ist, habe ich nicht gefragt, sondern ob du dich auch wieder um das Freigeben des Speichers kümmerst, oder ein Speicherleck hast.

Zitat:
Ich suche im Moment leider eher eine Möglichkeit, Strings wie "||" und "&&" [im Style einer ComboBox; wie eben Enums] hinzuzufügen
Das hättest du vielleicht auch mal oben erwähnen können. (Hellsehen ist nicht meine stärke)

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;

...
  Mit Zitat antworten Zitat
Basic-Master

Registriert seit: 9. Mär 2003
Ort: Brilon
395 Beiträge
 
Delphi 2007 Enterprise
 
#5

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

  Alt 14. Aug 2005, 18:50
Zitat von jbg:
Zitat von Basic-Master:
das New() in meiner Funktion ist notwendig
Ob es notwendig ist, habe ich nicht gefragt, sondern ob du dich auch wieder um das Freigeben des Speichers kümmerst, oder ein Speicherleck hast.
jop, werde dann wohl eins haben, werde es mit Hilfe einer TList beheben.

Zitat von jbg:
Das hättest du vielleicht auch mal oben erwähnen können.
ja tut mir leid...

Zitat von jbg:
(Hellsehen ist nicht meine stärke)
schade eigentlich [danke für den code, hat mir sehr geholfen ]
Christian
  Mit Zitat antworten Zitat
Basic-Master

Registriert seit: 9. Mär 2003
Ort: Brilon
395 Beiträge
 
Delphi 2007 Enterprise
 
#6

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

  Alt 14. Aug 2005, 21:41
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
Hier der Code:
Delphi-Quellcode:
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;
Was mache ich falsch?

Danke im Vorraus
Christian
  Mit Zitat antworten Zitat
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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz