AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi interfaces: Ein paar grundlegende Fragen (zB. woher die AV?)
Thema durchsuchen
Ansicht
Themen-Optionen

interfaces: Ein paar grundlegende Fragen (zB. woher die AV?)

Ein Thema von yankee · begonnen am 1. Mär 2007 · letzter Beitrag vom 1. Mär 2007
Antwort Antwort
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#1

interfaces: Ein paar grundlegende Fragen (zB. woher die AV?)

  Alt 1. Mär 2007, 16:21
Hi @ll,

alles, was ich an Erfahrung mit Interfaces habe kommt von Java und jetzt probiere ich diese mal in Delphi anzuwenden und .... habe damit ein paar Probleme .

Ich habe mir überlegt eine allgemeine Lösung zum sortieren einer TObjectList zu coden:
Delphi-Quellcode:
unit USortedList;

interface

uses SysUtils, Contnrs;

type

  IComparable =interface
    ['{210AC03E-6716-49A5-8B54-34845AE4A087}']
    function Compare(other: TObject):integer;
  end;
   TSortedList =class(TObjectList)
     public
       function Add(neu: IComparable):integer;
       procedure Sort;
   end;

   TIntTest =class(TInterfacedObject, IComparable)
     public
       v: integer;
       function Compare(other: TObject):integer;
   end;

implementation

function TIntTest.Compare(other: TObject):integer;
begin
  result :=v-TIntTest(other).v;
end;

function TSortedList.Add(neu: IComparable):integer;
begin
  result :=inherited Add(TObject(neu));
end;

procedure TSortedList.Sort;
 procedure QuickSort(iLo, iHi: Integer);
 var
   Lo, Hi: Integer;
   Mid: IComparable;
 begin
   Lo := iLo;
   Hi := iHi;
   Supports(Items[(Lo + Hi) div 2],IComparable,Mid); //Hier gibt es eine AV
   repeat
     while Mid.Compare(Items[Lo]) < 0 do Inc(Lo);
     while Mid.Compare(Items[Hi]) > 0 do Dec(Hi);
     if Lo <= Hi then
     begin
       Exchange(Lo,Hi);
       Inc(Lo);
       Dec(Hi);
     end;
   until Lo > Hi;
   if Hi > iLo then QuickSort(iLo, Hi);
   if Lo < iHi then QuickSort(Lo, iHi);
 end;
begin
  QuickSort(0,Count-1);
end;

end.
Dazu habe ich folgende Fragen:
1. Wofür ist die id (['{210AC03E-6716-49A5-8B54-34845AE4A087}']) gut? Soweit ich das sehe ist die 100% zufällig.
2. TIntTest =class(TInterfacedObject, IComparable) Muss ich das Objekt unbedingt von TInterfacedObject ableiten? Da wäre dann ja schon 80% der Grundidee von interfaces futsch...?! Ich will ja, dass ich meine Klasse, die ich später in der Liste mal speichere möglicherweise von was anderem ableiten.
3. Supports(Items[(Lo + Hi) div 2],IComparable,Mid); Am Anfang habe ich versucht das Objekt einfach zu casten (IComparable(Items[...])) aber wie ich gelesen habe funktioniert das nur in .net uind nicht in D für win32. Aber Supports funktioniert auch nicht so, wie ich gedacht hätte, denn der Aufruf wirft mir eine Access Violation. Warum? Und vorallem: Wie mache ich es richtig?
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Benutzerbild von Kedariodakon
Kedariodakon

Registriert seit: 10. Sep 2004
Ort: Mönchengladbach
833 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: interfaces: Ein paar grundlegende Fragen (zB. woher die

  Alt 1. Mär 2007, 16:37
Zitat von yankee:
1. Wofür ist die id (['{210AC03E-6716-49A5-8B54-34845AE4A087}']) gut? Soweit ich das sehe ist die 100% zufällig.
die GUID ist mehr oder minder zufällig berechnet, die benötigst du um z.b. mit As zu arbeiten...
Die ist vor allem auch dann wichtig, wenn du mit dem Interface auch außerhalb von deiner Anwendung arbeiten willst, ich glaub ohne GUID geht dann nichts mehr...

Zitat von yankee:
2. TIntTest =class(TInterfacedObject, IComparable) Muss ich das Objekt unbedingt von TInterfacedObject ableiten? Da wäre dann ja schon 80% der Grundidee von interfaces futsch...?! Ich will ja, dass ich meine Klasse, die ich später in der Liste mal speichere möglicherweise von was anderem ableiten.
Nein musst du nicht, du musst nur die Methoden von TInterface in deiner Klasse implementieren...
Wenn du es nicht machst, meckert Delphi...

Zitat von yankee:
3. Supports(Items[(Lo + Hi) div 2],IComparable,Mid); Am Anfang habe ich versucht das Objekt einfach zu casten (IComparable(Items[...])) aber wie ich gelesen habe funktioniert das nur in .net uind nicht in D für win32. Aber Supports funktioniert auch nicht so, wie ich gedacht hätte, denn der Aufruf wirft mir eine Access Violation. Warum? Und vorallem: Wie mache ich es richtig?
Das Problem wird sein, dass deine Objekte der Reihe nach freigegeben werden (glaub ich)...

Mit jedem neuen Methoden-Aufruf von Supports wird in Mid ein neues Interface von dem entsprechenden Objekt angefordert, und immer wenn dann Mid neu belegt wird, wird das Objekt von welchem das Interface vorher war wieder freigegeben, da der RefZähler dann jedesmal auf 0 gehen sollte...

Zumindest tip ich mal darauf...


Nie Interfaces mit Objekten mischen, sonst gibts fast immer =>

Bye Christian
Christian
  Mit Zitat antworten Zitat
bttb930

Registriert seit: 6. Okt 2003
372 Beiträge
 
#3

Re: interfaces: Ein paar grundlegende Fragen (zB. woher die

  Alt 1. Mär 2007, 16:39
Ich glaube wenn Du unter Delphi mit Interfaces arbeiten willst, dann ist es hilfreich, deine Java-Erfahrungen komplett zu vergessen. Interfaces in Java sind ein mächtiges Tool, unter Delphi eher kaum zu gebrauchen. Klar, manchmal habe ich auch schon welche benutzt, aber wenn das Problem irgendwie auch anders zu lösen ist, dann mach ich's lieber anders. In Java und C# benutze ich dagegen so oft es geht Interfaces.
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#4

Re: interfaces: Ein paar grundlegende Fragen (zB. woher die

  Alt 1. Mär 2007, 16:47
Hallo,

dass Du eine AV bekommst, wird daran liegen, dass Du ein Interface nach TObject castest und dieses speicherst. Dabei wird der Referenzzähler nicht erhöht (weak reference). Deshalb wird das Interface vermutlich irgendwann freigegeben, und wenn Du dann irgendwann darauf zugreifen willst...

//Edit:
Warum benutzt Du eigentlich eine TObjectList, und keine TInterfaceList?

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#5

Re: interfaces: Ein paar grundlegende Fragen (zB. woher die

  Alt 1. Mär 2007, 16:59
Zitat von Kedariodakon:
Das Problem wird sein, dass deine Objekte der Reihe nach freigegeben werden (glaub ich)...

Mit jedem neuen Methoden-Aufruf von Supports wird in Mid ein neues Interface von dem entsprechenden Objekt angefordert, und immer wenn dann Mid neu belegt wird, wird das Objekt von welchem das Interface vorher war wieder freigegeben, da der RefZähler dann jedesmal auf 0 gehen sollte...
Ich bin mir nicht sicher, ob ich dich jetzt richtig verstanden habe (ich galube ich habe das garnichtm, weil ich nicht wiess, was ein RefZähler ist) aber Die AV kommt schon beim ersten Aufruf von Supports (ich bin da mal durchgesteppt. Und schaffe es nicht den Befehl auch nur einmal erfolgreich auszuführen).

@bttb930: Ich werde es mir merken, abe zumindest für dieses Problem fällt mri keine bessere Lösung ein.

@xaromz: *gerde deinen Beitrag bemerk*:
RefZöähler = der vom Garbagecollector? Ihr seit euch schin im klaren, dass ich mit D2k5 for Win32 und nicht for .net arbeite? Da gibt es doch keinen GC, oder?

Und ich verwende die TObjectList, weil ich auch die Referenzen zu den Objekten gerne hätte um diese Freen zu können, wenn ich ein Objekt in der Liste lösche...
Ich habe es übrigens auch mal probiert ohne die Add-M;ethode zu überschreiben. Ich ahbe Add eigentlich nur überschrieben um die Möglichkeit auszuschliessen Objekte in die Liste einzufügen, die IComparable nicht implementieren...
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#6

Re: interfaces: Ein paar grundlegende Fragen (zB. woher die

  Alt 1. Mär 2007, 19:50
Hallo,
Zitat von yankee:
@xaromz: *gerde deinen Beitrag bemerk*:
RefZöähler = der vom Garbagecollector? Ihr seit euch schin im klaren, dass ich mit D2k5 for Win32 und nicht for .net arbeite? Da gibt es doch keinen GC, oder?
Mir ist vor Allem klar, dass Interfaces unter Win32 einer Referenzzählung unterworfen sind . Deshalb ja auch die beiden Methoden _AddRef und _Release.
Zitat von yankee:
Und ich verwende die TObjectList, weil ich auch die Referenzen zu den Objekten gerne hätte um diese Freen zu können, wenn ich ein Objekt in der Liste lösche...
Ich habe es übrigens auch mal probiert ohne die Add-M;ethode zu überschreiben. Ich ahbe Add eigentlich nur überschrieben um die Möglichkeit auszuschliessen Objekte in die Liste einzufügen, die IComparable nicht implementieren...
Das kannst Du vergessen. Ein Interface besitzt keine Free-Methode. Aber da hier eben die Referenzzählung greift, hast Du auch kein Problem.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  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 01:24 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