Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi TWindowsMediaPlayer, Fehler bei mehrmaligem aufrufen (https://www.delphipraxis.net/58103-twindowsmediaplayer-fehler-bei-mehrmaligem-aufrufen.html)

schnickers 1. Dez 2005 12:46


TWindowsMediaPlayer, Fehler bei mehrmaligem aufrufen
 
Hallo erstmal, nach durchforschen der suche konte ich nichts dazu finden also...

im groben hab ich eine MDIForm in der mehrere unterschiedliche Childform aufgerufen werden.
Diese Childforms Enhalten mehrere eingabeFelder und die TWindowsMediaPlayer (WMP) componente.
je nach aufruf (unterschiedliche Parameter) wird die URL des WMP beschrieben.

kurzer bsp code:

Delphi-Quellcode:
// Mainform, Aufruf des MDIChild
procedure TMainForm.CreateChildAudio;
var
  Child: TFormDBAudio;
begin
  Child := TFormDBAudio.Create(Application);
end;
Delphi-Quellcode:
// Constructor für neues Element, WMP.URL entspricht einem vorher definierten Default wert (c:\temp\demo.wav)
constructor TFormDBAudio.Create(owner :TComponent; EID :integer);
begin
  inherited Create(Owner);  // Initialize inherited parts
  ButtonSave.Enabled:= true;
  ADOQueryGetAudioTable.Open;
  ADOQueryGetAudioTable.Insert;

  ElementEID:= EID;
  Caption := 'Audio - (mit Element "'+IntToStr(EID)+'" verbunden';
end;

// Constructor für ein altes Element, WMP.URL entspricht einem (aus der datenbank) gewonnen
constructor TFormDBAudio.Create(owner :TComponent; AID, EID :integer);
var
  temp :string;
begin
  inherited Create(Owner);  // Initialize inherited parts
  ButtonSave.Enabled:= false;

  ADOQueryGetAudioTable.Parameters.ParamByName('parAID').Value:= AID;
  ADOQueryGetAudioTable.open;           // Öffnet die Tableconnection
  Caption := 'Audio - '+ DBATitel.Text +' - (mit Element ['+IntToStr(EID)+'] verbunden'; // Bennent das Fenster

  temp:= ADOQueryGetAudioTable.FieldByName('AID').Value;
  WMediaPlayerAudio.URL:= URLPath + temp + '.mus';
end;
wenn ich nun sagen wie 3 mal die Form öffne und dan schließe bekomme ich folgende Fehlermeldung:
Access violation at address 0778C733 in module 'wmp.dll'. Read of adress 00A2331C

Beim schließen des Programms gibs dann nochmal dashier:
Exception EAccessViolation in Module MdiAPP.exe at 00000000.
Access violation at address 00000000 in module 'wmp.dll'. Read of adress 00000000


noch zum rest: das prog dient als eingabemaske für eine datebank (access, ADOQuery usw.)

ich vermute das es am WMP liegt, da bei anderen Forms ohne den WMP keine probleme gibt.

Wenn irgendwer ne idee hat was da komisches vor sich geht, ich bin für alles dankbar.
falls noch informationen gebraucht werden, einfach bescheid sagen.

Gruß schnickers

schnickers 5. Dez 2005 08:02

Re: TWindowsMediaPlayer, Fehler bei mehrmaligem aufrufen
 
ich nehm mir mal die freiheit zu bumpen und zu fragen wo die heerscharen an antworten bleiben ;)
würd nur gern wissen warum keiner antwortet

- Frage SO mieß formuliert, das ich gemieden werde? :cry:
- keine hat ne idee? :shock:
- es fehlen informationen? :?:
- ich bin im falschen film? :cat:

wie auch immer ;) also ich nehm jeden nochsoklitzekleinen vorschlag dankbar an und wenn er daraus bestehen sollte meine hose auf dem kopf zu tragen :roteyes: (besser nicht)

mit komischem Gruß

Aenogym 5. Dez 2005 08:08

Re: TWindowsMediaPlayer, Fehler bei mehrmaligem aufrufen
 
hi und herzlich willkommen in der DP, schnickers :hi:

hast du schonmal den debugger bemüht, um heraus zu finden, an welcher zeile die Acces Violation auftritt?

aenogym

schnickers 5. Dez 2005 08:20

Re: TWindowsMediaPlayer, Fehler bei mehrmaligem aufrufen
 
Zitat:

Zitat von Aenogym
hi und herzlich willkommen in der DP, schnickers :hi:

hast du schonmal den debugger bemüht, um heraus zu finden, an welcher zeile die Acces Violation auftritt?

aenogym

OLE^^.. Hi,

falls du damit meinst, das ich mit breack an die stelle komme wo dann diese zeile eingefäbt bekomme, da zeigt der nichts an.
mit jump tu cpu (das wird wohl nicht viel helfen) ist der code um die abbruchstelle ca. so:

Code:
test ecx,[eax]
jz $0778c739
mov ecx,[eax] //hier springt er raus
push eax
ansonsten vieleicht noch wichtig. wenn ich z.b. 3 forms auf habe, dannbeim 2ten den fehler bekomme, und dann versuche diese form ochmal zu öffnen, passiert es manchmal, das ich die fehlermeldung bekomme, das diese form schon geöffnen ist bzw schon existiert

Aenogym 5. Dez 2005 08:46

Re: TWindowsMediaPlayer, Fehler bei mehrmaligem aufrufen
 
hm, ich meinte eigentlich, dass du mit F7 und F8 (Einzelschritt/gesamte Routine) zeile für zeile durchgehst. so siehst du, welche zeile zuletzt erfolgreich ausgeführt wird und wenn dann auch einmal die AV kommt, dann weißt du, welche zeile du jetzt bist - die ist dann der übeltäter.

allgemein kann ich nur vermuten, dass du beim schließen deines childs auf ein objekt zugreifst, das nicht initialisiert wurde...

aenogym

schnickers 5. Dez 2005 09:11

Re: TWindowsMediaPlayer, Fehler bei mehrmaligem aufrufen
 
Zitat:

Zitat von Aenogym
hm, ich meinte eigentlich, dass du mit F7 und F8 (Einzelschritt/gesamte Routine) zeile für zeile durchgehst. so siehst du, welche zeile zuletzt erfolgreich ausgeführt wird und wenn dann auch einmal die AV kommt, dann weißt du, welche zeile du jetzt bist - die ist dann der übeltäter.aenogym

ah ok, also

also folgenden code führt er noch aus
Delphi-Quellcode:
procedure TFormDBAudio.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action:= caFree
end;

procedure TFormDBAudio.FormDestroy(Sender: TObject);
begin
  FormDBAudio:= nil; //(1)
end;
nach (1) springt er in eine Fremdcomponente AdvMainMenü und bei dieser Function (ganz am ende):

Delphi-Quellcode:
function MDIClientWndProc(hWnd: HWND; uMsg: Integer; WParam: WPARAM; lParam: LPARAM): LRESULT; {$IFNDEF TMSDOTNET} stdcall; {$ENDIF}
const
  SeparatorShortcut = $ABCD;
  WindowItemGroupIndex = $CD;
var
  AdvMenu: TAdvMainMenu;
  MenuForm: TForm;
  Separator, NewItem: TMenuItem;
  i: Integer;
  ChildList: TStringList;
begin
  if uMsg = WM_MDIREFRESHMENU then
  begin
    Result := 0;
    MenuForm := FindForm(GetParent(hWnd));
    if (MenuForm <> nil) and (MenuForm.FormStyle = fsMDIForm) and (MenuForm.Menu <> nil) and
      (MenuForm.WindowMenu <> nil) and (MenuForm.Menu is TAdvMainMenu) then
      with MenuForm do
      begin
        AdvMenu := TAdvMainMenu(Menu);
        AdvMenu.BeginUpdate;
        Separator := AdvMenu.FindItem(SeparatorShortcut, fkShortcut);
        if Assigned(Separator) and (Separator.Caption = cLineCaption) then
          while Separator.MenuIndex + 1 < WindowMenu.Count do
            WindowMenu.Delete(Separator.MenuIndex + 1)
        else
        begin
          Separator := TMenuItem.Create(MenuForm.WindowMenu);
          Separator.Caption := cLineCaption;
          Separator.ShortCut := SeparatorShortcut;
          Separator.AutoLineReduction := maAutomatic;
          Separator.Visible := MenuForm.MDIChildCount > 0;
          WindowMenu.Add(Separator);
        end;

        ChildList := TStringList.Create;
        ChildList.Sorted := True;
        for i := 0 to MenuForm.MDIChildCount - 1 do
          ChildList.AddObject(MenuForm.MDIChildren[i].Caption,
            TObject(MenuForm.MDIChildren[i].Handle));

        for i := 0 to ChildList.Count - 1 do
        begin
          NewItem := TMenuItem.Create(WindowMenu);

          with NewItem do
          begin
            Caption := IntToStr(i + 1) + ' ' + ChildList.Strings[i];

            {$IFNDEF TMSDOTNET}
            Tag := THandle((ChildList.Objects[i]));
            {$ENDIF}

            OnClick := AdvMenu.ActivateMDIChild;
            RadioItem := True;
            GroupIndex := WindowItemGroupIndex;
            {$IFNDEF TMSDOTNET}
            Checked := Assigned(MenuForm.ActiveMDIChild) and
              (Tag = Integer(MenuForm.ActiveMDIChild.Handle));
            {$ENDIF}
          end;
          WindowMenu.Add(NewItem);
        end;
        ChildList.Free;
        AdvMenu.EndUpdate;
        Result := AdvMenu.Handle;
      end;
  end
  else
    Result := CallWindowProc(IntPtr(GetWindowLong(hWnd, GWL_USERDATA)), hwnd, uMsg, wParam, lParam); ////(2)
end;
(2) hier Springt er raus schmeißt er die fehlermeldung.

achja was mir gerade noch auffällt, wenn ich die fenster in der reihenfoge schließe wie ich sie öffne (Ältestes zuerest) kommt nicht(oder zumisndest sehr viel seltener) dieser fehler.
gibts allgemein Probleme wenn, man den WMP shr oft aufhat? wei an dem mus es ja liegen, forms ohne den WMP machen keinerlei probleme.

Aenogym 5. Dez 2005 11:01

Re: TWindowsMediaPlayer, Fehler bei mehrmaligem aufrufen
 
mh, äußerst komisch. da kann ich dir leider auch nicht helfen :(
vielleicht kennt sich ja jemand anders in diesem forum besser damit aus...

mumu 5. Dez 2005 11:48

Re: TWindowsMediaPlayer, Fehler bei mehrmaligem aufrufen
 
und was ist wenn du die zeile
Delphi-Quellcode:
FormDBAudio:= nil; //(1)
herausnimmst

schnickers 5. Dez 2005 12:09

Re: TWindowsMediaPlayer, Fehler bei mehrmaligem aufrufen
 
Zitat:

Zitat von mumu
und was ist wenn du die zeile
Delphi-Quellcode:
FormDBAudio:= nil; //(1)
herausnimmst

nach ausführen dieser anweisung tat sich folgendes:

1) (durch auskemmentiere des anweisung) keine fehlermeldungen mehr :spin2:
2) manche formen ließen sich nicht mehr öffnen nachdem ich sie geschlossen hatte. :?
3) die anweisungen wieder eingefügt (der code ist nun so wie vor 1) :coder:
4) keine fehlermeldung, offnen der forms wieder möglich :dance:

ich bin nun total :shock: weil ich keine ahnung hab was hier geht, hat auf jedenfall funktioniert danke vielmals :thumb:

kann nur hoffen das problem taucht nicht wieder auf (was ich vermute,... hmmmm)
naa werd das ganze mal testen und nachher nochmal den status schreiben,

bye
schnickers

schnickers 5. Dez 2005 13:36

Re: TWindowsMediaPlayer, Fehler bei mehrmaligem aufrufen
 
ok, ich packs nicht, ein problem das mich gut zwei wochen lang beschäftigt hat, und nun ist der code so wie vorher aber ohne fehlermeldungen (gutes altes computer phänomen wenn man mich fragt :mrgreen: )

in diesem sinne problem (vorerst gelößt) ich stell dann mal auf erledigt, danke nochmal an alle poster und helfer und an den weinachtsmann :xmas:

mit weinachtlichem gruß
schnickers


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:41 Uhr.

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