AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Firemonkey Workarounds

Ein Thema von greenmile · begonnen am 13. Jul 2012 · letzter Beitrag vom 6. Apr 2014
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.479 Beiträge
 
Delphi 11 Alexandria
 
#21

AW: Firemonkey Workarounds

  Alt 5. Apr 2014, 18:07
So, ich habe mal einen weiteren Workaround entwickelt und zwar für die fehlenden Hints in FireMonkey. Zwar hatte himitsu da auch schon mal was gemacht, das war aber eine Komponente und wenn ich das richtig sehe, wurde die nicht für XE4 bzw. XE5 weiterentwickelt (wenn ich hier was übersehen haben sollte, bitte Info).

Die Komponente von himitsu (eine tolle Leistung, wie ich finde) hatte zwar noch einige weitere Fähigkeiten, wie etwa Grafikanzeige im Hint. Aber ich denke für die meisten Anwendungsfälle wird das gar nicht benötigt und ich persönlich ziehe immer die Verwendung einfacher units vor, alles in einer Datei, da gibt es auch keine Probleme beim Wechsel von einer Delphi-Version zur nächsten (also nicht erneut Package / Komponenten installieren, usw).

Meine Lösung ist denkbar einfach (gerade mal 200 Zeilen) und bei Bedarf erweiterbar und funktioniert für XE2 bis XE5 sowohl unter Windows als auch auf dem MAC. Mann muss nur die Unit HS_FMXHints.pas in die jeweiligen Forms einbinden, wo man Hints verwenden möchte.

Im Oncreate-Ereignis der Form (oder in einer separaten Form-Procedure) setzt man dann die Hints mit einfachen Aufrufen wie

SetAHint (Button1, 'Dies ist ein Hint für Button1'); Bei Bedarf kann man vorgegebene Standardeinstellungen für die Hints mit der Procedure

SetHintSetting (TimeBeforeShow, TimeToShow: Integer; DynamicShow: Boolean; TC: TAlphaColor); überschreiben.

Bevor ich mir hier noch einen Wolf schreibe, verweise ich der Einfachheit halber auf ein kurzes Video, das ich auf YouTube gepostet habe.

Hier ist der Link: https://www.youtube.com/watch?v=eWGbhOexrJk

Die Lösung hat 1-2 kleinere Einschränkungen, wird im Video angesprochen.

Die Unit könnt Ihr frei verwenden wie Ihr wollt, Nutzung natürlich auf eigene Verantwortung.
Das Teil ist sicher noch ausbaufähig (und kann man wohl auch ein wenig "schicker" schreiben), aber ich denke, dennoch ganz nützlich, insbesondere, wenn man sonst keine Möglichkeit kennt, Hints in FMX-Anwendungen zu verwenden.

Ich gebe ja die Hoffnung nicht auf und erwarte das von Haus aus in einer der nächsten Delphi XE-Versionen.

Screenshot und Unit anbei.
Miniaturansicht angehängter Grafiken
hint.jpg  
Angehängte Dateien
Dateityp: zip HS_FMXHints.zip (2,0 KB, 5x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.479 Beiträge
 
Delphi 11 Alexandria
 
#22

AW: Firemonkey Workarounds

  Alt 6. Apr 2014, 14:33
Na, kaum gemacht, schon hat mich eine der "Einschränkungen" eingeholt. Ich benötige in einem Projekt doch die OnMouseEnter und OnMouseLeave Ereignisse, da wär es dann blöd, wenn die überschrieben werden.

Habe die HS_FMXHints.pas daher geändert, so dass eine Überschreibung nicht stattfindet, wenn für die Controls schon Events vorhanden sind:

Delphi-Quellcode:
procedure SetAHint (ic: TObject; txt: string);
begin
  if ic is TButton then begin
    TButton (ic).Hint := txt;
    if not Assigned (TButton (ic).OnMouseEnter) then TButton (ic).OnMouseEnter := EventEnter;
    if not Assigned (TButton (ic).OnMouseLeave) then TButton (ic).OnMouseLeave := EventExit
  end;

  if ic is TSpeedbutton then begin
    TSpeedButton (ic).Hint := txt;
    if not Assigned (TSpeedButton (ic).OnMouseEnter) then TSpeedButton (ic).OnMouseEnter := EventEnter;
    if not Assigned (TSpeedButton (ic).OnMouseLeave) then TSpeedButton (ic).OnMouseLeave := EventExit
  end;

  if ic is TLabel then begin
    TLabel (ic).Hint := txt;
    if not Assigned (TLabel (ic).OnMouseEnter) then TLabel (ic).OnMouseEnter := EventEnter;
    if not Assigned (TLabel (ic).OnMouseLeave) then TLabel (ic).OnMouseLeave := EventExit;
  end;
end;
In den dann bereits verwendeten Events muss man die Aufrufe auf die Hintunit selber ergänzen, also in

OnMouseEnter mit HintEnter (self, sender)
OnMouseLeave mit HintExit (self, sender)

Konkretes Beispiel:

Delphi-Quellcode:
procedure Tfrm_Main.sbNewMouseEnter(Sender: TObject);
begin
  TSpeedButton (sender).StyleLookup := 'sbNewStyle2';

  {$IFDEF MSWINDOWS}
  if AktFormStyle = 'ObsedianStylethen begin
    TSpeedButton (sender).FontColor := TAlphaColors.Black;
  end;
  {$ENDIF}

  HintEnter (self, sender);
end;

procedure Tfrm_Main.sbNewMouseLeave(Sender: TObject);
begin
  TSpeedButton (sender).StyleLookup := 'sbNewStyle1';

  {$IFDEF MSWINDOWS}
  if AktFormStyle = 'ObsedianStylethen begin
    TSpeedButton (sender).FontColor := TAlphaColors.White;
  end;
  {$ENDIF}

  HintExit (self, sender);
end;
Die aktualisierte Unit habe ich beigefügt.
Angehängte Dateien
Dateityp: zip HS_FMXHints.zip (2,5 KB, 5x aufgerufen)

Geändert von Harry Stahl ( 6. Apr 2014 um 14:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.346 Beiträge
 
Delphi 11 Alexandria
 
#23

AW: Firemonkey Workarounds

  Alt 6. Apr 2014, 18:05
Habe die HS_FMXHints.pas daher geändert, so dass eine Überschreibung nicht stattfindet, wenn für die Controls schon Events vorhanden sind:
Du könntest daraus auch eine Klasse machen und dir beim neu Zuweisen der Events die Original zugewiesenen schlicht merken.

Die viel sinnvollere Variante ist aber TVirtualMethodInterceptor zu benutzen und die Prozeduren MouseDown usw. direkt abzufangen ohne die Events überhaupt anzutasten...
http://docwiki.embarcadero.com/Libra...hodInterceptor
Denn die Events sollten wirklich nur für die direkte Benutzung einer spezifischen Komponente benutzt werden, nicht für so allgemeine Funktionalität.

// EDIT:
Höchstens ist die Frage, ob das ganze die Performance zu stark beeinträchtigt.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Geändert von jaenicke ( 6. Apr 2014 um 18:10 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz