AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Eleganter Ersatz für TList und Objekte unter FMX-Platformen?
Thema durchsuchen
Ansicht
Themen-Optionen

Eleganter Ersatz für TList und Objekte unter FMX-Platformen?

Ein Thema von Harry Stahl · begonnen am 30. Dez 2015 · letzter Beitrag vom 1. Jan 2016
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: Eleganter Ersatz für TList und Objekte unter FMX-Platformen?

  Alt 31. Dez 2015, 00:10
TObjectList<T> hat eine Property OwnsObjects - steht diese auf true, kümmerst sich die Objektliste um die Freigabe der zugehörigen Objekte - steht sie auf false, musst du dich selbst drum kümmern. Verwendest du diese Objekte also an anderer Stelle wieder, sollte OwnsObjects auf false stehen, sonst werdne beim Clear alle Items ge"free"t.
Die werden eben nicht ge"free"t sondern ge"DisposeOf"t und das ist gerade unter ARC wichtig zu wissen.

Kleines Beispiel:
Delphi-Quellcode:
var
  a,b : TFoo;

a := TFoo.Create();
b := a;
a.Free();
Ohne ARC haben wir in b jetzt einen dangeling pointer (zeigt auf eine nicht mehr vorhandene Instanz).
Mit ARC haben wir in b eine Referenz auf eine lebende Instanz.
Delphi-Quellcode:
var
  a,b : TFoo;

a := TFoo.Create();
b := a;
a.DisposeOf();
Ohne ARC haben wir in b jetzt einen dangeling pointer (zeigt auf eine nicht mehr vorhandene Instanz).
Mit ARC haben wir in b eine Referenz auf eine (halbwegs) lebende Instanz, die allerdings den Status Delphi-Referenz durchsuchenTObject.Disposed hat (und somit ein vergleichbarer Status wie ohne ARC).
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)

Geändert von Sir Rufo (31. Dez 2015 um 00:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

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

AW: Eleganter Ersatz für TList und Objekte unter FMX-Platformen?

  Alt 31. Dez 2015, 00:14
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...
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

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

AW: Eleganter Ersatz für TList und Objekte unter FMX-Platformen?

  Alt 31. Dez 2015, 00:25
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...
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

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

AW: Eleganter Ersatz für TList und Objekte unter FMX-Platformen?

  Alt 31. Dez 2015, 01:08
Das mit der TTerminList sieht jetzt auch unter Android schon mal ganz gut aus.

Dafür Euch schon mal recht herzlichen Dank.

Unerwartetes Problem, das jetzt aber eine normale TListbox unter Android Probleme macht:

lb.items.AddObject (TimeStr, TObject (Index)); führt zu Problemen in:

Delphi-Quellcode:
procedure _InstAddRef(const Dest: TObject);
begin
  if Dest <> nil then Dest.__ObjAddRef;
end;
EAccessViolation.

Wieso das nun?

Geändert von Harry Stahl (31. Dez 2015 um 01:27 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
 
#15

AW: Eleganter Ersatz für TList und Objekte unter FMX-Platformen?

  Alt 31. Dez 2015, 01:17
Jaaaa, das kommt davon, wenn man sich selber verar***t

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
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 Harry Stahl
Harry Stahl

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

AW: Eleganter Ersatz für TList und Objekte unter FMX-Platformen?

  Alt 31. Dez 2015, 01:40
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...
  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
 
#17

AW: Eleganter Ersatz für TList und Objekte unter FMX-Platformen?

  Alt 31. Dez 2015, 01:57
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).
Der Index auf eine Liste kann schneller veraltern, als einem lieb ist (Sortierung der Liste, Element davor eingefügt, Element davor entfernt, ...)

Mit der Referenz habe ich genau den Kontext, worauf ich mich beziehe.
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...
Mein Argument war nicht "man weiß ja nie", sondern "es ist falsch"

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.
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 Harry Stahl
Harry Stahl

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

AW: Eleganter Ersatz für TList und Objekte unter FMX-Platformen?

  Alt 31. Dez 2015, 03:01
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.
Miniaturansicht angehängter Grafiken
timo-android2.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#19

AW: Eleganter Ersatz für TList und Objekte unter FMX-Platformen?

  Alt 1. Jan 2016, 13:36
Hier mal ein schnelles Beispiel
Mal schnell? Ja ne, is klar.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 15:03 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