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
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#1

AW: Firemonkey Workarounds

  Alt 2. Apr 2014, 21:43
Du könntest Versuchen, Delphi mit Delphi zu debuggen (Mit Prozess verbinden). Also zuerst den Debuggee starten, im Taskmanager die Prozeß-ID merken und dann Delphi nochmals als Debugger starten (aus der Kommandozeile mit Parameter /np) und mit der BDS.exe mit der zuvor gemerkten ID verbinden. Dann in die erste Instanz wechseln und Fehler verursachen, in die zweite Instanz umschalten und schauen, ob Du was siehst (z.B. BPL-Namen).

Mist, merke gerade das geht mit XE nicht mehr, ausser man startet bei mit /np.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all

Geändert von Union ( 2. Apr 2014 um 21:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.561 Beiträge
 
Delphi 12 Athens
 
#2

AW: Firemonkey Workarounds

  Alt 2. Apr 2014, 22:27
Und wieder mal ein Mysterium gelöst...

Union, Deine Vermutung, es lag an den TMS-Komponenten, stimmte!!

Allerdings lag es nicht an den TMS-FMX-Komponenten, sondern an den TMS-VCL-Komponenten.

Als ich die defekte FMX speicherte und wieder lud, fiel mir auf, dass plötzlich folgende Einträge in der Form.pas-Datei drin waren:

GDIPCustomItem, GDIPTextItem, GDIPSectionItem,
GDIPImageSectionItem, GDIPHeaderItem;

Die gehören zu den TMS-VCL Komponenten und in der Unit GDIPHeaderItem ist auch eine Klasse "THeaderItem" drin. So kam es zu einem Konflikt. Wie das letztlich möglich sein kann, ist mir zwar ein Rätsel, aber gut.

Nachdem ich also die Packages der TMS-VCL-Komponenten deaktiviert hatte, konnte ich die Datei ganz normal laden.

So, jetzt muss ich das noch EMBA und TMS-Software erzählen... (na toll )

Wie war das eigentlich noch mal: Kann man Delphi nicht so einstellen, dass für bestimmte Projekte nur bestimmte Packages geladen werden? Dann könnte man das Problem vielleicht umgehen?

Geändert von Harry Stahl ( 2. Apr 2014 um 22:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Firemonkey Workarounds

  Alt 2. Apr 2014, 22:53
Wie war das eigentlich noch mal: Kann man Delphi nicht so einstellen, dass für bestimmte Projekte nur bestimmte Packages geladen werden? Dann könnte man das Problem vielleicht umgehen?
Ja, aber die Packages müssen sich auch daran halten.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.561 Beiträge
 
Delphi 12 Athens
 
#4

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.
Angehängte Grafiken
Dateityp: jpg Hint.jpg (27,7 KB, 24x aufgerufen)
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.561 Beiträge
 
Delphi 12 Athens
 
#5

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
10.052 Beiträge
 
Delphi 12 Athens
 
#6

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
AppCentral

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


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 04:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz