Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TObjectList - Sort crash (D7) (https://www.delphipraxis.net/110001-tobjectlist-sort-crash-d7.html)

o-sch 11. Mär 2008 14:40


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:
 
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;
Soweit so gut ... Ich kann ohne Probleme auf die Objekte zugreifen:

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:
  Procedure TmyItemList.AddMySpecialItem;
  begin
    Self.NewMyItem(1,2,3);
  end;
versus

Delphi-Quellcode:
  procedure fmain.CallIt
  begin
    getMyItemList.NewItem(99,88,77);
  end;

Sollte doch eigentlich keinen Unterschied machen.

Ich bin ratlos :-( help, please

thkerkmann 11. Mär 2008 15:29

Re: TObjectList - Sort crash (D7)
 
Hi,
also deine compare blick ich nicht:
Zitat:

Delphi-Quellcode:
function MyListCompare(pmyItem1, pmyItem2: pointer): integer;
  begin
    Result := 0
    if TmyItem(pmyItem).V1 > TmyItem(pmyItem).V2 then Result := 1; // <<<< wo kommt denn pmyItem plötzlich her ???
    if TmyItem(pmyItem).V1 < TmyItem(pmyItem).V2 then Result := -1;
  end;

ich würde so schreiben
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;

o-sch 11. Mär 2008 15:49

Re: TObjectList - Sort crash (D7)
 
Hallo !

Danke für deine Antwort.

pmyItem1 und pmyItem2 sind die übergebenen Pointer:

Delphi-Quellcode:
function MyListCompare(pmyItem1, pmyItem2: pointer): integer;
                       ^^^^^^^^^ ^^^^^^^^
Ich denke die beiden Compare-Varianten werden das gleiche Ergebnis liefern .

Die Zugriffsverletzung tritt ja auch schon beim Zugriff auf : TmyItem(pmyItem1).V1 auf.
Das ist das eigentliche Problem.

dfried 11. Mär 2008 15:59

Re: TObjectList - Sort crash (D7)
 
Zitat:

Zitat von o-sch
Hallo !
pmyItem1 und pmyItem2 sind die übergebenen Pointer:

Das ist glaub ich schon klar, nur wenn der Sourcecode den du oben aufgelistet hast per Copy & Past aus deinem Delphi ist, dann ist der Fehler, dass du dort auf ein "pmyItem" verweist und nicht auf pmyItem1 oder pmyItem2!

thkerkmann 11. Mär 2008 16:04

Re: TObjectList - Sort crash (D7)
 
Genau das hab ich gemeint :gruebel:

o-sch 11. Mär 2008 16:09

Re: TObjectList - Sort crash (D7)
 
Zitat:

Zitat von dfried
Das ist glaub ich schon klar, nur wenn der Sourcecode den du oben aufgelistet hast per Copy & Past aus deinem Delphi ist, dann ist der Fehler, dass du dort auf ein "pmyItem" verweist und nicht auf pmyItem1 oder pmyItem2!

Der Code wird nicht 1:1 benutzt, sondern ist stark vereinfacht. Das ist ein Fehler in der Fehlerbeschreibung :?

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;

thkerkmann 11. Mär 2008 16:34

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

Tyrael Y. 11. Mär 2008 16:39

Re: TObjectList - Sort crash (D7)
 
Zitat:

Zitat von o-sch
Delphi-Quellcode:
  Procedure TmyItemList.AddMySpecialItem;
  begin
    Self.NewMyItem(1,2,3);
  end;

Was passiert da drin?

o-sch 11. Mär 2008 16:52

Re: TObjectList - Sort crash (D7)
 
Zitat:

Zitat von Tyrael Y.
Delphi-Quellcode:
  Procedure TmyItemList.AddMySpecialItem;
  begin
    Self.NewMyItem(1,2,3);
  end;

Was passiert da drin?

Schau mal ganz oben. Der erste Codeschnippsel im Startpost.
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:

Dax 11. Mär 2008 16:58

Re: TObjectList - Sort crash (D7)
 
Zitat:

Zitat von o-sch
@thkerkmann: Else kommt mir nicht ins Haus :zwinker:

Wieso?


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 Uhr.
Seite 1 von 3  1 23      

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