AGB  ·  Datenschutz  ·  Impressum  







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

Listboxeinträge mit Objekten löschen

Ein Thema von Luckie · begonnen am 22. Aug 2009 · letzter Beitrag vom 22. Aug 2009
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Listboxeinträge mit Objekten löschen

  Alt 22. Aug 2009, 14:34
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:
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
          // ...;
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.

Und das verstehe ich nicht, denn ich lösche doch die Listbox. Allerdings scheint die Listbox noch die alten Objekteinträge gespeichert zu haben.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Listboxeinträge mit Objekten löschen

  Alt 22. Aug 2009, 14:38
Wie greifst Du im OnClick denn auf das Objekt zu?
Ansonsten kann ich in der bisherigen Vorgehensweise keinen Fehler sehen...
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Listboxeinträge mit Objekten löschen

  Alt 22. Aug 2009, 14:46
Über den Index des Listboxeintrages:
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;
Aber der Zeiger scheint noch der alte zu sein.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Listboxeinträge mit Objekten löschen

  Alt 22. Aug 2009, 14:48
Delphi-Quellcode:
  ContactForm.ContactList := ContactCollection;
  ContactForm.CurrentContactIndex := lbContacts.ItemIndex;
Der Index in der Original-Collection stimmt garantiert nicht mehr, wenn die Collection gefiltert ist. Du musst Ihn über IndexOf() (falls vorhanden) neu bestimmen.
Oder du speicherst beim Filtern im Objekt des Listeintrages nur den Original-Index ab, damit könntest Du das auch lösen.
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Listboxeinträge mit Objekten löschen

  Alt 22. Aug 2009, 14:52
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:
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;
Die Reihenfolge der Datesätze in der Collection bleibt unverändert.

Zitat von mirage228:
Oder du speicherst beim Filtern im Objekt des Listeintrages nur den Original-Index ab, damit könntest Du das auch lösen.
Das könnte ich natürlich auch machen, anstatt alle Daten zu speichern nur den Index, wo die dfaten in der Collection stehen. Würde allerdings bedeuten, dass ich den bestehenden Code an mehereren Stellen ändern müsste und davor schrecke ich noch etwas zurück, da es eine ziemliche Arbeit wäre.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Listboxeinträge mit Objekten löschen

  Alt 22. Aug 2009, 14:55
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Listboxeinträge mit Objekten löschen

  Alt 22. Aug 2009, 15:02
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;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Listboxeinträge mit Objekten löschen

  Alt 22. Aug 2009, 15:05
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Listboxeinträge mit Objekten löschen

  Alt 22. Aug 2009, 15:21
Zitat von mirage228:
Zeig doch mal den Code, wo das ContactForm aus das Contact-Objekt zugreift.
Danke das wars:
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:
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 ist eine Property der Form und anscheinend hat sie eine höhere Priorität als der übergeben Parameter. Wen nich die Zeile
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 07:18 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