Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Interface Problem (https://www.delphipraxis.net/173893-interface-problem.html)

razer91 22. Mär 2013 16:37

Interface Problem
 
Hallo Leute,

ich habe folgendes Problem:

Eine eine von mir geschriebene (mit Hilfe der JCL ;)) Listenklasse kann das:

Delphi-Quellcode:

function TSetList.GetSets(): ISetArray;
var
  Iter: IJclIterator;
begin
  Result := TSetArray.Create(DefaultContainerCapacity, False);
  Iter := FMap.Values.First();
  while Iter.HasNext do
    Result.Add(Iter.Next());
end;

ISetArray = interface(IJclList)
end;
TSetArray = class(TJclArrayList, ISetArray)
protected
  function CreateEmptyContainer: TJclAbstractContainerBase; override;
end;
Im Hauptprogramm ergibt sich folgende Situation:

Delphi-Quellcode:
procedure Something1();

  function Something2(): string;
  var
    Set2: TSetType; // Verträglich mit ISetArray/TSetArray...
  begin
    for Set2 in SetList.GetSets() do
    begin
      //...
    end;
  end;

var
  somestring: string;
  Set1: TSetType;
begin
  //[...]

  for Set1 in SetList.GetSets() do
  begin
    //[...]

    somestring := Something2();
  end;
  //[...]

end; // Something1 end und hier knallts (EAccesViolation in der Unit "System" in der Methode "@IntfClear"
Wenn ich die Zeile mit Funktion "Something2" weglasse, passiert nichts. Hat jemand eine Idee woran das liegen kann?
Scheint ja irgendwas beim Aufräumen des Methoden-Stacks oder so nicht ganz glatt zu laufen.

Danke schon mal im Voraus!

razer91 24. Mär 2013 18:45

AW: Interface Problem
 
Keiner eine Idee? Braucht es noch mehr Informationen?

geskill 24. Mär 2013 22:01

AW: Interface Problem
 
Am Besten du erstellst davon ein kleines Demo Projekt und stellst uns hier den Quellcode zur Verfügung.

Mit Interfaces kann das ganz schnell wigelich werden, weil der Debgugger da einem auch nicht mehr so zur Seite steht.

Es scheint aber, als würde sich eine Interface Instanz freigeben wollen, die jedoch schon zuvor freigeben wurde (so als ob man zwei mal .Free() ) aufruft.

razer91 25. Mär 2013 08:38

AW: Interface Problem
 
Zitat:

Zitat von geskill (Beitrag 1208647)
Am Besten du erstellst davon ein kleines Demo Projekt und stellst uns hier den Quellcode zur Verfügung. [...]

Bevor ich das mache, präzisiere ich meine Frage: Der Aufbau der Methode "Something1()" führt zu einer Verschachtelung zweier For-Schleifen, in denen jeweils "GetSets()" aufgerufen wird:

Delphi-Quellcode:
  for Set1 in SetList.GetSets() do
  begin
    //[...]

    somestring := Something2();
  end;
Das entspricht:

Delphi-Quellcode:
  for Set1 in SetList.GetSets() do
  begin
    //[...]
   
    for Set2 in SetList.GetSets() do
    begin
      //...
    end;

  end;
Wenn man die innere Schleife weglässt tritt der Fehler nicht auf. Das könnte bedeuten, dass gerade diese Verschachtelung mit dem zweimaligen Aufruf von GetSets() damit zu tun hat. Nur warum?

Wenn diese Überlegung nichts hilft, dann erstelle ich gerne ein Beispiel-Projekt. Ich weiß nur nicht, ob das hilft, weil ich JCL-Komponenten benutzte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:38 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