AGB  ·  Datenschutz  ·  Impressum  







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

Objectlist im Objektinspektor?!

Ein Thema von Namenloser · begonnen am 18. Jul 2006 · letzter Beitrag vom 18. Jul 2006
Antwort Antwort
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#1

Objectlist im Objektinspektor?!

  Alt 18. Jul 2006, 00:18
Ich schreibe mir gerade für den Eigenbedarf eine TrackBar-ähnliche Komponente, bloß mit mehreren Schiebebalken. (Das mag vielleicht schwachsinnig klingen, aber ich brauche momentan sowas )
Um diese Balken (variable Anzahl) im Objektinspektor bearbeiten zu können habe ich mir eine Klasse von TObjectlist abgeleitet.

Delphi-Quellcode:
  TSlider = class
    position: integer; // Noch etwas leer, aber wahrscheinlich kommen noch sachen dazu ;)
  end;

  TSliderList = class(TObjectList)
    private
       function getitem(idx: integer): tSlider;
       procedure setItem(idx: integer; data: tSlider);
    public
      procedure Add(data: TSlider);
      procedure Delete(idx: integer);
      property Items[idx: integer]: tslider read getitem write setitem; default;
  end;

  {...}
  
  procedure TSliderList.Add(data: TSlider);
  begin
    inherited add(data);
  end;

  procedure TSliderList.Delete(idx: integer);
  begin
    inherited delete(idx);
  end;

  procedure TSliderList.setItem(idx: integer; data: tSlider);
  begin
    inherited setitem(idx,data);
  end;

  function tSliderList.getitem(idx: integer): tSlider;
  begin
    result := inherited getitem(idx) as tslider;
  end;
Soviel zu der Liste.
das problem liegt jetzt aber irgendwo hier:

Delphi-Quellcode:
  TMultiTrackBar = class(TCustomControl)
  private
  {...}
    fsliders: TSliderList;
    function slidercount: integer;
    function getsliders: TSliderlist;
    procedure setsliders(data: TSliderList);
  {...}
  public
  {...}
  published
    { Published-Deklarationen }
    property Sliders: TSliderList read getsliders write setsliders;
  end;

  {...}

  function TMultiTrackbar.getSliders: TSliderList;
  begin
    result := fsliders;
  end;

  procedure TMultiTrackbar.setSliders(data: TSliderList);
  begin
    fsliders := data;
    paint;
  end;
Wenn ich die Komponente installiere klappt zunächst alles hervorragend, die Eigenschaft sliders wird auch angezeigt. Sobald ich diese im Objektinspektor aber markiere kommt folgende Meldung:
Zitat:
Zugriffsverletzung bei Adresse 4002701E im Modul rtl90.bpl.Lesen von Adresse 00000001 kann nicht erweitert werden.
WORAN LIEGT DAS?!?!


Hilfe

PS: Erzeugt wird die Liste auch
fsliders := TSliderlist.Create; PPS: Bitte nicht sauer sein, wenn ich erst Morgen antworte, ich geh jetzt ins Bett.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#2

Re: Objectlist im Objektinspektor?!

  Alt 18. Jul 2006, 01:11
Zitat von NamenLozer:
das problem liegt jetzt aber irgendwo hier:

  TMultiTrackBar = class(TCustomControl)
...Zugriffsverletzung bei Adresse 4002701E im Modul rtl90.bpl.Lesen von Adresse 00000001 kann nicht erweitert werden.
Siehe hier :

Delphi-Quellcode:
  TCustomControl = class(TWinControl)
  private
    FCanvas: TCanvas;
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  protected
    procedure Paint; virtual;
    procedure PaintWindow(DC: HDC); override;
    property Canvas: TCanvas read FCanvas;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;
Was ist mit den override ? Sind die richtig definiert ? Denn das kommt von hier :

Delphi-Quellcode:
  TTrackBar = class(TWinControl)
  private
    FOrientation: TTrackBarOrientation;
    FTickMarks: TTickMark;
    FTickStyle: TTickStyle;
    FLineSize: Integer;
    FPageSize: Integer;
    FThumbLength: Integer;
    FSliderVisible: Boolean;
    FMin: Integer;
    FMax: Integer;
    FFrequency: Integer;
    FPosition: Integer;
    FSelStart: Integer;
    FSelEnd: Integer;
    FOnChange: TNotifyEvent;
    function GetThumbLength: Integer;
    procedure SetOrientation(Value: TTrackBarOrientation);
    procedure SetParams(APosition, AMin, AMax: Integer);
    procedure SetPosition(Value: Integer);
    procedure SetMin(Value: Integer);
    procedure SetMax(Value: Integer);
    procedure SetFrequency(Value: Integer);
    procedure SetTickStyle(Value: TTickStyle);
    procedure SetTickMarks(Value: TTickMark);
    procedure SetLineSize(Value: Integer);
    procedure SetPageSize(Value: Integer);
    procedure SetThumbLength(Value: Integer);
    procedure SetSliderVisible(Value: Boolean);
    procedure SetSelStart(Value: Integer);
    procedure SetSelEnd(Value: Integer);
    procedure UpdateSelection;
    procedure CNHScroll(var Message: TWMHScroll); message CN_HSCROLL;
    procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY;
    procedure CNVScroll(var Message: TWMVScroll); message CN_VSCROLL;
    procedure WMEraseBkGnd(var Message: TWMEraseBkGnd); message WM_ERASEBKGND;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure CreateWnd; override;
    procedure DestroyWnd; override;
    procedure Changed; dynamic;
  public
    constructor Create(AOwner: TComponent); override;
    procedure SetTick(Value: Integer);
  published
    property Align;
    property Anchors;
    property BorderWidth;
    property Ctl3D;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Enabled;
    property Constraints;
    property LineSize: Integer read FLineSize write SetLineSize default 1;
    property Max: Integer read FMax write SetMax default 10;
    property Min: Integer read FMin write SetMin default 0;
    property Orientation: TTrackBarOrientation read FOrientation write SetOrientation default trHorizontal;
    property ParentCtl3D;
    property ParentShowHint;
    property PageSize: Integer read FPageSize write SetPageSize default 2;
    property PopupMenu;
    property Frequency: Integer read FFrequency write SetFrequency default 1;
    property Position: Integer read FPosition write SetPosition default 0;
    property SliderVisible: Boolean read FSliderVisible write SetSliderVisible default True;
    property SelEnd: Integer read FSelEnd write SetSelEnd default 0;
    property SelStart: Integer read FSelStart write SetSelStart default 0;
    property ShowHint;
    property TabOrder;
    property TabStop default True;
    property ThumbLength: Integer read GetThumbLength write SetThumbLength default 20;
    property TickMarks: TTickMark read FTickMarks write SetTickMarks default tmBottomRight;
    property TickStyle: TTickStyle read FTickStyle write SetTickStyle default tsAuto;
    property Visible;
    property OnContextPopup;
    property OnChange: TNotifyEvent read FOnChange write FOnChange;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDock;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnKeyDown;
    property OnKeyPress;
    property OnKeyUp;
    property OnStartDock;
    property OnStartDrag;
  end;
Dürfte schwierig werden, aus so abstraktem Zeug etwas zusammenzubauen und dazu zwei verschiedene Komponenten zu verwenden. 8)
Gruß
Hansa
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

Re: Objectlist im Objektinspektor?!

  Alt 18. Jul 2006, 08:14
Hallo

es liegt an deiner Setmethode, du mußt dort assign statt der direktzuweisung verwenden
Delphi-Quellcode:
  procedure TMultiTrackbar.setSliders(data: TSliderList);
  begin
    fsliders.assign(data);
    paint;
  end;
Mfg Frank

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Objectlist im Objektinspektor?!

  Alt 18. Jul 2006, 09:02
Hallo NamenLozer,

alle Properties, die du über den Objektinspektor bearbeiten möchtest, müssen direkt oder indirekt von der Klasse Delphi-Referenz durchsuchenTPersistent abgeleitet sein. TObject und TObjectList - wie in deinem Fall - sind also als Vorgängerklasse nicht geeignet. Wenn du eine dynamische Anzahl von Elementen bearbeiten möchtest, wirst du dich mit den Klassen Delphi-Referenz durchsuchenTCollection und Delphi-Referenz durchsuchenTCollectionItem befassen müssen. Ein Beispiel habe ich gerade nicht vorliegen, aber vielleicht findest du über die genannten Suchbegriffe etwas in der Online-Hilfe oder im Internet.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Objectlist im Objektinspektor?!

  Alt 18. Jul 2006, 11:00
Zitat von Keldorn:
Hallo

es liegt an deiner Setmethode, du mußt dort assign statt der direktzuweisung verwenden
Delphi-Quellcode:
  procedure TMultiTrackbar.setSliders(data: TSliderList);
  begin
    fsliders.assign(data);
    paint;
  end;
Mfg Frank
Hmm, das hatte ich auch schon ausprobiert, hat aber nichts genützt.

Ich werde mich dann wohl mal mit TCollection befassen (müssen).

Thx @ all!

edit: wenn man bedenkt, dass ich die Objectlist genommen hab, weil delphi mir keine Arrays gestattet hat
  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 18:27 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