![]() |
Listboxeinträge mit Objekten löschen
Ich habe eine Listbox in der ich mit AddObject Einträge hinzufüge. Dann habe ich ein Eingabefeld, welches die Listboxeinträge filtert im OnChange Ereignis des Eingabefeldes:
Delphi-Quellcode:
Der Inhalt der Listbox wird also gelöscht und dann werden nur Items hinzugefügt, die den Filterkriterien entsprechen. Jetzt ist es allerdings so, dass, wenn man auf einen gefilterten Eintrag doppelt klickt, nicht die zugehörigen Daten, die im Objekt des Eintrages gespeichert sind, des gefilterten Eintrages angezeigt werden, sondern die Daten des Eintrages im ungefilterten Zustand.
procedure TfrmAdressen.ApplyFilter;
var i : Integer; begin lbContacts.Items.Clear; case cbFind.ItemIndex of 0: // Name oder Vorname begin for i := 0 to ContactCollection.Count - 1 do begin if ((pos(LowerCase(edtFind.Text), LowerCase(ContactCollection.Items[i].Name)) > 0) or (pos(Lowercase(edtFind.Text), LowerCase(ContactCollection.Items[i].Vorname)) > 0)) then lbContacts.AddItem('', ContactCollection.Items[i]); end; end; 1: // Ort begin for i := 0 to ContactCollection.Count - 1 do begin // ...; Und das verstehe ich nicht, denn ich lösche doch die Listbox. Allerdings scheint die Listbox noch die alten Objekteinträge gespeichert zu haben. |
Re: Listboxeinträge mit Objekten löschen
Wie greifst Du im OnClick denn auf das Objekt zu?
Ansonsten kann ich in der bisherigen Vorgehensweise keinen Fehler sehen... |
Re: Listboxeinträge mit Objekten löschen
Über den Index des Listboxeintrages:
Delphi-Quellcode:
Aber der Zeiger scheint noch der alte zu sein.
procedure TfrmAdressen.ShowContactDetails;
var ContactForm : TContactForm; begin if (lbContacts.ItemIndex > -1) then begin ContactForm := TContactForm.Create(nil); try // Kontakt Objekt von Listbox an Kontaktformular übergeben // Das Listbox Objekt ist ein Zeiger auf das Objekt in der Kontakt Collection ContactForm.Contact := TContact(lbContacts.Items.Objects[lbContacts.ItemIndex]); ContactForm.ContactList := ContactCollection; ContactForm.CurrentContactIndex := lbContacts.ItemIndex; ContactForm.ShowModal; |
Re: Listboxeinträge mit Objekten löschen
Delphi-Quellcode:
Der Index in der Original-Collection stimmt garantiert nicht mehr, wenn die Collection gefiltert ist. Du musst Ihn über IndexOf() (falls vorhanden) neu bestimmen. :)
ContactForm.ContactList := ContactCollection;
ContactForm.CurrentContactIndex := lbContacts.ItemIndex; Oder du speicherst beim Filtern im Objekt des Listeintrages nur den Original-Index ab, damit könntest Du das auch lösen. |
Re: Listboxeinträge mit Objekten löschen
Was meinst du mit original Collection? Die Collection mit allen Datensätzen wird nicht verändert. Sie wird nur durchsucht und passende Datensätze werden in der Listbox angezeigt:
Delphi-Quellcode:
Die Reihenfolge der Datesätze in der Collection bleibt unverändert.
for i := 0 to ContactCollection.Count - 1 do
begin if ((pos(LowerCase(edtFind.Text), LowerCase(ContactCollection.Items[i].Name)) > 0) or (pos(Lowercase(edtFind.Text), LowerCase(ContactCollection.Items[i].Vorname)) > 0)) then lbContacts.AddItem('', ContactCollection.Items[i]); end; Zitat:
|
Re: Listboxeinträge mit Objekten löschen
Ich meine dein "ContactCollection" Objekt, sorry falls das undeutlich war.
Ist TContact(lbContacts.Items.Objects[lbContacts.ItemIndex]) denn das richtige Objekt? Es müsste es auf jeden Fall sein, aber die von mir zitierten Code-Zeilen fand ich bedenklich, da diese eine Verbindung von lbContacts.ItemIndex und ContactCollection suggerieren. Verwendest Du diese beiden Elemente zusammen in einer gefilterten Liste passt ItemIndex nicht mehr zum richtigen Eintrag in ContactCollection... Edit: Rechtschreibung |
Re: Listboxeinträge mit Objekten löschen
Jupp an der Stelle hab eich den richtigen Kontakt, aber in der Form, die dann geöffnet wird, werden die falschen Daten angezeigt, nämlich die, die zu ungefilterten Liste gehören. Kann es sein, dass wir an der falschen Stelle suchen? Hie rnoch mal die gesamte Doppelklick-Routine:
Delphi-Quellcode:
procedure TfrmAdressen.ShowContactDetails;
var ContactForm : TContactForm; begin if (lbContacts.ItemIndex > -1) then begin ContactForm := TContactForm.Create(nil); try // Kontakt Objekt von Listbox an Kontaktformular übergeben // Das Listbox Objekt ist ein Zeiger auf das Objekt in der Kontakt Collection ContactForm.Contact := TContact(lbContacts.Items.Objects[lbContacts.ItemIndex]); ContactForm.ContactList := ContactCollection; ContactForm.CurrentContactIndex := lbContacts.ItemIndex; ContactForm.ShowModal; // wenn geändert Modified flag setzen if ContactForm.Contact.HasBeenModified then begin // nichts mehr zu machen // Das Kontakt Objekt wurde im Kontaktformular geändert. // Da wir nur mit Zeigern arbeiten, // ist auch das Objekt in der Kontakt Collection betroffen. ContactCollection.HasBeenModified := True; FillListbox; UpdateStatusbar; end; finally ContactForm.Release; end; end; end; |
Re: Listboxeinträge mit Objekten löschen
Zeig doch mal den Code, wo das ContactForm aus das Contact-Objekt zugreift. Wie ich aber schon schrieb ist meiner Ansicht nach "CurrentContactIndex" im Fall einer gefilterten Liste falsch, da der Listen-Index(!) nicht auf das richtige Objekt in ContactCollection zeigt (den Du ja auch dem ContactForm übergibst).
Viele Grüße |
Re: Listboxeinträge mit Objekten löschen
Zitat:
Delphi-Quellcode:
procedure TContactForm.FormShow(Sender: TObject);
begin if FCurrentContactIndex > -1 then begin //Contact := ContactList.Items[FCurrentContactIndex]; Caption := Format('%s', [Helper.MakeCaption(Contact.Name, Contact.Vorname, Contact.Firma)]); if Caption = '' then Caption := 'Neuer Kontakt'; DisplayData(FContact); SetTlbState; end else begin tlbPrevious.Enabled := False; tlbNext.Enabled := False; end; sgDetails.TabOrder := 0; end;
Delphi-Quellcode:
Contact ist eine Property der Form und anscheinend hat sie eine höhere Priorität als der übergeben Parameter. Wen nich die Zeile
procedure TContactForm.DisplayData(Contact: TContact);
begin Self.Caption := Format('%s', [Helper.MakeCaption(Contact.Name, Contact.Vorname, Contact.Firma)]); sgDetails.Cells[1, 0] := Contact.Name; sgDetails.Cells[1, 1] := Contact.Vorname; sgDetails.Cells[1, 2] := Contact.Firma; sgDetails.Cells[1, 3] := Contact.Strasse; sgDetails.Cells[1, 4] := Contact.PLZ; sgDetails.Cells[1, 5] := Contact.Ort; sgDetails.Cells[1, 6] := Contact.Land; sgDetails.Cells[1, 7] := Contact.Telefon1; sgDetails.Cells[1, 8] := Contact.Telefon2; sgDetails.Cells[1, 9] := Contact.EMail1; sgDetails.Cells[1, 10] := Contact.EMail2; sgDetails.Cells[1, 11] := Contact.Homepage; sgDetails.Cells[1, 12] := Contact.Gebdat; memBem.Text := Contact.Bemerkung; Statusbar1.SimpleText := 'geändert am: ' + Contact.Modified; Modified := False; end; Contact := ContactList.Items[FCurrentContactIndex]; auskommentiere funktioniert es. Jetzt mus sich nur noch rausfinden wozu die Zeile eigentlich gut war. ;) Problem hat sich also erledigt. Danke für Tipps. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:23 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