AGB  ·  Datenschutz  ·  Impressum  







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

An ListView ein SubItem anhängen

Ein Thema von Chemiker · begonnen am 13. Jun 2007 · letzter Beitrag vom 13. Jun 2007
Antwort Antwort
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#1

An ListView ein SubItem anhängen

  Alt 13. Jun 2007, 09:16
Hallo,

ich füge mit der Methode AddItem ein neues ListenEintrag in eine ListView ein.

Wenn die Daten aus einem Stream gelesen werden, habe ich kein Problem:

Delphi-Quellcode:
  MSObj:= TMSV1.Create; // Obj. für die Liste erzeugen
    MSObj.MSDateiName:= MSDateiName;
    MSObj.MSLesen:= i+1; // Datensatz auslesen
    MSAnzeigenListView.AddItem(MSObj.MaNr+MSObj.MSNr,MSObj);
    MSAnzeigenListView.Items.Item[i].SubItems.Add(MSObj.MaNr);
    MSAnzeigenListView.Items.Item[i].SubItems.Add(MSObj.MSNr);
    MSAnzeigenListView.Items.Item[i].SubItems.Add(MSObj.MaBez);
    MSAnzeigenListView.Items.Item[i].SubItems.Add(MSObj.MaGruppe1);
    // Anzeige des Richtigen Icons
    If MSObj.DarstellungsArt = 0 then
    begin
      MSAnzeigenListView.Items.Item[i].ImageIndex:= 1;
    end;
Ich habe dann ein Problem, wenn ein neuer Eintrag an die Liste angehängt werden soll

Delphi-Quellcode:
  if (NOT(blIdNrVorhanden)) then
    begin
      MSObj:= TMSV1.Create; // Obj. für die Liste erzeugen
      MSAnzeigenListView.SmallImages:= ImageList1;
      MSObj.MaNr:= MaNrComboBox3.Text;
      MSObj.MSNr:= MSNrComboBox4.Text;
      MSObj.MABez:= MaBezComboBox1.Text;
      MSObj.MaGruppe1:= MaschinenGruppe1ComboBox2.Text;

     MSAnzeigenListView.AddItem(MSObj.MaNr+MSObj.MSNr,MSObj);
Das funktioniert auch, aber mir ist nun nicht klar, wie ich die SubItems für diesen neuen Eintrag in die ListView bekomme.

Mit

MSAnzeigenListView.Items.Item.SubItems.Add(MSObj.MSNr); geht’s nicht, weil der Index hinter Item fehlt, nur wie bekomme ich diesen Index für diesen neuen Eintrag?

Noch ein Hinweis, mir ist klar das ich auch mit TListItem arbeiten könnte und die Methode
ListView.Items.Add; verwenden könnte, dies hat aber den Nachteil das ich die Daten ins Object kopieren müsste.


Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#2

Re: An ListView ein SubItem anhängen

  Alt 13. Jun 2007, 09:28
Hallo,

sollte doch irgendwie so funktionieren


MSAnzeigenListView.Items.Item[DeinIndex].SubItems.Add(MSObj.MSNr); je nachdem auch
MSAnzeigenListView.Items.Item[Listview1.Selected.Index].SubItems.Add(MSObj.MSNr);
Uwe
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: An ListView ein SubItem anhängen

  Alt 13. Jun 2007, 09:45
Hallo uwewo,

danke für die schnelle Antwort.

Mit

MSAnzeigenListView.Items.Item[MSAnzeigenListView.Selected.Index].SubItems.Add(MSObj.MaNr); bekomme ich leider eine Zugriffverletzung.

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: An ListView ein SubItem anhängen

  Alt 13. Jun 2007, 10:00
Hallo,

Zitat von Chemiker:
... mir ist klar das ich auch mit TListItem arbeiten könnte und die Methode ListView.Items.Add; verwenden könnte, dies hat aber den Nachteil das ich die Daten ins Object kopieren müsste. ...
das verstehe ich nicht. Die Methode Add() von TListItems dient genau zur Ermittlung des neuen Index und du kopierst doch so oder so alles in dein MSObj:

Delphi-Quellcode:
// ...
    if not blIdNrVorhanden then
    begin
      MSObj:= TMSV1.Create; // Obj. für die Liste erzeugen
      MSAnzeigenListView.SmallImages:= ImageList1;
      MSObj.MaNr:= MaNrComboBox3.Text;
      MSObj.MSNr:= MSNrComboBox4.Text;
      MSObj.MABez:= MaBezComboBox1.Text;
      MSObj.MaGruppe1:= MaschinenGruppe1ComboBox2.Text;

      with MSAnzeigenListView.Items.Add do
      begin
        Caption := MSObj.MaNr + MSObj.MSNr;
        Data := MSObj;
        SubItems.Add('...');
      end;
Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: An ListView ein SubItem anhängen

  Alt 13. Jun 2007, 10:02
Items.Add gibt dir ein TListItem zurück. Dieses kannst du direkt ansprechen und musst somit nicht per Index drauf zugreifen.
Also an stelle von:
Delphi-Quellcode:
var
  lListItem: TListItem;
begin
  MSObj:= TMSV1.Create; // Obj. für die Liste erzeugen
  MSObj.MSDateiName:= MSDateiName;
  MSObj.MSLesen:= i+1; // Datensatz auslesen
  lListItem := MSAnzeigenListView.Items.Add();
  lListItem.Caption := MSObj.MaNr+MSObj.MSNr;
  lListItem.Data := MSObj;
  lListItem.SubItems.Add(MSObj.MaNr);
  lListItem.SubItems.Add(MSObj.MSNr);
  lListItem.SubItems.Add(MSObj.MaBez);
  lListItem.SubItems.Add(MSObj.MaGruppe1);
  // Anzeige des Richtigen Icons
  If MSObj.DarstellungsArt = 0 then
  begin
    lListItem.ImageIndex:= 1;
  end;
Zitat:
Noch ein Hinweis, mir ist klar das ich auch mit TListItem arbeiten könnte und die Methode
ListView.Items.Add; verwenden könnte, dies hat aber den Nachteil das ich die Daten ins Object kopieren müsste.
versteh ich nicht es ist doch das gleiche ob du AddItem verwendest oder Add einzeln und anschließend Item.Data und Item.Caption zuweist. AddItem macht ja auch nichts anderes:
Zitat:
procedure TCustomListView.AddItem(Item: String; AObject: TObject);
begin
with Items.Add do
begin
Caption := Item;
Data := AObject;
end;
end;
ich versteh nicht warum man diese unbedingt 2 zeilen sparen will und sich damit solche Probleme bzw. schwierigkeiten einhandelt.

Aber wenn du unbedingt bei deiner Variante bleiben willst versteh ich auch nicht das Problem. Im ersteren Quelltext greifst du mit i drauf zu. Wenn du mit AddObject ein neues Item hinzufügst wird dieses auch nur ans Ende angehangen. Dementsprechend ist
i = ListView.Items.Count - 1; Was aber wie gesagt völlig unnötig ist. Denn durch den Zugriff mit Items.Item[i] werden intern auch GetMethoden aufgerufen die das ganze nur langsamer machen als ein direktzugriff auf das Item. Denn durch Items.Item[i] wird jedesmal erst das Items abgerufen (was du ja auch gleich hamm könntest wenn du Add verwendest) und danach passiert das gleiche. Also unnötige Schritte.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

Re: An ListView ein SubItem anhängen

  Alt 13. Jun 2007, 10:05
Pflichte meinen Vorrednern bei, und auch hier brauchst du keinen Index:
Das:
Code:
MSAnzeigenListView.Items.Item[MSAnzeigenListView.Selected.Index]...
ist von hinten durch die Brust ins Bein geschossen dasselbe wie
Code:
MSAnzeigenListView.Selected...
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: An ListView ein SubItem anhängen

  Alt 13. Jun 2007, 11:13
Hallo,

danke für die Antwort.

Mit

MSAnzeigenListView.Items.Item[MSAnzeigenListView.Items.Count-1].SubItems.Add(MSObj.MaNr); wird das SubItem nicht angezeigt.

Ich habe die Methode ListView.AddItem verwendet, weil sonst die Daten ins Object kopiert werden müssen und mit der Methode nur einfach angehängt werden.

Ich werden das ganze noch mal Testen, vielleicht habe ich ja irgendetwas übersehen beim ersten Versuch.


Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: An ListView ein SubItem anhängen

  Alt 13. Jun 2007, 11:18
kopiert wird da nichts. wie gesagt ruft addobject auch nur Items.Add auf und weißt Data und caption zu
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: An ListView ein SubItem anhängen

  Alt 13. Jun 2007, 12:31
Hallo,

habe das ganze noch auf ListView.Item.add umgeschrieben.

Delphi-Quellcode:
for I := 0 to AnzahlDatenSaetze - 1 do
  begin
    MSObj:= TMSV1.Create;
    MSObj.MSDateiName:= MSDateiName;
    MSObj.MSLesen:= i+1; // Datensatz auslesen
    ListIt:= MSAnzeigenListView.Items.Add();
    ListIt.Caption:= MSObj.MaNr+MSObj.MSNr;
    ListIt.Data:= MSObj;
    ListIt.SubItems.Add(MSObj.MaNr);
    ListIt.SubItems.Add(MSObj.MSNr);
    ListIt.SubItems.Add(MSObj.MaBez);
    ListIt.SubItems.Add(MSObj.MaGruppe1);
    ListIt.ImageIndex:= MSObj.DarstellungsArt;
  end;
und einzelne Einträge so

Delphi-Quellcode:
if (NOT(blIdNrVorhanden)) then
    begin
      MSObj:= TMSV1.Create; // Obj. für die Liste erzeugen
      MSAnzeigenListView.SmallImages:= ImageList1;
      MSObj.MaNr:= MaNrComboBox3.Text;
      MSObj.MSNr:= MSNrComboBox4.Text;
      MSObj.MABez:= MaBezComboBox1.Text;
      MSObj.MaGruppe1:= MaschinenGruppe1ComboBox2.Text;
      MSObj.DarstellungsArt:= ComboBoxEx1.ItemIndex;

      ListIt:= MSAnzeigenListView.Items.Add;
      ListIt.Caption:= MSObj.MaNr+MSObj.MSNr;
      ListIt.SubItems.Add(MSObj.MaNr);
      ListIt.SubItems.Add(MSObj.MSNr);
      ListIt.SubItems.Add(MSObj.MaBez);
      ListIt.SubItems.Add(MSObj.MaGruppe1);
      ListIt.ImageIndex:= MSObj.DarstellungsArt;
      ListIt.Data:= MSObj;
    end
und es funktioniert ohne Problem, weis auch nicht was ich beim erstenmal Falsch gemacht habe.

Vielen dank für die Tipps.

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  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 22:14 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