![]() |
AW: Eleganter Ersatz für TList und Objekte unter FMX-Platformen?
Zitat:
Kleines Beispiel:
Delphi-Quellcode:
Ohne ARC haben wir in
var
a,b : TFoo; a := TFoo.Create(); b := a; a.Free();
Delphi-Quellcode:
jetzt einen dangeling pointer (zeigt auf eine nicht mehr vorhandene Instanz).
b
Mit ARC haben wir in
Delphi-Quellcode:
eine Referenz auf eine lebende Instanz.
b
Delphi-Quellcode:
Ohne ARC haben wir in
var
a,b : TFoo; a := TFoo.Create(); b := a; a.DisposeOf();
Delphi-Quellcode:
jetzt einen dangeling pointer (zeigt auf eine nicht mehr vorhandene Instanz).
b
Mit ARC haben wir in
Delphi-Quellcode:
eine Referenz auf eine (halbwegs) lebende Instanz, die allerdings den Status
b
![]() |
AW: Eleganter Ersatz für TList und Objekte unter FMX-Platformen?
Prima. Dann brauch ich nur mit "false" zu erzeugen (da ich ja bislang das alles selbst verwaltet habe) und die Sache läuft.
Unter Windows ging es mit den wenigen Änderungen schon, alles läuft wie bisher. Mal sehen, wie das jetzt unter Android ist... |
AW: Eleganter Ersatz für TList und Objekte unter FMX-Platformen?
Heißt das jetzt, mit Deiner ergänzenden Erläuterung, dass ich das unter Android / ARC dann doch anders behandeln muss?
Ich benötige die Terminliste mit den verbundenen Objekten natürlich während der ganzen Laufzeit des Programms bzw. solange ich eine Termindatei geladen habe. Schließe ich die, gebe ich die nicht mehr benötigten Objekte wieder frei. Puh... 40.000 Zeilen für Android zu kompilieren dauert lang... |
AW: Eleganter Ersatz für TList und Objekte unter FMX-Platformen?
Das mit der TTerminList sieht jetzt auch unter Android schon mal ganz gut aus.:thumb:
Dafür Euch schon mal recht herzlichen Dank. Unerwartetes Problem, das jetzt aber eine normale TListbox unter Android Probleme macht:
Delphi-Quellcode:
führt zu Problemen in:
lb.items.AddObject (TimeStr, TObject (Index));
Delphi-Quellcode:
EAccessViolation.
procedure _InstAddRef(const Dest: TObject);
begin if Dest <> nil then Dest.__ObjAddRef; end; Wieso das nun? |
AW: Eleganter Ersatz für TList und Objekte unter FMX-Platformen?
Jaaaa, das kommt davon, wenn man sich selber verar***t :stupid:
Ich war nie ein Freund von diesem "ich missbrauche mal eine Instanz-Referenz als Integer-Speicher". Denn genau das wird dort gemacht ... und rächt sich jetzt ;) |
AW: Eleganter Ersatz für TList und Objekte unter FMX-Platformen?
Na ja, ein großer Freund bin ich auch nicht davon, bei neueren Projekten verweise ich direkt auf das Objekt (statt wie hier auf den Index in einer Liste von Objekten).
War halt mal eine Zeit, da war das "in". Alle haben zwar gesagt, man sollte das nicht machen, weil man weiß ja nie, aber dennoch haben die meisten es so gemacht... |
AW: Eleganter Ersatz für TList und Objekte unter FMX-Platformen?
Zitat:
Mit der Referenz habe ich genau den Kontext, worauf ich mich beziehe. Zitat:
Hier mal ein schnelles Beispiel
Delphi-Quellcode:
unit Unit1;
interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts, FMX.ListBox, FMX.Controls.Presentation, FMX.StdCtrls, System.Generics.Collections; type TFoo = class private FDate: TDate; public function ToString( ): string; override; property Date: TDate read FDate write FDate; end; TFooList = TObjectList<TFoo>; TForm1 = class( TForm ) ListBox1: TListBox; Button1: TButton; Button2: TButton; procedure Button1Click( Sender: TObject ); procedure Button2Click( Sender: TObject ); procedure ListBox1Compare( Item1, Item2: TListBoxItem; var Result: Integer ); private FFooList: TFooList; public procedure AfterConstruction; override; procedure BeforeDestruction; override; end; HelperForStrings = class helper for TStrings public function AddObject( AObject: TObject ): Integer; overload; procedure RefreshFromObjects( ); end; var Form1: TForm1; implementation {$R *.fmx} uses System.DateUtils; { HelperForStrings } function HelperForStrings.AddObject( AObject: TObject ): Integer; begin Result := Self.AddObject( AObject.ToString( ), AObject ); end; procedure HelperForStrings.RefreshFromObjects; var idx: Integer; begin BeginUpdate( ); try for idx := 0 to Count - 1 do begin if Objects[ idx ] <> nil then Strings[ idx ] := Objects[ idx ].ToString( ); end; finally EndUpdate( ); end; end; { TFoo } function TFoo.ToString( ): string; begin Result := DateToStr( FDate ); end; procedure TForm1.AfterConstruction; begin inherited; FFooList := TFooList.Create( True ); end; procedure TForm1.BeforeDestruction; begin FFooList.Free; inherited; end; procedure TForm1.Button1Click( Sender: TObject ); var lFoo: TFoo; begin lFoo := TFoo.Create; lFoo.Date := Date( ) + Random( 11 ) - 5; FFooList.Add( lFoo ); ListBox1.Items.AddObject( lFoo ); end; procedure TForm1.Button2Click( Sender: TObject ); var idx : Integer; foo : TFoo; sorted: Boolean; begin idx := Random( FFooList.Count ); foo := FFooList[ idx ]; foo.Date := foo.Date + Random( 11 ) - 5; sorted := ListBox1.sorted; try ListBox1.sorted := False; ListBox1.Items.RefreshFromObjects( ); finally ListBox1.sorted := sorted; end; end; procedure TForm1.ListBox1Compare( Item1, Item2: TListBoxItem; var Result: Integer ); begin if Assigned( Item1.Data ) and Assigned( Item2.Data ) then Result := CompareDate( TFoo( Item1.Data ).Date, TFoo( Item2.Data ).Date ) else Result := 0; end; end. |
AW: Eleganter Ersatz für TList und Objekte unter FMX-Platformen?
Liste der Anhänge anzeigen (Anzahl: 1)
Nur mal kurz drüber geschaut: Wahrscheinlich willst Du darauf hinweisen, dass wegen des Index = 0 eine potentielle Bewertung des Objects als NIL passieren kann und da bei Sortierungen was schief laufen kann.
Das ist mir soweit bewusst, daher habe ich Sortierungen immer über den String-Inhalt der Liste gemacht. Anyway: Da jeder hinzugefügte String in der Listbox unter Firemonkey in Wahrheit ein ListboxItem ist, füge ich halt erst den String hinzu und verwende dann das Listitem [x].tag um den Index-Eintrag für meine Terminliste zu speichern. Da es hier nur um die Anzeige von Informationen geht, konnte ich das ganz schnell für die FMX-Variante anpassen, unter VCL kann es bleiben, wie es war. Jetzt funktioniert alles wie gewünscht (siehe anlg. Screenshot mit eingelesener Termindatei). Morgen werde ich mal IOS testen, wie es da aussieht. |
AW: Eleganter Ersatz für TList und Objekte unter FMX-Platformen?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:04 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