AGB  ·  Datenschutz  ·  Impressum  







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

Fmx FMX.ListView.TListView Fix

Ein Thema von Rollo62 · begonnen am 30. Jun 2015
Antwort Antwort
Rollo62

Registriert seit: 15. Mär 2007
4.094 Beiträge
 
Delphi 12 Athens
 
#1

Fmx FMX.ListView.TListView Fix

  Alt 30. Jun 2015, 15:57
Hallo zusammen,

in meinem RadStudio XE8 + Upd1 Subrc. sieht der FMX.ListView.TListView folgendermassen aus:

Code:
procedure TCustomListView.UpdateItemLookups;
var
  I, TotalHeight, PrevItemHeight, CurHeaderRef: Integer;
begin
  if FHeightSumsNeedUpdate then
  begin
    TotalHeight := 0;

    if (FSearchEdit <> nil) and FSearchEdit.Visible then
      TotalHeight := TotalHeight + Ceil(FSearchEdit.Height);

    FHeightSums.Clear;
    FHeightSums.Add(TotalHeight);

    CurHeaderRef := -1;

    for I := 0 to Items.Count - 1 do
    begin
      if I > 0 then
      begin
        PrevItemHeight := GetItemHeight(I - 1);
        Inc(TotalHeight, PrevItemHeight);

        FHeightSums.Add(TotalHeight);
      end;

      if Items[I].Purpose = TListItemPurpose.Header then
      begin
        CurHeaderRef := I;
        TOpenListBoxItem(Items[I]).FHeaderRef := I;
      end;

      if Items[I].Purpose = TListItemPurpose.None then
      begin
        if Items[I].Count > 0 then
          TOpenListBoxItem(Items[I]).FHeaderRef := CurHeaderRef
        else
          CurHeaderRef := -1;
      end;
    end;

    Inc(TotalHeight, GetItemHeight(Items.Count - 1));
    if TotalHeight <> FMaxKnownHeight then
    begin
      FHeightSums.Add(TotalHeight); //S4:Fix added

      FMaxKnownHeight := TotalHeight;
      UpdateScrollingLimits;
    end;

    FHeightSumsNeedUpdate := False;
  end;
end;

function TCustomListView.FindItemAbsoluteAt(ViewAt: Integer): Integer;
var
  Left, Right, Pivot, Value: Integer;
  iUp: Integer;
begin
  UpdateItemLookups;

  if Items.Count < 1 then
    Exit(-1);
  if ViewAt < 1 then
    Exit(0);
  if ViewAt >= FHeightSums[FHeightSums.Count - 1] then
    Exit(-1); //S4:Fix: FHeightSums.Count - 1);

  Left := 0;
  Right := FHeightSums.Count - 1;
  Pivot := 0;

  while Left <= Right do
  begin
    Pivot := (Left + Right) div 2;

    Value := FHeightSums[Pivot];
    if Value = ViewAt then
      Exit(Pivot);

    if Value > ViewAt then
      Right := Pivot - 1
    else
      Left := Pivot + 1;
  end;

  Result := Pivot;

  if (Result > 0) and (Result < FHeightSums.Count) and (FHeightSums[Result] >= ViewAt) then
    Dec(Result);
end;
Das ähnliche Problem und ein FIX ist hier beschrieben, damit beim Click unterhalb des Letzten Items kein falscher Click aufs Letzte Item ausgelöst wird.
Code:
  if ViewAt >= FHeightSums[FHeightSums.Count - 1] then
    Exit(-1); //S4:Fix: FHeightSums.Count - 1);
Allerdings reicht das bei mir (XE8 Pro + Upd1 Subscr.) nicht aus, denn es werden wohl zuwenig FHeightSums angelegt,
dazu muss ich einen 2ten Fix anlegen:
Code:
    Inc(TotalHeight, GetItemHeight(Items.Count - 1));
    if TotalHeight <> FMaxKnownHeight then
    begin
      FHeightSums.Add(TotalHeight); //S4:Fix added

      FMaxKnownHeight := TotalHeight;
      UpdateScrollingLimits;
    end;
Und natürlich muss ich FMX.ListView in meinen Code kopieren, was ich eigentlich nicht möchte.
Ich habe das Ganze auch nicht auf Herz und Nieren getestet (Header, Footer, GroupHeader, iOS, And, Win, Mac, etc.),
aber es löst erstmal quick&dirty mein Problem.

Vielleicht hat ja jemand schon eine bessere Lösung gefunden ?

Anbei ein Demo (die DB ignorieren, das war für einen anderen Test).


Rollo
Angehängte Dateien
Dateityp: zip T07_Fd_ClickFix.zip (120,4 KB, 2x aufgerufen)

Geändert von Rollo62 (30. Jun 2015 um 16:00 Uhr)
  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 03:55 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