Autor Beitrag
Klaus777
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 27.12.19 21:49 
Hallo,

ich habe das Problem, das ich Objekte in ihrer Reihenfolge verwalten möchte.
d.h. Objekt anlegen und in einer Listbox anzeigen, klappt.

Als Grundlage habe ich das hier verwendet:
www.delphipraxis.net...ontainer-klasse.html

Jetzt möchte ich das Objekt in der Reihenfolge in der Listbox verschieben.

Das Verschieben der Einträge geht auch, nur die Zuordnung der Objekte passt dann nicht mehr.

Hat jemand so etwas schon mal gebaut?

Viele Grüße Klaus
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 28.12.19 09:12 
Hallo und :welcome:

wie greifst du denn von der ListBox aus auf die Objekte des Containers zu (mittels Index)?
Besser ist, bei AddItem als 2. Parameter das Datenobjekt zu hinterlegen. Oder wie verschiebst du die Items in der ListBox (evtl. geht dort ja die Zuordnung zu den Daten verloren)?

Oder sollen zeitgleich auch die Objekte im Container mitverschoben werden?

Vllt. solltest du relevanten Code hier zeigen?
Klaus777 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: So 29.12.19 22:16 
Hallo TH69,
danke das du mich unterstützen möchtest.

www.delphipraxis.net...ontainer-klasse.html

Das ist das Ausgangsprojekt. Ich habe den Source zum Verschieben der Einträge eingefügt.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TfrmMain.LbMoveItemDown(AListBox: TListBox);
var
CurrIndex, LastIndex: Integer;
begin
with AListBox do
  begin
  CurrIndex := ItemIndex;
  LastIndex := Items.Count;
  if ItemIndex <> -1 then
    begin
    if CurrIndex + 1 < LastIndex then
      begin
      Items.Move(ItemIndex, (CurrIndex + 1));
      ItemIndex := CurrIndex + 1;
      end;
    end;
  end;
end;

mit der Funktion verschiebe ich Einträge nach unten , dabei wird in der ursprünglichen Liste die Reihenfolge nicht angepasst.

Viele Grüße Klaus

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 29.12.19 23:49 
Moin!

user profile iconKlaus777 hat folgendes geschrieben Zum zitierten Posting springen:
dabei wird in der ursprünglichen Liste die Reihenfolge nicht angepasst.
Was ist denn "die ursprüngliche Liste"? :lupe:

Abgesehen davon ist das referenzierte Tutorial schon etwas angestaubt (*hüstel*), vielleicht erklärst du mal etwas mehr davon, was du eigentlich machen möchtest. :les: Vielleicht gibt es da inzwischen ein paar andere Wege. :idea: ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.

Für diesen Beitrag haben gedankt: Klaus777
Klaus777 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 30.12.19 10:17 
Hallo Narses,

ich habe eine umfassende Textdatei in der u.a. Informationen strukturiert, leide nicht in der richtigen Reihenfolge, abgelegt sind.
Die Idee war ursprünglich, die strukturierten Informationen vom restlichen Müll zu trennen und diese, was davon möglich ist, grafisch darzustellen um eine einfache Sortierung zu ermöglichen.
Dabei sollte die Reihenfolge der vorhandenen Strukturen geändert werden und das Ergebnis dann wieder in die Textdatei zurück, natürlich muss der Müll wieder drumrum.

Eine automatische Sortierung der Elemente ist anhand der vielen Wünsche der Kreativen, die den Haushalt verursachen, nicht wirklich möglich.
Also war der Ansatz, ähnlich wie bei vektororientierten Zeichenprogrammen(Corel, Incscape), so eine Art Objektliste.
Damit haben die schon Erfahrung und ich müsste nicht permanent alles erklären was dann auch den Ansatz mit der Listbox und den Tasten für Objekt hoch und runter erklärt ,-)

Was das Tutorial angeht, mag es sein dass das zeitliche schon genagt hat.
Ich durfte eine etwas längere Programmierpause einlegen müssen, daher fällt es u.a. auch etwas schwerer den Einstig wieder zu finden.

Für Anregungen bin ich sehr dankbar.

Grüße Klaus
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 30.12.19 11:11 
Und noch mal die Frage: wie ist jetzt die ListBox mit deinen Container-Daten verbunden?

Für diesen Beitrag haben gedankt: Klaus777
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mo 30.12.19 11:46 
Mit Bezug auf das Tutorial vielleicht ein paar Anmerkungen, damit auch TH69s Frage deutlicher wird:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TfrmMain.UpdateListBox;
var
  Contact : TContact;
  i : Integer;
  s : string;
begin
  ListBox1.Items.Clear;
  for i := 0 to AddressBook.Contacts.Count - 1 do
  begin
    Contact := AddressBook.Contacts.Items[i];
    s := Contact.LastName + ', ' + Contact.FirstName;
    ListBox1.Items.Add(s);
  end;
end;


In diesem Beispiel aus dem Tutorial sind die Daten in der Liste "AddressBook.Contacts" gespeichert. In die Listbox werden dann über die for-Schleife Strings angezeigt, die aus einigen Datenpunkten der Liste generiert werden (LastName + FirstName). Die Listbox "weiß" aber sonst nichts über die Objekte. Ihr werden quasi nur ein paar Strings zum Anzeigen vor die Füße geworfen. Wenn du dann die Strings verschiebst, dann bekommen die Objekte dahinter nichts davon mit.

Daher gibt es bei der ListBox noch die Methode AddObject, der man nicht nur den String zum Anzeigen, sondern auch ein Datenobjekt übergeben kann. Der Code zum Füllen der Listbox dürfte dann in etwa so aussehen (basierend auf dem Tutorial-Code)

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  for i := 0 to AddressBook.Contacts.Count - 1 do
  begin
    Contact := AddressBook.Contacts.Items[i];
    s := Contact.LastName + ', ' + Contact.FirstName;
    ListBox1.AddObject(s, Contact);
  end;


Damit behältst du beim Verschieben die Referenz auf die Objekte, und kannst diese dann in der neuen Reihenfolge wieder abspeichern.

Allerdings muss man da dann auch aufpassen, dass man die Grenzen zwischen Datenspeicherung im Hintergrund und der Anzeige nicht verwischt. Denn durch das Verschieben der Listbox-Items wird die Reihenfolge der Objekte in der "ursprünglichen Liste" AddressBook.Contacts erstmal nicht verändert. D.h. du müsstest den Code ggf. so erweitern, dass die Move-Operationen auch auf dieser Liste durchgeführt werden.

Zum Staub: Die Motivation hinter der Klasse TContactList in dem Tutorial ist eine Typ-sichere Liste von "Kontakten". Man kann auch (wenn man auf die Typsicherheit verzichten mag) eine normale TObjectList verwenden. Wenn man aber heutzutage (da kommt dann der Staub rein) in dem Kontext Typsicherheit haben will, dann nimmt man Generics. Das Prinzip dahinter (Datenklasse + Containerklasse) kann man aber imho immer noch so anwenden. Daran ändert sich auch wenig, wenn man statt der ListBox andere Komponenten zum Anzeigen nimmt, wie z.B. den VirtualStringTree.

_________________
We are, we were and will not be.

Für diesen Beitrag haben gedankt: Klaus777
Klaus777 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 02.01.20 17:48 
Hallo ihr beiden,
vielen Dank für die Unterstützung.

Meine Überlegungen waren wohl doch aus der „Steinzeit“ und bedürfen dringend einem Refresh. :autsch:

Die Trennung zwischen Anzeige und den eigentlichen Daten und dem Aufwand, das synchron zu halten, hatte nicht verstanden.

Sicherlich könnte ich das jetzt mit dem Beispielobjekt und euren Denkanstößen weitertreiben.
Ein Projektende wäre auch möglich.

Ob das wirklich sinnvoll ist… das habt ihr mir zwischen den Zeilen beantwortet. :think:

Ich werde mich mit den neuen Techniken beschäftigen und einen neuen Versuch starten um das Problem anzugehen. :mahn:


Danke & viele Grüße Klaus