AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ListView TopItem

Ein Thema von EWeiss · begonnen am 10. Jan 2017 · letzter Beitrag vom 10. Jan 2017
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

ListView TopItem

  Alt 10. Jan 2017, 08:11
Wie kann ich mit Win32Api mitteln den ausgewählten Eintrag des ListView an erster Position setzen (Scrollen)

Bei der ListBox geht das schön..
Delphi-Quellcode:
procedure TSkinListBox.ListSetTopIndex(hList: hWnd; nTopIndex: Integer);
begin
  if nTopIndex > 0 then
    dec(nTopIndex);
  if hList <> 0 then
    SendMessageW(hList, LB_SETTOPINDEX, nTopIndex, 0);

  if assigned(LVScrollBar) then
    LVScrollBar.Value := nTopIndex;
end;
Für die ListView gibt es kein SetTopItem oder ähnlich.

jemand ne Idee?

gruss

Geändert von EWeiss (10. Jan 2017 um 08:21 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
969 Beiträge
 
Delphi 6 Professional
 
#2

AW: ListView TopItem

  Alt 10. Jan 2017, 09:02
Hmm..

Delphi-Quellcode:
procedure LWScrollUp(AListView : TListView);
begin
  if AListView.Items.Count > 0 then
    AListView.Items[0].MakeVisible(False);
end;
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#3

AW: ListView TopItem

  Alt 10. Jan 2017, 09:04
Nicht VCL sondern Win32 API.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
969 Beiträge
 
Delphi 6 Professional
 
#4

AW: ListView TopItem

  Alt 10. Jan 2017, 09:10
Hmm..

OK, mal in den Source reingeschaut und da steht (Delpi 6):

Delphi-Quellcode:
procedure TListItem.MakeVisible(PartialOK: Boolean);
begin
  ListView_EnsureVisible(Handle, Index, PartialOK);
end;


function ListView_EnsureVisible(hwndLV: HWND; i: Integer; fPartialOK: Bool): Bool;
begin
  Result := SendMessage(hwndLV, LVM_ENSUREVISIBLE, i,
    MakeLong(Integer(fPartialOK), 0)) <> 0;
end;
Somit sollte er das SendMessage auch direkt verwenden können.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: ListView TopItem

  Alt 10. Jan 2017, 09:31
Ich habe es jetzt mal so versucht.
Das Problem ist mal wieder .. es geht dann wieder nicht.

Delphi-Quellcode:
procedure TSkinListView.SetTopItem(hwndLV: HWND; nItem: Integer);
var
  TopIndex: Integer;
  ItemIndex: TLVItemIndex;
  Rect: TRect;
begin

  ListView_EnsureVisible(hwndLV, nItem, true);
  TopIndex := ListView_GetTopIndex(hwndLV);
  ItemIndex.iItem := TopIndex;
  ItemIndex.iGroup := -1;
  ListView_GetItemIndexRect(hwndLV, ItemIndex, nItem, LVIR_BOUNDS, Rect);
  ListView_Scroll(hwndLV, Rect.Left, Rect.Top);
  if Visible then
    SetFocus(hwndLV);

end;
Kann jemand sehen was nicht stimmt?
Einmal ist der Eintrag unten selektiert und manchmal oben.

gruss

Geändert von EWeiss (11. Jul 2019 um 16:45 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
969 Beiträge
 
Delphi 6 Professional
 
#6

AW: ListView TopItem

  Alt 10. Jan 2017, 10:17
Hmm..

Bei allen Beispielen wurde

ListView_EnsureVisible(hwndLV, nItem, false);
(false) verwendet.

Ach, und verwende mal:

Scroll(hwndLV, 0 , R.Top - (R.Bottom - R.Top));
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#7

AW: ListView TopItem

  Alt 10. Jan 2017, 10:18
Ich vermute das hängt vom Ausgangspunkt ab. Wenn er von unten anfängt zu scrollen, ist es unten markiert, von oben angefangen oben.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: ListView TopItem

  Alt 10. Jan 2017, 10:29
Hmm..

Bei allen Beispielen wurde

ListView_EnsureVisible(hwndLV, nItem, false);
(false) verwendet.

Ach, und verwende mal:

Scroll(hwndLV, 0 , R.Top - (R.Bottom - R.Top));
Ich sehe kein False..

ListView_EnsureVisible(hwndLV, nItem, true);

Oder meinst du ich sollte false verwenden?
Wenn es so ist werde ich auch das mal versuchen.

Den anderen Vorschlag werde ich mal versuchen Danke.

PS:
Hab es mal versucht keine Änderung denke da ist was Faul mit
ListView_GetItemIndexRect

gruss

Geändert von EWeiss (10. Jan 2017 um 10:51 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: ListView TopItem

  Alt 10. Jan 2017, 11:54
Ok hier die neue funktionierende Version.
Delphi-Quellcode:
procedure TSkinListView.SetTopItem(hwndLV: HWND; nItem: Integer);
var
  lvItemsPerPage: Integer;
  lvTopIndex: Integer;
begin

   lvTopIndex := ListView_GetTopIndex(hwndLV) + 1;
   lvItemsPerPage := ListView_GetCountPerPage(hwndLV);

   if lvTopIndex > nItem then
     ListView_EnsureVisible(hwndLV, nItem, false)
   else
   if (nItem - lvTopIndex) >= lvItemsPerPage then
   begin
    if (nItem + lvItemsPerPage) > ListView_GetItemCount(hwndLV)-1 then
      ListView_EnsureVisible(hwndLV, ListView_GetItemCount(hwndLV)-1, false)
    else
    ListView_EnsureVisible(hwndLV, nItem + lvItemsPerPage - 1, false);
   end;

  if Visible then
    SetFocus(hwndLV);

end;
falls es mal jemand braucht.

gruss
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:49 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