Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi An ListView ein SubItem anhängen (https://www.delphipraxis.net/93910-listview-ein-subitem-anhaengen.html)

Chemiker 13. Jun 2007 08:16


An ListView ein SubItem anhängen
 
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

Delphi-Quellcode:
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

uwewo 13. Jun 2007 08:28

Re: An ListView ein SubItem anhängen
 
Hallo,

sollte doch irgendwie so funktionieren


Delphi-Quellcode:
MSAnzeigenListView.Items.Item[DeinIndex].SubItems.Add(MSObj.MSNr);
je nachdem auch
Delphi-Quellcode:
MSAnzeigenListView.Items.Item[Listview1.Selected.Index].SubItems.Add(MSObj.MSNr);

Chemiker 13. Jun 2007 08:45

Re: An ListView ein SubItem anhängen
 
Hallo uwewo,

danke für die schnelle Antwort.

Mit

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

Bis bald Chemiker

marabu 13. Jun 2007 09:00

Re: An ListView ein SubItem anhängen
 
Hallo,

Zitat:

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

SirThornberry 13. Jun 2007 09:02

Re: An ListView ein SubItem anhängen
 
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 :gruebel: 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
Delphi-Quellcode:
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.

Flocke 13. Jun 2007 09:05

Re: An ListView ein SubItem anhängen
 
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...

Chemiker 13. Jun 2007 10:13

Re: An ListView ein SubItem anhängen
 
Hallo,

danke für die Antwort.

Mit

Delphi-Quellcode:
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

SirThornberry 13. Jun 2007 10:18

Re: An ListView ein SubItem anhängen
 
kopiert wird da nichts. wie gesagt ruft addobject auch nur Items.Add auf und weißt Data und caption zu

Chemiker 13. Jun 2007 11:31

Re: An ListView ein SubItem anhängen
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:25 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