Delphi-PRAXiS
Seite 1 von 2  1 2      

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


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