Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Prog. nur einmal starten.Parameter an erstes Weitergeben? (https://www.delphipraxis.net/18370-prog-nur-einmal-starten-parameter-erstes-weitergeben.html)

dadu 17. Mär 2004 15:39


Prog. nur einmal starten.Parameter an erstes Weitergeben?
 
Hi Leute!

Ich habe einen mp3Player geschrieben. Wenn man mehrere mp3-Dateinen im Windowsexplorer markiert und diese dann durch "Enter"drücken öffnet, sendet Windows nacheinander immer nur 1 Parameter an mein Programm=> Die Playliste wird immer geleert und nur ein Lied wird wieder hinzugefügt, und dass geht dann so bis zu letzten Datei.

Wie kann ich einfach auf alle Parameter reagieren, dass heißt alle markierten mp3-Dateien in die Playliste einfügen und abspielen.

(Winamp und MSMediaplayer können das! Aber wie?)

DaDu

The-X 17. Mär 2004 15:47

Re: Prog. nur einmal starten.Parameter an erstes Weitergeben
 
Mit einem Mutex prüfen ob dein programm schon läuft und dann mit Messages? dem ersten Player mitteilen, das noch eine Datei geöffnet werden soll...

OH -> CreateMutex, SendMessage

dadu 17. Mär 2004 19:34

Re: Prog. nur einmal starten.Parameter an erstes Weitergeben
 
Kannst du mir das mal mit CreateMurtex erklären(Was macht das?; wofür ist das da?)

APP 17. Mär 2004 19:40

Re: Prog. nur einmal starten.Parameter an erstes Weitergeben
 
Hallo dadu,
interessant ist, dass Deine Frage genau den gleichen Wortlaut hat wie die Lösung in der Library Progamm nur einmal starten und ParameterProgamm nur einmal starten und Parameter :shock:

dadu 17. Mär 2004 19:46

Re: Prog. nur einmal starten.Parameter an erstes Weitergeben
 
Thx! :-D

Hatte ich nicht gesehen. Probier's gleich mal aus!

Christian Seehase 17. Mär 2004 19:48

Re: Prog. nur einmal starten.Parameter an erstes Weitergeben
 
Moin Dadu,

oder guckst Du hier:

Mit Mehreren Datein ein Program Starten

dadu 20. Mär 2004 15:18

Re: Prog. nur einmal starten.Parameter an erstes Weitergeben
 
Danke für eure Antworten :love: , jedoch hab ich mich wahrscheinlich nicht verständlich genug ausgedrückt!

Mein Problem ist nicht, nur einen Player zu starten und dann immer eine Message an ihn zu senden!

Mein Problem:

Wenn der Player gestartet ist und man im Windows-Explorer eine mp3(*.mp3 ist mit meinem Player verknüpft) per doppelklick öffnet dann löscht der Player die gesamte Playliste und fügt dann in die leere Liste nur die mp3 ein, die man grade per doppelklick geöffnet hat. (Das soll auch alles so sein!!!)

> Wenn ich aber jetzt im Explorer mehrere mp3s markiere und alle zusammen mit "Enter" gleichzeitig öffne macht mein Player das, was ich oben beschrieben habe. Er leert die Liste, und fügt nur die eine mp3 ein. Da Windows die markierten Dateien hintereinander öffnet wird aus diesem "leeren , einfügen" eine Schleife, wobei sich immer nur ein Lied in der Playliste befindet.
Nur die von Windows zuletzt geöffnete Datei wird in der Playliste sein und abgespielt werden!

Das ist mein Problem; wenn man mehrere mp3-Dateien markiert hat und diese gleichzeitig öffnet, soll die Playliste geleert werden und alle markierten Dateien sollen in die Liste eingefügt werden.

Irgendwelche Vorschläge? :?:

PS: Timer ist wohl nicht so gut, da die Ladezeit der Dateien bei unterschiedlichen Rechnern variiert! Vielleicht eine Message?! WindowsMediaPlayer und Winamp haben das Problem irgendwie gelöst.

DaDu

atreju2oo0 20. Mär 2004 16:05

Re: Prog. nur einmal starten.Parameter an erstes Weitergeben
 
Ich stehe gerade vor dem selben Problem...
Wenn ich mehrere Dateien markiere und öffne dann ist in Paramstr(1) nur eine Datei.
An die restlichen Dateien komm ich nicht ran!
:wall:

Luckie 20. Mär 2004 16:18

Re: Prog. nur einmal starten.Parameter an erstes Weitergeben
 
Woher soll auch Windows wissen, dass ihr keine neue Instanz wollt? Schickt mit WM_COPYDATA die Paremter der zweiten Instanz an die erste und beendet die zweite. Aber warum erzähle ich das eigentlich alles? Steht dich genmauso in dem Code-Lib Eintrag. Ich muüüst nur mal auf die Links klicken, die man euch gibt. :roll:

Christian S. 20. Mär 2004 16:19

Re: Prog. nur einmal starten.Parameter an erstes Weitergeben
 
Hallo!

Ich habe das einmal so gelöst. Ist zwar nicht schön, funktioniert aber:

In der Projektdatei:
Delphi-Quellcode:
var
  Semaphore: THandle;
  theFiles : String;
  i : Integer;
  MyCopyDataStruct: TCopyDataStruct;
begin
  ActivationMessage := RegisterWindowMessage(PChar(MyGUID));
  Semaphore := CreateSemaphore(nil, 1, 1, PChar(MyGUID));

  if (GetLastError = ERROR_ALREADY_EXISTS) then
  begin
    PostMessage(HWND_BROADCAST, Mainform.ActivationMessage, 0, 0);

    if ParamCount > 0 then
    begin
      theFiles := '';

      for i:=1 to ParamCount do
      begin
        theFiles := theFiles + ParamStr(i);
        if i < ParamCount then theFiles := theFiles + '|';
      end;

      with MyCopyDataStruct do
      begin
        dwData := 0;
        cbData := StrLen(PChar(theFiles));
        lpData := PChar(theFiles);
      end;

      SendMessage(HWND_BROADCAST, WM_COPYDATA, LongInt(Application.Handle), Longint(@MyCopyDataStruct));
    end;
  end
  else
    {Mache das, was Du auch sonst hier treibst.}
Und in der Hauptform:
Delphi-Quellcode:
private
  {...}
  procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;

{...}

procedure Tfrm_main.WMCopyData(var Msg: TWMCopyData);
var sText: Array of Char;
    fad, theFiles : TStringList;
    i,k : Integer;
    temp : String;
begin
  SetLength(sText, Msg.CopyDataStruct.cbData);

  StrLCopy(@sText[0], Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);


  theFiles := TStringList.Create;
  fad := TStringList.Create;
  try
    temp := '';

    k := 0;
    fad.Add('');
    for i:=0 to High(sText) do
    begin
      if (sText[i] = '|') and (i < High(sText)) then
      begin
        fad.Add('');
        inc(k);
      end else
          fad[k] := fad[k] + sText[i];
    end;


    for i:=0 to fad.Count - 1 do
    begin
      if FileGetAttr(fad[i]) and faDirectory <> 0 then
        addFilesFromFolder(fad[i])
      else
        theFiles.Add(fad[i]);
    end;

    addFiles(theFiles);
  finally
    theFiles.Free;
    fad.Free;
  end;
end;
Damit wird folgendes gemacht:
Die Parameter werden in der Projektdatei erst einmal alle mit '|' getrennt, weil das in Dateinamen nicht vorkommen kann. Dann werden alle komplett an das laufende Programm gesendet.
Dieses nimmt die wieder auseinandern und speichert die einzelnen Paraemter wieder in der StringList fad ("files and directories"). Die Liste wird durchgegangen und je nachdem, ob es sich um ein Verzeichnis oder nur um eine Datei handelt, wird was anderes gemacht. Letzteres braucht Ihr wahrscheinlich nicht, aber es ist halt aus meinen Programm rauskopiert.

MfG
Peter

mimi 26. Jun 2004 19:23

Re: Prog. nur einmal starten.Parameter an erstes Weitergeben
 
ich habe den code aus der code-lib genommn,und beim starten erhalte ich folgende fehermledung:
Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Textanzeiger.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00489453 in Modul 'Textanzeiger.exe'. Lesen von Adresse 000006C0'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------
und an dieser stelle:
Code:
class procedure TSingleInstance.WndProc(var Msg: TMessage);
// das ist die Fensterprocedure von WndHandle, sie empfängt innerhalb
// der 1. Instance die wm_CopyData Message mit der CommandLine der
// 2. Instance
begin
  with Msg do
    if (Msg = wm_CopyData) and (PCopyDataStruct(lParam).dwData = cMagic) then // hier die fehlermeldung
    begin
      Result := cResult;
      CmdLine := PCopyDataStruct(lParam).lpData;
      OnStartup;
    end else Result := DefWindowProc(WndHandle, Msg, wParam, lParam);
end;
und sTitle = 'Textanzeiger:1.0Z$123456789'; ist doch richtig ??? das ist der caption in mein haupt form

Christian Seehase 26. Jun 2004 21:19

Re: Prog. nur einmal starten.Parameter an erstes Weitergeben
 
Moin Michael,

den Fehler kann ich mir im Moment nicht erklären. :gruebel:
Such' hier mal nach Hier im Forum suchenWM_COPYDATA oder Hier im Forum suchenCreateSemaphore, da müsstest Du noch ein paar Möglichkeiten finden.

SirThornberry 27. Jun 2004 00:01

Re: Prog. nur einmal starten.Parameter an erstes Weitergeben
 
Also bei Winamp wird die liste nur geleert wenn zwischen dem hinzufügen von liedern zu viel zeit vergeht. Wenn man also 20 mp3s gleichzeitig öffnet werden diese alle in die liste aufgenommen weil während dem öffnen der 1ten, 2ten etc. mp3 wenig zeit vergeht und winamp somit weiß das diese vermutlich alles aufeinmal geöffnet werden. Ganz einfach kann man das testen wenn man in einer schleife mit shellexecute hintereinander mp3-dateien öffnet (wenn diese mit winamp verknüpft sind). Sobald man in die schleife ein ausreichend langes wait einbaut so wird jede datei einzeln geöffnet ansonsten alle auf einmal und in der liste angefügt


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:40 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