![]() |
TObjectList - Sort crash (D7)
Hallo !
Ich habe hier eine abgeleitete TObjectList die ich mit eigenen Objekten befülle: (Der Code ist frisiert, damit ich das Problem einfacher darstellen kann)
Delphi-Quellcode:
Soweit so gut ... Ich kann ohne Probleme auf die Objekte zugreifen:function TMyItemList.NewMyItem(a1,a2,a3:Integer):TmyItem; begin Result := NIL; Result := TmyItem.Create(Self); Result.V1 := a1; Result.V2 := a2; Result.V3 := a3; Self.Add(Result); end;
Delphi-Quellcode:
procedure TmyItemList.SchleifMich; var i:Integer; begin for i := 0 to Self.Count-1 do begin if TmyItem(Items[i]).V1 > 0 then beep; end; end; Aber: Versuche ich zu sortieren bekomme, ich eine Zugriffsverletzung. Ich würde ja vermuten, daß ich nur "gültige" Pointer also vom passenden Typ (TmyItem) in der Funktion vorfinde. Schließlich gib es nur die eine Funktion um Objekte zuzufügen. Das ist auch in 99% der Fälle so ... dann plötzlich finde ich einen Pointer der ins Nichts zeigt.
Delphi-Quellcode:
function MyListCompare(pmyItem1, pmyItem2: pointer): integer; begin Result := 0 if TmyItem(pmyItem).V1 > TmyItem(pmyItem).V2 then Result := 1; if TmyItem(pmyItem).V1 < TmyItem(pmyItem).V2 then Result := -1; end; procedure TMyItemList.DoSort begin Self.Sort(MyListCompare); end; Meine Vermutung ... ich mache was beim Erzeugen falsch. Die Funktion NewMyItem wird einmal von außen gecallt und einmal über eine Funktion im Objekt:
Delphi-Quellcode:
versus
Procedure TmyItemList.AddMySpecialItem;
begin Self.NewMyItem(1,2,3); end;
Delphi-Quellcode:
procedure fmain.CallIt
begin getMyItemList.NewItem(99,88,77); end; Sollte doch eigentlich keinen Unterschied machen. Ich bin ratlos :-( help, please |
Re: TObjectList - Sort crash (D7)
Hi,
also deine compare blick ich nicht: Zitat:
Delphi-Quellcode:
function MyListCompare(pmyItem1, pmyItem2: pointer): integer;
begin if TmyItem(pmyItem1).V1 > TmyItem(pmyItem2).V1 then Result := 1 else if TmyItem(pmyItem1).V1 < TmyItem(pmyItem2).V1 then Result := -1 else Result := 0; end; |
Re: TObjectList - Sort crash (D7)
Hallo !
Danke für deine Antwort. pmyItem1 und pmyItem2 sind die übergebenen Pointer:
Delphi-Quellcode:
Ich denke die beiden Compare-Varianten werden das gleiche Ergebnis liefern .
function MyListCompare(pmyItem1, pmyItem2: pointer): integer;
^^^^^^^^^ ^^^^^^^^ Die Zugriffsverletzung tritt ja auch schon beim Zugriff auf : TmyItem(pmyItem1).V1 auf. Das ist das eigentliche Problem. |
Re: TObjectList - Sort crash (D7)
Zitat:
|
Re: TObjectList - Sort crash (D7)
Genau das hab ich gemeint :gruebel:
|
Re: TObjectList - Sort crash (D7)
Zitat:
Delphi-Quellcode:
function MyListCompare(pmyItem1, pmyItem2: pointer): integer;
begin Result := 0 if TmyItem(pmyItem1).V1 > TmyItem(pmyItem2).V1 then Result := 1; if TmyItem(pmyItem1).V1 < TmyItem(pmyItem2).V1 then Result := -1; end; |
Re: TObjectList - Sort crash (D7)
Ok,
also wenn's das nicht ist - nehmen wir mal an deine compare Funktion sei richtig - muss der Fehler woanders liegen. Wiewohl ich deine Konstruktion von if's nicht akzeptieren kann. Das ist sowas von ineffizient, für mich gehört da ein if .. else if .. else rein Aus dem was Du uns hier an Code gezeigt hast, können wir aber nichts entnehmen. Da wirst Du mehr rausrücken müssen. Gruss |
Re: TObjectList - Sort crash (D7)
Zitat:
|
Re: TObjectList - Sort crash (D7)
Zitat:
Es gibt auch nur diese eine Methode um ein Objekt zu erzeugen und der eigenen Liste zuzufügen. @thkerkmann: Else kommt mir nicht ins Haus :zwinker: |
Re: TObjectList - Sort crash (D7)
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 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 by Thomas Breitkreuz