| Autor |
Beitrag |
Querkopf
      
Beiträge: 31
Win XP SP2
Turbo Delphi 2006 Explorer
|
Verfasst: 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
Delphi-Quelltext 1: 2: 3: 4: 5:
| function getMatchList : TMatchList; stdcall; begin result := internetSource.loadData; end; |
Deklaration von TMatchList :
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 :
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| TList = class published var pPrev : TList; pNext : TList; ... end; |
Moderiert von Christian S.: Code- durch Delphi-Tags ersetzt
|
|
bis11
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: Di 09.05.06 17:56
|
|
Querkopf 
      
Beiträge: 31
Win XP SP2
Turbo Delphi 2006 Explorer
|
Verfasst: 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 :
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; |
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; 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 raziel: Code- durch Delphi-Tags ersetzt
|
|
NeoInDerMATRIX
      
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
|
Verfasst: 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
      
Beiträge: 52
WinXP
|
Verfasst: 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 
      
Beiträge: 31
Win XP SP2
Turbo Delphi 2006 Explorer
|
Verfasst: 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
      
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
|
Verfasst: 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 
      
Beiträge: 31
Win XP SP2
Turbo Delphi 2006 Explorer
|
Verfasst: 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
|
|
|