🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.delphi
20 messages
20 total messages Started by mwitkowski2b Tue, 13 Nov 2018 22:16
dispintertface - Jak się dostać do metod
#346854
Author: mwitkowski2b
Date: Tue, 13 Nov 2018 22:16
36 lines
2734 bytes
(Delphi 2007) 
Zaimportowałem pliki TLB, miedzy innymi mam taki DispInterface (fragment):

_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;

Jest to fragment API do obsługi kontrolki ActiveX. Kontrolka jest zainstalowana wszystko już działa. Muszę wykonać operację wykorzystującą ww. dispinterface. Metody Progress i TrackAvailable są wykonywane automatycznie w przypadku gdy poszukiwanie przyniesie oczekiwany efekt.
Nie wiem jak mam się do nich dostać? Mam przykłady w C#, gdzie te metody są podpięte do zdarzeń, ale muszę to przenieść do Delphi. 
Nie można zrobić tak:
  Interface2 = interface(_ISearchSessionEvents)
  end;
ani tak:
  Interface3 = class(TInterfacedObject, _ISearchSessionEvents)
  end;
Próbowałem również podstawić swoją metodę np. MyTrackAvailable
procedure My_TimelineAvailable(Type_: SearchTypeEnum; const pResult:                                 ITimeline; const pSearchSession: ISearchSession);
a potem w programie:
var
  obi: _ISearchSessionEvents;
i dalej:
  obi.TrackAvailable := My_TrackAvailable;
też nic z tego.

Proszę o wskazówkę, jak się dostać do tych metod żeby móc odczytać przesłąne do nich parametry z ich wnętrza?


Pozdrawiam
MW
Re: dispintertface - Jak się dostać do metod
#346855
Author: konsul41
Date: Thu, 15 Nov 2018 07:03
43 lines
2435 bytes
Po pierwsze pokaż cały plik TLB
Po drugie zazwyczaj w zaimportowanym pliku jest metoda, która tworzy 
interfejs.
Jeżeli nie ma to musisz ustalić pod jaką nazwą klasa jest zarejestrowana 
i wtedy normalnie jak za każdą kontrolką ActivX.

Z calkiem robi się tak

var
     openoffice : Variant;
     OpenDesktop : Variant;
     LoadParams : Variant;
     monclasseur : Variant;
     document,cellule,mafeuille,nb : Variant;
     v:real;
     oFormats,oLocale : variant;
     nNumKey, i : integer;
     Sheets, Sheet, MyStruct, Cell ,arkusz : variant;
begin
   if VarIsEmpty(OpenOffice) then
     try
       OpenOffice := CreateOleObject('com.sun.star.ServiceManager');
     except
       Raise Exception.Create('Nie mogę pobrać ServiceManager OpenOffice');
       Exit;
     end;

   OpenDesktop := 
OpenOffice.createInstance('com.sun.star.frame.Desktop');// 
'private:factory/scalc',
   LoadParams := VarArrayCreate([0, -1], varVariant);
   if ((EditNIP.text[1]='P') AND 
(EditNIP.text[2]='L'))OR(EditNIP.text[1] in ['0'..'9']) then
   begin
     document := 
openDesktop.LoadComponentFromURL('file:///'+ExtractFilePath(Application.ExeName)+'/wezwaniezagraniczne.xls','_blank', 
0,LoadParams);
   end else
   begin
     document := 
openDesktop.LoadComponentFromURL('file:///'+ExtractFilePath(Application.ExeName)+'/wezwaniezagraniczne.xls','_blank', 
0,LoadParams);
   end;
Re: dispintertface - Jak się dostać do metod
#346856
Author: mwitkowski2b
Date: Thu, 15 Nov 2018 09:49
68 lines
5009 bytes
Może rzeczywiście zbyt mało opisałem, przepraszam. Już to naprawiam.

Mam API, dzięki któremu łączę się kamerą i otrzymuję z niej obraz. SDK to zestaw plików DLL oraz API oparte na klasach i interfejsach. Obraz jest 
prezentowany w kontrolce ActiveX (i to jest mój OLE server).
Wczytuje się pliki *.TLB i powstaje całe API. Dysponuję działającymi przykładami w C#, które należy przenieść do Delphi (D2007). Oczywiście nieco inne API powstaje w C#, a nieco inne w Delphi.

Interesuje mnie fragment, za pomocą którego przeprowadza się wyszukiwanie historycznych nagrań (kamera ma swoja pamięć). W C# jest to zrealizowane następująco:
Jest obiekt za pomocą którego wykonuje się poszukiwanie:
  SearchSession f_trackSearch;
przy czym typ SearchSession to typ dzieddziczący po 2 interfejsach:
  public interface SearchSession : ISearchSession, 
                                   _ISearchSessionEvents_Event
drugi z nich ma metody istotne dla procesu poszukiwania:
  public interface _ISearchSessionEvents_Event
  {
  ...
  // czy już wszystko znalazl, wtedy Progress = 100
  event _ISearchSessionEvents_ProgressEventHandler Progress; 
  // jeśli są dostępne nagrania to program tu wchodzi, można je pobrać
  event _ISearchSessionEvents_TrackAvailableEventHandler TrackAvailable; 
  ..
  }

W C# akcja jest prosta:
tworzony jest obiekt do poszukiwania:
  f_trackSearch = mdb.CreateSearchSession(steTrack);
a metody z interfejsu _ISearchSessionEvents_Event są podpięte jako zdarzenia:
  f_trackSearch.TrackAvailable += new Bosch.VideoSDK.GCALib._ISearchSessionEvents_TrackAvailableEventHandler(OnTrackAvailable);
  f_trackSearch.Progress += new Bosch.VideoSDK.GCALib._ISearchSessionEvents_ProgressEventHandler(OnProgress);
uruchom poszukiwanie:
  f_trackSearch.Start();
	

Teraz przenoszę ww. kod do Delphi.
Mam obiekt za pomocą ktorego wykonuje się poszukiwanie:
  f_trackSearch: SearchSession;
przy czym SearchSession to interfejs:
  ISearchSession = interface(IDispatch)
    ['{7EA4139D-5EFE-4BD2-9EF7-211F199DA18C}']
    ...
  end;
W C# mieliśmy:
public interface SearchSession : ISearchSession, _ISearchSessionEvents_Event
a więc brakuje nam podpięcia _ISearchSessionEvents_Event, który zawiera istotne metody Progress() i TrackAvailable()
w powstałym w Delphi po wczytaniu plików *.TLB API jest odpowiadający mu interfejs (istotny fragment):
  _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;

Proszę zauważyć, że jest to nie jest interface tylko dispintertface.

Teraz analogiczny kod jak w c#.
Tworzymy obiekt poszukiwania:
  f_trackSearch := mdb.CreateSearchSession(steTrack);
dla 
  var
    f_dispinterface: _ISearchSessionEvents; 
    // interfejs z naszymi brakującymi metodami Progress i TrackAvailable
    // wykonujemy sprzężenie IDispatch z dispinterface wykonując:		
    f_dispinterface := _ISearchSessionEvents(f_trackSearch);
	
I w tym miejscy jest pytanie. Co zrobić, aby wykonały się metody z interfejsu _ISearchSessionEvents: Progress() i TrackAvailable()?
W jaki sposób podpiać je do moich obiektów? Jak z nich skorzytać?
Re: dispintertface - Jak się dostać do metod
#346857
Author: konsul41
Date: Thu, 15 Nov 2018 13:15
34 lines
2227 bytes
Ale interfejs musisz jakoś utworzyć, prawda?


 >W C# akcja jest prosta:
 >tworzony jest obiekt do poszukiwania:
   f_trackSearch = mdb.CreateSearchSession(steTrack);
to jest tworzenie w C# (wywoływanie konstruktora który zwraca jakiś typ)


A jak to robisz w Delphi?

w Delphi robisz tak
 >f_trackSearch := mdb.CreateSearchSession(steTrack);

tylko co to jest "mdb" i gdzie zostało utworzone?
w C# aby użyć konstruktora "wystarczy że jego kod jest widoczny" (to 
oczywiście uproszczenie).
W Delphi musisz mieć obiekt "mdb" aby użyć jego metody (to też 
uproszczenie).
Nie pokazujesz całego kodu więc trudno pomóc.

Na pewno nie masz interfejsu i metody tworzącej w pliku TLB?

coś w stylu
...
CLASS_TKsi: TGUID = '{097871C6-1C49-401D-81F7-124DA3AE2CD2}';
...

class function CoTKsi.Create: _Object;
begin
   Result := CreateComObject(CLASS_TKsi) as _Object;
end;

może spróbuj tworzenia z TGUID tak jak powyżej
Re: dispintertface - Jak się dostać do metod
#346858
Author: konsul41
Date: Thu, 15 Nov 2018 13:28
13 lines
1655 bytes
Spróbuj
http://www.delphigroups.info/2/b2/264416.html
var
   Disp: IDispatch;
   MyDispinterface: ITMyAutoObjDisp;
begin
   Disp := CreateComObject(CLASS_TMyAutoObj) as IDispatch;
   MyDispinterface := ITMyAutoObjDisp(Disp);


kolejne naprowadzenia
http://www.delphigroups.info/2/ba/258415.html
http://delphidabbler.com/tips/216 <--- od tego zacznij
Re: dispintertface - Jak się dostać do metod
#346859
Author: mwitkowski2b
Date: Thu, 15 Nov 2018 13:45
9 lines
2183 bytes
Oczywiście, fragment o którym wspominam, to jest w momencie gdy już jestem podpięty do serwera COM. Jest w mdb. Po wykonaniu
f_trackSearch := mdb.CreateSearchSession(steTrack); 
oraz (dla var f_dispinterface: _ISearchSessionEvents;)
f_dispinterface := _ISearchSessionEvents(f_trackSearch); 
mogę napisać np.:
f_dispinterface.Progress()
i z tego punktu widzenia Twoja rada jak najbardziej działa. Tu masz oczywiście rację, tylko niestety u mnie np. Progress to jest (deklaracja):
Progress(Progress: Integer; const pSearchSession: ISearchSession); dispid 1;
Ja musze odczytać wartość parametrów Progres i ISearchSession, i na ich podstawie podjąć odpowiednią akcję. Wywołanie tej metody mi nie wystarczy. Musze się dostać do środka tych metod, czyli jakoś je podpiąć, przeładować, no właśnie na to nie mam pomysłu. :)
Re: dispintertface - Jak się dostać do metod
#346860
Author: konsul41
Date: Fri, 16 Nov 2018 08:47
6 lines
1291 bytes
W dniu 15-11-2018 o 14:45, mwitkowski2b@gmail.com pisze:
> pSearchSession: ISearchSession
pSearchSession: ISearchSession
Czy dobrze zrozumiałem, że Ty potrzebujesz Implementacji ISearchSession ?

Jeżeli tak to go zaimplementuj.
Re: dispintertface - Jak się dostać do metod
#346861
Author: konsul41
Date: Fri, 16 Nov 2018 08:50
18 lines
1919 bytes
W dniu 16-11-2018 o 09:47, konsul41@wp.pl pisze:
> W dniu 15-11-2018 o 14:45, mwitkowski2b@gmail.com pisze:
>> pSearchSession: ISearchSession
> pSearchSession: ISearchSession
> Czy dobrze zrozumiałem, że Ty potrzebujesz Implementacji ISearchSession ?
> 
> Jeżeli tak to go zaimplementuj.

_ISearchSessionEvents = dispinterface
   ['{E421B6DF-86ED-47ED-8EFE-54D69BFA4D7D}']
   ...
   procedure Progress(Progress: Integer; const pSearchSession: 
ISearchSession);
   dispid 1;

Podsumujmy.
Możesz wywołać metod Progressi musisz podać mu 2 parametry i 
potrzebujesz implementację interfejsu ISearchSession tak?
Re: dispintertface - Jak się dostać do metod
#346862
Author: konsul41
Date: Fri, 16 Nov 2018 11:21
7 lines
1757 bytes
> Ja musze odczytać wartość parametrów Progres i ISearchSession, i na ich podstawie podjąć odpowiednią akcję. Wywołanie tej metody mi nie wystarczy. Musze się dostać do środka tych metod, czyli jakoś je podpiąć, przeładować, no właśnie na to nie mam pomysłu. :)

Odczytać czy dostarczyć?
To jest ważne ponieważ, może być sytuacja, że Metoda wykorzystuje 
parametr który podajesz do jakichś celów i to ty masz je utworzyć.
Wtedy to ty implementujesz interfejs.
Re: dispintertface - Jak się dostać do metod
#346875
Author: Roman Tyczka
Date: Fri, 16 Nov 2018 11:45
14 lines
1261 bytes
On Tue, 13 Nov 2018 14:16:06 -0800 (PST), mwitkowski2b@gmail.com wrote:

> (Delphi 2007) 
> Zaimportowałem pliki TLB, miedzy innymi mam taki DispInterface (fragment):
[...]
 
> Proszę o wskazówkę, jak się dostać do tych metod żeby móc odczytać przesłąne do nich parametry z ich wnętrza?

Opublikuj tego Video_SDK_UserGuide.pdf ;-) 
Bet tego nikt Ci nie pomoże :-)

-- 
pozdrawiam
Roman Tyczka
Re: dispintertface - Jak się dostać do metod
#346864
Author: mwitkowski2b
Date: Fri, 16 Nov 2018 12:08
7 lines
1834 bytes
Oprogramowanie i dokumentację można bez problemu ściągnąć ze strony producenta.
W "SDK Downloads" wybieramy pliki msi (najlepiej 64 bit dla c#)
https://ipp.boschsecurity.com/en/news-events/product-news/video-sdk-6-04/video-sdk
Po zainstalowaniu w katalogu :
C:\Program Files\Bosch\VideoSDK6\Documentation jest plik z dokumentacją:
Video SDK Interface Definition.chm
Ale uprzedzam, że tego jest dość sporo.
Re: dispintertface - Jak się dostać do metod
#346865
Author: mwitkowski2b
Date: Fri, 16 Nov 2018 12:13
114 lines
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
Re: dispintertface - Jak się dostać do metod
#346866
Author: konsul41
Date: Fri, 16 Nov 2018 12:37
16 lines
2033 bytes
> 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.
To są callback czyli funkcja jest wołana gdy nastąpi jakieś 
zdarzenie(poprawcie jeżeli się mylę).

Sprawdź czego żąda
Bosch.VideoSDK.GCALib._ISearchSessionEvents_ProgressEventHandler(OnProgress);
jako OnProgress.
I tak spreparuj aby nie krzyczał błędami.


private void OnProgress(int progress, 
Bosch.VideoSDK.MediaDatabase.SearchSession searchSession)
...
zakładam że ONProgress jest metodą jakiejś klasy, więc trzeba nie jawnie 
przekazać parametr self.
Re: dispintertface - Jak się dostać do metod
#346863
Author: Roman Tyczka
Date: Fri, 16 Nov 2018 12:41
38 lines
2182 bytes
On Fri, 16 Nov 2018 04:13:01 -0800 (PST), mwitkowski2b@gmail.com wrote:


Chłopie, Ty tak mieszasz i bełkoczesz, że za cholerę nie mogę się w tym
połapać :-)

Np. poniżej:

> Przy czym f_SearchSession: SearchSession i tutaj podobnie jak w c# SearchSession = ISearchSession
>   ISearchSession = interface(IDispatch)
>   	...
>   end;


No i co niby do anielci ktoś ma napisać, skoro ukrywasz to co w tych
kropkach jest? Wszak tam powinny być te zdarzenia, do których możesz
podpiąć swoje metody obsługi analogicznie jak w C#.

Czyli interfejs powstały po wywołaniu mdb.CreateSearchSession(), u Ciebie
zaszyty pod zmienną f_SearchSession, powinien oferować to co oferuje w C#:

    f_trackSearch.TrackAvailable += new
Bosch.VideoSDK.GCALib._ISearchSessionEvents_TrackAvailableEventHandler(OnTrackAvailable);
    f_trackSearch.Progress += new
Bosch.VideoSDK.GCALib._ISearchSessionEvents_ProgressEventHandler(OnProgress);

czyli po delphiowemu:

    f_trackSearch.TrackAvailable := MojaMetodaOnAvailable;
    f_trackSearch.Progress := MoJaMetodaProgress;


A co do SDK, skoro trzeba je instalować to wrzuć gdzieś do sieci samego
helpa i daj linka, nikt nie będzie syfu instalował na swoim kompie.

-- 
pozdrawiam
Roman Tyczka
Re: dispintertface - Jak się dostać do metod
#346868
Author: konsul41
Date: Fri, 16 Nov 2018 12:51
46 lines
2972 bytes
W dniu 16-11-2018 o 13:41, Roman Tyczka pisze:
> On Fri, 16 Nov 2018 04:13:01 -0800 (PST), mwitkowski2b@gmail.com wrote:
> 
> 
> Chłopie, Ty tak mieszasz i bełkoczesz, że za cholerę nie mogę się w tym
> połapać :-)
> 
> Np. poniżej:
> 
>> Przy czym f_SearchSession: SearchSession i tutaj podobnie jak w c# SearchSession = ISearchSession
>>    ISearchSession = interface(IDispatch)
>>    	...
>>    end;
> 
> 
> No i co niby do anielci ktoś ma napisać, skoro ukrywasz to co w tych
> kropkach jest? Wszak tam powinny być te zdarzenia, do których możesz
> podpiąć swoje metody obsługi analogicznie jak w C#.
> 
> Czyli interfejs powstały po wywołaniu mdb.CreateSearchSession(), u Ciebie
> zaszyty pod zmienną f_SearchSession, powinien oferować to co oferuje w C#:
> 
>      f_trackSearch.TrackAvailable += new
> Bosch.VideoSDK.GCALib._ISearchSessionEvents_TrackAvailableEventHandler(OnTrackAvailable);
>      f_trackSearch.Progress += new
> Bosch.VideoSDK.GCALib._ISearchSessionEvents_ProgressEventHandler(OnProgress);
> 
> czyli po delphiowemu:
> 
>      f_trackSearch.TrackAvailable := MojaMetodaOnAvailable;
>      f_trackSearch.Progress := MoJaMetodaProgress;

raczej
f_trackSearch.Progress := 
Bosch.VideoSDK.GCALib._ISearchSessionEvents_ProgressEventHandler(MoJaMetodaProgress);


Prawdopodobnie metoda 
Bosch.VideoSDK.GCALib._ISearchSessionEvents_ProgressEventHandler coś 
robi jeszcze z uchwytem.

Tylko zastanawia mnie operator += w C# to jest przecież przypisanie z 
dodawaniem czyli
PSEUDOKOD
f_trackSearch.Progress := 
f_trackSearch.Progress+Bosch.VideoSDK.GCALib._ISearchSessionEvents_ProgressEventHandler(MoJaMetodaProgress);
Re: dispintertface - Jak się dostać do metod
#346870
Author: mwitkowski2b
Date: Fri, 16 Nov 2018 13:11
5 lines
1635 bytes
Panowie, mnie się wydawało, że włożyłem trochę pracy, żeby możliwie najprościej wyjaśnić, o co mi chodziło. Do tego na prawdę nie jest potrzebna znajomość całości problemu. W istocie to się sprowadza do pytania jak przenieść obsługę zdarzeń do interfejsów. Jestem nieco zaskoczony ocena mojego podejścia. Tym niemniej dziękuje za pomoc.


Pozdrawiam
MW
Re: dispintertface - Jak się dostać do metod
#346871
Author: konsul41
Date: Fri, 16 Nov 2018 13:18
4 lines
1790 bytes
W dniu 16-11-2018 o 14:11, mwitkowski2b@gmail.com pisze:
> Panowie, mnie się wydawało, że włożyłem trochę pracy, żeby możliwie najprościej wyjaśnić, o co mi chodziło. Do tego na prawdę nie jest potrzebna znajomość całości problemu. W istocie to się sprowadza do pytania jak przenieść obsługę zdarzeń do interfejsów. Jestem nieco zaskoczony ocena mojego podejścia. Tym niemniej dziękuje za pomoc.

Nie przenieść i nie zdarzeń, a zarejestrować callback.
Re: dispintertface - Jak się dostać do metod
#346867
Author: Roman Tyczka
Date: Fri, 16 Nov 2018 13:22
13 lines
1396 bytes
On Fri, 16 Nov 2018 13:51:56 +0100, konsul41@wp.pl wrote:

> Tylko zastanawia mnie operator += w C# to jest przecież przypisanie z 
> dodawaniem czyli
> PSEUDOKOD
> f_trackSearch.Progress := 
> f_trackSearch.Progress+Bosch.VideoSDK.GCALib._ISearchSessionEvents_ProgressEventHandler(MoJaMetodaProgress);

Multicast events. Delphi też to oferuje, choć nie w standardzie niestety.

-- 
pozdrawiam
Roman Tyczka
Re: dispintertface - Jak się dostać do metod
#346869
Author: konsul41
Date: Fri, 16 Nov 2018 13:27
5 lines
1482 bytes
> Multicast events. Delphi też to oferuje, choć nie w standardzie niestety.
> 

Tak myślałem, dzięki za nazwanie i potwierdzenie.
Re: dispintertface - Jak się dostać do metod
#346872
Author: Roman Tyczka
Date: Fri, 16 Nov 2018 18:25
29 lines
1981 bytes
On Fri, 16 Nov 2018 05:11:01 -0800 (PST), mwitkowski2b@gmail.com wrote:

> Panowie, mnie się wydawało, że włożyłem trochę pracy, 

Nikt temu nie przeczy, ale pamiętaj, że to Twoja praca w Twoim interesie,
nie naszym.

> żeby możliwie najprościej wyjaśnić, o co mi chodziło. 

No to się chyba nie udało sądząc po odzewie grupy.

> Do tego na prawdę nie jest
> potrzebna znajomość całości problemu. W istocie to się sprowadza do
> pytania jak przenieść obsługę zdarzeń do interfejsów. 

Tutaj akurat masz imho błędne założenie. Zdrowo jest zakładać, że się nie
wie gdzie jest problem i przedstawiać szerszy opis zagadnienia, bo się może
okazać (i często okazuje), że problem leży zupełnie gdzie indziej (np.
niezrozumieniu jak coś działa).

> Jestem nieco zaskoczony ocena mojego podejścia. Tym niemniej dziękuje za pomoc. 

Oceny Twoje podejścia nikt nie dokonywał, co najwyżej jego efektów ;-)

I się jak baba nie obrażaj tylko odpowiadaj na pytania, które dostałeś.

-- 
pozdrawiam
Roman Tyczka
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads