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
Benutzerbild von Sir Rufo
Sir Rufo

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

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

  Alt 31. Dez 2015, 00: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.561 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 31. Dez 2015, 02: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.
Angehängte Grafiken
Dateityp: jpg Timo-Android2.jpg (92,9 KB, 26x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

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

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

  Alt 1. Jan 2016, 12: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


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 14:46 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