![]() |
TObjectList sehr anfällig?
Versuche die TObjectList anstelle von Collection(VB) zu verwedenden.
Beim start der Anwendung wird ein Button erstellt der aber nicht in die TObjectList aufgenommen wird. Das ergebis ist dann ListIndex überschreitet das Maximum(1) Lasse ich den ersten Button weg und fange bei 0 an kommt die Meldung ListIndex überschreitet das Maximum(0) Langsam bekomme ich einen Anfall und frage mich ob es nicht besser wäre einfach ein normales Array zu verwenden. Ich dachte das es sinnvoll wäre da die Button während der Laufzeit auch wieder entfernt bzw.. ReOrganisiert werden müssen. FColButtons: TObjectList;
Delphi-Quellcode:
function TClsProgBar.Button(Btn: Integer): TClsButtonInfo;
var FSelButton: TObject; begin FSelButton := nil; try try // auch ein FColButtons.Items[Btn- 1]) führt zu einem EListError FSelButton := (FColButtons.Items[Btn]) as TClsButtonInfo; except // end; finally Result := TClsButtonInfo(FSelButton); end; end;
Delphi-Quellcode:
Bedingt durch den Fehler fehlen mir immer irgendwelche Button
function TClsProgBar.ReOrgDisplay(Ctrl: TClsControls; oInit: Bool): Bool;
var Width: Integer; Height: Integer; Btn: Integer; oButton: TClsButtonInfo; begin NewNumButtons := ButtonWidth * ButtonHeight; oButton := nil; // Lösche nicht benötigte Controls if NewNumButtons < FNumButtons then begin // lösche nichtverwendete Tasten, ausgenommen die erste for Btn := NewNumButtons + 1 to FNumButtons do Ctrl.RemoveButton(Btn); end; // lösche nichtverwendete einträge in der TObjectList if NewNumButtons < FColButtons.Count then // Lösche nicht benötigte Tasten, ausgenommen die erste for Btn := NewNumButtons + 1 to FNumButtons do RemoveButton(Btn); // erstelle neue Tasten wenn vorhanden Btn := 0; for Height := 1 to ButtonHeight do begin for Width := 1 to ButtonWidth do begin inc(Btn); if Btn > FNumButtons then Ctrl.AddButton(frmButtonHandle, Btn); Ctrl.PositionButton(Btn, Width, Height); if Btn > FColButtons.Count then begin try oButton := TClsButtonInfo.Create(nil); oButton.Num := Btn; AddButton(oButton); finally oButton := nil; end; end; end; // Width end; // Height // ButtonForm adjustieren Ctrl.Adjust(ButtonWidth, ButtonHeight); if oInit then begin // lösche die 1. Taste oButton := Button(1); if Assigned(oButton) then begin try oButton.BmpFile := ''; oButton.ButtonKey := ''; oButton.ToolTip := ''; oButton.ButtonCmd := ''; finally oButton := nil; end; end; // ProgBar-Properties zurücksetzen ClassNamen := ''; ProgPath := ''; ArbVerz := ''; ProgTitle := ''; ProgToolTips := ''; ProgTrayMenu := ''; Name := ''; FNumButtons := 1; end else FNumButtons := NewNumButtons; if Assigned(SelButton) then SelButton.Free; result := True; end; hier zum beispiel 2 .. sollten 8 sichtbar sein. gruss |
AW: TObjectList sehr anfällig?
Also eine TObjectList ist genauso anfällig wie ein Array, vor allem weil eine TObjectList ein gekapseltes Array ist. Und ein Griff neben die Kiste ( Index < 0 or Index >= Count ) würde auch bei einem Array Probleme geben.
Allerdings findet es eine TObjectList doof, wenn man eine Instanz in der Liste aus dem Speicher wirft, solange diese noch in selbiger verweilt. Aus deinem Code entnehme ich, dass du da die Buttons entfernst und erst dann die Liste bereinigst. Diese Organisation sehe ich als den kritischen Teil an. Denn in der TObjectList sind ja die Verweise auf die Instanzen noch enthalten und wenn OwnsObjects auf true, dann versucht die TObjectList beim Entfernen aus der Liste ein Free auf diese (vermeintlich noch existierende) Instanz. Evtl. ist da die Verantwortlichkeit (wer macht was wann) im Code nicht klar geregelt. Aber zur Beurteilung fehlt da der CodeTeil, der für den Eintrag und das Entfernen der Buttons. |
AW: TObjectList sehr anfällig?
Zitat:
Denn..
Delphi-Quellcode:
"ButtonWidth * ButtonHeight" = 1 * 1
NewNumButtons := ButtonWidth * ButtonHeight;
Da NewNumButtons in dem Fall 1 ist, also nicht weniger wie FColButtons.Count wird hier auch nichts gelöscht. Nachher mag das zutreffend sein dafür muss ich einfach nur die beiden abfragen vertauschen. Obwohl Ctrl.RemoveButton(Btn) nichts mit RemoveButton(Btn) zu tun hat. Zitat:
Delphi-Quellcode:
function TClsProgBar.AddButton(var oButton: TClsButtonInfo): Bool;
begin if ButtonExists(oButton.Num) then RemoveButton(oButton.Num); FColButtons.Add(oButton); FColButtons.Insert(oButton.Num, oButton); Result := True; end;
Delphi-Quellcode:
Beim ersten start kracht es schon (also EListError)
function TClsProgBar.ButtonExists(Btn: Integer): Bool;
begin FOButton := Button(Btn); Result := Assigned(FOButton); end; Notfalls kann ich den Source mal hochladen. gruss |
AW: TObjectList sehr anfällig?
Zitat:
Delphi-Quellcode:
der Button an die Liste angehängt und mit
FColButtons.Add(oButton);
Delphi-Quellcode:
nochmal an der Stelle oButton.Num eingefügt. Er befindet sich jetzt also zweimal in der Liste. Das bringt zumindest die Bedeutung von FColButtons.Count durcheinander.
FColButtons.Insert(oButton.Num, oButton);
|
AW: TObjectList sehr anfällig?
Das ButtonExists würde ich umschreiben oder das Button( Btn : Integer ).
Delphi-Quellcode:
Die genaue Codierung hängt allerdings davon ab, ob du 0 basierend indizierst (so wie die Liste) oder 1 basierend.
function TClsProgBar.ButtonExists( Btn : Integer ) : Bool;
begin Result := ( Btn >= 0 ) and ( Btn < FButtonList.Count ); end; |
AW: TObjectList sehr anfällig?
Zitat:
gruss |
AW: TObjectList sehr anfällig?
Das umschreiben der ButtonExists sorgt zumindest dafür das es zu keinen ElistError mehr kommt.
Wenn ich hingegen irgendeine Zeile von AddButton entferne dann kracht es wieder.
Delphi-Quellcode:
function TClsProgBar.AddButton(var oButton: TClsButtonInfo): Bool;
begin if ButtonExists(oButton.Num) then RemoveButton(oButton.Num); FColButtons.Add(oButton); // kann nicht entfernt werden FColButtons.Insert(oButton.Num, oButton); // Das auch nicht Result := True; end; Wirklich kompiliziert die Collection von VB nach Delphi zu portieren. Hier sind mal die VB Teile dazu.. mcolButtons = Collection und in Delphi halt die TObjectList.
Code:
Public Function AddButton(ByRef roButton As clsButtonInfo) As Boolean
If ButtonExists(roButton.Num) Then RemoveButton roButton.Num mcolButtons.Add roButton, CStr(roButton.Num) End Function
Code:
Public Property Get Button(ByVal vlBtn As Long) As clsButtonInfo
On Error Resume Next Set moSelButton = mcolButtons.Item(CStr(vlBtn)) Set Button = moSelButton Err.Clear End Property
Code:
Nur das ihr den Unterschied sehen könnt.
Private Function ButtonExists(ByVal vlBtn As Long) As Boolean
Dim oButton As clsButtonInfo Set oButton = Button(vlBtn) ButtonExists = CBool(Not oButton Is Nothing) End Function Sorry habe mich noch nie mit der ObjectList beschäftigt. Nebenbei: Es geht hier nicht um Copy/Paste Es ist ein Programm das ich 1999 in VB geschrieben habe was da auf der VB seite abgeht weiss ich und stellt kein problem dar. gruss |
AW: TObjectList sehr anfällig?
Zitat:
Der Code mit Add und Insert ist in jedem Fall falsch. Gib doch bitte mal den kompletten Code mitsamt ButtonExists uhnd RemoveButton, damit man mal den Überblick bekommt. |
AW: TObjectList sehr anfällig?
Zitat:
Da hier zu viele dinge zugehörig sind. Ich habe ihn so klein wie möglich gehalten zwei Skins müssen sein zum gegenprüfen. Die aktuell relevanten teile befinden sich in uProgBar Das ist eine Common Classe die später auch für ProgStart verwendet wird. gruss |
AW: TObjectList sehr anfällig?
Ein paar Dinge gleich nach dem ersten Duchsehen:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:16 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