Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi FMX Listview Mouseover Button im Item (https://www.delphipraxis.net/197591-fmx-listview-mouseover-button-im-item.html)

Towmuz 20. Aug 2018 09:22

FMX Listview Mouseover Button im Item
 
Guten Morgen,

nachdem ich mich nun wund gesucht habe, frage ich mal hier.

Gegeben sei ein TListView, darin füge ich Items in
Delphi-Quellcode:
DynamicAppearance
ein, alles schön herumdesignt usw.
Nun habe ich zwei ImageObjectAppearance IM ListViewItem, die als Buttons dienen sollen (Bearbeiten, Entfernen), alles Andere funktioniert auch schon,
aber wie tausche ich bei ImageObjectAppearance das Bild bei MouseOver?

Also ich möchte einen MouseOver Effekt, nur für diese zwei Buttons im ListItem.
Das MouseOverEvent vom ListView bietet mir leider nicht die selben Möglichkeiten wie z.B. ItemClickEx.

(Sorry erste ernste FMX Anwendung :))

Harry Stahl 20. Aug 2018 17:13

AW: FMX Listview Mouseover Button im Item
 
Ich nehme mal an, Du hättest in dem Mouse-Over Event gerne die Informationen, die ItenClickEx bietet, also das ListviewItem und die (lokale) Position der Maus innerhalb des ListViewItems?

Letztlich kann man das aber selber ermitteln.

Habe hier mal eine Info gepostet, wie man an das ListviewItem kommt, über das die Maus gerade ist (dummerweise ist Sender in Listview.Mousemove ja nicht das ListviewItem, sondern die Listview selber):

https://www.delphipraxis.net/187248-...-listview.html

So kommst Du an das ListviewItem. Wenn Du das hast, kannst Du anhand der Position Deines Buttons prüfen, ob die Maus gerade da drüber (z.B. Du rechnest die Koordinaten des Schalters per button.localtoabsolute um (ggflls. weitere Berechnungen, je nach Verschachtelung) und prüfst, ob die Maus im Bereich des Buttons ist) die gewünschte Manipulation vornehmen...

Denkbar wäre aber auch, dem Button (bzw. dem Image) selber direkt einen Effekt mitzugeben...

Towmuz 21. Aug 2018 09:08

AW: FMX Listview Mouseover Button im Item
 
Danke schön, funktioniert :)
Mittels
Delphi-Quellcode:
InLocalRect
bekommt man auch fix das gewünschte Control.

hier die Testversion, die Icons müssen noch in eine Imagelist o.ä.
Delphi-Quellcode:
//Edit: Der Vollständigkeit halber, hier noch die function von Harry aus dem verlinkten Thread
Function GetIndexAtPos(LV: TListView; TP: TPointF): Integer;
var
  I: Integer;
  TR: TRectF;
begin
  Result := -1;

  for I := 0 to LV.Items.Count-1 do begin
    TR := LV.GetItemRect(I);

    if TR.Contains(TP) then begin
      Result := I;
      Break;
    end;
  end;
end;

procedure Tfrm1.lv_timesMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
var
  obj    : IControl;
  ind    : Integer;
  item   : TListViewItem;
  img    : TListItemImage;
  icoEdit : TBitmap;
begin
  obj := ObjectAtPoint(Screen.MousePos);
  if obj <> nil then
  begin
    ind := GetIndexAtPos(lv_times, TPointF.Create(X, Y));

    if ind <> -1 then
    begin
      item := lv_times.Items[ind];
      if item <> nil then
      begin
        img        := item.Objects.FindObjectT<TListItemImage>('btn_Edit');
        icoEdit    := TBitmap.Create;
        img.Bitmap := TBitmap.Create(0, 0);
        if img.InLocalRect(TPointF.Create(X, Y)) then
        begin
          icoEdit.LoadFromFile('C:\Users\Ich\Desktop\edit_over.ico');
          img.Bitmap := icoEdit;
        end else
        begin
          icoEdit.LoadFromFile('C:\Users\Ich\Desktop\edit.ico');
          img.Bitmap := icoEdit;
        end;
      end;
    end;
  end;
end;
Zitat:

Denkbar wäre aber auch, dem Button (bzw. dem Image) selber direkt einen Effekt mitzugeben...
Hast du dafür einen Ansatz? Das würde sicherlich weniger Overhead produzieren.

Harry Stahl 21. Aug 2018 21:46

AW: FMX Listview Mouseover Button im Item
 
Zu Deiner Frage nach einem alternativen Ansatz:

Du könntest z.B. ein TGlowEffect oder TBeveleffect erzeugen, als Parent das Image setzen (Hittest muss für das Image=True sein) und als Trigger für den Effekt "Mouseover=True" und "enabled=false" als Vorgabe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:25 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