Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Problem mit ListView (https://www.delphipraxis.net/28952-problem-mit-listview.html)

Schneider-Huetter 1. Sep 2004 17:36


Problem mit ListView
 
Bei meinem mp3-Player benutze ich ein ListView als PlayList.
Die Pfade sind als SubItems gespeichert, durch einen klick
auf einen Button wird die Datei abgespielt.

Code:
PlayFile(ListView1.Selected.SubItems.Strings[0];
Das funktioniert auch, solange ich auf den Button klicke.

Möchte ich das Ganze aus der ClientSocketRead-Prozedur von
TClientSocket heraus aufrufen (z.B. Button1.click) , wird zwar ein Titel abgespielt
der sich in der selben Zeile, jedoch in einer anderen Spalte
wie der aktuell markierte befindet (ViewStyle: vsList)!?

Bin völlig ratlos :wiejetzt: !!!

Matze 1. Sep 2004 17:47

Re: Problem mit ListView
 
Mit welchem Code rufst du das dort auf?
Mit obigem, oder mit einem anderen?

Luckie 1. Sep 2004 17:50

Re: Problem mit ListView
 
Was hat die Methode ClientSockeRead mit dem Listview zu tun? Eine genauere Beschreibung deines Problems und wie du es machst (SourceCode) wäre echt nicht schlecht.

Schneider-Huetter 1. Sep 2004 18:03

Re: Problem mit ListView
 
Zitat:

Was hat die Methode ClientSockeRead mit dem Listview zu tun?
Die hat prinzipiell natürlich gar nichts damit zu tun, nur wenn ich Button1 anklicke funktioniert es eben und wenn ich die Button1Click-Prozedur aus erwähnter Methode heraus aufrufe nicht.

Wenn ich heute abend noch etwas mehr Zeit habe werde ich noch etwas Code posten

Schneider-Huetter 1. Sep 2004 21:37

Re: Problem mit ListView
 
Also, ich werde mal versuchen das Problem etwas genauer zu erläutern:
Ich habe folgende Prozedur, die funktioniert, wenn ich auf den entsprechenden
Button klicke:

Code:
procedure TForm2.SpeedButton3Click(Sender: TObject);
var tag : TID3Tag;
begin
 If Form1.IsPlaying = 'Paused' then Form1.ResumeBass
  else
   begin
    UserStop:=False;
    Form1.StopBass;
   
    //- LCD löschen - 
    ClearDisplay;
    Count:=0;
    PlayRahmen;
   
    //- markierten Track abspielen -
    CurrentTrack := ListView1.Selected.SubItems.Strings[0];
    Form1.PlayFile(CurrentTrack);
   
    //- Titel und Interpret auf dem LCD ausgeben
    Tag := TID3Tag.Create;
    PlayMode( Tag.Interpret(CurrentTrack), Tag.Titel(CurrentTrack) );
    Tag.Free;
   end;
end;
Hier ist die TClientSocket-Methode, der Client verbindet mit einem WinLIRC Server,
damit eine IR-Fernbedienung für den mp3-Player genutzt werden kann:

Code:
procedure TForm2.ClientSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
var s,t:string;
i:integer;
partbeg,partend:integer;
params:array[1..4] of string;
begin

s := socket.ReceiveText;

partbeg := 0;
partend := 0;

t:=s;
  for i := 1 to 3 do begin
    partend := Pos(' ', t);
    params[i] := Copy(t, 1, partend - 1);
    Delete(t, 1, partend);
  end;
  params[4] := t;
  delete(params[4],length(params[4]),1);

   //-- Cursor-Tasten --
    if ( Uppercase(params[3]) = 'VOL_DOWN') and (params[2] = '01') then
     SendMessage(ListView1.Handle, WM_KEYDOWN, VK_DOWN, 0);

    if ( Uppercase(params[3]) = 'VOL_UP') and (params[2] = '01') then
     SendMessage(ListView1.Handle, WM_KEYDOWN, VK_UP, 0);

    if ( Uppercase(params[3]) = 'NEXT') and (params[2] = '01') then
     SendMessage(ListView1.Handle, WM_KEYDOWN, VK_RIGHT, 0);

    if ( Uppercase(params[3]) = 'PREVIOUS') and (params[2] = '01') then
     SendMessage(ListView1.Handle, WM_KEYDOWN, VK_RIGHT, 0);

    if ( Uppercase(params[3]) = 'PAUSE') and (params[2] = '01') then
     SpeedButton2.Click;

   //-- Stop --
    if ( Uppercase(params[3]) = 'STOP') and (params[2] = '01') then
      Begin
        UserStop := True;
        SpeedButton1.Click;
      End;


   //-- Play -- 
    if ( Uppercase(params[3]) = 'PLAY') and (params[2] = '01') then
      begin
         UserStop:=False;
         SpeedButton3.Click;
        end;

   

end;
Wenn ich also den SpeedButton anklicke wird der korrekte Titel abgespielt.
Wird aber die Taste 'PLAY' auf der Fernbedienung gedrückt wird ein falscher
Titel abgespielt (also nicht der markierte) obwohl ja eigentlich genau das
gleiche geschehen müsste wie wenn ich den Button anklicke!
An der Fernbedienung u.s.w. kann es nicht liegen, da ansonsten alles funktioniert
(Cursortasten, Stop...).

Kann's einfach nicht verstehn :gruebel:

Nightshade 1. Sep 2004 22:33

Re: Problem mit ListView
 
Zitat:

Zitat von Schneider-Huetter
Code:
SendMessage(ListView1.Handle, WM_KEYDOWN, VK_DOWN, 0);

Irre ich mich da, oder muss da nicht noch ein WM_KEYUP Event kommen ?

Code:
SendMessage(ListView1.Handle, WM_KEYDOWN, VK_DOWN, 0);
SendMessage(ListView1.Handle, WM_KEYUP, VK_DOWN, 0);

Schneider-Huetter 2. Sep 2004 09:59

Re: Problem mit ListView
 
Das mit dem WM_KEYUP habe ich gerade ausprobiert, hat aber leider nichts gebracht. Aber die Cursortasten haben ja auch bisher schon funktioniert, es geht ja eigentlich nur darum, dass nicht der auf dem Bildschirm markierte Titel abgespielt wird.

Schneider-Huetter 2. Sep 2004 10:29

Re: Problem mit ListView
 
Noch eine Anmerkung:
Der Fehler tritt nur auf, wenn ich die Tasten "VK_RIGHT" und "VK_LEFT" benutze!


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