"Hint" per Software steuern

Rund um die LCL und andere Komponenten
Antworten
siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

"Hint" per Software steuern

Beitrag von siro »

Hallo, zusammen,

Kurze Info, was ich mache:
ich bastle grade an einem neuen Schieberegler, da ich keine Komponente gefunden habe die auch mit Floatingpoints arbeiten kann.
Ich möchte Werte einstellen zwischen z.B. -13,56 bis +134,9
Blödes Beispiel, soll nur verdeutlichen was der Schieber machen soll.
Zudem sollte, wenn ich eine Position anklicke, der Schieber sofort dort hin springen. Das läuft jetz auch alles super.


Nun meine Frage:
Ich habe für die Anzeige des aktuellen Wertes den "Hint" benutzt.
So wird der Wert angezeigt wenn die Komponente den Focus bekommt.

Schieber_01.jpg
Schieber_01.jpg (7.68 KiB) 1473 mal betrachtet


Kann ich den Hint solange anzeigen lassen wie eine Maustaste gedrückt ist ?
Dann sehe ich direkt beim Schieben gleich den entsprechenden Wert,
oder evtl. den Hint solange anzeigen wie die Komponente den Focus hat.

Im Prinzip suche ich also nach der Möglichkeit den Hint per Software zu aktivieren, eventuell sogar die Hint Position festzulegen.

Ich könnt mir natürlich eine zusätzliche Komponente generieren, die dann angezeigt wird, aber eigentlich existiert das ja schon.

Siro


Zusatz:
Habe jetz auch eine neue OnChange Funktion implementiert, der Unterschied ist hier gut zu sehen. Bei OnChange brauch ich doch meisten den aktuellen Wert und den
übergebe ich dann sinnvollerweise....

Beim Scrollbar muss man da schon tricksen, oder ich mache da was falsch..

Code: Alles auswählen

procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
  if Sender is TScrollBar then caption := IntToStr(TScrollBar(Sender).Position);
end;
 

Bei mir sieht es nun so aus:

Code: Alles auswählen

procedure TForm1.SliderHor1Change(Sender: TObject; posi: Double);
begin
  caption:=FloatToStr(posi);
end;
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: "Hint" per Software steuern

Beitrag von Michl »

Sowas könnte man machen (eben unter Win 7 getestet):

Code: Alles auswählen

procedure TForm1.TrackBar1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  TrackHint := THintWindow.Create(Self);
  TrackHintSet(Point(X + TrackBar1.Left, TrackBar1.Top), IntToStr(TrackBar1.Position));
  TrackHint.Show;
end;
 
procedure TForm1.TrackBar1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if not (Shift = [ssLeft]) then Exit;
  TrackHintSet(Point(X + TrackBar1.Left, TrackBar1.Top), IntToStr(TrackBar1.Position));
  TrackHint.Invalidate;
end;
 
procedure TForm1.TrackBar1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  TrackHint.Free;
end;
 
procedure TForm1.TrackHintSet(P: TPoint; s: String);
var
  r: TRect;
begin
  r := TrackHint.CalcHintRect(100, s, nil);
  P.y := P.y - r.Bottom + r.Top;
  P.x := P.x - (r.Right - r.Left) div 2;
  P := ClientToScreen(P);
  TrackHint.SetBounds(P.x, P.y, r.Right - r.Left, r.Bottom - r.Top);
  TrackHint.Caption := s;
end;
Testprojekt anbei.
Dateianhänge
test.zip
(2.03 KiB) 49-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: "Hint" per Software steuern

Beitrag von siro »

Guten Morgen Michl,
ersteinmal vielen lieben Dank für deine Mühe, ich habe das Projekt grade ausprobiert.
Das funktioniert ausgezeichnet, "genaus so" wollte ich das haben.
Alles drin, alles dran, sogar gleich mit Positionierung. SUPI.

Das werde ich mal gleich in meine Komponente übernehmen.
Dazu jedoch noch eine generelle Frage:

Bei MouseDown wird jedesmal das HintWindow neu erzeugt und bei MouseUp wieder freigegeben.
Ich hab immer Bedenken, dass der Speicher völlig fragmentiert wird. GetMem FreeMem....
Sollte man das HintWindow eventuell gleich bei Componente.create erzeugen und erst bei Destroy wieder freigeben ?
Oder spricht etwas dagegen ?

Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: "Hint" per Software steuern

Beitrag von Michl »

Freut mich, daß ich dir helfen konnte.

Du kannst natürlich auch das HintWindow erzeugen, wenn das Formular erstellt wird. Dann brauchst du es auch nicht frei geben, wenn der Owner das Formular ist. Bei manchen Komponenten wird unter Umständen auch das OnMouseUp nicht richtig gefeuert, sodaß bei meinem Vorgehen Speicherleichen entstehen könnten (ein Check ob Assigned(TrackHint) bevor es erzeugt wird und FreeAndNil(TrackHint) im OnMouseDown sollten in mein Beispiel eingebaut werden). Es war ein kurzer Test und dient nur zur Veranschaulichung, was man machen könnte. Ich persönlich mag keine ungenutzten Formulare oder Controls während der Laufzeit rumhängen haben und erzeuge viel on Demand.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: "Hint" per Software steuern

Beitrag von siro »

Michl hat geschrieben:Freut mich, daß ich dir helfen konnte.

Bei manchen Komponenten wird unter Umständen auch das OnMouseUp nicht richtig gefeuert, sodaß bei meinem Vorgehen Speicherleichen entstehen könnten (ein Check ob Assigned(TrackHint) bevor es erzeugt wird und FreeAndNil(TrackHint) im OnMouseDown sollten in mein Beispiel eingebaut werden). .


Danke , Das ist nochmal ein guter Hinweis, Feinheiten kommen dann noch. Mir ging es ums Prinzip und das läuft supi.

Ich hab mich auch schon so manches Mal gewundert, unter anderem, dass MouseDown ein MouseMove auslösst, dass fange ich in meinen Komponenten jetzt immer ab (vielleicht zittere ich auch schon zu dolle :D )
indem ich mir die letzen Koordinaten merke und dann vergleiche.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: "Hint" per Software steuern

Beitrag von wp_xyz »

siro hat geschrieben:
Michl hat geschrieben:Ich hab mich auch schon so manches Mal gewundert, unter anderem, dass MouseDown ein MouseMove auslösst

Ich kann mir nicht vorstellen, dass das allgemein der Fall. Ich kenne Fälle, wo beim Mousedown noch nichts passiert, erst wenn man die Maus verschiebt - ich weiß natürlich gerade nicht, wo das so aufgetreten ist. Bist du sicher, dass du mit dem Drücken der Maustaste nicht doch die Maus ein kleines bisschen verschoben hast? Das ist manschmal ganz schön schwierig, 1 Pixel reicht.

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: "Hint" per Software steuern

Beitrag von siro »

Du hast recht wp_xyz bei Lazarus passiert es anscheinend nicht mehr, hab grad mal nen kleinen Test gemacht.
In Delphi 6 grad nochmal rückgetestet, dort wird bei ButtonUp ein MouseMove ausgelöst. Sorry hab ButtonDown geschrieben, das stimmte nicht.

Kann man ja recht einfach testen:
Maus abheben, dann bewegt man sie nicht...

Code: Alles auswählen

var cnt:Integer;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  inc(cnt);
  caption:=IntToStr(cnt);
end;
 
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: "Hint" per Software steuern

Beitrag von Mathias »

In Delphi 6 grad nochmal rückgetestet, dort wird bei ButtonUp ein MouseMove ausgelöst.

Auch Delphi kann Bugs haben.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten