Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Filteranschlüsse nicht verbunden. (https://www.delphipraxis.net/13150-filteranschluesse-nicht-verbunden.html)

chris_82 11. Dez 2003 21:16


Filteranschlüsse nicht verbunden.
 
Hab mir folgende Prozedure geschrieben um das einer Webcam dazustellen.
Beim ersten Aufruf ist das kein Problem, da funktioniert alles, wenn ich aber in meiner Listbox ein zweites mal auf die Videoquelle klicke bzw. eine andere auswähle kommt immer die exception Filteranschlüsse nicht verbunden. Woran liegt das, wie kann ich das zum Bsp. in der Exception abfangen?

Delphi-Quellcode:
//Initialisieren des Bildes im VideoWindow
procedure TCapSource.StartCapture(Lbindex:integer; VideoWindow:TVideoWindow);
var index:integer;
    vw:tvideowindow;
begin
  //Klassen instanziieren
  try
  Filtergraph:=TFiltergraph.Create(VideoWindow);
  Filter:=TFilter.Create(VideoWindow);
  SampleGrabber:=TSampleGrabber.Create(VideoWindow);

  VideoWindow.FilterGraph:=Filtergraph;
  SampleGrabber.FilterGraph:=Filtergraph;
  Filter.FilterGraph:=Filtergraph;

  Filtergraph.ClearGraph;
  Filtergraph.Active:=False;
  Filter.BaseFilter.Moniker := Capenum.GetMoniker(Lbindex);
  Filtergraph.GraphEdit := true;
  Filtergraph.Mode := gmCapture;
  FilterGraph.Active := True;

  with Filtergraph as ICaptureGraphBuilder2 do
   RenderStream (@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter,
   SampleGrabber as IBaseFilter, VideoWindow as IBaseFilter);

  FilterGraph.Play;
  except
  end;
  end;

Kamil 11. Dez 2003 21:38

Re: Filteranschlüsse nicht verbunden.
 
Gibst du Filtergraph, Filter und SampleGrabber auch wieder frei (bevor du z.B. den Button nochmal anklickst)?

himitsu 11. Dez 2003 21:38

Re: Filteranschlüsse nicht verbunden.
 
Ich hab zwar davon keine Ahnung, aber ich könnte mir denken, woran es liegt.

Du erstellst ja hiermit neue Filter und so.
Delphi-Quellcode:
Filtergraph:=TFiltergraph.Create(VideoWindow);
Filter:=TFilter.Create(VideoWindow);
SampleGrabber:=TSampleGrabber.Create(VideoWindow);

VideoWindow.FilterGraph:=Filtergraph;
SampleGrabber.FilterGraph:=Filtergraph;
Filter.FilterGraph:=Filtergraph;
Bei zweiten Aufruf existieren die aber schon und es entsteht deiser Fehler.

Es gibt demnach also zwei Lösungen:
1: Du fragst vorm erstellen ab, ob sie schon erstellt wurden und erstellst sie nur, wenn sie noch nicht existieren.

2: Oder du gibst die vorher schon erstellten vorher frei.
z.B.:
Delphi-Quellcode:
Filtergraph.Free;
Filter.Free;
SampleGrabber.Free;
...
(die Freigabe sollte aber auch nur gemacht werden, wenn was existiert)

http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

chris_82 11. Dez 2003 21:55

Re: Filteranschlüsse nicht verbunden.
 
wie überprüfe ich ob die objekte schon existieren?

Kamil 11. Dez 2003 22:04

Re: Filteranschlüsse nicht verbunden.
 
z.B. mit Assigned. Du muss aber nach dem Freigeben das Objekt auf nil setzten (z.B. FreeAndNil zum freigeben verwenden)

Luckie 11. Dez 2003 22:21

Re: Filteranschlüsse nicht verbunden.
 
Es wäre auch sinnvoll, die Objekte vor dem try-Block zu erstellen und dann eine try-finally Konstrukt zu verwenden und die Objekte im finally Abschnitt wieder frei zugen.
Delphi-Quellcode:
  sl := TStringList.Create;
  try
    sl. ...;
  finally
    FreeAndNil(sl);
  end;
Wenn es nicht erzeugt werden kann, ist auch kein Speicher reserviert, den man freigeben müsste. Bei deinem Konstrukt, müsste dir der Compiler übrigens eine Warnung ausgeben. Und Warnungen sollte man nicht ignorieren, die gibt der Compiler nicht nur zum Spaß aus.

chris_82 11. Dez 2003 22:33

Re: Filteranschlüsse nicht verbunden.
 
dei methode assigned gibt es wohl nicht, und was genau meinst du mit freeandnil..da find ich auch nur free

Kamil 11. Dez 2003 22:43

Re: Filteranschlüsse nicht verbunden.
 
Assigned ist in der Unit Systems.
FreeAndNil ist bei den Indy Komponenten dabei (IdGlobal.pas) und sieht so aus:
Delphi-Quellcode:
procedure FreeAndNil(var Obj);
var
  P: TObject;
begin
  if TObject(Obj) <> nil then begin
    P := TObject(Obj);
    TObject(Obj) := nil; // clear the reference before destroying the object
    P.Free;
  end;
end;

chris_82 11. Dez 2003 23:00

Re: Filteranschlüsse nicht verbunden.
 
Ja also woran wahrscheinlich das Problem liegt weiß ich jetzt wohl, dank eurer Hilfe, aber ich hab versucht dies auf das Problem umzumünzen, aber so recht will es noch nicht klappen. bekomme immer noch dieselbe Meldung.

Wenn ich FreeandNil benutze, muss ich die Objekte dann immer noch zerstören (.destroy)?

hab mal debuggt, der fehler kommt immer erst, wenn ich

Delphi-Quellcode:
 Filtergraph.Play
aufrufe.

edit: hab gesehen Free in der Methode FreeandNil zerstört ja das Objekt schon.

Kamil 11. Dez 2003 23:05

Re: Filteranschlüsse nicht verbunden.
 
Wie sieht dein Code jetzt aus?


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:11 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz