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
> 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
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
> 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
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]
> 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
> 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
> 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
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
> 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
>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]
> 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