AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ObjectList

Ein Thema von Willie1 · begonnen am 19. Jun 2020 · letzter Beitrag vom 21. Jun 2020
Antwort Antwort
Willie1

Registriert seit: 28. Mai 2008
668 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

ObjectList

  Alt 19. Jun 2020, 17:23
Hallo Freunde*innen,
das wollte ich eigentlich fragen, als das Problem mit den 2 Fenstern dazwischen kam.
Ich will den Umgang mit TObjectList lernen und habe ein Telefonbuch entwickelt. Nicht gerade originell aber das ist mir egal. Ich habe alles gelernt, Anlegen, Daten anhängen, einfügen löschen, sortieren, speichern und öffnen.. Nur eines kann ich noch nicht richtig einen Eintrag korrigieren. Ich habe diesen Weg gewählt aber das geht doch sicher einfacher.
Delphi-Quellcode:
type
   TTel = record
     Name: string;
     VName: string;
     Nr: string;
     Mobil: string;
     G: Integer;
   end;

   TTelAdress = class(TObject)
     private
     Tel: TTel;
     public
     constructor Create;
     destructor Destroy; override;
   end;

   TTelList = class(TObjectList)
     function AddTel(Tel: TTel): Integer;
     procedure SetTel(Index: Integer; Tel: TTel);
     function GetTel(Index: Integer): TTel;
   end;
...
procedure TTellist.SetTel(Index: Integer; Tel: TTel);
var
  TelA: TTelAdress;
begin
  TelA:=TTelAdress.Create;
  TelA.Tel:=Tel;
  self.Delete(Index);
  self.Insert(Index,TelA);
end;
Willie.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.737 Beiträge
 
Delphi 6 Enterprise
 
#2

AW: ObjectList

  Alt 19. Jun 2020, 17:46
Unabhängig von der Frage finde ich die Konstruktion etwas unglücklich.
TTelAdress ist nur dafür da um den Record TTel in ein Objekt zu packen. Da hätte man doch direkt ein Objekt TKontakt machen können und fertig ist das Ganze:

Delphi-Quellcode:
type
   TKontakt = Object
    public
     Name: string;
     VName: string;
     Nr: string;
     Mobil: string;
     G: Integer;
   end;
So mal als Minimal-Beispiel weil eigentlich ist es ja nicht sauber einfach alle Variablen Public zu machen.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: ObjectList

  Alt 19. Jun 2020, 17:47
Ich würde hier garkeine Objektliste verwenden, sondern eine TCollection mit TCollectionItems.

Erstmal verwaltet die von Haus aus alles selber, vor allem auch das Erstellen und Freigeben der Items
und gerade hier kann es auch von Vorteil sein, dass Collections sich bereits von Haus aus serialisieren lassen. (TReader/TWriter)
$2B or not $2B
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
961 Beiträge
 
#4

AW: ObjectList

  Alt 19. Jun 2020, 18:09
Record ist überflüssig. Zumindest in dieser Konstellation.

Wie Jumpy bereits gesagt hat, pack deine Variablen direkt in die Klasse.

Delphi-Quellcode:
Type
  TTelEintrag=class
    private
      FName: string;
      FTelNummer: string;
      Procedure SetName(value: string);
      Procedure SetTelNummer(value: string);
    published
      property Name: string read FName write SetName;
      property TelNummer: string read FTelNummer write SetTelNummer;
   end;

   TTelBuch=class(TObjectList<TTelEintrag>);
Lesen und Schreiben der Daten kannst du recht einfach über TelBuch[Index].Name oder TelBuch[index].TelNummer.

Wenn du eine Liste hast, dann wirst du in den meisten Fällen diese Liste irgendwie abbilden. Im simpelsten Fall in einer Listbox.
Laden könntest du die vielleicht so:

Delphi-Quellcode:
Listbox.clear;
for i:=0 to TelBuch.Count-1 do
  ListBox.Items.Add(TelBuch[i].Name);
Wenn du jetzt einen Eintrag der ListBox selektierst könnte du auf die Daten ungefär so zugreifen:
TelBuch[ListBox.ItemIndex].Name (oder .TelNummer)

Du kannst diese Daten halt in ein Control laden z.B. edit1.Text:=TElBuch[ListBox.ItemIndex].Name nach der Änderung z.B: über TelBuch[ListBox.ItemIndex].Name:=edit1.Text; .

Einfach mal ein bisschen mit rumspielen.

Du kannst natürlich in dem Object auch anderen Objecte als properties verwenden z.B. eine TStringList oder TNummernList (eine weitere TObjectList, die du natürlich vorher deklariert haben solltest), usw.

Dann solltest du den Constructor Create und den Destructor Destoy mit in deine Klasse aufnehmen und dort entsprechen diese Objecte erzeugen bzw. Freigeben.
Delphi-Quellcode:
.
.
.
public
  constructor Create;
  destructor Destroy; override;
.
.
.

implementation
  
constructor TTelEintrag.Create;
begin
  inherited;
  FNummernList:=TNummernList.Create;
end;

destructor TTelEintrag.Destroy;
begin
  FNummernList.free;
  inherited;
end;
Wichtig ist im Interface-Abschnitt beim Destroy nicht das override zu vergessen.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.

Geändert von Hobbycoder (19. Jun 2020 um 18:20 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#5

AW: ObjectList

  Alt 19. Jun 2020, 18:28
Ich habe mal eine meiner Meinung nach ausreichende Mini-Demo für die ObjectList (Telefonbuch, hinzufügen/löschen) erstellt. Es ist auch eine ListView zur Anzeige vorhanden. Die kann aber eigentlich ignoriert werden weil die mehr schlecht als recht ist.

Es geht nur um das Hinzufügen und Löschen!
Angehängte Dateien
Dateityp: zip ObjectList mit ListView.zip (1,9 KB, 21x aufgerufen)

Geändert von DieDolly (19. Jun 2020 um 19:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: ObjectList

  Alt 19. Jun 2020, 18:56
Zitat:
direkt in eine Klasse
Jupp, drum nennt sich sowas auch Daten-Klasse, weil da eben nur Daten drin sind. (ohne "höhere" Funktionen)

Wenn Record, dann die generische TList<>, TDictionary<> oder TStack<> und das Objekt weglassen.

Delphi-Quellcode:
var
  L: TList<TTel>;
  R: TTel;

L := TList<TTel>.Create;

R.Name := 'Hans';
R.Tel := '0190666666';
L.Add(R);

R := L.First // L[0]
R := L.Last // L[i.Count-1]
i := L.IndexOf(R); // wobei ein TDictionary<> zum Suchen besser ist, außer man baut eine eigene Suchfunktion, welche auch Einzelfelder suchen kann

if L[i].Name = 'Hansthen

R := L[i];
if R.Name = 'Hansthen

L[i] := R; // überschreiben (dein Delete + Insert)

L.Free;
$2B or not $2B
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
668 Beiträge
 
Delphi 10.1 Berlin Starter
 
#7

AW: ObjectList

  Alt 21. Jun 2020, 18:21
Hallo, jetzt bekomme ich das hin. Danke.

Ich darf mal kurz abschweifen: ich habe oft Briefe als PDF eingescannt und mir von Edge vorlesen lassen. Nach dem letzten Update von Windows steht diese Option nicht mehr zur Verfügung. Das trifft mich.

Gruß Willie.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  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 02:08 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