Article View: pl.comp.lang.delphi
Article #346865Re: dispintertface - Jak się dostać do metod
From: mwitkowski2b
Date: Fri, 16 Nov 2018 12:13
Date: Fri, 16 Nov 2018 12:13
114 lines
6654 bytes
6654 bytes
Jeszcze raz podsumowanie:
Cel, który chcę osiągnąć to przeniesienie kodu z C# do Delphi.
W C# wygląda to tak, że jeżeli chciałbym sprawdzić jakiego rodzaju dane są przechowywane na karcie pamięci, to wykonuję to w następujący sposób (celowo zamieszczam tylko wybrane fragmenty kodu żeby nie komplikować problemu dodatkowo. Przyjmijmy, że mam już połączenie, widzę obraz, teraz muszę tylko z istniejącej sesji połączenia pobrać te dodatkowe informacje)
Najpierw analiza w C#:
[1]
private void StartTrackSearch(Bosch.VideoSDK.MediaDatabase.MediaDatabase mdb)
{
if(mdb != null)
{
// do f_trackSearch poniższa metoda zwraca mi obiekt klasy SearchSession
f_trackSearch = mdb.CreateSearchSession(Bosch.VideoSDK.MediaDatabase.SearchTypeEnum.steTrack);
// podepnij obsluge zdarzeń TrackAvailable() i Progress()
f_trackSearch.TrackAvailable += new Bosch.VideoSDK.GCALib._ISearchSessionEvents_TrackAvailableEventHandler(OnTrackAvailable);
f_trackSearch.Progress += new Bosch.VideoSDK.GCALib._ISearchSessionEvents_ProgressEventHandler(OnProgress);
// uruchom mechanizm poszukiwania, UWAGA: automatycznie wywoła OnTrackAvailable i OnProgress
f_trackSearch.Start();
}
}
f_trackSearch jest typu public Bosch.VideoSDK.MediaDatabase.SearchSession, a dokładnie:
public interface SearchSession : ISearchSession, _ISearchSessionEvents_Event
{
}
przy czym
public interface ISearchSession
{
...
}
a _ISearchSessionEvents_Event zawiera te dwa potrzebne do obsługi poszukiwania zdarzenia
public interface _ISearchSessionEvents_Event
{
...
event _ISearchSessionEvents_ProgressEventHandler Progress;
event _ISearchSessionEvents_TrackAvailableEventHandler TrackAvailable;
...
}
ich realizacja jest następująca (fragment):
[2]
private void OnProgress(int progress, Bosch.VideoSDK.MediaDatabase.SearchSession searchSession)
{
if (progress == 100)
{
// zatrzymaj proces poszukiwania nagrań
f_trackSearch.Stop();
// odepnij obsługę zdarzeń
f_trackSearch.TrackAvailable -= new Bosch.VideoSDK.GCALib._ISearchSessionEvents_TrackAvailableEventHandler(OnTrackAvailable);
f_trackSearch.Progress -= new Bosch.VideoSDK.GCALib._ISearchSessionEvents_ProgressEventHandler(OnProgress);
...
}
}
Najważniejsze jest wywołanie OnTrackAvailable(), jeżeli w karcie pamięci znajduje się nagranie to poniżej jest ono w track i wstawiane jest do listy f_tracks
(cały kod):
[3]
private void OnTrackAvailable(Bosch.VideoSDK.MediaDatabase.SearchTypeEnum se, Bosch.VideoSDK.MediaDatabase.Track track, Bosch.VideoSDK.MediaDatabase.SearchSession searchSession)
{
f_tracks.Add(track);
}
ta lista to:
public System.Collections.Generic.List<Bosch.VideoSDK.MediaDatabase.Track> f_tracks = new System.Collections.Generic.List<Bosch.VideoSDK.MediaDatabase.Track>();
przyjmijmy, że to jest:
lista typu Track, gdzie klasa Track ma już wszystkie informacje o nagraniu, stąd można pobrać nazwę, id, i samo nagranie
---------------------------------------------------------------
No i teraz próba przeniesienia tego fragmentu do Delphi.
Wywołujemy StartTrackSearch()
[A]
procedure MBosch.StartTrackSearch(mdb: MediaDatabase);
begin
f_SearchSession := mdb.CreateSearchSession(steTrack);
f_dispinterface := _ISearchSessionEvents(f_SearchSession);
f_SearchSession.Start(3000);
end;
Przy czym f_SearchSession: SearchSession i tutaj podobnie jak w c# SearchSession = ISearchSession
ISearchSession = interface(IDispatch)
...
end;
natomiast f_dispinterface: _ISearchSessionEvents;
_ISearchSessionEvents = dispinterface
['{E421B6DF-86ED-47ED-8EFE-54D69BFA4D7D}']
...
procedure Progress(Progress: Integer; const pSearchSession: ISearchSession); dispid 1;
procedure TrackAvailable(Type_: SearchTypeEnum; const pResult: ITrack;
const pSearchSession: ISearchSession); dispid 4;
...
end;
Jak widać próba przeniesienia tego konkretnie fragmentu kodu z c# natrafia na podstawowy problem, taki, że nie możemy w łatwy sposób podpiąć obsługi zdarzeń Progress() i TrackAvailable(). Metody te (ale nie zdarzenia) implementuje dispinterfejs _ISearchSessionEvents.
Jednak kod z [A] (StartTrackSearch(mdb: MediaDatabase)) nie sprawi, że można pobrać z nich wartości.
Rzeczywiście moglibyśmy te metody wywołać ręcznie:
// tutaj mogło by być np.
f_dispinterface.Progress(...);
ale to nie ma sensu, ponieważ w C# poprzez podpięcie zdarzeń wystarczyło użyć
f_trackSearch.Start();
żeby te zdarzenia uruchomiły się automatycznie. W Delphi takiej konstrukcji nie mamy do dyspozycji. Czyli potrzebny jest teraz kod który umożliwi mi odczytanie wartości już po wywołaniu Progress() i TrackAvailable()
Proszę zauważyć, że w [A], we fragmencie
f_SearchSession := mdb.CreateSearchSession(steTrack);
my otrzymujemy już w f_SearchSession obiekt typu ISearchSession
a kod
f_dispinterface := _ISearchSessionEvents(f_SearchSession);
"nakłada na niego" wiedzę o Progress() i TrackAvailable()
Tylko co dalej? Co zrobić żebyśmy mogli otrzymać kod jak w C# w [2] i [3]
Pozdrawiam
MW
Technical Details
Message-ID:
<4bb7fe25-103a-4c9b-921e-cdc63e0aeac8@googlegroups.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!weretis.net!feeder6.news.weretis.net!feeder.usenetexpress.com!feeder-in1.iad1.usenetexpress.com!border1.nntp.dca1.giganews.com!nntp.giganews.com!z5-v6no382784ite.0!news-out.google.com!t123-v6ni216itb.0!nntp.google.com!g188-v6no378831itg.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mailReferences:
<6b30eb9c-c06f-40fd-8894-b7ee3c347c59@googlegroups.com>Show Full Headers
Complete Article Headers
X-Received: by 2002:a24:93:: with SMTP id 141mr3169071ita.17.1542370381812; Fri, 16 Nov 2018 04:13:01 -0800 (PST) X-Received: by 2002:a9d:5ad:: with SMTP id 42mr82279otd.0.1542370381691; Fri, 16 Nov 2018 04:13:01 -0800 (PST) Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!weretis.net!feeder6.news.weretis.net!feeder.usenetexpress.com!feeder-in1.iad1.usenetexpress.com!border1.nntp.dca1.giganews.com!nntp.giganews.com!z5-v6no382784ite.0!news-out.google.com!t123-v6ni216itb.0!nntp.google.com!g188-v6no378831itg.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail Newsgroups: pl.comp.lang.delphi Date: Fri, 16 Nov 2018 04:13:01 -0800 (PST) In-Reply-To: <6b30eb9c-c06f-40fd-8894-b7ee3c347c59@googlegroups.com> Complaints-To: groups-abuse@google.com Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=91.192.196.210; posting-account=E-z6ZwoAAACYsJZxZNjBCrM3zzyF6Vo_ NNTP-Posting-Host: 91.192.196.210 References: <6b30eb9c-c06f-40fd-8894-b7ee3c347c59@googlegroups.com> User-Agent: G2/1.0 MIME-Version: 1.0 Message-ID: <4bb7fe25-103a-4c9b-921e-cdc63e0aeac8@googlegroups.com> Subject: Re: dispintertface - Jak się dostać do metod From: mwitkowski2b@gmail.com Injection-Date: Fri, 16 Nov 2018 12:13:01 +0000 Lines: 152 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit