unit FormMain;
interface
uses
Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls,
Vcl.ComCtrls,
System.Generics.Collections, ModelData;
type
TForm1 =
class( TForm )
ListView1: TListView;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
AddButton: TButton;
procedure AddButtonClick( Sender: TObject );
private
FDataList: TList<TDataModel>;
procedure PresentData;
public
procedure AfterConstruction;
override;
procedure BeforeDestruction;
override;
end;
var
Form1: TForm1;
implementation
uses
System.Generics.Defaults;
{$R *.dfm}
{ TForm1 }
procedure TForm1.AddButtonClick( Sender: TObject );
var
LItem: TDataModel;
begin
// Aus den Eingaben eine Daten-Instanz erzeugen
LItem := TDataModel.Create( Edit1.Text, Edit2.Text, Edit3.Text, Edit4.Text );
try
// Wenn es diese Daten-Instanz mit diesen Werten noch nicht gibt ...
// (dank dem Comparer ist das ganz einfach zu prüfen)
if not FDataList.
Contains( LItem )
then
begin
// ... dann fügen wir das in die Liste ein
FDataList.Add( LItem );
// setzen die Referenz auf NIL (siehe unten)
LItem :=
nil;
// präsentieren die neuen Daten
PresentData;
end;
finally
// Wenn LItem <> NIL, dann wird die Instanz zerstört
LItem.Free;
end;
end;
procedure TForm1.AfterConstruction;
begin
inherited;
FDataList := TObjectList<TDataModel>.Create(
// Dieser Vergleicher (Comparer) kann die Daten in der Liste vergleichen
// zum Sortieren, aber auch um mit Contains gleiche Instanzen zu finden
TComparer<TDataModel>.Construct(
function(
const L, R: TDataModel ): Integer
begin
Result := CompareStr( L.Val1, R.Val1 );
if Result = 0
then
Result := CompareStr( L.Val2, R.Val2 );
if Result = 0
then
Result := CompareStr( L.Val3, R.Val3 );
if Result = 0
then
Result := CompareStr( L.Val4, R.Val4 );
end ), True );
end;
procedure TForm1.BeforeDestruction;
begin
inherited;
FDataList.Free;
end;
procedure TForm1.PresentData;
var
LDataItem: TDataModel;
LListItem: TListItem;
begin
ListView1.Items.BeginUpdate;
try
// ListView leeren
ListView1.Items.Clear;
// durch alle Daten-Instanzen laufen
for LDataItem
in FDataList
do
begin
// und in die ListeView eintragen
LListItem := ListView1.Items.Add;
LListItem.Caption := LDataItem.Val1;
LListItem.SubItems.Add( LDataItem.Val2 );
LListItem.SubItems.Add( LDataItem.Val3 );
LListItem.SubItems.Add( LDataItem.Val4 );
LListItem.Data := LDataItem;
end;
finally
ListView1.Items.EndUpdate;
end;
end;
end.