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 Bei OnMouseOver Hilfe zu Eintrag in TChecklistBox anzeigen? (https://www.delphipraxis.net/84981-bei-onmouseover-hilfe-zu-eintrag-tchecklistbox-anzeigen.html)

winx 24. Jan 2007 09:24


Bei OnMouseOver Hilfe zu Eintrag in TChecklistBox anzeigen?
 
Hallo,

ich habe in meinem Forumlar eine TCheckListbox mit Einträgen.

Ist es mir möglich ein onMouseOver Event einzubauen, dass mir, immer wenn ich die Maus über einen Eintrag
in der Listbox bewege, ein kleines Popup mit einer für diesen Eintrag spezifischen Hilfe anzeigt?

Und: wie füge ich an die TChecklistbox ein event onmouseover hinzu: Ich Muß ich ne neue Komponente erstellen, mich von checklistbox ableiten und irgendwie das event zufügen, oder???
nur: wie mach ich das?

Danke,
winx

Pfoto 24. Jan 2007 09:41

Re: Bei OnMouseOver Hilfe zu Eintrag in TChecklistBox anzeig
 
Hi!

ich würde es so machen:

Jedem Item vorher mit AddObjekt einen Pointer auf ein Objekt
mitgeben, das Infos über das jeweilige Item speichert.
Delphi-Quellcode:
  TItemInfo = class
  private
   fInfoPicture: TBitmap;
  [ ...usw.. ]
  public
    property InfoString: string;
    property InfoPicture: TBitmap read fInfoPicture;
  end;
im OnMouseMove-Event dann:

Delphi-Quellcode:
Index := ListBox1.ItemAtPos(Point(X, Y), true);
Das Item unter der Maus herausbekommen.

Nun das drangehängte Objekte des Item aufrufen und die
Infos dazu auslesen.
Delphi-Quellcode:
with TItemInfo(ListBox1.Items.Objects[Index]) do
begin
  ItemInfoString:= InfoString;
  [...]
end;


Gruß
Pfoto

winx 24. Jan 2007 09:44

Re: Bei OnMouseOver Hilfe zu Eintrag in TChecklistBox anzeig
 
Das ist ne gute Idee :-)

jetzt bräucht ich nur noch nen Tip, wie ich das Problem mit dem Control
überschreiben mache, damit ich bei der ComboBoxListBox das
mouseOverEvent bekomme?


Hat da jemand nen Tip?

Thx,
winx

winx 24. Jan 2007 09:52

Re: Bei OnMouseOver Hilfe zu Eintrag in TChecklistBox anzeig
 
He,

das brauch ich ja gar nicht :-)

Mit deinem MouseOve klappt es !!!

Jetzt nur noch ne letzte Frage:

Kann ich irgendwie so ne schöne, gelbe Hilfe (als Popup) beim MouseMove einbleden,
wenn er über dem Objekt ist???

Danke,
winx

sirius 24. Jan 2007 09:59

Re: Bei OnMouseOver Hilfe zu Eintrag in TChecklistBox anzeig
 
Delphi-Quellcode:
Tchecklistbox.showhint:=true;
TChecklistbox.hint:='Das wird angezeigt'

winx 24. Jan 2007 10:04

Re: Bei OnMouseOver Hilfe zu Eintrag in TChecklistBox anzeig
 
dass problem ist, das der hint spezifisch für die ganze box ist und nich fürs item...
also kommt der hint auch, wenn ich nur auf die combolistbos fahre, irgendwo hin...
kann man das auch fürs item machen?

sirius 24. Jan 2007 10:31

Re: Bei OnMouseOver Hilfe zu Eintrag in TChecklistBox anzeig
 
Na du überprüfst doch bei onMouseMove, wo sich die Maus befindet. Und je nachdem, wo die Maus ist, sezt du das Hintfenster neu, oder lässt es halt gar nicht anzeigen.

winx 24. Jan 2007 10:39

Re: Bei OnMouseOver Hilfe zu Eintrag in TChecklistBox anzeig
 
So hab ichs jetzt auch, aber irgendwie klappt des noch nich so richtig:

Delphi-Quellcode:
procedure Tmainform.objectlistMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var index : integer;
    val : string;
begin

  index := objectlist.ItemAtPos(Point(x,y),true);

  if (index > -1) then begin

    objectlist.ShowHint := true;
    try
      if (objectlist.Items[objectlist.ItemIndex] = objectlist.Items[objectlist.ItemAtPos(Point(X, Y), True)]) then
        objectlist.Hint := objectlist.Items[index]
      else
        objectList.ShowHint := false;

    finally
      objectlist.ShowHint := false;
    end;

  end;

end;
jetzt zeigt sich NIX mehr an :-(
wo liegt denn da der Fehler???

Pfoto 24. Jan 2007 11:45

Re: Bei OnMouseOver Hilfe zu Eintrag in TChecklistBox anzeig
 
Hallo nochmal,

also hier ist mein Code, eben getestet:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TItemData = class
  private
    fInfoString: string;
  public
    property InfoString: string read fInfoString;
    constructor Create(aInfoString: string);
  end;

  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    lblItemData: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private-Deklarationen } 
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  { Einfach mal ein paar sinnlose Einträge einfügen }
  for i:= 0 to 10 do
    ListBox1.Items.AddObject('Eintrag Nr. ' + inttostr(i), TItemData.Create('Daten zu Eintrag Nr. ' + inttostr(i)));
end;

{ TItemData }

constructor TItemData.Create(aInfoString: string);
begin
  inherited Create;
  fInfoString:= aInfoString;
end;

procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  Index: integer;
begin
  with TListbox(Sender) do
  begin
    Index:= ItemAtPos(Point(x,y), true);
    ShowHint:= Index <> -1;
    If (Index <> -1) then
      Hint:= TItemData(Items.Objects[Index]).InfoString;
  end;
end;

end.

Natürlich könnte man das Ganze noch etwas perfektionieren, indem z.B.
der Hint schneller oder länger angezeigt wird.
Das kann man ja dann nach Wunsch einstellen.

Gruß

Pfoto

winx 24. Jan 2007 12:22

Re: Bei OnMouseOver Hilfe zu Eintrag in TChecklistBox anzeig
 
Hallo Pfoto,

swoeit war ich doch auch schon ,allerdings zeigts dann immer, wenn ich auf die Control gehe die Infobox an,
ich möchte aber nur wenn man über ein Objekt geht.

Und dann hab ichs mir so gedacht:

Delphi-Quellcode:
procedure Tmainform.objectlistMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var index : integer;
    val : string;
begin

  index := objectlist.ItemAtPos(Point(x,y),true);

  if (index > -1) then begin

    objectlist.ShowHint := true;
    try
      if (objectlist.Items[objectlist.ItemIndex] = objectlist.Items[objectlist.ItemAtPos(Point(X, Y), True)]) then
        objectlist.Hint := objectlist.Items[index]
      else
        objectList.ShowHint := false;

    finally
      objectlist.ShowHint := false;
    end;

  end;

end;
aber klappt eben nich...bin mir nur nich im klaren, wieso?

Pfoto 24. Jan 2007 13:23

Re: Bei OnMouseOver Hilfe zu Eintrag in TChecklistBox anzeig
 
Mein zuletzt geposteter Code zeigt jetzt
nur einen Hint an, wenn die Maus über einem Objekt ist.


Wenn du möchtest, dann das nur dann Infos gezeigt werden,
wenn das Objekt markiert ist, musst du einfach folgende Methode
in meinem obigen Beispiel ersetzen:

Delphi-Quellcode:

procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  Index: integer;
begin
  with TListbox(Sender) do
  begin
    Index:= ItemAtPos(Point(x,y), true);
    ShowHint:= (Index <> -1) and (Index = ItemIndex);
    If (ShowHint) then
      Hint:= TItemData(Items.Objects[Index]).InfoString;
  end;
end;
P.S. Warum verdoppelst du teilweise unnötig den Code?
Du setzt z.B. die Variable "Index" und nimmst dann 2 Zeilen später
doch wieder das gesamte Objekte mit "ItemAtPos".

Bei größeren Projekten macht das schon mal was aus...

Gruß
Pfoto

winx 8. Feb 2007 07:41

Re: Bei OnMouseOver Hilfe zu Eintrag in TChecklistBox anzeig
 
Hi,

hab das ganze jetzt so eingebunden und es hat auch (bis dato) geklappt...

Aber jetzt geht es nicht mehr:

Er kommt zwar in die Funktion rein, wenn ich ein MouseMove über einem
Element mache, aber es geht NIX mehr auf, keine gelbe Box, nix...
wenn ich mir an dieser Stelle den HINT loggen laß, klappt
das ganze einwandfrei...

woran kann das liegen, dass kein Hint aufgeht?

Delphi-Quellcode:
procedure Tmainform.objectlistMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var index : integer;
    val : string;
begin

  index := objectlist.ItemAtPos(Point(x,y),true);
  objectlist.ShowHint:= (Index <> -1) and (Index = objectlist.ItemIndex);

  if (objectlist.ShowHint) then begin
    //Hier kommt er rein
    objectlist.ShowHint := true;
    objectlist.Hint := 'HINT';
    //Logger.add('HINT');

  end;

end;
Danke!!!

winx


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz