Sascha Posted June 30, 2004 Share Posted June 30, 2004 (edited) Hallo, wie ich ein OSD-Menü auf den Bildschirm per PlugIn zaubere weiß ich ja nun, aber wenn ich "EPG-Info" oder das OSD-Menü wähle, kommt beide Male das selbe Fenster. Wie kann ich dem Plugin nun klar machen, dass er unterscheiden soll, ob man das EPG-Info-Fenster oder das OSD-Menü haben möchte? Kann ich außerdem noch ein paar Infos zum auslesen der EPG-Daten bekommen? Damit ich diese ins EPG-Info-Fenster packen kann? Viele Grüße Sascha Edit: Bitte noch eine Erkärung der Funktionen "OSDExecute" und "OSDAddEntries". Wie kann man beide nutzen? z.B. die Variabeln "Entries" und "Action". Edit2: Für LoadEPGData brauch ich die TEPGClass. Die kennt er natürlich nicht, weil sie nirgendswo vorher erwähnt wird. Was brauch ich da für Daten? Edited June 30, 2004 by Sascha Quote Link to comment
Guest Lars_MQ Posted June 30, 2004 Share Posted June 30, 2004 hmm mal nicht so fix Also Du möchtest jetzt genau was tun? ein plugin schreiben, das die osd Darstellung übernimmt? wie ich ein OSD-Menü auf den Bildschirm per PlugIn zaubere weiß ich ja nun, aber wenn ich "EPG-Info" oder das OSD-Menü wähle, kommt beide Male das selbe Fenster. Wie kann ich dem Plugin nun klar machen, dass er unterscheiden soll, ob man das EPG-Info-Fenster oder das OSD-Menü haben möchte? Wenn Du ein richtiges OSD-Plugin schreiben willst, dann musst du auf alle 4 OSD-Typen reagieren (Menu, EPG, EPGInfo, Duration). Du (also Dein Plugin) bekommst vom DVBViewer mitgeteilt, was jetzt angezeigt werden soll und erstellst es entsprechend. Einfach nur einen Teil rauspicken, das geht nicht, so ist das nicht möglich (und auch nicht sinnvoll). Ich setze mal vorraus, das du die procedure OSDDisplay(Handle: THandle; Rect: TRect; Typ: TOSDType; Data: TListArray; Buttons: TActionArray; Selected: integer); stdcall; nimmst. Dort wird dir unter Typ der verlangte OSD-Typ mitgeteilt. TOSDType = (otMenu,otEPG,otEPGInfo, otDuration); Was ich dir empfehlen kann ist, in die routine mal ne log-funktion einzubauen, also alles, was geliefert wird in 'ne text-datei schreiben und dann systematisch mal die einzelnen OSD Bereiche des DVBViewer durch zu klicken und Dir mal das log anzuschauen. Das sagt viel mehr als 'n roman von mir hier Dort wird das EPG u.a. auch gleich mitgeliefert... Ansonsten gilt, je genauer die Beschreibung deines Problems und Deines Vorgehens ist, desto besser können wir Dir helfen. Gruss lars Quote Link to comment
Sascha Posted June 30, 2004 Author Share Posted June 30, 2004 danke für den Tipp mit "otMENU", etc.... das hatte ich übersehen Nun habe ich das schon mal hin bekommen Ehrlich gesagt, wüsste ich nun nicht, wie ich das mit der Log-Funktion machen könnte.... Ich habe für die Sache mit den EPG-Infos folgendes gefunden: TMSG_EPGInfo = record Time: TDateTime; Duration: TDateTime; Title, Info, Description: PChar; Charset: Integer; end; TEPGData = record Now, Next: TMSG_EPGInfo; Wenn ich dann mithilfe von Canvas.TextOut die laufende Sendung angezeigt haben möchte, steht dann entweder gar nichts, oder mal nur ein einziger Buchstabe bzw. Hyroglyph. D.h. (wenn var epg:tepgdata) epg.now.title leer ist, dann fehlen ihm die Informationen. Ich denke mal dafür ist die Prozedure "LoadEPGData", jedoch geht diese nicht (s. 1. Post oben). Quote Link to comment
Guest Lars_MQ Posted June 30, 2004 Share Posted June 30, 2004 Ehrlich gesagt, wüsste ich nun nicht, wie ich das mit der Log-Funktion machen könnte.... global: var log : TStrings; Beim initialisieren des plugins: log:=TStrings.create; in der OSDDisplay: for i:= 0 to 22 do log.add(Data.caption); hier noch was dir sonst zum loggen einfällt hinzufügen... in der Finalization der DLL: log.savetofile('c:\hierbinich.log'); log. free; (der code ist ohne gewähr ) damit hast du recht fix einige kilobyte an daten zusammen... klar funktioniert nur, wenn das plugin sauber mit dem DVBViewer beendet wird... (ist auch nicht für echte debugging zwecke geeignet weil rumms = alle daten weg aus TStrings) kleiner hint: initialization und finalization am besten über die procedure DLLEntry(dwReason: Integer); begin if dwReason = DLL_PROCESS_DETACH then // = 0 begin //hier gehts aufs ende zu.... end else if dwreason = DLL_PROCESS_ATTACH then // =1 begin //hier kannste initialisieren.... end; end; begin // hauptteil der DLL DLLProc := @DLLEntry; DLLEntry(1); end. Zu deinem Canvas Problem, vielleicht mal nen codeschnippsel wäre nett Gruss Lars Quote Link to comment
Sascha Posted June 30, 2004 Author Share Posted June 30, 2004 danke. werde das mit der log-funktion nachher mal testen. zum epg: procedure OSDDisplay (Handle:THandle;Rect:TRect;Typ:TOSDType;Data:TListArray;Buttons:TActionArray;Selected:integer);stdcall; var Canvas:TCanvas; epg: TEPGData; begin Canvas:=TCanvas.create; Canvas.handle:=handle; canvas.Brush.Color:=clnavy; Canvas.FillRect(rect); Canvas.Font.Color := clwhite; Canvas.Font.Size := 12; Canvas.TextOut(rect.Left,rect.Top,epg.Now.Title); Canvas.destroy; end; Gruß Sascha Quote Link to comment
Guest Lars_MQ Posted June 30, 2004 Share Posted June 30, 2004 Canvas.TextOut(rect.Left,rect.Top,epg.Now.Title); hmm du willst zuviel auf einmal ein normales Canvas.TextOut(rect.Left,rect.Top,'Sascha was here'); macht er nehme ich mal an... versuch dich erstmal im auslesen der Data : TListArray variable per log. da steht wirklich das epg drin (sofern ne epg-seite vom DVBViewer abgerufen wird natürlich). die epgdaten (ob aus der epg.dat oder per abruf) sind ein ganz anderes kapitel, da kriegst du alles und muss dir selber raussuchen, welches epg in bezug auf kanal und uhrzeit anzuzeigen wäre. übrigens überleg ich verzweifelt, was das "LoadEPGData" war. woher hast du die funktion? (auswendig kenn ich die api bei weitem nicht ) Gruss lars Quote Link to comment
Sascha Posted July 1, 2004 Author Share Posted July 1, 2004 ja, wenn ich bei textout selber einen string eingebe, dann geht es. loadepgdata habe ich von christian per mail mal bekommen. das teil poste ich nachher mal. gruß sascha Quote Link to comment
Guest hackbart Posted July 1, 2004 Share Posted July 1, 2004 wichtig ist außerdem, dass die Schnittstelle für das OSD sich geändert hat. Die Parameter sind nun wie folgt: TString4k = Array [0..4095] of char; TActionRecord = record caption: TString4k; Id: Integer; end; TActionArray = array[0..3] of TActionRecord; TListArray = array[0..22] of TActionRecord; Weiterhin sind noch ein paar Funktionen zum hinzufügen eigener Menüpunkte hinzugekommen, sowie die Möglichkeit Befehle abzufangen und auf Eingaben über Keyboard und WinLIRC eigenständig zu reagieren. Christian Quote Link to comment
Sascha Posted July 1, 2004 Author Share Posted July 1, 2004 Zu der Log-Sache: Wenn ich das genau so mache, dann kommt am Ende immer eine Fehlermeldung. "Abstrakter Fehler" usw. Quote Link to comment
Guest Lars_MQ Posted July 1, 2004 Share Posted July 1, 2004 nimm anstatt des tstrings mal ne tstringlist, das war mein fehler :-( Quote Link to comment
erwin Posted July 1, 2004 Share Posted July 1, 2004 Hallo Experten! Ich versuch mich schon eine Weile mit dem OSD (allerdings in C++). Ich kriegs nicht gebacken. Wahrscheinlich habe ich die Philosophie noch nicht durchschaut. Ich denke OSDDisplay (...) muß im Plugin implementiert werden und wird dann vom DVBViewer gegebenenfalls aufgerufen. Wirds aber nicht. Muß ich noch was initailisieren? Habt Erbarmen und gebt mir ein Code-Schnitzel (Delphi reicht mir) über die allgemeine Struktur eines solchen OSD-Plugins. Gruß Erwin Quote Link to comment
Guest Lars_MQ Posted July 1, 2004 Share Posted July 1, 2004 (edited) der trick ist in den Einstellungen | Optionen vom DVBViewer unter epg dein osd-plugin einzustellen :-) dann wird deine osddisplay auch aufgerufen... Klar, das Plugingrundgerüst muss stimmen, dafür gibts im membersbereich ja einige beispiele.. gruss lars Edited July 1, 2004 by Lars_MQ Quote Link to comment
erwin Posted July 1, 2004 Share Posted July 1, 2004 der trick ist in den Einstellungen | Optionen vom DVBViewer unter epg dein osd-plugin einzustellen :-) dann wird deine osddisplay auch aufgerufen... Klar, das Plugingrundgerüst muss stimmen, dafür gibts im membersbereich ja einige beispiele.. gruss lars Erst mal Dank für deine Bemühungen: Scheint daß ich ziemlich Begriffsstutzig bin. Aber was soll ich wo einstellen? Unter Einstellungen/Optionen/Teletext & EPG finde ich Nichts das OSD betreffend. THX Erwin Quote Link to comment
Sascha Posted July 1, 2004 Author Share Posted July 1, 2004 (edited) fehlermeldung ist weg, datei wird angelegt. super nur: der inhalt der log-datei ist stets leer var log: TStringList; // -- Declaration of all Types ------------------------------------------------- procedure OSDDisplay (Handle:THandle;Rect:TRect;Typ:TOSDType;Data:TListArray;Buttons:TActionArray;Selected:integer);stdcall; var i:integer; begin for i:= 0 to 22 do log.add(Data[i].caption); end; // -- Exports ------------------------------------------------------------------ exports PluginName; exports Version; exports Copyright; exports LibTyp; exports OSDDisplay; exports OSDAspect; exports OSDExecute; exports OSDAddEntries; procedure DLLEntry(dwReason: Integer); begin if dwReason = DLL_PROCESS_DETACH then // = 0 begin log.savetofile('c:\hierbinich.log'); log.Free; end else if dwreason = DLL_PROCESS_ATTACH then // =1 begin log:=TStringList.create; end; end; begin // hauptteil der DLL DLLProc := @DLLEntry; DLLEntry(1); end. @erwin: bei der Skin-Auswahl für das EPG-Info-Fenster. Edited July 1, 2004 by Sascha Quote Link to comment
Guest Lars_MQ Posted July 1, 2004 Share Posted July 1, 2004 @sascha du hast dein plugin aber als aktives OSD eingestellt? Quote Link to comment
Sascha Posted July 1, 2004 Author Share Posted July 1, 2004 jepp. wobei ich dann aber kein osd mehr habe. ich erhalte nur noch ein epg-info-fenster in der größe des osd-menüs. Quote Link to comment
Guest Lars_MQ Posted July 1, 2004 Share Posted July 1, 2004 (edited) hmm, genau der gleiche code bei mir getestet und innerhalb von 2 minuten gut 13 kb an log... sehr eigenartig mal nen anderen weg :-) debugge deine dll mal direkt aus delphi. Projekt| Optionen | Verzeichnisse/ Bedingungen -> Ausgabeverzeichniss [hier den DVBViewer Pluginfad eintragen] Start | Parameter | Hostanwendung -> hier den DVBViewer.exe inkl. pfad eintragen wenn du jetzt aus delphi raus startest, startet der DVBViewer mit deiner dll und du kannst wie gewohnt breakpoints setzen in deinem code und in ruhe deine werte untersuchen. (naja in ruhe der DVBViewer hört sich an wie ne gesprungene platte...) Edited July 1, 2004 by Lars_MQ Quote Link to comment
Guest hackbart Posted July 1, 2004 Share Posted July 1, 2004 gaanz wichtig. Du wirst das gleiche Problem wie Lars haben. Der DVBViewer ist in D4 entwickelt wurden und das Alignment der Datensätze ist nen anderes als bei >D5. Genau deswegen hab ich die Einträge in der aktuellen Version umgestellt auf feste Datengrößen. Was den Skin angeht, so würde ich mal nicht viel Arbeit investieren, denn das System vom Lars ist schon jetzt extrem flexibel und wenn der OSD Filter ins Spiel kommt, kann fließende Transparenz problemlos im Overlay und anderen Videorendermodis benutzt werden. Wie gesagt es bewegt sich im Untergrund recht viel, also stay tuned Christian Quote Link to comment
Guest Lars_MQ Posted July 1, 2004 Share Posted July 1, 2004 (edited) ja klar sascha, das sollteste im delphi einstellen unter Projekt| Optionen | compiler| Codeerzeugung-> ausrichtung von recordfeldern auf 4!! (gilt für delphi 7 bei 5 und 6 gibts sicher was ähnliches...) sorry hab ich total verdrängt schon lars Edited July 1, 2004 by Lars_MQ Quote Link to comment
Sascha Posted July 1, 2004 Author Share Posted July 1, 2004 hab zwar nun in meiner log-datei etwas, aber damit kann man überhaupt nichts anfangen Da stehen einfach nur die Texte, die im Menü standen und die Texte aus den EPG-Infos.. Quote Link to comment
erwin Posted July 2, 2004 Share Posted July 2, 2004 @erwin: bei der Skin-Auswahl für das EPG-Info-Fenster. Kaum machts man richtig schon klappts. Danke Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.