AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Eintrag nur hinzufügen wenn nicht in Listview vorhanden
Thema durchsuchen
Ansicht
Themen-Optionen

Eintrag nur hinzufügen wenn nicht in Listview vorhanden

Ein Thema von LordGinn · begonnen am 13. Okt 2014 · letzter Beitrag vom 21. Okt 2014
 
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: Eintrag nur hinzufügen wenn nicht in Listview vorhanden

  Alt 16. Okt 2014, 08:39
Es ist grober Unfug die ListView für die Dublettenprüfung zu bemühen. Ist aber ein klassischer Anfängerfehler und habe ich zu meinen Anfangszeiten auch so gemacht, also keine falsche Scham.

Wie macht man es also richtig(er)?

Zunächst erstellt man sich eine Klasse, die die Daten selber aufnehmen kann
Delphi-Quellcode:
unit ModelData;

interface

type
  TDataModel = class
  private
    FVal1: string;
    FVal2: string;
    FVal3: string;
    FVal4: string;
  public
    constructor Create( const AVal1, AVal2, AVal3, AVal4: string );
    property Val1: string read FVal1;
    property Val2: string read FVal2;
    property Val3: string read FVal3;
    property Val4: string read FVal4;
  end;

implementation

{ TDataModel }

constructor TDataModel.Create( const AVal1, AVal2, AVal3, AVal4: string );
begin
  inherited Create;
  FVal1 := AVal1;
  FVal2 := AVal2;
  FVal3 := AVal3;
  FVal4 := AVal4;
end;

end.
Da ist nichts aufregendes dran.

Der Trick ist jetzt die Daten in einer Liste zu verwalten und diese Liste dann in der ListView zu präsentieren (anzeigen). Dadurch brauche ich jetzt nicht mehr die ListView irgendwie abzuklappern und mich auf den Kopf zu stellen, weil für die Anzeige die echten Daten irgendwie aufbereitet wurden, sondern ich vergleiche nur noch mit der einfachen Liste.

Das sieht dann z.B. so aus:
Delphi-Quellcode:
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.
P.S. Da du keine Delphi-Version angegeben hast (Beitrag oder Profil) gehe ich davon aus, dass du schon eine neuere Version mit Generics und den Namespaces hast.
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
 

 

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 22:35 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