Autor Beitrag
Querkopf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 31

Win XP SP2
Turbo Delphi 2006 Explorer
BeitragVerfasst: Di 09.05.06 13:47 
Hallo!

Mit meinem Fussball-Reporter lese ich den bundesliga.de-Ticker aus und gebe die Ergebnisse aus. Da es ja aber auch noch andere Ticker gibt, habe ich nun das Programm so umgestellt, dass das Auslesen des Ticker-HTML-Codes in Plugins geschehen soll, welche die Funktion getMatchList (s.u.) haben. Rufe ich das auskommentierten showmessage in der DLL auf, kommt die richtige Ausgabe. In getMatch wird die Verknüpfung zum nächsten MatchListenelement von TList zu TMatchList umgewandelt. Die gleiche Showmessage-Anweisung funktioniert aber nicht mehr in der Executable, also sobald ich den Rückgabewert dort bekomme, geht offensichtlich der Typ TMatchList verloren. Dort bekomme ich die Meldung "Ungültige Typumwandlung". Ich habe es auch schon mit Pointer als Rückgabewert und einer Prozedur mit Parameter statt Funktion versucht.


Ich hoffe, Ihr werdet halbwegs schlau aus dem Code und könnt mir helfen.

Gruss, Pierre


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
function getMatchList : TMatchList; stdcall;
begin
  result := internetSource.loadData;
//  showmessage(matchList.getMatch(1).match)
end;


Deklaration von TMatchList :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
  TMatchList = class (TList)
    private
      var
        pMatch : TMatch;
    public
      function getMatch (id : byte) : TMatch;
      ...
  end;

function TMatchList.getMatch (id : byte) : TMatch;
begin
  if id < pMatch.id then
    result := (pPrev as TMatchList).getMatch(id)
  else if id > pMatch.id then
    result := (pNext as TMatchList).getMatch(id)
  else
    result := pMatch
end;


und TList ist nicht das von Delphi vorgegebene sondern dieses :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  TList = class
    published
      var
        pPrev : TList;
        pNext : TList;
        ...
  end;


Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Di 09.05.06 17:56 
user profile iconQuerkopf hat folgendes geschrieben:


Deklaration von TMatchList :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  TMatchList = class (TList)
    private
      var
        pMatch : TMatch;
    public
      function getMatch (id : byte) : TMatch;
      ...
  end;



Müsste dieser Teil nicht so heißen ? (Bin mir nicht ganz sicher !!)

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  TMatchList = class (TList)
    private
        pMatch : TMatch;
    public
      function getMatch (id : byte) : TMatch;
      ...
  end;


Zusätzlich vermisse ich hier noch den Aufruf von Deiner Funktion getMatchList in der DLL ?
Querkopf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 31

Win XP SP2
Turbo Delphi 2006 Explorer
BeitragVerfasst: Mi 10.05.06 18:26 
Hi,

das 'var' kann nach meiner Erfahrung, muss aber nicht. Ich nehms zur Übersicht, hatte bisher noch keine Probleme damit. Nun zum eigentlichen Problem :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
constructor TTickerDLL.load (tickerDLLFile : String);
begin
  pPath := PChar(tickerDLLFile);
  try
    lib := loadLibrary(PChar(tickerDLLFile));
    if lib = 0 then
      raise exception.Create('Fehler : Die angegebene Datei ist keine Library.')
    else
      begin
        @loadPlugin := GetProcAddress(lib,'loadPlugin');
        @getMatchList := GetProcAddress(lib,'getMatchList');
        @setCompetition := GetProcAddress(lib,'setCompetition');
        if not (Assigned(loadPlugin) and Assigned(loadPlugin) and Assigned(setCompetition)) then
          raise exception.Create('Fehler : Die angegebene Datei ist kein gültiges Fussball-Reporter-PlugIn'+#10#13+'oder hat ungültige API-Version.');
        pCompetitions := TStringList.Create;
        if not loadPlugin(pDescription,pFileName,pVersion,pProgrammer,pVersionAPI,pCompetitions) then
          raise exception.Create('Fehler : Beim Laden des PlugIns ist ein Fehler aufgetreten!');
        if PLUGIN_API_VERSION <> pVersionAPI then
          raise exception.Create('Fehler : Die API-Version ist verschieden!'); 
      end
  except
    on e : exception do
      begin
        if lib <> 0 then FreeLibrary(lib);
        raise exception.Create(e.Message)
      end
  end
end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function TTickerDLL.getGetMatchList : TMatchList;
var
  matchList : TMatchList;
begin
  try
    result := getMatchList;
//    showmessage('Match 2:'+result.getMatch(1).match);
  except
    on e:exception do
      begin
        if not assigned(result) then result := TMatchList.create;
        raise Exception.Create(e.Message)
      end
  end
end;


Dieses Showmessage geht nicht mehr.
Leidiglich wenn ich getMatch(0) haben möchte. Der Zeiger zeigt auf das erste Matchelement und muss somit nicht durch die Liste wandern, deshalb geht das. Sobald ich aber durch die Liste wandern muss, kann das Programm nicht mehr von TList auf TMatchList casten.

Gruss, Pierre

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt
NeoInDerMATRIX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 245

Win95, Win98(+se), WinNT, Win2000, WinME, WinXP(+pro), VISTA, Linux(SuSe), DOS [MultiMon(3)], Vista
D6 PeE + (FP 2.0l) + D3 Pe + D2005+ D2006 Arch
BeitragVerfasst: Mi 10.05.06 18:54 
Hallo,

soweit ich weis verweden die DLL und die APP je ihre eigene RTL. Das heist natürlich auch das sich die typen von ein ander unterscheiden. Also du kannst nur über umwege Klassen an DLL's übergeben!
Ich hoffe ich liege hier jetzt nicht zu falsch.

Cu
Neo
Balmung der blaue Gott
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 52

WinXP

BeitragVerfasst: Mi 10.05.06 19:01 
Hi,

Mein Post von heut morgen scheint nicht angekommen zu sein :(
Also hast du die Klassen in einer Unit, die du einbindest?
Querkopf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 31

Win XP SP2
Turbo Delphi 2006 Explorer
BeitragVerfasst: Mi 10.05.06 19:07 
Hallo,

jede Klasse hat ihre eigene Unit, die ich alle eingebunden habe. Ich meine auch, dass es auf das Problem, das NeoInDerMATRIX beschrieben hat, hinaus läuft. Etwas ähnliches hatte ich glaube ich schonmal gelesen. Wäre jetzt natürlich schön zu erfahren, wie diese Umwege aussehen ;) Ansonsten muss ich mir da was andres einfallen lassen.

Gruss, Pierre
NeoInDerMATRIX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 245

Win95, Win98(+se), WinNT, Win2000, WinME, WinXP(+pro), VISTA, Linux(SuSe), DOS [MultiMon(3)], Vista
D6 PeE + (FP 2.0l) + D3 Pe + D2005+ D2006 Arch
BeitragVerfasst: Mi 10.05.06 19:32 
Hallo,

soweit ich weis gibt es die möglichkeit das die DLL den gleichen MM benutzt aber so genau kenne ich mich damit nicht aus. Ich weis nur das es bei sowas einfacher ist mit Puffern ider Records zu arbeiten!

Cu
Neo
Querkopf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 31

Win XP SP2
Turbo Delphi 2006 Explorer
BeitragVerfasst: Mi 10.05.06 19:59 
Hi,

danke erstmal. Hab noch ein bissle gegooglet. Also das geht wohl wirklich nicht (oder nur sehr schwer). Ich werd dann die TMatchList-Klasse einfach in eine einfache doppelt-verkettete Liste umwandeln.

Gruss, Pierre