AGB  ·  Datenschutz  ·  Impressum  







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

Problem mit TCollection im OI

Ein Thema von DevilsCamp · begonnen am 9. Nov 2005
Antwort Antwort
DevilsCamp
(Gast)

n/a Beiträge
 
#1

Problem mit TCollection im OI

  Alt 9. Nov 2005, 13:20
ich habe folgenden Code (gekürzt auf das wesentlichste):

Delphi-Quellcode:
unit MeineKompo;

interface

uses
  Windows, SysUtils, Classes, Controls, Graphics, Messages, Math, StdActns,
  ExtCtrls, Dialogs;

type
  TShelfType = (stNone, st3, st4, st6, st8, st9, st10, st14, st28);
  TMRAnlage = class(TCustomControl)
  private
    myAnlagenShelfs : TMRAnlagenShelfs;
    myhasdata : array of Boolean;

    function myFillShelf(const ShelfType: TShelfType): TShelfType;
    procedure mySetAnlagenShelfs(const Value: TMRAnlagenShelfs);
  published
    property Shelfs: TMRAnlagenShelfs read myAnlagenShelfs write mySetAnlagenShelfs;
  end;

  TMRAnlagenShelfs = class(TCollection)
  private
    myOwner : TMRAnlage;

    function myGetShelf(const Index: Integer): TMRAnlagenShelf;
    procedure mySetShelf(const Index: Integer; const Value: TMRAnlagenShelf);
  protected
    function GetOwner: TPersistent; override;
  public
    constructor Create(const AOwner: TMRAnlage);

    function Add: TMRAnlagenShelf;
    function Owner: TMRAnlage;
    property Items[const Index: Integer]: TMRAnlagenShelf read myGetShelf write mySetShelf; default;
  end;

  TMRAnlagenShelf = class(TCollectionItem)
  private
    myShelfType : TShelfType;
    myHEinheit : Integer;
    
    procedure mySetShelfType(const Value: TShelfType);
    procedure mySetHEinheit(const Value: Integer);
  public
    constructor Create(Collection: TCollection); override;
  published
    property Hoeheneinheiten: Integer read myHEinheit write mySetHEinheit default 1;
    property ShelfType: TShelfType read myShelfType write mySetShelfType default stNone;
  end;

implementation

{ TMRAnlage }

procedure TMRAnlage.mySetAnlagenShelfs(const Value: TMRAnlagenShelfs);
begin
  myAnlagenShelfs.Assign(Value);
end;

constructor TMRAnlage.Create(AOwner: TComponent);
begin
  inherited;

  Width := 300;
  Height := 200;
  myAnlagenShelfs := TMRAnlagenShelfs.Create(Self);
  myAnlagenShelfs.Clear;
  SetLength(myhasdata, 0);
end;

function TMRAnlage.myFillShelf(const ShelfType: TShelfType): TShelfType;
begin
// CODE TO DO

// Hier wird auf das Array myhasdata zugegriffen

  Result := ERGEBNIS;
end;

{ TMRAnlagenShelfs }

constructor TMRAnlagenShelfs.Create(const AOwner: TMRAnlage);
begin
  inherited Create(TMRAnlagenShelf);

  myOwner := AOwner;
end;

function TMRAnlagenShelfs.Add: TMRAnlagenShelf;
begin
  Result := TMRAnlagenShelf(inherited Add);
  myOwner.Invalidate;
  SetLength(myOwner.myhasdata, Length(myOwner.myhasdata)+1);

  myOwner.myhasdata[High(myOwner.myhasdata)] := false;
end;

{ TMRAnlagenShelf }

constructor TMRAnlagenShelf.Create(Collection: TCollection);
begin
  inherited;

  myHEinheit := 1;
end;

procedure TMRAnlagenShelf.mySetHEinheit(const Value: Integer);
begin
  myHEinheit := Value;

  TMRAnlage(Collection.Owner).Invalidate;
end;

procedure TMRAnlagenShelf.mySetShelfType(const Value: TShelfType);
begin
  if myShelfType<>Value then
  begin
    myShelfType := TMRAnlage(Collection.Owner).myFillShelf(Value);
  end;
end;

end.
Wenn ich nun innerhalb des Programms folgendes aufrufe:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  mrsh : TMRAnlagenShelf;
begin
  mrsh := MRAnlage1.Shelfs.Add;

  mrsh.ShelfType := st28;
end;
Dann funktioniert alles wie es soll.

Wenn ich aber nun innerhalb des OI ein Shelf hinzufüge, dann scheint es, dass die Add-Methode von TMRAnlagenShelfs nicht aufgerufen wird. Denn ich bekomme dann jedes mal eine Zugriffsverletzung sobald ich per OI beim hinzugefügten Shelf die Eigenschaft ShelfType ändern will.
Entsprechend, wenn ich beim, im OI hinzugefügten, Shelf per Programm den ShelfType ändern will.

Wenn ich obige Button1Click Methode benutze und debugge, dann sehe ich, dass das Array myhasdata wie gewünscht um ein Element vergrößert wird, es aber beim Start nicht wie erwartet die Länge 1 hat sondern 0 (Obwohl schon per OI ein Shelf hinzugefügt wurde).


Ich hoffe es blickt hier jemand durch, was genau ich meine und kann mir helfen
  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 05:22 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