AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Seter und getter von TCollection überschreiben
Thema durchsuchen
Ansicht
Themen-Optionen

Seter und getter von TCollection überschreiben

Ein Thema von Andreas L. · begonnen am 19. Sep 2007 · letzter Beitrag vom 22. Sep 2007
Antwort Antwort
Andreas L.
(Gast)

n/a Beiträge
 
#1

Seter und getter von TCollection überschreiben

  Alt 19. Sep 2007, 14:13
Hi,
ich verwende in einer Komponente zur Verwaltung von Items die TCollection. Damit nur meine eigenen TCollectionItems hinzugefügt werden können und nicht andere, habe ich einige Routinen überschrieben.

Delphi-Quellcode:
type
  TNavigationListCollection = class(TCollection)
  protected
    function GetItem(Index: Integer):TNavigationListCollectionItem;
    procedure SetItem(Index: Integer; const Value: TNavigationListCollectionItem);
  public
    function Add:TNavigationListCollectionItem;
    function Insert(Index: Integer):TNavigationListCollectionItem;
    property Items[Index: Integer]: TnavigationListCollectionItem read GetItem write SetItem; default;
  end;

...
...

procedure TNavigationListCollection.SetItem(Index: Integer; const Value: TNavigationListCollectionItem);
begin

 Items[Index].Assign(Value);

end;

function TNavigationListCollection.GetItem(Index: Integer):TNavigationListCollectionItem;
begin

 Result.Assign(Items[Index]);
// Result := Items[Index];

end;

function TNavigationListCollection.Add:TNavigationListCollectionItem;
begin

 Result := (inherited Add as TNavigationListCollectionItem);

end;

function TNavigationListCollection.Insert(Index: Integer):TNavigationListCollectionItem;
begin

 Result := (inherited Insert(Index) as TNavigationListCollectionItem);

end;
Doch wenn getItem aufgerufen wird, bekomme ich einen Stack-Überlauf. Wieso? Ich kann keinen Fehler finden...
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Seter und getter von TCollection überschreiben

  Alt 19. Sep 2007, 14:20
Du must inherited Items aufrufen, da sonst wieder dein Getter drankommt, der wieder deinen Getter aufruft...
Außerdem solltest du die auskommentierte Variante verwenden, da du sonst eine Zugriffsverletzung bekommst (weil du result nicht createt hast), und wenn die behoben ist, wirst du nicht die gewünschten Ergebnisse erhalten.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#3

Re: Seter und getter von TCollection überschreiben

  Alt 19. Sep 2007, 14:27
Ok, jetzt gehts. Jedesmal wenn sich eine Eigenschaft eines TNavigationListCollectionItems ändert, muss die Basiskomponente (TNavigationList) neugezeichnet werden. Dafür habe ich eine private Refresh procedure implementiert. Es wäre doch nun sinnvoll, diese Procedure im Setter von TNavigationListCollection aufzurufen anstatt für jede Eigenschaft einen eignen Setter zu bauen. Geht das so ohne weiteres?
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#4

Re: Seter und getter von TCollection überschreiben

  Alt 19. Sep 2007, 15:29
Hab jetzt im Setter einen Aufruf der Refresh-Procedure implementiert.

Delphi-Quellcode:
procedure TNavigationListCollection.SetItem(Index: Integer; const Value: TNavigationListCollectionItem);
begin

 inherited Items[Index].Assign(Value);
 (Owner as TNavigationList).Refresh;

end;
Wenn ich jetzt in meiner Test-Anwendung folgendes aufrufe, passiert nichts:

 NavigationList1.Items.Items[0].ShowHint := False; Muss ich evtl. noch irgendeine Methode überschreiben?
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#5

Re: Seter und getter von TCollection überschreiben

  Alt 20. Sep 2007, 19:44
Keiner eine Idee?
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Seter und getter von TCollection überschreiben

  Alt 20. Sep 2007, 21:09
Ich habe eben mal nachgeschaut, es wird nur getItem aufgerufen. Das ist auch logisch, da Klassen bekanntlich Zeiger sind, und diesen Zeiger liest man ja.
Dein Problem würde ich so lösen, dass ich im Item die Setter-Methoden überschreibe und das Refresh des Parents auslöse.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#7

Re: Seter und getter von TCollection überschreiben

  Alt 21. Sep 2007, 23:24
Wie genau meinst du das? Wenn ich für jedes property des Items einen Setter anlege, habe ich abgesehen davon, dass ich mir keinerlei Arbeit spare, auch noch eine Zugriffsverletzung.

Delphi-Quellcode:
procedure TNavigationListCollectionItem.SetCaption(Value: string);
begin

 fCaption := Value;
 (Collection.Owner as TNavigationList).Refresh;

end;
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#8

Re: Seter und getter von TCollection überschreiben

  Alt 22. Sep 2007, 11:37
Ich bin in der Delphi-Hilfe nun auf die procedure Changed gestoßen, diese wird immer aufgerufen wenn sich ein CollectionItem ändert. Also überschrieben und folgendes rein:

Delphi-Quellcode:
procedure TNavigationListCollection.Changed;
begin

 (Owner as TNavigationList).Refresh;
 ShowMessage('ok');

end;
Nichts passiert, nicht mal die Message wird angezeigt.

EDIT: Wenn ich die procedure Update überschreibe gehts, Problem gelöst...
  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 14:03 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