Itemy z LB1 do LB2 zależne od LV1

0
procedure TForm1.Button5Click(Sender: TObject);
var
   i,j: integer;
begin
jvListbox3.Items.Clear;// czyści poprzednią listę z itemami
  for j:=Listbox1.Items.Count-1 downto 0 do
    for i:=jvListview1.Items.Count-1 downto 0 do
     if pos(ExtractFileExt(Listbox1.Items.Strings[j]) ,// extraktuje formaty plików ze ścieżek
     jvListview1.Items[i].SubItems[0] ) <> 0 // i sprawdza czy są subitemy z nimi w jvLV
     then
    jvListbox3.Items.Add(Listbox1.Items.Strings[j]); // jeśli nie ma w LB1 takich itemów to dopisuje itemy z nimi do LB3 
end;

Witam.
Napisałem taką procedurkę która ma za zadanie wyciągnąć formaty plików z LB1, sprawdzić czy te formaty występują w Subitemie jvLV1, jeśli ich nie ma to itemy z LB1 dodawaj do LB3.

LB1 ma postać taką:

Ścieżka

C:\plik.txt
C:\dupa.jpg
D:\dokument.doc
D:\fotka.jpg
E:\filmik.avi
------------------------------------------------------------

LV1:

Foldery | Format

D:\JPG | .jpg
C:\Dokumenty | .doc
------------------------------------------------------------

Zatem LB3 musi mieć postać:

Ścieżka

C:\plik.txt
E:\filmik.avi
------------------------------------------------------------

...dlatego, że foldery dla DOC i JPG są już zadane.
Napisany przeze mnie algorytm nie zdaje egzaminu nawet w 40%, dlatego że powtarza pliki lub pokazuje te pliki, które mają już w LV1 ścieżki. Coś się w nim soli...

Hmm gdzie robię błąd? Mam nadzieję, że dobrze przedstawiłem problem. :)
Dzięki za sugestie lub poprawienie algo. [soczek]

0

Może da się inaczej, ale ja zrobił bym tak jak poniżej, bo z moich testów wynika, że efekt jest taki jak chcesz.

var
  ListItem : TListItem;
  LB_I, LV_I, Cnt : integer;
  NazwaPliku, Rozszerzenie : string;
begin
  LB3.Items.Clear;
  for LB_I := 0 to LB1.Items.Count - 1 do
  begin
    NazwaPliku := LB1.Items[LB_I];
    Cnt := 0;
    LV_I := 0;
    repeat
      ListItem := LV1.Items[LV_I];
      Rozszerzenie := AnsiLowerCase(ListItem.SubItems[0]);
      if AnsiLowerCase(ExtractFileExt(NazwaPliku)) <> Rozszerzenie then
      begin
        Cnt := Cnt + 1;
      end;
      LV_I := LV_I + 1;
    until LV_I = LV1.Items.Count;
    if Cnt = LV1.Items.Count then
    begin
      LB3.Items.Add(NazwaPliku);
    end;
  end;
end;

A i mam nadzieję że odpiszesz, bo kojarze że kiedyś chyba Ty pod innym nickiem miałeś podoobny problem,
tylko chodziło o przenoszenie plików. Znalazłem ten temat jest pod tym adresem. A może teraz mi odpiszesz.
http://4programmers.net/Forum/viewtopic.php?id=156406

0

Efekt jest taki jaki chciałem uzyskać. Działa u mnie bardzo dobrze.
Dziękuję bardzo za to. :) Teraz go sobie przeanalizuję, aby mieć łatwiej w przyszłości.

Jeszcze jedno pytanie:
Jak usunąć zaznaczenie w Listview?
Pytam dlatego, że zaznacza mi 2 wiersze (stary i nowy), wcześniej gdy zaznaczyłem jeden.

Dla Listboxa napisałem to i działa:

for i := 0 to jvListbox1.Items.Count -1 do
   jvListbox1.Selected[i]:=False;

Dla Listview nie działa poprawnie:

for i:=jvListview1.Items.Count-1 downto 0 do
 jvListview1.Items[i].Checked := False;

Pewnie gdzieś siedzi jakaś głupotka.... [rotfl]

0

Owszem, pisałem wtedy ja. Jednak kilka dni nie odpisywałem nic, ponieważ nie było mnie w przy komputerze. Jednak napisałem później swoją prockę, krótszą, spartańską, ale dobrze działającą:

procedure TForm1.JvTransparentButton7Click(Sender: TObject);
var
   i: integer;
    format, fileSource, fileDest: string;

begin
 Repeat
    format:=ExtractFileExt(Listbox1.Items.Strings[0]);
      for i:=jvListview1.Items.Count-1 downto 0 do
       if pos(format ,jvListview1.Items[i].SubItems[0]) > 0
       then
      Edit3.Text:= jvListView1.Items[i].Caption;
 try
  //przenoszenie plików
  fileSource :=Listbox1.Items.Strings[0];
  fileDest :=PChar(Edit3.Text)+'\'+ExtractFileName(Listbox1.Items.Strings[0]);
  CopyFile(PChar(fileSource), PChar(fileDest), False);
  Listbox1.Items.Delete(0);
 //--koniec przenoszenia--//
 finally
 end;
Until Listbox1.Items.Count = 0;
Application.ProcessMessages;
END;
0

ListView też ma własności Selected. Także poniższy kod powinien pomóc. Jest też jeszcze własnośc Focused,
która decytuje o tym który element ma zostać wybrany, tak że jak masz na przykład jakiś kod po naciśnięciu
klawisza który coś robic z użyciem ItemIndex, na przykład usuwanie pojedyńczego elemetu To będzie to ten.

var
  I : integer;
begin
  for I := 0 to LV1.Items.Count - 1 do
  begin
    LV1.Items.Item[I].Selected := False;
  end;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1