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 1 von 3  1 23      
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#1

Firemonkey Workarounds

  Alt 13. Jul 2012, 11:10
Hallo,

da ich während meiner Entwicklung unter Firemonkey über einige Bugs gestolpert bin, die man teilweise recht einfach umgehend kann, möchte ich hier immer mal wieder einige Workarounds reinschreiben. Vielleicht klinkt sich ja der eine oder andere an. Und vielleicht geschieht ja ein Wunder und jemand von Embar liest mit ... Betrifft alles XE2, aktuell Hotfix 4

- OpenDialog ist unter Windows nicht Modal

Delphi-Quellcode:
Uses {$IFDEF MSWINDOWS}Winapi.Windows, FMX.Platform.Win,{$ENDIF}

{$IFDEF MSWINDOWS} Try EnableWindow(FmxHandleToHWND(Self.Handle), False); Except End; {$ENDIF}
Try
  OpenDialog.Execute;
  ....
Finally
  {$IFDEF MSWINDOWS}
  SetActiveWindow(FmxHandleToHWND(Self.Handle));
  EnableWindow(FmxHandleToHWND(Self.Handle), True);
  {$ENDIF}
End;
- TTreeview: "Accept" in OnDragOver wird ignoriert
FMX.TreeView.pas und FMX.Defines.inc ins Projektverzeichnis kopieren, damit das Projekt immer die lokale verwendet. FMX.TreeView.pas öffnen und zu TCustomTreeView.DragOver springen. Dort den Anfang wie folgt auswechseln:
Delphi-Quellcode:
procedure TCustomTreeView.DragOver(const Data: TDragObject; const Point: TPointF;
  var Accept: Boolean);
var
  Obj: TTreeViewItem;
begin
  // Änderungen
  // inherited;
  inherited DragOver(Data, Point, Accept);
  if assigned(OnDragOver) then exit;
  // ...
- TListbox: "Accept" in OnDragOver wird ignoriert, D&D funktioniert nicht
FMX.Listbox.pas und FMX.Defines.inc ins Projektverzeichnis kopieren, damit das Projekt immer die lokale verwendet. FMX.Listbox.pas öffnen und zu TCustomListBox.DragOver springen. Dort den Anfang wie folgt auswechseln:
Delphi-Quellcode:
procedure TCustomListBox.DragOver(const Data: TDragObject; const Point: TPointF; var Accept: Boolean);
var
  Obj: TListBoxItem;
begin
  // Änderungen
  // inherited;
  inherited DragOver(Data, Point, Accept);
  if assigned(OnDragOver) then exit;
  // ...
- Open-/Savedialog: Der Dialog wird unter Mac OS nicht geöffnet, Execute liefert false zurück
Unter MacOS muss der Filter leer sein. Den Dialog daher wie folgt öffnen
Delphi-Quellcode:
{$IFDEF MACOS} Try OpenDlg.Filter := ''; Except End; {$ENDIF} // Geht unter Mac nicht
OpenDlg.Execute;
...
- TDropTarget: "Accept" wird in OnDragOver nicht akzeptiert
FMX.ExtCtrls und FMX.Defines.inc ins Projektverzeichnis kopieren, damit das Projekt immer die lokale verwendet. FMX.ExtCtrls öffnen und zu TDropTarget.DragOver springen. Dort den Anfang wie folgt auswechseln:
Delphi-Quellcode:
procedure TDropTarget.DragOver(const Data: TDragObject; const Point: TPointF;
  var Accept: Boolean);
begin
  // Änderungen
  // inherited;
  inherited DragOver(Data, Point, Accept);
  // ...
- THeader: Werden HeaderItems hinzugefügt, ist die .FMX Datei anschließend defekt
Beim laden der Datei kam es zum Meldung "Ungültige Eigenschaft Headeritem1.Width, außerdem sind plötzlich andere Komponenten auf der Form verschwunden.
Einzig mir bekannter Workaround: THeaderItem dynamisch erzeugen:
Delphi-Quellcode:
TMainForm = class(TForm)
...
privat
    HeaderItem1: THeaderItem;
    HeaderItem2: THeaderItem;
    ...
public
...
In OnCreate dann:
Delphi-Quellcode:
    HeaderItem1 := THeaderItem.Create(nil);
    HeaderItem1.Parent := Header1;
    HeaderItem1.Width := 50;
    HeaderItem1.Text :='HeaderItem1';
    Header1.AddObject(HeaderItem1);

    HeaderItem2 := THeaderItem.Create(nil);
    HeaderItem2.Parent := Header1;
    HeaderItem2.Width := 50;
    HeaderItem2.Text :='HeaderItem2';
    Header1.AddObject(HeaderItem1);

Geändert von fkerber ( 1. Apr 2014 um 23:10 Uhr) Grund: Code-Formatierung ergänzt.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

AW: Firemonkey Workarounds

  Alt 13. Jul 2012, 11:28
Und vielleicht geschieht ja ein Wunder und jemand von Embar liest mit ...
Wieso? Gibt es dazu noch keine QC-Einträge?
(Was ja hieße es soll nicht gefixt werden, denn was man nicht weiß kann man auch nicht fixen.)

Vor allem würden in der QC die Hinweise zu den Fixes auch von anderen gefunden werden, die damit Probleme haben.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#3

AW: Firemonkey Workarounds

  Alt 13. Jul 2012, 12:59
Also den QC zu Punkt 1 gibt es schon:


OpenDialog nicht modal
Lars
  Mit Zitat antworten Zitat
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Firemonkey Workarounds

  Alt 13. Jul 2012, 13:28
Oh wie schlimm ...
Nein im Ernst, ich habe kaum Lust bei QC zu suchen und versuche erstmal die Delphi-Quelle meiner Wahl: DP.
  Mit Zitat antworten Zitat
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Firemonkey Workarounds

  Alt 25. Jul 2012, 13:14
- Mac: Anwendung wird plötzlich nicht mehr gestartet
Nach einem Absturz wird die Anwendung plötzlich nicht mehr auf dem Mac gestartet. Hierzu die Datei Info.plist im Editor öffnen, diese befindet sich im Package im Verzeichnis Contents. Anschließend den Wert unter CFBundleIdentifier ändern, zum Beispiel eine 1 hinzufügen.

Geändert von fkerber ( 1. Apr 2014 um 23:11 Uhr) Grund: Full-Quote entfernt, um Lesbarkeit zu erhöhen.
  Mit Zitat antworten Zitat
Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#6

AW: Firemonkey Workarounds

  Alt 5. Jun 2013, 08:40
Ich packe das mal hier rein, da es passt:

- FMX.Treeview öffnet bei jedem TreeviewItem die Children und zeichnet jedes einzelne Element neu

In FMX.Treeview.pas unter procedure TTreeViewItem.SetIsExpanded(const Value: Boolean); folgendes ausklammern:
Delphi-Quellcode:
(* if FContent.ChildrenCount > 0 then
      for i := FContent.ChildrenCount - 1 downto 0 do
      begin
        Item := nil;
        if FContent.Children[i] is TTreeViewItem then
          Item := TTreeViewItem(FContent.Children[i]);

        if Item <> nil then
          Item.IsExpanded := True;
      end;*)
und das FUpdating hinzufügen bei:
Delphi-Quellcode:
   if (FUpdating = 0) and (TreeView <> nil) then
      TreeView.Realign;

- unter OSX liefert das OnClick Ereignis bei den Menüs nicht das TMenuitem zurück.

Unter FMX.Platform.MAC das DispatchMenu wie folgt ersetzen:
Delphi-Quellcode:
procedure TFMXOSMenuItem.DispatchMenuClick(Sender: Pointer);
begin
  try
    if Assigned(FMXMenuItem.OnClick) then
      FMXMenuItem.OnClick(FMXMenuItem); //++
  except
    Application.HandleException(Self);
  end;
end;

Geändert von fkerber ( 1. Apr 2014 um 23:12 Uhr) Grund: Code-Formatierung ergänzt.
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

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

AW: Firemonkey Workarounds

  Alt 1. Apr 2014, 22:53
Hallo,

da ich während meiner Entwicklung unter Firemonkey über einige Bugs gestolpert bin, die man teilweise recht einfach umgehend kann, möchte ich hier immer mal wieder einige Workarounds reinschreiben. Vielleicht klinkt sich ja der eine oder andere an. Und vielleicht geschieht ja ein Wunder und jemand von Embar liest mit ... Betrifft alles XE2, aktuell Hotfix

...

4- THeader: Werden HeaderItems hinzugefügt, ist die .FMX Datei anschließend defekt
Beim laden der Datei kam es zum Meldung "Ungültige Eigenschaft Headeritem1.Width, außerdem sind plötzlich andere Komponenten auf der Form verschwunden.
Einzig mir bekannter Workaround: THeaderItem dynamisch erzeugen:

...
So, dieser schöne Fehler ist mir nun auch begegnet. Anscheinend hat hier von EMBA leider keiner mitgelesen, denn in XE5 ist das Problem noch (oder wieder) vorhanden. In einem XE3-Projekt nutze ich einen THeader ohne Probleme.

Ein wenig zur Ehrenrettung von EMBA: Im Quality Central gab es aber auch keinen einzigen Eintrag zu diesem Problem.

Das habe ich nun nachgeholt und ein für die Prüfer reproduzierbares Beispiel beigefügt.

Hier ist der Eintrag: http://qc.embarcadero.com/wc/qcmain.aspx?d=123746
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

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

AW: Firemonkey Workarounds

  Alt 2. Apr 2014, 00:30
Außerdem habe ich nun mal den Workaround-Vorschlag von Greenmile aufgegriffen und eine kleine Prozedur draus gemacht, so dass man mit einem Aufruf den Header, die Höhe des Headers, die Items, die jeweilige Breite der Items, die Captions der HeaderItems, die Ausrichtung des Headers, den Parent und ein ClickEvent übergeben kann.

Sieht dann so aus (die Unit StrUtils und FMX.Header wird benötigt):

Delphi-Quellcode:
Procedure CreateANewHeader (AH: THeader; AHeight: Integer; AClickEvent: TNotifyEvent; AParent: TFMXObject; AL: TAlignLayout; SInfo: String);
var
  DyA: TStringDynArray; s: string; HI: THeaderItem; P: Integer;
begin
  AH := THeader.Create(AParent);
  AH.Parent := Aparent;
  AH.Height := Aheight;
  AH.Align := AL;

  DyA := SplitString (SInfo, ',');

  for s in DyA do begin
    P := Pos ('=', S);

    HI := THeaderItem.Create(AH);
    HI.Parent := AH;
    HI.Text := Copy (S, 1, p-1);
    HI.DragMode := TDragMode.dmManual; // Ohnen diesen Fix geht das ClickEvent nicht :-(
    HI.Width := StrToInt (Copy (S, p+1, Length (s)-P+1));

    if Assigned (AClickEvent) then HI.OnClick := AClickEvent;
  end;
end;
Das könnt Ihr dann so aufrufen (unterstellt, pnSizeBack ist hier z.B. ein TPanel):

var
BillHeader: THeader;

Delphi-Quellcode:
procedure TF_Main.FormCreate(Sender: TObject);
begin
  CreateANewHeader (BillHeader, 21, HeaderItemXClick, pnSizeBack, TAlignLayout.alTop,
   'Re-Datum=89,Re-Nr=64,Anl.=30,Name=176,Summe=100,ZS=24,Zahldatum=83');
  ...
end;
Ein Beispiel für die Event-Prozedur:

Delphi-Quellcode:
procedure TF_Main.HeaderItemXClick(Sender: TObject);
begin
  ShowMessage ('Clicked: ' + THeaderItem(sender).Text);
end;

Geändert von Harry Stahl ( 2. Apr 2014 um 00:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Firemonkey Workarounds

  Alt 2. Apr 2014, 01:12
Warum keine Factory?

So muss man sich ja diesen String irgendwie zusammenbasteln. Geht, aber ist auch nicht wirklich schön.
Delphi-Quellcode:
THeaderItemFactory = class
  function Build( const AText : string; AWidth : Integer ) : THeaderItem;
end;
Der Factory-Instanz gibt man alle relevanten Teile im constructor mit und erzeugt dann die jeweiligen Items.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

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

AW: Firemonkey Workarounds

  Alt 2. Apr 2014, 11:02
Also ich kann das nicht reproduzieren. Wenn ich in pnSizeback in Form48 einen THeader und darin dann HeaderItems hinzufüge, sind die nach dem Speichern, Schließen und wieder Laden wieder da. Auch Dein angehängtes Form49, das den Fehler bereits enthalten soll kann ich problemlos laden (s. Anhang). Evtl. hast Du eine bpl geladen, die ein solches Fehlverhalten bei Dir auslöst. Höchstwahrscheinlich die TMS-Komponenten.
Miniaturansicht angehängter Grafiken
qc123746.png  
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all

Geändert von Union ( 2. Apr 2014 um 11:08 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 00:23 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