Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

OnMouseEnter im TEdit

27 views
Skip to first unread message

Klaus Dewald

unread,
Oct 13, 2008, 4:59:00 AM10/13/08
to
Hallo NG,
ich möchte in einem TEdit beim Drüberfahren mit der Maus unter
bestimmten Bedingungen ein Hint anzeigen. Dazu sind wohl die Ereignisse
OnMouseEnter und OnMouseLeave verfügbar. Leider funktionieren die bei
mir nicht. Es passiert einfach nichts. Scheinbar werden die Ereignisse
auch nicht gefeurt, da ein Breakpoint im Ereignis nicht angesprungen wird.
In der OH steht: "Verwenden Sie die Ereignisbehandlungsroutine
OnMouseEnter, um eine spezielle Weiterverarbeitung eines Steuerelements
zu implementieren, wenn das überordnete Formular auf oberster Ebene
nicht aktiv ist."

Was bedeutet der letzte Teil des Satzes "... auf oberster Ebene nicht
aktiv ist."? Meine Edits sitzen in einem Panel welches wiederum auf dem
Hauptformular sitzt.

Komischerweise funktioniert das bei einem TStaticText einwandfrei.

Irgend ein Tip was ich falsch mache?

Vielen Dank im voraus.
Klaus Dewald

Hans-Peter Diettrich

unread,
Oct 13, 2008, 5:51:40 AM10/13/08
to
Klaus Dewald schrieb:

> ich möchte in einem TEdit beim Drüberfahren mit der Maus unter
> bestimmten Bedingungen ein Hint anzeigen. Dazu sind wohl die Ereignisse
> OnMouseEnter und OnMouseLeave verfügbar.

Nimm OnMouseMove.

DoDi

Klaus Dewald

unread,
Oct 13, 2008, 8:03:38 AM10/13/08
to
Hans-Peter Diettrich schrieb:
>
> Nimm OnMouseMove.
>
Hallo
zunächst einmal Danke für den Hinweis. Im Prinzip funktioniert das
Event. Es wird zumindest gefeuert. Leider jedoch bei jeder noch so
kleinen Mausbewegung. Dies hat zur Folge das der Hint nicht angezeigt
wird, da er immer wieder durch das Event überschrieben wird. Ich habe
das so gemacht:

procedure TMainForm.suiEdit135MouseMove(Sender: TObject; Shift:
TShiftState; X,
Y: Integer);
begin
If (X > 0) and (X < suiEdit135.Width) then
If (Y > 0) and (Y < suiEdit135.Height) then
begin
If Length(Trim(suiEdit135.Text)) > 40 then
begin
If Edit135ToolTip = Nil then
Edit135ToolTip := TToolTip.Create(Self);
Edit135ToolTip.Titel := '';
Edit135ToolTip.Text := Trim(suiEdit135.Text);
Edit135ToolTip.ShowBalloonTip;
Application.ProcessMessages;
end;
end
Else
If Edit135ToolTip <> Nil then
Edit135ToolTip.Free;
end;

Außerdem wird beim Verlassen und nochmaligem Eintritt eine "Ungültige
Zeigeroperation" ausgelöst. Es gibt leider kein anderes Ereignis womit
ich das Free machen könnte, oder?

Nochmals vielen Dank.
Klaus Dewald

Alfred Gemsa

unread,
Oct 13, 2008, 8:23:44 AM10/13/08
to
Klaus Dewald schrieb:

> begin
> If (X > 0) and (X < suiEdit135.Width) then
> If (Y > 0) and (Y < suiEdit135.Height) then
> begin
> If Length(Trim(suiEdit135.Text)) > 40 then
> begin
> If Edit135ToolTip = Nil then
> Edit135ToolTip := TToolTip.Create(Self);
> Edit135ToolTip.Titel := '';
> Edit135ToolTip.Text := Trim(suiEdit135.Text);
> Edit135ToolTip.ShowBalloonTip;
> Application.ProcessMessages;
> end;
> end
> Else
> If Edit135ToolTip <> Nil then
> Edit135ToolTip.Free;
> end;

Ohne genau zu schauen vermute ich, dass Du den Compiler mit den
verschachtelten If's und dem Else überforderst.

Worauf soll sich das Else beziehen: Auf das erste oder das zweite If?

In solchen Fällen nehme ich *immer* begin-End-Blöcke, damit alles klar ist.

Alfred

Martin Hentrich

unread,
Oct 13, 2008, 8:35:07 AM10/13/08
to
On Mon, 13 Oct 2008 14:03:38 +0200, Klaus Dewald
<Klaus....@EfASoftware.de> wrote:

Das ist ein Monstrum:

>procedure TMainForm.suiEdit135MouseMove(Sender: TObject; Shift:
>TShiftState; X,
> Y: Integer);
>begin
> If (X > 0) and (X < suiEdit135.Width) then
> If (Y > 0) and (Y < suiEdit135.Height) then
> begin
> If Length(Trim(suiEdit135.Text)) > 40 then
> begin
> If Edit135ToolTip = Nil then
> Edit135ToolTip := TToolTip.Create(Self);
> Edit135ToolTip.Titel := '';
> Edit135ToolTip.Text := Trim(suiEdit135.Text);
> Edit135ToolTip.ShowBalloonTip;
> Application.ProcessMessages;
> end;
> end
> Else
> If Edit135ToolTip <> Nil then
> Edit135ToolTip.Free;
>end;

Mit einem Hint ginge es einfach so:

Du füllst bedingungsgemäß:
Edit135.hint := "Ich bin die Meldung!";
Und du setzt in den Eigenschaften:
Edit135.showhint := true;
In MouseMove muß dann gar nicht stehn...

Was sind Deine "besonderen Bedingungen"? MouseMove kümmert sich von
ganz allein um die Kontrolle des Mauszeigers bezogen auf die Größe des
TEdit, das mußt du nicht implementieren - oder welchen Zweck hat dein
If..then...?

Martin
--
Eine als Irrtum anerkannte Meinung ohne falsche Scham aufzugeben,
das ist vielleicht die wunderbarste Kraftersparnis, die unserem
Geist gegönnt ist; und zugleich die, von der wir am seltensten
Gebrauch machen. [Arthur Schnitzler]

Burkhard Schneider

unread,
Oct 13, 2008, 4:43:44 PM10/13/08
to
"Klaus Dewald" schrieb:

> zunächst einmal Danke für den Hinweis. Im Prinzip funktioniert das Event.
> Es wird zumindest gefeuert. Leider jedoch bei jeder noch so kleinen
> Mausbewegung. Dies hat zur Folge das der Hint nicht angezeigt wird, da er
> immer wieder durch das Event überschrieben wird. Ich habe das so gemacht:

OnMouseMove ist schon der richtige Event für so etwas. Du darfst den
TToolTip nur nicht im OnMouseMove erzeugen, sondern in OnFormCreate. Dann
kannst du ihn auch im OnFormDestroy wieder sauber entfernen.

Verlagere das
Edit135ToolTip := TToolTip.Create(Self);
ins OnFormCreate
(oder muss dass TToolTip.Create(suiEdit135) heißen?)

> If (X > 0) and (X < suiEdit135.Width) then
> If (Y > 0) and (Y < suiEdit135.Height) then

Wozu das? MouseMove wird eh nur gefeuert, wenn sich die Maus über dem
Editfeld befindet.

Dein OnMouseMove reduziert sich dann zu:

procedure TMainForm.suiEdit135MouseMove(Sender: TObject; Shift:
TShiftState; X,
Y: Integer);
begin

If Length(Trim(suiEdit135.Text)) > 40 then
begin
Edit135ToolTip.Text := Trim(suiEdit135.Text);
Edit135ToolTip.ShowBalloonTip;
end;
end;

Und nicht vergessen in OnFormDestroy:
Edit135ToolTip.Free;

Getestet mit deiner Klasse TToolTip aus
http://newsgroups.derkeiler.com/Archive/De/de.comp.lang.delphi.misc/2007-08/msg00048.html
(Was Google so alles findet...)

Gruß
Burkhard Schneider


Burkhard Schneider

unread,
Oct 13, 2008, 4:58:36 PM10/13/08
to
"Alfred Gemsa" schrieb:

> Klaus Dewald schrieb:
>
>> begin
>> If (X > 0) and (X < suiEdit135.Width) then
>> If (Y > 0) and (Y < suiEdit135.Height) then
>> begin
>> If Length(Trim(suiEdit135.Text)) > 40 then
>> begin
>> If Edit135ToolTip = Nil then
>> Edit135ToolTip := TToolTip.Create(Self);
>> Edit135ToolTip.Titel := '';
>> Edit135ToolTip.Text := Trim(suiEdit135.Text);
>> Edit135ToolTip.ShowBalloonTip;
>> Application.ProcessMessages;
>> end;
>> end
>> Else
>> If Edit135ToolTip <> Nil then
>> Edit135ToolTip.Free;
>> end;
>
> Ohne genau zu schauen vermute ich, dass Du den Compiler mit den
> verschachtelten If's und dem Else überforderst.
>
> Worauf soll sich das Else beziehen: Auf das erste oder das zweite If?

Der Compiler ist damit sicher nicht überfordert, höchstens derjenige, der
vor dem Bildschirm sitzt. Der Compiler hält sich an klare Regeln und die
besagen in diesem Fall, dass das Else zum ersten If gehört. Ich hätte
allerdings auch die ersten beiden Ifs mit einem "and" zu einem Statement
zusammengefasst, abgesehen davon, dass sie im konkreten Fall ganz
überflüssig sind.

Gruß
Burkhard Schneider


Alfred Gemsa

unread,
Oct 14, 2008, 4:27:12 AM10/14/08
to
Burkhard Schneider schrieb:

> Der Compiler ist damit sicher nicht überfordert, höchstens derjenige, der

> vor dem Bildschirm sitzt...

Du hast latürnich recht. Insofern bitte ich den Compiler wegen der
ungerechtfertigten Unterstellung um Entschuldigung :-)

Alfred

Klaus Dewald

unread,
Oct 14, 2008, 4:55:56 AM10/14/08
to
Burkhard Schneider schrieb:

> Getestet mit deiner Klasse TToolTip aus
> http://newsgroups.derkeiler.com/Archive/De/de.comp.lang.delphi.misc/2007-08/msg00048.html
> (Was Google so alles findet...)
Ja, Google ist schon ein tolles Ding. Die Seite hatte ich noch nie
gesehen. Ich poste normalerweise über btx.dtag.de. Aber die Welt ist ja
bekanntlich klein.

Vielen Dank auch für Deinen Hinweis. Ist ja im Prinzip logisch. Manchmal
sieht man vor lauter Bäumen den dazu gehörigen Wald nicht mehr.

Danke nochmal.
Viele Grüße
Klaus Dewald

Georg Hübner

unread,
Oct 14, 2008, 7:59:59 AM10/14/08
to
Klaus Dewald schrieb:

> procedure TMainForm.suiEdit135MouseMove(Sender: TObject; Shift:
> TShiftState; X,
> Y: Integer);
> begin
> If (X > 0) and (X < suiEdit135.Width) then
> If (Y > 0) and (Y < suiEdit135.Height) then
> begin
> If Length(Trim(suiEdit135.Text)) > 40 then
> begin
> If Edit135ToolTip = Nil then
> Edit135ToolTip := TToolTip.Create(Self);
> Edit135ToolTip.Titel := '';
> Edit135ToolTip.Text := Trim(suiEdit135.Text);
> Edit135ToolTip.ShowBalloonTip;
> Application.ProcessMessages;
> end;
> end
> Else
> If Edit135ToolTip <> Nil then
> Edit135ToolTip.Free;
> end;

Hallo Klaus,

mein Vorschlag wäre stattdessen das OnChange-Ereignis
zu verwenden:

procedure TMainForm.suiEdit135Change(Sender: TObject);


begin
If Length(Trim(suiEdit135.Text)) > 40 then
begin

suiEdit135.Hint:='Dies ist ein Hinweis!';
suiEdit135.ShowHint:=True;
end else
begin
suiEdit135.Hint:='';
suiEdit135.ShowHint:=False;
end;
end;

Wenn ich die Problemstellung richtig verstanden
habe, funktioniert die Sache dann auch so wie gewünscht. ;-)

MfG


Georg Hübner

Klaus Dewald

unread,
Oct 15, 2008, 8:05:14 AM10/15/08
to
Georg Hübner schrieb:
> Hallo Klaus,
Hallo Georg,

> mein Vorschlag wäre stattdessen das OnChange-Ereignis
> zu verwenden:
OnChange wird doch nur bei einer aktiven Änderungen des Inhalts
aufgerufen oder? Der Benutzer macht aber keine Änderung. Das Feld ist
Read-Only.

> Wenn ich die Problemstellung richtig verstanden
> habe, funktioniert die Sache dann auch so wie gewünscht. ;-)
Es werden nur ca. 40 Zeichen angezeigt. Wenn der Inhalt aber länger ist
soll der komplette Feldinhalt in einem Hint angezeigt werden. Und das
nur beim Drüberwandern mit der Maus.
>
> MfG
Viele Grüße
Klaus Dewald

Martin Hentrich

unread,
Oct 15, 2008, 8:38:06 AM10/15/08
to
On Wed, 15 Oct 2008 14:05:14 +0200, Klaus Dewald
<Klaus....@EfASoftware.de> wrote:

>Es werden nur ca. 40 Zeichen angezeigt. Wenn der Inhalt aber länger ist
>soll der komplette Feldinhalt in einem Hint angezeigt werden. Und das
>nur beim Drüberwandern mit der Maus.

Dann schreib den Code von Georg bei MouseMove rein.

Martin
--
Stil ist richtiges Weglassen des Unwesentlichen.
[Anselm Paul Johann Ritter von Feuerbach]

Georg Hübner

unread,
Oct 15, 2008, 3:14:20 PM10/15/08
to
Klaus Dewald schrieb:

> OnChange wird doch nur bei einer aktiven Änderungen des Inhalts
> aufgerufen oder? Der Benutzer macht aber keine Änderung. Das Feld ist
> Read-Only.

Nein. OnChange wird auch dann ausgelöst, wenn irgendwo im Programm
das Eigenschaftsfeld Text von Edit1 (Edit1.Text:='Irgenwas an Text')
neu Beschrieben wird und sich der Inhalt ändert (auch bei gleicher
Textlänge und ReadOnly:=True). Wird der selbe Inhalt geschrieben, wird
das OnChange nicht ausgelöst.

> Es werden nur ca. 40 Zeichen angezeigt. Wenn der Inhalt aber länger ist
> soll der komplette Feldinhalt in einem Hint angezeigt werden. Und das
> nur beim Drüberwandern mit der Maus.

Genau dieses gewünschte Verhalten kannst Du mit meinem Programmbeispiel
erreichen. Ersetze einfach Edit1.Hint:='Mein Hint-Text';
durch Edit1.Hint:=Edit1.Text; ;-)

Sorry, wenn ich hier nicht Deine Objektbezeichner verwendet habe.
Soll ja auch nur ein Beispiel sein. ;-)


Mfg

Georg Hübner

0 new messages