Announcement

Collapse
No announcement yet.

Hint manuell auslösen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Hint manuell auslösen

    Hallo,

    ich habe eine Komponente entwickelt, die ein Zeichenobjekt mit sensitiven Zonen darstellt. Jedesmal, wenn der Benutzer in diesen Bereich mit der Maus fährt, so sollte ein Hint kommen, der spezifisch den Daten in dem entsprechend Event gesetzt wird. Trotzdem erscheint aber der Hint nur einmal (wie man es ja auch gewöhnt ist). Wie kann ich nun einen Hint Event auslösen um die Hints mehrfach anzuzeigen. Application.HandleHintMessage
    und TTM_ACTIVATE und CM_HINTSHOW funktionierten entweder nicht richtig oder ich verwendete sie falsch. Wer hat einen Rat?

    Danke im Voraus, Martin

  • #2
    Hallo,

    das folgende Beispiel demonstriert den direkten Aufruf des Hintfensters. Immer dann, wenn die <b>TEdit</b>-Instanz den Fokus erhält, wird das Hint-Fenster ständig eingeblendet:

    <pre>
    type
    TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure EditEnter(Sender: TObject);
    procedure EditExit(Sender: TObject);
    private
    { Private-Deklarationen }
    FHintWnd: THintWindow;
    FControl: TControl;
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.DFM}

    procedure TForm1.EditEnter(Sender: TObject);
    var
    aRect : TRect;
    aPoint : TPoint;
    begin
    if not Assigned(FHintWnd) then
    FHintWnd := HintWindowClass.Create(Self);
    FHintWnd.Color := Application.HintColor;
    FControl := TControl(Sender);
    aRect := FHintWnd.CalcHintRect(Screen.Width, FControl.Hint, nil);
    aPoint := ClientToScreen(Point(FControl.Left + 4,
    FControl.Top + FControl.Height));
    OffsetRect(aRect, aPoint.X, aPoint.Y);
    FHintWnd.ActivateHint(aRect, FControl.Hint)
    end;

    procedure TForm1.EditExit(Sender: TObject);
    begin
    FControl := nil;
    FHintWnd.ReleaseHandle;
    end;
    </pre>

    Auszug aus dem <b>Formular (DFM-Datei)</b>:
    <pre>
    object Edit1: TEdit
    Left = 40
    Top = 32
    Width = 121
    Height = 21
    Hint = 'Hint zu Edit1'
    TabOrder = 0
    Text = 'Edit1'
    OnEnter = EditEnter
    OnExit = EditExit
    end
    object Edit2: TEdit
    Left = 40
    Top = 64
    Width = 121
    Height = 21
    Hint = 'Hint zu Edit2'
    TabOrder = 1
    Text = 'Edit2'
    OnEnter = EditEnter
    OnExit = EditExit
    end
    </pre&gt

    Comment


    • #3
      Danke Andreas,

      funktionierte einwandfrei. Sag mir bitte nur noch eins, wann muss ich das Objekt zerstören FHintWnd.Free()?

      Danke, Marti

      Comment


      • #4
        Hallo,

        nein - die Instanz des Hintfensters darf <b>nicht</b> im eigenen Programm zerstört werden. Wenn zum Beispiel bereits ein Hintfenster sichtbar ist, wird <b>keine</b> eigene Instanz erzeugt (der MessageBeep-Aufruf macht das akustisch sichtbar):

        <pre>
        procedure TForm1.EditEnter(Sender: TObject);
        var
        aRect : TRect;
        aPoint : TPoint;
        begin
        if not Assigned(FHintWnd) then
        begin
        MessageBeep($FFFF);
        FHintWnd := HintWindowClass.Create(Self);
        end;
        FHintWnd.Color := Application.HintColor;
        FControl := TControl(Sender);
        aRect := FHintWnd.CalcHintRect(Screen.Width, FControl.Hint, nil);
        aPoint := ClientToScreen(Point(FControl.Left + 4,
        FControl.Top + FControl.Height));
        OffsetRect(aRect, aPoint.X, aPoint.Y);
        FHintWnd.ActivateHint(aRect, FControl.Hint)
        end;
        </pre>

        Beim Aufruf des Constructors <b>Create</b> wird der Parameter <b>Self</b> übergeben, die Instanz wird in die interne Listes des <i>Owners</i> übernommen und somit ist <b>TComponent.Remove</b> für den Aufruf von <b>Free</b> zuständig:

        <pre>
        constructor TComponent.Create(AOwner: TComponent);
        begin
        FComponentStyle := [csInheritable];
        if AOwner <> nil then AOwner.InsertComponent(Self);
        end;
        </pre&gt

        Comment

        Working...
        X