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 Datei öffnen mit TOpenDialog (https://www.delphipraxis.net/100965-datei-oeffnen-mit-topendialog.html)

Andy-h 6. Okt 2007 09:02


Datei öffnen mit TOpenDialog
 
Hallo

Wie bekomme ich es hin das sich das Fenster öffnet in dem man Dateien öffnen kann?
Wenn ich eine Win2000-Logo-Anwendung öffne ist ja schon ein Kleines programm aufgebaut mit dem man
Daten öffnen und Speichern kann. Ich komme aber nicht dahinter wie das gemacht wird.
Ich habe eine VLC-Anwendung denke aber das das gleich aufgebaut ist.
Es geht um Musik dateien die in die ListBox1 geladen werden sollen.

Gruß
Andy

Corpsman 6. Okt 2007 09:06

Re: Datei öffnen mit TOpenDialog
 
Du ziehst den Topendialog auf dein Formular

und machst in den Buttonclick
Delphi-Quellcode:
If Opendialog1.execute then begin

..

end;
Wenn du das Flag setzt damit man nehrere Dateien öffnen kann must du

die von

Opendialog1.files[i] mit i = 0 bis Opendialog1.files.count -1 auslesen

sonst Opendialog1.filename

Andy-h 6. Okt 2007 09:26

Re: Datei öffnen mit TOpenDialog
 
Wie müsster der Code genau aussehen?
Also der Button auf den geklickt werden soll heist Button5 und in ListBox1 sollen die Lieder geladen werden.

Ich bin schon so weit:

Delphi-Quellcode:
procedure TForm4.Button5Click(Sender: TObject);
begin
 If Opendialog1.execute then begin
 begin


  end;
 end;
end;
So machen Foren spaß wenn man gute Antworten in kurzer Zeit bekommt!

SaFu 6. Okt 2007 09:53

Re: Datei öffnen mit TOpenDialog
 
So zum datei laden

Delphi-Quellcode:
procedure TForm1.Button5Click(Sender: TObject);
var SAlterPfad,SNeuerPfad :string;
begin
if OpenDialog1.Execute then
 begin
 SAlterPfad := OpenDialog1.FileName;
   SNeuerPfad := ExtractFilePath(ParamStr(0))+('Musik\'+ ExtractFileName(OpenDialog1.FileName));

 if not FileExists(SNeuerPfad) then
  begin
   CopyFile(PChar(SAlterPfad), PChar(SNeuerPfad), true);
   FileListBox1.Items.Add(ExtractFileName(OpenDialog1.FileName));
  end
 else
  MessageDlgPos('Datei ist bereits in der Liste',mtInformation,[mbOk],0,280,170);
 end;
end;
Gruss Sascha

Andy-h 6. Okt 2007 10:14

Re: Datei öffnen mit TOpenDialog
 
Hallo

Ich kann die Datei öffnen und sie wird auch in die ListBox1 geladen nur wenn ich sie dann abspielen möchte kommt ein fehler:

Im Projekt MP.exe ist der Klasse EStringListError mit der meldung "Listindex überschreitet das
Maximum (0)" aufgetreten.

Ich habe bei den Code von fuknersascha eine Zeile geändert und zwar so:
Orginal: FileListBox1.Items.Add(ExtractFileName(OpenDialog1 .FileName));
ListBox1.Items.Add(ExtractFileName(OpenDialog1.Fil eName));

und wie kann ich mehrere Dateien gleichzeitig öffnen?

Die Muhkuh 6. Okt 2007 10:19

Re: Datei öffnen mit TOpenDialog
 
Hi,

das hat Corpsman schon geschrieben:

Zitat:

Opendialog1.files[i] mit i = 0 bis Opendialog1.files.count -1 auslesen

SaFu 6. Okt 2007 10:21

Re: Datei öffnen mit TOpenDialog
 
für mehrere Dateien musst du im OI den opendialog noch auf Multiselect:= True stellen

Andy-h 6. Okt 2007 10:25

Re: Datei öffnen mit TOpenDialog
 
Gut wenn ich das mache bleibt der fehler und es wird auch nur eine Datei in die Liste übertragen.

DeddyH 6. Okt 2007 10:55

Re: Datei öffnen mit TOpenDialog
 
Zeig doch mal den Code zum Abspielen.

Andy-h 6. Okt 2007 11:05

Re: Datei öffnen mit TOpenDialog
 
Hier der Code zum Abspielen:

Delphi-Quellcode:
procedure TForm4.Button1Click(Sender: TObject);
var i : integer;
begin
  TRY
   for i := 0 to listbox1.Count - 1 do
    if listbox1.Selected[i] then break;
   PlayFile(i);
   EXCEPT
    showmessage('ERROR: Musiktitle wählen');
  END;
end;
***** Wenn ich die Musiktitle über drag und drop einfüge geht das Abspielen*****

DeddyH 6. Okt 2007 11:12

Re: Datei öffnen mit TOpenDialog
 
Hmm... auf den ersten Blick kann ich keinen Fehler entdecken. :gruebel:

[edit]Versuch es mal so:
Delphi-Quellcode:
procedure TForm4.Button1Click(Sender: TObject);
var i : integer;
begin
   for i := 0 to listbox1.Count - 1 do
     if listbox1.Selected[i] then
       begin
         PlayFile(i);
         exit;
       end;
    showmessage('ERROR: Musiktitle wählen');
end;
[/edit]

Die Muhkuh 6. Okt 2007 11:13

Re: Datei öffnen mit TOpenDialog
 
Delphi-Quellcode:
procedure TForm4.Button1Click(Sender: TObject);
var i : integer;
begin
  TRY
   for i := 0 to listbox1.Count - 1 do
     if listbox1.Selected[i] then
     begin;
       PlayFile(i);
       Break;
     end;
   EXCEPT
    showmessage('ERROR: Musiktitle wählen');
  END;
end;

SaFu 6. Okt 2007 11:14

Re: Datei öffnen mit TOpenDialog
 
Setz dein listen index der Listbox im Oi auf 1 und im code auch

Die Muhkuh 6. Okt 2007 11:15

Re: Datei öffnen mit TOpenDialog
 
Zitat:

Zitat von fuknersascha
Setz dein listen index der Listbox im Oi auf 1 und im code auch

Was soll das bringen?

DeddyH 6. Okt 2007 11:15

Re: Datei öffnen mit TOpenDialog
 
*Hehe* Manuel hat denselben Verdacht wie ich ;)

Die Muhkuh 6. Okt 2007 11:16

Re: Datei öffnen mit TOpenDialog
 
Zitat:

Zitat von DeddyH
*Hehe* Manuel hat denselben Verdacht wie ich ;)

Wie immer Detlef ;-)

Andy-h 6. Okt 2007 11:19

Re: Datei öffnen mit TOpenDialog
 
Also es geht mit beiden varianten nicht :cry:

Wo im code auf 1 stellen?

das drag und drop sieht so aus:
Delphi-Quellcode:
Procedure TForm4.WMDropFiles (Var aMsg: tMessage);
Var
  Idx, Size, FileCount: Integer;
  Filename: pChar;
Begin
  Inherited;
  FileCount := DragQueryFile (aMsg.WParam, $FFFFFFFF, nil, 255);
  For Idx := 0 To FileCount -1 Do Begin
    Size := DragQueryFile (aMsg.WParam, Idx, nil, 0) + 1;
    Filename := StrAlloc (Size);
    If DragQueryFile (aMsg.WParam, Idx, Filename, Size) = 1 Then { nothing }
    else AddToPlayList (pChar (Filename)); // hier wird das jeweilige file unserer Prozedur AddToPlaylist überwiesen.
    StrDispose (Filename);
  End;
  DragFinish (aMsg.WParam);
End;

Procedure TForm4.AddToPlayList(s:string);
begin
   playList.Add(s);
   ListBox1.Items.Add(extractfilename(s));
end;

Die Muhkuh 6. Okt 2007 11:23

Re: Datei öffnen mit TOpenDialog
 
Hi,

Du möchtest das selektierte Lied abspielen, richtig?

Versuch mal das:

Delphi-Quellcode:
procedure TForm4.Button1Click(Sender: TObject);
begin
  PlayFile(ListBox1.ItemIndex);
end;

Andy-h 6. Okt 2007 11:30

Re: Datei öffnen mit TOpenDialog
 
ja das soll gespiel werden

kommt immer noch der fehler:
Im Projekt MP.exe ist der Klasse EStringListError mit der meldung "Listindex überschreitet das
Maximum (0)" aufgetreten.

wenn ich die Lieder rein ziehe gehen alle codes nur über öffnen nicht.

DeddyH 6. Okt 2007 11:34

Re: Datei öffnen mit TOpenDialog
 
Ist denn überhaupt ein Item selektiert?

Die Muhkuh 6. Okt 2007 11:35

Re: Datei öffnen mit TOpenDialog
 
Und eine andere Sache: Wie sieht die Procedure PlayList aus?

Andy-h 6. Okt 2007 11:40

Re: Datei öffnen mit TOpenDialog
 
Ja Item ist markiert.

hier mal der ganze code:

Delphi-Quellcode:
unit Unit4;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, MPlayer, ShellApi, mmsystem, Math, ExtCtrls;

type
  TForm4 = class(TForm)
    MediaPlayer1: TMediaPlayer;
    Button1: TButton;
    ListBox1: TListBox;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    OpenDialog1: TOpenDialog;
    Timer1: TTimer;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ListBox1DblClick(Sender: TObject);
    procedure MediaPlayer1Notify(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    Procedure AddToPlayList(s:string);
    procedure PlayFile(songNumber: integer);
    Procedure WMDropFiles (Var aMsg: tMessage); message WM_DROPFILES; //Drag und drop
  end;

var
  Form4: TForm4;
  var PlayList: TStringList;
  CurrentSong: integer = -1; // neue globale variable um uns das aktuelle lied zu merken
  Lautstaerke: integer = -1;

implementation

{$R *.dfm}
//Sound
procedure GetVolume(var volL, volR: Word);
var
  hWO: HWAVEOUT;
  waveF: TWAVEFORMATEX;
  vol: DWORD;
begin
  volL:= 0;
  volR:= 0;
  // init TWAVEFORMATEX
  FillChar(waveF, SizeOf(waveF), 0);
  // open WaveMapper = std output of playsound
  waveOutOpen(@hWO, WAVE_MAPPER, @waveF, 0, 0, 0);
  // get volume
  waveOutGetVolume(hWO, @vol);
  volL:= vol and $FFFF;
  volR:= vol shr 16;
  waveOutClose(hWO);
end;


procedure SetVolume(const volL, volR: Word);
var
  hWO: HWAVEOUT;
  waveF: TWAVEFORMATEX;
  vol: DWORD;
begin
  // init TWAVEFORMATEX
  FillChar(waveF, SizeOf(waveF), 0);
  // open WaveMapper = std output of playsound
  waveOutOpen(@hWO, WAVE_MAPPER, @waveF, 0, 0, 0);
  vol:= volL + volR shl 16;
  // set volume
  waveOutSetVolume(hWO, vol);
  waveOutClose(hWO);
end;

//Sound

Procedure TForm4.WMDropFiles (Var aMsg: tMessage);
Var
  Idx, Size, FileCount: Integer;
  Filename: pChar;
Begin
  Inherited;
  FileCount := DragQueryFile (aMsg.WParam, $FFFFFFFF, nil, 255);
  For Idx := 0 To FileCount -1 Do Begin
    Size := DragQueryFile (aMsg.WParam, Idx, nil, 0) + 1;
    Filename := StrAlloc (Size);
    If DragQueryFile (aMsg.WParam, Idx, Filename, Size) = 1 Then { nothing }
    else AddToPlayList (pChar (Filename)); // hier wird das jeweilige file unserer Prozedur AddToPlaylist überwiesen.
    StrDispose (Filename);
  End;
  DragFinish (aMsg.WParam);
End;

Procedure TForm4.AddToPlayList(s:string);
begin
   playList.Add(s);
   ListBox1.Items.Add(extractfilename(s));
end;

procedure TForm4.Button1Click(Sender: TObject);
begin
  PlayFile(ListBox1.ItemIndex);
end;

//sound auslesen

procedure TForm4.Button2Click(Sender: TObject);
var
X,TonLi, TonRe, VolLi, VolRe: Word;
begin
  GetVolume(VolLi,VolRe);
  TonLi:= Floor(VolLi / 65535 * 100);
  TonRe:= Floor(VolRe / 65535 * 100);
  Label1.Caption:=IntToStr(TonLi);
  Label2.Caption:=IntToStr(TonRe);
end;

procedure TForm4.Button3Click(Sender: TObject);
begin
 mediaplayer1.next;
end;

procedure TForm4.Button4Click(Sender: TObject);
begin
 mediaplayer1.back;
end;

procedure TForm4.Button5Click(Sender: TObject);
var SAlterPfad,SNeuerPfad :string;
begin
if OpenDialog1.Execute then
begin
SAlterPfad := Opendialog1.files[0];
   SNeuerPfad := ExtractFilePath(ParamStr(0))+('Musik\'+ ExtractFileName(OpenDialog1.FileName));

if not FileExists(SNeuerPfad) then
  begin
   CopyFile(PChar(SAlterPfad), PChar(SNeuerPfad), true);
   ListBox1.Items.Add(ExtractFileName(OpenDialog1.FileName));
  end
else
  MessageDlgPos('Datei ist bereits in der Liste',mtInformation,[mbOk],0,280,170);
end;
end;

//Sound auslesen

procedure TForm4.FormCreate(Sender: TObject);
begin
   DragAcceptFiles (Handle, True);  // drag und drop akzeptieren
   playList := TStringList.Create;
end;

procedure TForm4.FormDestroy(Sender: TObject);
begin
   playList.Free;
end;

procedure TForm4.PlayFile(songNumber: integer); // deklaration von playfile ändern, hier das 2. mal
begin
   if fileexists(Playlist.Strings[songNumber]) then begin
     CurrentSong := songNumber;
     mediaplayer1.Close;
     mediaplayer1.FileName := Playlist.Strings[songNumber];
     mediaplayer1.Open;
     mediaplayer1.play;
   end;
end;

procedure TForm4.Timer1Timer(Sender: TObject);
var
  hilf, hilfbuchstabe: string;
begin
  hilf := Label3.Caption; //einlesen der gesamten caption
  hilfbuchstabe := hilf[1];   //merken des ersten zeichens der caption
  delete(hilf, 1, 1);         //erstes zeichen löschen
  hilf := hilf + hilfbuchstabe;//caption + gemerktes zeichen
  Label3.Caption := hilf; //das ganze ausgeben
  application.ProcessMessages; //um sicher zu gehen, dass das ganze angezeigt wird
  //timer intervall auf ca. 200ms stellen
end;

procedure TForm4.ListBox1DblClick(Sender: TObject);
var i : integer;
begin
  for i := 0 to listbox1.Count - 1 do
    if listbox1.Selected[i] then break;
  { nun haben wir in i die nummer der selektierten Zeile
    da Listbox und Playlist eine identische Reihe der Einträge und gleiche Sortierung
    vorweisen, können wir mit dem erhaltenen index den richtigen Eintrag der Playlist
    auslesen. }
    PlayFile(i);
end;

procedure TForm4.MediaPlayer1Notify(Sender: TObject);
begin
   if mediaplayer1.Position = mediaplayer1.Length then begin
   // position = gesamtlänge, bedeutet dass das lied beendet wurde
     Listbox1.Selected[currentSong] := false; // das gerade gespielte lied de-selektieren
     inc(currentSong); // aktuellen song um eines erhöhen
     if currentSong < Playlist.Count then { alles passt, songindex im rahmen}
     else currentsong := 0; {ende der liste erreicht, setze aktuelles lied auf anfang}
     PlayFile(CurrentSong);
     Listbox1.Selected[currentSong] := true; // das aktuelle lied selektieren
   end;
end;

end.
Ist zum größten teil zusammengesucht und sieht deswegen unordentlich aus.

DeddyH 6. Okt 2007 11:51

Re: Datei öffnen mit TOpenDialog
 
Wieso benutzt Du denn 2 Stringlisten? PlayList ist IMHO überflüssig, da könntest Du doch direkt auf ListBox1.Items zugreifen.

Andy-h 6. Okt 2007 12:31

Re: Datei öffnen mit TOpenDialog
 
Wie müsste das dan aussehen?

DeddyH 6. Okt 2007 12:37

Re: Datei öffnen mit TOpenDialog
 
Ich denke, so (ungetestet):
Delphi-Quellcode:
//Version ohne den Parameter Songnumber
procedure TForm4.PlayFile; // deklaration von playfile ändern, hier das 2. mal
begin
  if ListBox1.ItemIndex < 0 then exit;
  if fileexists(ListBox1.Items[ListBox1.ItemIndex]) then begin
     CurrentSong := ListBox1.ItemIndex;
     mediaplayer1.Close;
     mediaplayer1.FileName := ListBox1.Items[ListBox1.ItemIndex];
     mediaplayer1.Open;
     mediaplayer1.play;
   end;
end;

Andy-h 6. Okt 2007 13:14

Re: Datei öffnen mit TOpenDialog
 
Danke für die Hilfe
Es geht jetzt

Andy-h 6. Okt 2007 15:52

Re: Datei öffnen mit TOpenDialog
 
Mir ist doch noch was aufgefallen:

mit dem alten code ist er immer ins nächste Lied gesprungen und hat es abgespielt
jetzt bleibt er einfach am ende des liedes stehen

was muss ich machen?

DeddyH 6. Okt 2007 15:59

Re: Datei öffnen mit TOpenDialog
 
Delphi-Quellcode:
procedure TForm4.MediaPlayer1Notify(Sender: TObject);
begin
   if mediaplayer1.Position = mediaplayer1.Length then begin
   // position = gesamtlänge, bedeutet dass das lied beendet wurde
     Listbox1.Selected[currentSong] := false; // das gerade gespielte lied de-selektieren
     inc(currentSong); // aktuellen song um eines erhöhen
     if currentSong >= Playlist.Count then
       currentsong := 0; {ende der liste erreicht, setze aktuelles lied auf anfang}
     Listbox1.Selected[currentSong] := true; // das aktuelle lied selektieren
     PlayFile; //und abspielen ;)
   end;
end;

Andy-h 6. Okt 2007 16:22

Re: Datei öffnen mit TOpenDialog
 
Hatte den fehler garnich an der stelle vermutet

habe selber noch was geändert so läufts:

Delphi-Quellcode:
procedure TForm4.MediaPlayer1Notify(Sender: TObject);
begin
   if mediaplayer1.Position = mediaplayer1.Length then begin
   // position = gesamtlänge, bedeutet dass das lied beendet wurde
     Listbox1.Selected[currentSong] := false; // das gerade gespielte lied de-selektieren
     inc(currentSong); // aktuellen song um eines erhöhen
     if currentSong < Playlist.Count then { alles passt, songindex im rahmen}
     else mediaplayer1.next;
     PlayFile(CurrentSong);
     Listbox1.Selected[currentSong] := true; // das aktuelle lied selektieren
     PlayFile(ListBox1.ItemIndex);
   end;
end;

DeddyH 6. Okt 2007 16:26

Re: Datei öffnen mit TOpenDialog
 
Die Zeilen
Delphi-Quellcode:
if currentSong < Playlist.Count then { alles passt, songindex im rahmen}
else mediaplayer1.next;
finde ich persönlich unschön (obwohl syntaktisch richtig), aber das ist Geschmackssache.


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