Einzelnen Beitrag anzeigen

greenmile

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

Firemonkey Workarounds

  Alt 13. Jul 2012, 10: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 22:10 Uhr) Grund: Code-Formatierung ergänzt.
  Mit Zitat antworten Zitat