07. april 2006 - 20:53Der er
18 kommentarer og 1 løsning
drag/drop fra explorer
hej experter
jeg sidder og roder med en komponent der skulle gøre livet nemmere med drag n' drop fra explorer; jeg hat en TListview sof filbeholder, i komponentet vælger jeg at alle filer skal lande i listview, fint nok... jeg har opbygget en procedure der tilføjer filerne + diverse info, men jeg har brug for at kontrollere hvilken filtyper der bliver dropped på listview og derefter tillade nogle bestemte filtyper at blive tilføjet. jeg har lavet denne kode men under runtime giver den en "list index out of bounds"
procedure TMainForm.ExDragDrop1Dropped(Sender: TObject; ItemsCount: Integer); var i: integer; begin for i := 0 to ExDragDrop1.Items.Count do if (ExtractFileExt(ExDragDrop1.Items[i]) = '.mp3') or (ExtractFileExt(ExDragDrop1.Items[i]) = '.wav') or (ExtractFileExt(ExDragDrop1.Items[i]) = '.fla') or (ExtractFileExt(ExDragDrop1.Items[i]) = '.flac') or (ExtractFileExt(ExDragDrop1.Items[i]) = '.ogg') or (ExtractFileExt(ExDragDrop1.Items[i]) = '.ape') then begin FillListview(ExDragDrop1.Items); end else MessageBeep(mb_IconError); MessageDlg(ExtractFileExt(ExDragDrop1.Items[i]) + ' is not a supported filetypre!', mtError, [mbOK], 0); Exit; end;
ExDragDrop1.Items er af typen TStrings, det er også FillListview vil have.
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
gee, hvor har jeg sovet i timen.... det var lige det ekstra begin -end der skulle til, nu virker koden som det skal :D, takker mange gane for hjælpen kroning, smid et svar og pointne er dine :D
procedure TMainForm.ExDragDrop1Dropped(Sender: TObject; ItemsCount: Integer); var i: integer; begin for i := 0 to ExDragDrop1.Items.Count-1 do if (ExtractFileExt(ExDragDrop1.Items[i]) = '.mp3') or (ExtractFileExt(ExDragDrop1.Items[i]) = '.wav') or (ExtractFileExt(ExDragDrop1.Items[i]) = '.fla') or (ExtractFileExt(ExDragDrop1.Items[i]) = '.flac') or (ExtractFileExt(ExDragDrop1.Items[i]) = '.ogg') or (ExtractFileExt(ExDragDrop1.Items[i]) = '.ape') then begin FillListview(ExDragDrop1.Items); end else begin MessageBeep(mb_IconError); MessageDlg(ExtractFileExt(ExDragDrop1.Items[i]) + ' is not a supported filetype!', mtError, [mbOK], 0); Exit; end; end;
tror det er noget i den stil... men nu er der opstået et andet lille problem: hvis jeg fx markere 3 .ogg filer og en .jpg fil og dropper dem på listview, så kommer den med en meddelse om at .jpg ikke er understøttet, så springer den ud af koden og ikke tilføjer de 3 .ogg filer (fint det var Exit;, væk med det...) men når exit er væk kommer den med meddelelsen men når brugeren klikker ok til fejlen, tilføjer den både .jpg og .ogg filerne + at de ligger dobbelt på listen så i stedet for 3 ogg filer ligger der 6...
Mon ikke det skal være FillListview(ExDragDrop1.Items[i]);? Du skal vel kun have dem der er gode nok, så du skal kun sende dem du har bekræftet til din metode.
Skal den ikke tilføje de 3 .ogg filer og så kun komme med fejl om at .jpg filen ikke er understøttet? Kan det ikke ordnes ved at gøre som pidgeot skriver og så også fjerne din Exit i sidste linie.
procedure TMainForm.FillListView(Files : TStrings); var i : integer; s: String; begin for i := 0 to Files.Count-1 do with MediaBox.Items.Add do begin Caption := Files[i]; s := Caption; Subitems.Add(ChangeFileExt(s, '.kxq')); SubItems.Add(GetFileSize(Caption)); Subitems.Add(ExtractFileExt(Caption)); SubItems.Add(GetBitrate(Caption); end; end;
procedure TForm1.FillListView(Files : String); var i : integer; s: String; begin with MediaBox.Items.Add do begin Caption := Files; s := Caption; Subitems.Add(ChangeFileExt(s, '.kxq')); SubItems.Add(GetFileSize(Caption)); Subitems.Add(ExtractFileExt(Caption)); SubItems.Add(GetBitrate(Caption); end; end;
så virker koden til drag/drop, men efter som det er den samme kode jeg brugte til min OpenDialog virker det ikke efter hensigten (i opendialog) :(..... jeg løste problemet ved at lave en speciel procedure til OpenDialog... :-)
Hvad med en procedure der kan klare begge muligheder:
procedure TMainForm.FillListView(Files : TStrings; OnlyOne : integer = -1); var i : integer;
procedure Start(No : integer); var s: String; begin with MediaBox.Items.Add do begin Caption := Files[No]; s := Caption; Subitems.Add(ChangeFileExt(s, '.kxq')); SubItems.Add(GetFileSize(Caption)); Subitems.Add(ExtractFileExt(Caption)); SubItems.Add(GetBitrate(Caption); end; end;
begin if OnLyOne=-1 then for i := 0 to Files.Count-1 do start(i) else start(OnlyOne); end;
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.