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 Hint über SubItem einer ListView (https://www.delphipraxis.net/96557-hint-ueber-subitem-einer-listview.html)

Reinhardtinho 26. Jul 2007 15:55


Hint über SubItem einer ListView
 
Hi zusammen, :hi:

Gibt es eine Möglichkeit über einem bestimmten SubItem ein Hint anzuzeigen?

Ich habe eine JvListView (ViewStyle := vsReport) und habe auch schon das Ereignis OnInfoTip benutzt, aber dort wird der Hint immer über dem Eintrag in der ersten Spalte gezeigt. Vielleicht kann man ja das Hintfenster irgendwo anders positionieren. :?:


Vielen Dank für eure Tipps


MFG
Lorenz

marabu 27. Jul 2007 18:46

Re: Hint über SubItem einer ListView
 
Hallo Lorenz,

in diesem Thread findest du zwei Ansätze um die Spalte in einer ListView zu ermitteln: im listview onclick spaltenindex heraus finden

Delphi-Quellcode:
uses
  CommCtrl;

function GetItemAt(lv: TListView; X, Y: Integer; var iSubItem: Integer): TListItem;
var
  hti: TLVHitTestInfo;
begin
  hti.pt := Point(X, Y);
  iSubItem := ListView_SubItemHitTest(lv.Handle, @hti);
  if iSubItem >= 0 then
  begin
    Result := lv.Items[iSubItem];
    iSubItem := hti.iSubItem;
  end else Result := nil;
end;

procedure TDemoForm.ListViewInfoTip(Sender: TObject; Item: TListItem;
  var InfoTip: String);
var
  p: TPoint;
  li: TListItem;
  iItem, iSubItem: Integer;
begin
  p := ScreenToClient(Mouse.CursorPos);
  li := GetItemAt(Sender as TListView, p.X, p.Y, iSubItem);
  if Assigned(li)
    then iItem := li.Index
    else iItem := -1;
  InfoTip := Format('Item %d SubItem %d', [iItem, iSubItem]);
end;
Getestet habe ich mit TListView - und dort funktioniert es.

Grüße vom marabu

Reinhardtinho 13. Aug 2007 09:27

Re: Hint über SubItem einer ListView
 
So, erstmal danke für den Lösungsvorschlag und sorry, dass ich jetzt erst antworte ... hatte Urlaub :cheers:

Habe mich grad mal an dem Code versucht, bekomme allerdings jetzt noch einen Fehler.

Bei Point(X,Y) steht nun:
[Fehler] FRM_Main.pas(2275): ')' erwartet, aber ',' gefunden.

Delphi schlägt aber das richtige vor:

Delphi-Quellcode:
function Point(AX, AY: Integer): TPoint;

Meine Delphi-Version ist Delphi 5 Enterprise.

Ich hoffe mir kann auch hier jemand weiterhelfen ... vielen Dank.


MFG
Lorenz

_frank_ 13. Aug 2007 17:24

Re: Hint über SubItem einer ListView
 
hast du selber eine funktion mit dem namen Point definiert?
ggf. mal hti.pt:=classes.Point(x,y); probieren

HTH Frank

Reinhardtinho 14. Aug 2007 07:24

Re: Hint über SubItem einer ListView
 
Nein, ich habe keine Funktion mit dem Namen Point definiert.

Und das Problem, dass ich im ersten Post geschildert habe, ist jetzt auch erledigt.

Für alle die an einem alternativen Code interessiert sind, hier:

Delphi-Quellcode:
function TForm_Main.GetCol(X : Integer) : Integer;
var
 Left, Col: integer;
begin
  Left := 0;
  for Col := 0 to JvListView1.Columns.Count- 1 do
  begin
   if (Left <= X) and (X < (Left + JvListView1.Columns.Items[Col].Width)) then
   Break;

   Inc(Left, JvListView1.Columns.Items[Col].Width);
  end; (* of for *)

  Result := Col;
end; (* of GetCol *)

procedure TForm1.JvListView1MouseMove(Sender : TObject; Shift : TShiftState; X, Y : Integer);
const
  LastItem    : TListItem = nil;
  LastColIndex : Integer  = -1;
var
  ListView    : TJvListView;
  CurrItem    : TListItem;
  CurrColIndex : Integer;
begin
  ListView    := Sender as TJvListView;
  CurrItem    := ListView.GetItemAt(X, Y);

  CurrColIndex := GetCol(X);

  if (CurrItem <> LastItem) or (CurrColIndex <> LastColIndex) then
  begin
    ListView.Hint := '';

    if Assigned(CurrItem) then
      ListView.Hint := 'Hint';

    LastItem    := CurrItem;
    LastColIndex := CurrColIndex;

    Application.ProcessMessages;
  end; (* of if *)
end;

procedure TForm1.DoShowHint(var HintStr : String; var CanShow: Boolean; var HintInfo : THintInfo);
begin
  if ((HintInfo.HintControl = JvListView1) and (HintInfo.HintStr <> '')) then
  with HintInfo do
  begin
    HintColor    := RGB(159, 207, 255);
    ReshowTimeout := 500;
  end; (* of with *)
end;
Und im FormCreate wird es so zugewiesen:

Delphi-Quellcode:
Application.OnShowHint := DoShowHint;
JvListView1.OnMouseMove := JvListView1MouseMove;

MFG
Lorenz


[Edit]Funktion vergessen[/Edit]

krzyk_91 22. Okt 2011 08:59

AW: Hint über SubItem einer ListView
 
Hallo,

ich habe diesen Beitrag gefunden, um einen eignen Hint anzuzeigen. Diese Lösungen funktionieren gut, solange ich RowSelect Eigenschaft auf True nicht eingestellt habe. Gegebenenfalls wird der Hint nicht richtig angezeigt.

Ich habe diese Prozedur bearbeitet:

Code:
procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  li: TListItem;
  iItem, iSubItem: Integer;
begin
  li := GetItemAt(Sender as TListView, X, Y, iSubItem);
  if Assigned(li)
    then iItem := li.Index
    else iItem := -1;
  Caption := Format('Item %d SubItem %d', [iItem, iSubItem]);

  if iitem <> -1 then
  begin
    if iSubItem = 0 then
      ListView1.Hint:=ListView1.Items[iitem].Caption
    else
      ListView1.Hint:=ListView1.Items[iitem].SubItems[iSubItem-1];

  end;
end;
und im Form.Caption werden richtige Daten des iItems und iSubItems angezeigt, und zwar sowohl wenn RowSelect eines TreeView auf True als auch auf False eingestellt ist. Der Hint wird hingegen nur bei False richtig angezeigt. Mache ich etwas falsch? Ich arbeite unter Delphi 7.

Vielen Dank für Hilfe im Voraus


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