Toon posts:

[Delphi] Focus van een item van een ListView wijzigen

Pagina: 1
Acties:
  • 279 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb een ListView die ingesteld staat op MultiSelect en in de Report mode. Nu wil ik dat als de gebruiker een item deselecteert, de focus verschuift naar de 1e item die geselecteerd is.

Nu heb ik dat met deze code geprobeerd:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TFormArtikelVerpakking.ListViewArtikelVerpakkingSelectItem(
  Sender: TObject; Item: TListItem; Selected: Boolean);
begin
  if ListViewEnabled then
  begin
    if not Selected then
    begin
      if ListViewArtikelVerpakking.SelCount > 0 then
        ListViewArtikelVerpakking.ItemFocused := ListViewArtikelVerpakking.Selected;
    end
    else
    begin
      edt_Afkorting.Text := Item.Caption;
      edt_Omschrijving.Text := Item.SubItems[0];
    end;
    UpdateToolButtons;
  end;
end;


Maar hiermee lukt het niet om de focus te wijzigen. Maar de SelectItem event doet toch voor de rest niks waardoor de focus weer terug gezet wordt?

Verwijderd

Heeft'n listview item in delphi geen EnsureVisible method?

Verwijderd

Topicstarter
Verwijderd schreef op 08 september 2002 @ 15:33:
Heeft'n listview item in delphi geen EnsureVisible method?
Nee die is er niet

Verwijderd

Gebruik 's Item.MakeVisible (Partial:boolean)

Verwijderd

Topicstarter
Verwijderd schreef op 08 september 2002 @ 16:00:
Gebruik 's Item.MakeVisible (Partial:boolean)
Ik geloof niet dat het helemaal duidelijk is wat het probleem is. Ik zal proberen om het wat duidelijker uit leggen:

Stel ik heb 3 rows geselecteerd in een ListView en de bovenste van de 3 heeft de focus (dus een selectie rect. er om heen). Nu ga ik de bovenste van de 3 deselecteren.

Wat ik nu wil is dat de 2e item van die 3 (is namelijk nu de eerste die geselecteerd is) de focus rect. krijgt.

Het gaat er nu dus ff niet om dat een bepaalde row niet zichtbaar is (dus dat er gescrolld zou moeten worden)

Verwijderd

aha, dus je wilt de voorlaatst geselecteerde item focus geven.
Ik denk dat je dan zelf een lijstje bij moet gaan houden, of iets van pointers aan de geselecteerde items toevoegen naar de vorig geselecteerde.

Verwijderd

Topicstarter
Verwijderd schreef op 08 september 2002 @ 16:12:
aha, dus je wilt de voorlaatst geselecteerde item focus geven.
Ik denk dat je dan zelf een lijstje bij moet gaan houden, of iets van pointers aan de geselecteerde items toevoegen naar de vorig geselecteerde.
Nee, de Property Selected houdt alle geselecteerde items bij. Dus dat is het probleem niet.

Verwijderd

Jij hebt gelijk, ik zal 's ff een en ander uitproberen.

Verwijderd

probeer dit is (is niet de netste code, maar misschien kan je hiermee verder ...)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
  var
    i : integer;
    MyItem : TListItem;
begin
   MyItem := NIL;
   if (not item.selected) then begin
      i := listview1.Items.Count;
      while (i > 0) and (not listview1.items[i - 1].Selected) do
        i := i - 1;
      if i > 0 then  begin
         listview1.itemfocused := listview1.Items[i - 1];
      end;
      MyItem := Listview1.ItemFocused;
   end
   else
      MyItem := Item;

   if MyItem <> Nil then 
   edit1.text := Myitem.caption
   else edit1.text := '';
end;

Verwijderd

Verwijderd schreef op 08 september 2002 @ 16:18:
[...]
Nee, de Property Selected houdt alle geselecteerde items bij. Dus dat is het probleem niet.
De property Selected van Listview verwijst alleen naar het huidige selected item
De property Selected van een listview item geeft alleen aan of het item geselecteerd is ja of nee.
Er is dus geen lijst ofzo van de selected items

  • tfk__66
  • Registratie: September 2002
  • Laatst online: 29-10-2025

tfk__66

OS1: Fedora Linux, OS2: W10

Volgens mij kun je de Focussed property van de TListItem gebruiken. Als je de index van het Item, die aangeklikt is, opslaat (het item dat aan de eventhandler wordt meegegeven) dan zou je met de index+1 het goeie item te pakken kunnen hebben.

Je moet volgens mij door de lijst van ListItems lopen en de Focussed prop eerst uitzetten alvorens je weer eentje aan kan zetten (dat las ik in de help).
TListItem.Focused

Indicates whether the list item has input focus.

property Focused: Boolean;

Description

Set Focused to True to allow the user to edit the Caption.

Note: Only one item in the view should have focus at a time. When setting Focused to True, be sure to set the Focused property of all other items in the list view to False. When the list item is Focused, it appears surrounded by a standard focus rectangle.
Ik ben bang dat je nog wel wat zelf moet gaan vogelen, aangezien dit allemaal theoretisch gewauwel is en alleen uit de help-file komt. Maar misschien helpt het je in de goede richting.

GA-Z170XP-SLI - i7 6700K 4.0GHz - 16GB DDR3 - Corsair 300R Wnd - Corsair CX750M - AMD 7950 3GB


Verwijderd

Topicstarter
Verwijderd schreef op 08 september 2002 @ 18:05:De property Selected van Listview verwijst alleen naar het huidige selected item
De property Selected van een listview item geeft alleen aan of het item geselecteerd is ja of nee.
Er is dus geen lijst ofzo van de selected items
Sorry, ik bedoelde eigenlijk dat je met Selected en GetNextItem(Item, sdAll, [isSelected]) de hele lijst met geselecteerde items door kan lopen.

Verwijderd

Topicstarter
Ik heb inmiddels de oplossing gevonden. Ik kan de focus niet wijzigen in de OnSelectItem event maar in de OnChange event.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Let eens op de Selected: Boolean in deze procedure

"The shell stopped unexpectedly and Explorer.exe was restarted."

Pagina: 1