"Hint" per Software steuern

Rund um die LCL und andere Komponenten

"Hint" per Software steuern

Beitragvon siro » 28. Jun 2017, 15:32 "Hint" per Software steuern

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


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;
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Grüße von Siro
"C" verCehnfacht die Entwicklungszeit...
siro
 
Beiträge: 227
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Michl » 28. Jun 2017, 21:12 Re: "Hint" per Software steuern

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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2186
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon siro » 29. Jun 2017, 07:44 Re: "Hint" per Software steuern

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
"C" verCehnfacht die Entwicklungszeit...
siro
 
Beiträge: 227
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Michl » 29. Jun 2017, 08:03 Re: "Hint" per Software steuern

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; 
Michl
 
Beiträge: 2186
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon siro » 29. Jun 2017, 13:03 Re: "Hint" per Software steuern

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
"C" verCehnfacht die Entwicklungszeit...
siro
 
Beiträge: 227
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 29. Jun 2017, 13:12 Re: "Hint" per Software steuern

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.
wp_xyz
 
Beiträge: 2272
Registriert: 8. Apr 2011, 08:01

Beitragvon siro » 29. Jun 2017, 14:27 Re: "Hint" per Software steuern

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
"C" verCehnfacht die Entwicklungszeit...
siro
 
Beiträge: 227
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 29. Jun 2017, 16:44 Re: "Hint" per Software steuern

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

Auch Delphi kann Bugs haben.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3249
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste

porpoises-institution
accuracy-worried