Firemonkey Workarounds
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:
- TTreeview: "Accept" in OnDragOver wird ignoriert
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; 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:
- TListbox: "Accept" in OnDragOver wird ignoriert, D&D funktioniert nicht
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; // ... 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:
- Open-/Savedialog: Der Dialog wird unter Mac OS nicht geöffnet, Execute liefert false zurück
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; // ... Unter MacOS muss der Filter leer sein. Den Dialog daher wie folgt öffnen
Delphi-Quellcode:
- TDropTarget: "Accept" wird in OnDragOver nicht akzeptiert
{$IFDEF MACOS} Try OpenDlg.Filter := ''; Except End; {$ENDIF} // Geht unter Mac nicht
OpenDlg.Execute; ... 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:
- THeader: Werden HeaderItems hinzugefügt, ist die .FMX Datei anschließend defekt
procedure TDropTarget.DragOver(const Data: TDragObject; const Point: TPointF;
var Accept: Boolean); begin // Änderungen // inherited; inherited DragOver(Data, Point, Accept); // ... 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:
In OnCreate dann:
TMainForm = class(TForm)
... privat HeaderItem1: THeaderItem; HeaderItem2: THeaderItem; ... public ...
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); |
AW: Firemonkey Workarounds
Zitat:
(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. :wink: |
AW: Firemonkey Workarounds
|
AW: Firemonkey Workarounds
Oh wie schlimm ...
Nein im Ernst, ich habe kaum Lust bei QC zu suchen und versuche erstmal die Delphi-Quelle meiner Wahl: DP. |
AW: Firemonkey Workarounds
- 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. |
AW: Firemonkey Workarounds
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:
und das FUpdating hinzufügen bei:
(* 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;*)
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; |
AW: Firemonkey Workarounds
Zitat:
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 |
AW: Firemonkey Workarounds
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:
Das könnt Ihr dann so aufrufen (unterstellt, pnSizeBack ist hier z.B. ein TPanel):
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; var BillHeader: THeader;
Delphi-Quellcode:
Ein Beispiel für die Event-Prozedur:
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;
Delphi-Quellcode:
procedure TF_Main.HeaderItemXClick(Sender: TObject);
begin ShowMessage ('Clicked: ' + THeaderItem(sender).Text); end; |
AW: Firemonkey Workarounds
Warum keine Factory?
So muss man sich ja diesen String irgendwie zusammenbasteln. Geht, aber ist auch nicht wirklich schön.
Delphi-Quellcode:
Der Factory-Instanz gibt man alle relevanten Teile im
THeaderItemFactory = class
function Build( const AText : string; AWidth : Integer ) : THeaderItem; end;
Delphi-Quellcode:
mit und erzeugt dann die jeweiligen Items.
constructor
|
AW: Firemonkey Workarounds
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 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