Zaznaczenie w Listboxie.

0

Witka

Jeden z was już mi tu trochę pomógł ( dzięki Ci ), jakoś radzę sobie teraz z poprawkami, ale mam problem z listboxem.
Googlowałem na temat zaznaczenia pozycji w listboxie.

Te zaznaczenie jest mi bardzo potrzebne, bo np. jeśli zaznacze na listboxie pozycję i dam przycisk DEL - niech ją usunie.
Jak np. wyszukam pozycję na listboxie, niech ją zaznaczy na czerwono itd.

Czy ktoś zna magiczną formułkę na zaznaczenie pozycji w listboxie i w jakim zdarzeniu je dać ?

Pozdro
Adaxuss

0

ListBox1.ItemIndex:=zaznaczana_pozycja

0

No dzięki, ale w jakim evencie to wrzucić ? Właśnie z tym tez mam problem, ze nie chce to pod żadnego buttona wrzucać tylko przy samym kliknięciu na konkretną linie.

0

"przy samym kliknięciu na konkretną linie" kliknięty Item sam się zaznaczy a ItemIndex przyjmie odpowiednią wartość. Wystarczy go odczytać.
Jeżeli chcesz wykryć, że user kliknął, to wykorzystaj zdarzenie OnClick ListBoxa.

0

Kolego ja wiem, że to za to odpowiada ItemIndex ale chodzi mi dokładnie o rozwiazanie problemu.

Więc może chociaż składniowo pomożesz :)

If Listbox.ItemIndex[i] and  Key = #13 then DeletebuttonClick(Sender);

Czyli jeśli zaznacze wpis w listboxie i nacisne enter wtedy wykonaj przycisk usuniecia.

dodanie znacznika <code class="delphi"> - furious programming

0

If Listbox.ItemIndex[i] and Key = #13 then DeletebuttonClick(Sender);

  1. Kolejność operatorów
  2. Listbox.ItemIndex to nie tablica
  3. Tak się nie wywołuje metod. Używaj TButton.Click.

Kolego ja wiem, że to za to odpowiada ItemIndex ale chodzi mi dokładnie o rozwiazanie problemu.

Czekaj czekaj, gotowiec?

Czyli jeśli zaznacze wpis w listboxie i nacisne enter wtedy wykonaj przycisk usuniecia.

Gdy zostanie naciśnięty enter, sprawdzaj czy jest fokus na ListBox, czy jest wybrany poprawny item, i go usuwaj. Na gotowy kod ode mnie nie licz, to już jest tak proste, że jeżeli umiesz programować i googlować to bez problemu dasz sobie radę.

0

Warunki należy przy takim ifie umieszczać w nawiasach, poczytaj na google o tym. Poza tym widzę, że coś kombinujesz z naciskanym klawiszem, więc czy to tak trudno zobaczyć na listę zdarzeń w zakładce Events Object Inspectora i dojrzec, że są tam zdarzenia zaczynające się od słów OnKey...?

0

If (Listbox.ItemIndex>=0) and (Key = #13) then DeletebuttonClick(Sender);

olesio napisał(a):

... więc czy to tak trudno zobaczyć na listę zdarzeń w zakładce Events Object Inspectora i dojrzec, że są tam zdarzenia zaczynające się od słów OnKey...?
A jak sądzisz skąd się wzięła ta sprawdzana zmienna Key?

0
_13th_Dragon napisał(a):

If (Listbox.ItemIndex>=0) and (Key = #13) then DeletebuttonClick(Sender);

Oczywiście poprawnie wywołać metody buttona nie można. Metody już byście nie wykonali gdyby nie Sender który wysyłacie z waszego Sendera (bezsensownie).

A jak sądzisz skąd się wzięła ta sprawdzana zmienna Key?

Umiesz zgadywać? Nie tylko ty. Tylko jak masz buga, to też zgadujesz gdzie on jest wyłączając losowe części kodu, czy używasz debuggera do wykrycia przyczyny błędu i poprawiasz kod mając to na uwadze? Metody failsafe użył @olesio tutaj. I akurat jest ona pewniejsza niż twoje zgadywania.

0

A delete w ASCII jaki ma # ? 127 ? Bo jak tak to mi nie działa ten numer ;/

Mam:

if Key = #127 then showmessage('usuwam');

tak na razie zrobiłem zeby wypróbować klawisz DEL ale nie śmiga.
No i teraz kombinuje z tym focusem zeby usunelo zaznaczoną linie ;/

Muszą się spełnić dwa warunki if listbox.focused and key =#127 then ... ?

0
-321oho napisał(a):
_13th_Dragon napisał(a):

If (Listbox.ItemIndex>=0) and (Key = #13) then DeletebuttonClick(Sender);

Oczywiście poprawnie wywołać metody buttona nie można. Metody już byście nie wykonali gdyby nie Sender który wysyłacie z waszego Sendera (bezsensownie).
Owszem można zawsze wywołać Deletebutton.Click() ale wtedy wewnątrz DeletebuttonClick nie rozpoznasz czy to wywołano przez użytkownika czy sztucznie.
Przy takim wywołaniu jaki użył pytający można wewnątrz DeletebuttonClick sprawdzić Sender'a i w zależności od tego zmienić nieco działanie.

-321oho napisał(a):

A jak sądzisz skąd się wzięła ta sprawdzana zmienna Key?

Umiesz zgadywać? Nie tylko ty. Tylko jak masz buga, to też zgadujesz gdzie on jest wyłączając losowe części kodu, czy używasz debuggera do wykrycia przyczyny błędu i poprawiasz kod mając to na uwadze? Metody failsafe użył @olesio tutaj. I akurat jest ona pewniejsza niż twoje zgadywania.
@olesio skrytykował pytającego że nie nie spojrzał na listę event'ow zaś z kodu wynika że spojrzał, znalazł i kombinuje wewnątrz odpowiedniego eventu na co ja zwróciłem uwagę. Naprawdę nie rozumiem o czym ty tu piszesz.

adaxuss napisał(a):

Muszą się spełnić dwa warunki if listbox.focused and key =#127 then ... ?
Jeżeli użyłeś OnKey??? formatki to ma sens sprawdzać listbox.focused natomiast jak użyłeś OnKey??? dla listbox'a to nie ma sensu sprawdzać bo to będzie zagwarantowane.

0

Myślałem, że jakoś tym focusem wyciągne konkretne położenie itemindex'a ;/ ale chyba nie tędy droga...
Zależy mi, żeby usuwało zaznaczony item po delecie

Powiedzmy, że juz poradziłem sobie z usuwaniem z listboxa po enterze:

if key = #13 then
        ListBox1.Items.Delete(ListBox1.ItemIndex);

A kto ładnie naprowadzi na kod ASCII ( DZIAŁAJĄCY !!! ), który odpowiada za klawisz DEL ?

Update ;/
Fuck - ładnie usuwa do czasu zamkniecia programu, przy nowym uruchomieniu stara lista powraca :/

0

Owszem można zawsze wywołać Deletebutton.Click() ale wtedy wewnątrz DeletebuttonClick nie rozpoznasz czy to wywołano przez użytkownika czy sztucznie.
Przy takim wywołaniu jaki użył pytający można wewnątrz DeletebuttonClick sprawdzić Sender'a i w zależności od tego zmienić nieco działanie.

Mimo że nie ma zielonego pojęcia jak z tego skorzystać. Genialne .
Może w ogóle dawajmy kod tak jakbyśmy my to zrobili, bo przecież mamy do czynienia których nie uczymy podstaw, tylko z samymi pr0sami, którzy wiedzą jak to się normalnie robi. Oczywiście wszystko w dziale newbie, dlatego nie powinniśmy niczego tłumaczyć, bo zakładamy że wszystko wiedzą i umieją użyć F1/google, prawda? Więc po co w ogóle jest wydzielony dział newbie? Według ciebie po nic. Natomiast według mnie szukanie uzasadnienia dla mniej poprawnego użycia funkcji w dziale newbie jest NIE na miejscu. To nie jest miejsce gdzie każdy wie jak się powinno bawić, więc twoje obejściowe/niekoniecznie poprawne rozwiązanie będzie potraktowane jako wzorzec. Jak chcesz pokazywać coś co może być przydatne w pewnych innych warunkach to nie tutaj.

@olesio skrytykował pytającego że nie nie spojrzał na listę event'ow zaś z kodu wynika że spojrzał, znalazł i kombinuje wewnątrz odpowiedniego eventu na co ja zwróciłem uwagę. Naprawdę nie rozumiem o czym ty tu piszesz.

Skrytykował za to: No dzięki, ale w jakim evencie to wrzucić ?
Nie wynika że kombinuje z odpowiedniego eventu, to jest zgadywanie. Równie dobrze może znać angielski i przetłumaczyć klawisz na angielski. Nie no ale gdzie ja się znam. Widzę że jasnowidz. Debuggera też nie używasz...

Myślałem, że jakoś tym focusem wyciągne konkretne położenie itemindex'a

A wiesz co to fokus? Odpowiem za ciebie: nie.

A kto ładnie naprowadzi na kod ASCII ( DZIAŁAJĄCY !!! ), który odpowiada za klawisz DEL ?

Czekaj, to nie możesz pomyśleć i zrobić tak, że jak naciśniesz klawisz to ci go WYŚWIETLI i potem naciśniesz DELETE i będziesz WIEDZIAŁ?! Nie no co ja, za trudne...

Fuck - ładnie usuwa do czasu zamkniecia programu, przy nowym uruchomieniu stara lista powraca

To teraz nam jest potrzebny @_13th_Dragon żebyśmy znów wiedzieli o co chodziło pytaczowi, bo tylko jasnowidz pomoże.

0

każecie szukać po google to szukam, kod ascii dla DEL to #127 - więc czemu nie działa ? skoro ta sama #13 dla entera działa bez zarzutu ?

0

Bo DEL nie działa w OnKeyPress tylko w OnKeyDown i OnKeyUp a jaki ma kod to sobie sprawdź choćby głupim (jak nie umiesz użyć Google czy debuggera)

ShowMessage(IntToStr(Key));
0

Lepiej użyj OnKeyPress lub PopupMenu gdzie dla MenuItem ustalasz ShortCut na DEL, wtedy masz dodatkową możliwość usuwania spod prawego klawisza. Ewentualnie jak nie chcesz to możesz dać Visble=false dla tego MenuItem ale mimo że nie widoczny działać będzie poprawnie.

0

Faktycznie pod OnKeyPress - DEL nie działa, natomiast przy OnKeyDown też się wykrzacza.
Według podpowiedzi showmessage - klawisz del ma #46 ale mi go nie przyjmuje :[

0
adaxuss napisał(a):

każecie szukać po google to szukam, kod ascii dla DEL to #127 - więc czemu nie działa ? skoro ta sama #13 dla entera działa bez zarzutu ?

DEL nie posiada przyporządkowanego kodu ASCII, natomiast ENTER posiada.
Przeczytaj dokładnie deklarację OnKeyDown to będziesz wiedział co robisz źle.

0

W OnKeyDown Key jest typu Word a więc liczbą czyli zwyczajnie 46 a nie #46

0

Faktycznie - pomogło besh hasha :)

Ale dalej usuwa z listy tylko do czasu wyłączenia programu ;/
Tutaj zmodyfikowałem trochę pomysł kolegi:

var
  Sl : TStringList;
  iIndex: integer;
begin
 if key = 46 then
        ListBox1.Items.Delete(ListBox1.ItemIndex);
begin
  SL:= TStringList.Create;
  try
    SL.LoadFromFile(sDatPath);
    iIndex:= GetIndex(edit1.text,SL);
    if iIndex >= 0 then
    begin
      Sl.Delete(iIndex);
      SL.SaveToFile(sDatPath);
      Listbox1.Clear;
      Listbox1.Items:= SL;
    end;

Na obecną chwile działa to tak, że trzeba wpisać to co ma usunąć w edit1 i dopiero wtedy moim klawiszem usunie go na stałe.
Próbowałem pod tym drugim begin wprowadzić ListBox1.Items.Delete(ListBox1.ItemIndex) ale efekt ten sam - po ponownym uruchomieniu powraca ;/
Przecież jest zapisywanie bierzącego stanu listboxa po usuwaniu. Jakieś pomysły ?

0

Przecież tutaj się nikt nie wyzna co ten kod robi (a raczej miał robić) po co w ogóle ten StringList?
Ładować ListBox z pliku możesz np. tak ListBox1.Items.LoadFromFile('sciezka i nazwa pliku');
a zapisywać po usunięciu:

 if Key = 46 then
 begin
   ListBox1.Items.Delete(ListBox1.ItemIndex);
   ListBox1.Items.SaveToFile('sciezka i nazwa pliku');
 end;
0

W OnKeyDowd porównuj do VK_DELETE

0

Panowie ktoś ma jakiś pomysł na podwójne pokazywanie w listboxie ? ale tylko do czasu wpisania kolejnej linijki...

Np. dodaje XXX i na liście jest

XXX
XXX

Dodaje zaraz potem YYY

i na liście robi się

XXX
YYY
YYY

Co może być odpowiedzialne za to ?

0

musisz pokazać to dodawanie oraz procedurę OwnerDraw jeżeli taką zrobiłeś.

0

Ondraw jeszcze sie nie bawiłem ( podobno sprawdzi się na tym numerowanie linii w listboxie ).
Probówałem innego rozwiązania od kolegi "Adamek", aby numerować linie:

 For n:=0 to RichEdit1.Lines.Count do
RichEdit1.Lines.Strings[n]:=inttostr (n+1)+\'. \'+RichEdit1.Lines.Strings[n]; 

Zrobiłem to na Listboxie ale nie numeruje.

Kod, który służy za dodawanie:

 var
  Sl : TStringList;
  sTemp: string;
  i: Integer;

  //iIndex: integer;
begin
  if (Length(Edit1.Text) > 0) and  (Length(Edit4.Text) > 0)then
     begin
       SL:= TStringList.Create;
       SL.LoadFromFile(sDatPath);
       ListBox1.Items.LoadFromFile(sDatPath);
       //
  //zamieniamy znaki #255 na entery
       sTemp:= Edit1.Text + '|' + Edit2.Text + '|' + Edit3.Text + '|' + Edit4.Text + '|' + richedit1.Text;
       sTemp:= Trim(STemp);
       try
         //if not SL.Find(sTemp,iIndex) then
         //if SL.IndexOf(sTemp) < 0 then
         if GetIndex(Edit1.Text,SL) < 0 then
         begin
           SL.Add(sTemp);
           SL.SaveToFile(sDatPath);
           Memo1.Lines:= SL;
           Listbox1.Items:= SL;
           listBox1.Items.Add(Edit1.Text + '|' + Edit2.Text + '|' + Edit3.Text + '|' + Edit4.text+ '|' + richedit1.Text);
           ListBox1.TopIndex := ListBox1.Items.Count -1;
           Button6Click(Sender);
              end else

             ShowMessage('Ten numer IMEI już istnieje !');
                          begin
for i:=0 to ListBox1.Count-1 do begin
    if Pos(AnsiLowerCase(Edit1.Text),AnsiLowerCase(ListBox1.Items.Strings[i]))
>0 then
   ListBox1.Selected[i]:=true

   else ListBox1.Selected[i]:=false;


end;
end;

       finally
         SL.Free;
       end;
     end;
     edit1.Clear;
end;
0

For n:=0 to RichEdit1.Lines.Count-1 do

Ależ nakręciłeś !! masz podwójne dodawanie:
SL.Add(sTemp); // dodano
Listbox1.Items:= SL; // przypisano razem z dodanym
listBox1.Items.Add(Edit1.Text + '|' + Edit2.Text + '|' + Edit3.Text + '|' + Edit4.text+ '|' + richedit1.Text); // dodano jeszcze raz.

0
_13th_Dragon napisał(a):

For n:=0 to RichEdit1.Lines.Count-1 do

Ależ nakręciłeś !! masz podwójne dodawanie:
SL.Add(sTemp); // dodano
Listbox1.Items:= SL; // przypisano razem z dodanym
listBox1.Items.Add(Edit1.Text + '|' + Edit2.Text + '|' + Edit3.Text + '|' + Edit4.text+ '|' + richedit1.Text); // dodano jeszcze raz.

Ale tylko tak mi działa jako tako...
Jak wywale SL.Add(sTemp) to nadpisuje linijkę i zawsze jest tylko jedna.
A usunięcie listbox1.items.add mija się z celem bo jest główna czynność programu :)

0

napisz co robi GetIndex(Edit1.Text,SL) i Button6Click(Sender);
śmiało wywal: listBox1.Items.Add(Edit1.Text + '|' + Edit2.Text + '|' + Edit3.Text + '|' + Edit4.text+ '|' + richedit1.Text);

0

Pola z Editów1,2,3,4, i richedit muszą być wpisane na listbox1, w edit1 wpisywana jest najwazniejsza wartość i to ona zatwierdza reszte.
A button6 to jest powiedzmy ze to samo tylko ze dla listboxa2. po prostu listbox1 to jest dla mnie spis wszystkiego a listbox2 to jest spis tymczasowy ( kasowany po zamknieciu programu lub ręcznie przez przycisk ).

Najgorsze jest to numerowanie w listboxie wszystkich pozycji ;/ Za ch... nie wiem jak sie za to zabrać...

0

Najgorsze jest to numerowanie w listboxie wszystkich pozycji ;/ Za ch... nie wiem jak sie za to zabrać...

Wiesz co jest najgorsze? Nazywanie komponentów Button1, Button2... ButtonN.

Panowie ktoś ma jakiś pomysł na podwójne pokazywanie w listboxie ? ale tylko do czasu wpisania kolejnej linijki...

Gdy dodajesz nową linię, to usuwasz ostatnią (chyba że jest pusto) i dodajesz dwa razy nową? Gdzie tu jest problem.

Za ch... nie wiem jak sie za to zabrać...

Gdyby udało ci się opisać problem tak żeby wszyscy jasno rozumieli co masz, co chcesz mieć i czego nie wiesz, to może ktoś by ci pomógł. Póki co twoje tłumaczenia są dla mnie nie zrozumiałe. Ponazywaj Komponenty po ludzku i opisz dokładnie (najlepiej z obrazkami) co chcesz zrobić.

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