AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Datensätze aus ner ListView ohne ID ändern?
Thema durchsuchen
Ansicht
Themen-Optionen

Datensätze aus ner ListView ohne ID ändern?

Ein Thema von AlexII · begonnen am 15. Okt 2012 · letzter Beitrag vom 16. Okt 2012
Antwort Antwort
Popov
(Gast)

n/a Beiträge
 
#1

AW: Datensätze aus ner ListView ohne ID ändern?

  Alt 15. Okt 2012, 19:27
Hast wahrscheinlich schon selbst gelöst, aber ich habe so Just4Fun ein Beispiel geprogt. Vielleicht interessiert es mal einen.

Beispiel ist nicht perfekt, kann man besser machen, ich hoffe ohne Fehler. Nicht wundern über Teile des Beispiels, einige Funktionen habe ich aus einem anderen Projekt genommen, vor allem die Daten für Beispiel.

Delphi-Quellcode:
type
  TInfo = class
    ID: Integer;
  end;

  {Gibt den X-ten Teilstring eines mit Kommas getrennten Daten-Strings}
function ExtractSubStr(Str: String; Index: Integer): String;
var
  i: Integer;
begin
  Result := '';
  if Index < 1 then Exit;
  Str := Str + ',';
  for i := 1 to Index - 1 do Delete(Str, 1, Pos(',', Str));
  Result := Trim(Copy(Str, 1, Pos(',', Str) - 1));
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  sl: TStringList;
  i: Integer;
  NewColumn: TListColumn;
  ListItem: TListItem;
  Info: TInfo;
begin
  with ListView1 do
  begin
    ViewStyle := vsReport;
     
    //Erstellt Spalten
    NewColumn := Columns.Add;
    NewColumn.Caption := 'Name';
    NewColumn := Columns.Add;
    NewColumn.Caption := 'Ort';
    NewColumn := Columns.Add;
    NewColumn.Caption := 'Freunde';

    {Beispieldaten. Letzter Wert ist eine ID}
    sl := TStringList.Create;
    try
      //Beispieldaten in TStringList
      sl.Add('Anna, Köln, 1 Gemeinsame Freunde, 0');
      sl.Add('Kristina, München, 1 Gemeinsame Freunde, 1');
      sl.Add('Sonja, Berlin,,2');
      sl.Add('Petra, Frankfurt, 1 Gemeinsame Freunde, 3');
      sl.Add('Berbel, Lübeck,, 4');

      for i := 0 to sl.Count - 1 do
      begin
        //Daten an ListView übergeben
        ListItem := Items.Add;
        ListItem.Caption := ExtractSubStr(sl[i], 1);
        ListItem.SubItems.Add(ExtractSubStr(sl[i], 2));
        ListItem.SubItems.Add(ExtractSubStr(sl[i], 3));

        //Info 4 an die TInfo Klasse
        Info := TInfo.Create;
        Info.ID := StrToIntDef(ExtractSubStr(sl[i], 4), -1);
        //Objekt an Item Data übergeben
        ListItem.Data := Info;
      end;
    finally
      sl.Free;
    end;
  end;
end;

procedure TForm1.ListView1Click(Sender: TObject);
var
  Info: TInfo;
begin
  with ListView1 do
  begin
    if ItemIndex < 0 then Exit;

    Info := TInfo(Selected.Data);
    ShowMessage(IntToStr(Info.ID));
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  Info: TInfo;
  i: Integer;
begin
  with ListView1 do
  begin
    for i := 0 to Items.Count - 1 do
    begin
      //Diese Funktion gibt die Objekte wieder frei.
      //Beim löschen eines Items müß immer vorher das Objekt freigegeben werden
      Info := TInfo(Items[i].Data);
      Info.Free;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Info: TInfo;
  i: Integer;
begin
  with ListView1 do
  begin
    if ItemIndex < 0 then Exit;
    if Selected = nil then Exit;

    //Beim löschen eines Items vorher Objekt freigeben
    Info := TInfo(Selected.Data);
    Info.Free;
    Selected.Delete;
  end;
end;
TInfo ist eine simple Klasse die die ID beinhaltet, mehr nicht. Wichtig ist vor allem, dass nicht mehr direkt gelöscht wird, sondern vorher immer zuerst das Object des Items freigegeben wird.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#2

AW: Datensätze aus ner ListView ohne ID ändern?

  Alt 15. Okt 2012, 20:37
He he, wobei, aber dafür wird man in der Regel gesteinigt, da hab ich vor über 15 Jahren mal so ein Beispiel gesehen und der ist mir im Kopf geblieben, kann man ja den Pointer von Data als Integer-Variable missbrauchen. Ich hab es auch mal in meiner Unkenntnis gemacht und es hat funktioniert. Danach nie wieder, aber es hat funktioniert. Und es hat einen kleinen Vorteil.

Achtung! Ab hier Pfusch am Bau!

Also der Pointer von Data ist ja auch nur eine Art Integer. Nur ist sein Sinn eben Adressen zu beinhalten. Aber wenn man ja nur ein Integer irgendwo speichern muß, warum nicht dazu den Poniter dazu missbrauchen.

Statt
Delphi-Quellcode:
        Info := TInfo.Create;
        Info.ID := StrToIntDef(ExtractSubStr(sl[i], 4), -1);
das
Delphi-Quellcode:
           //gepfuscht
           ListItem.Data := Pointer(StrToIntDef(ExtractSubStr(sl[i], 4), -1));
Und schon ist die ID gespeichert.

Gelesen wird das so:

Statt
Delphi-Quellcode:
    Info := TInfo(Selected.Data);
    ShowMessage(IntToStr(Info.ID));
so
Delphi-Quellcode:
    //gepfuscht
    ShowMessage(IntToStr(Integer(Selected.Data)));
Der besondere Pfuschvorteil ist, dass keine Objekte freigegeben werden müssen. Man kann den Item einfach so löschen. Trotzdem kann es böse Folgen haben.

Wie gesagt, ich hab es mal vor etwa 15 Jahre in einem eigentlich guten und professionellem Tutorial gesehen. Ich schätze der Typ wollte sich in seinem ersten Beispiel auf das Wesentliche konzentrieren und hat statt einem Objekt einen Integer-Wert an Data gehangen.

Das nur als so geschrieben, bitte nicht nachmachen.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: Datensätze aus ner ListView ohne ID ändern?

  Alt 15. Okt 2012, 21:57
@Popov

warum nicht nachmachen, solange jeder der damit umgeht weiß was da passiert ...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.545 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Datensätze aus ner ListView ohne ID ändern?

  Alt 16. Okt 2012, 07:09
Windows selbst macht das auch öfter mal so: wParam und lParam sind ja auch nichts anderes als ganze Zahlen, nehmen aber trotzdem gelegentlich Pointer auf.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#5

AW: Datensätze aus ner ListView ohne ID ändern?

  Alt 16. Okt 2012, 07:21
Ich würde bei diesem kleinen Grundkurs noch einige Dinge verbessern:
1. TInfo sollte alle Daten enthalten, schließlich wird die ListView ja nur eine Visualisierung der Daten verwendet. Hier hat man beim Speichern das Problem, das die Anzahl der gemeinsamen Freunde mühsam aus einem Eintrag extrahier werden müsste-
2. Das Aufteilen der Strings per ExtractSubStr ist nicht gerade best practice.

Aber ich denke, wenn man erst einmal anfängt, kann man endlos verbessern. Immerhin hat sich Popov die Mühe gemacht, so ein Beispiel anzufertigen. Ich kenne einige, die dazu zu faul sind.
  Mit Zitat antworten Zitat
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Datensätze aus ner ListView ohne ID ändern?

  Alt 16. Okt 2012, 07:34
Geht ganz einfach:

Schreiben der ID:
Delphi-Quellcode:
var
  ListItem: TListItem;
begin
  ListItem := ListView1.Items.Add;
  ListItem.Caption := 'xyz';
  //...
  ListItem.Data := TObject(DeineDBKompo.FieldAsInteger);
end;
Lesen:
Delphi-Quellcode:
var
  ID: Integer;
begin
  ID := Integer(ListItem.Data);
end;
Andreas Lauß
Blog
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#7

AW: Datensätze aus ner ListView ohne ID ändern?

  Alt 16. Okt 2012, 14:14
Das Aufteilen der Strings per ExtractSubStr ist nicht gerade best practice.
Das eigentlich Problem mit Beispielen ist sie so zu konzipieren, dass deren Code sich nur um das Wesentliche dreht und die Lösung gleich erkennbar ist. Die Lösung per ExtractSubStr war in diesem Fall bewußt nicht optimal, sondern nur zweckmäßig. Wie auch immer AllexII seine ListView organisiert, er hat eine Methode für seine Standarddaten. Und die wollte ich nicht in Frage stellen. Ihm fehlte nur noch die Möglichkeit ein Wert extra zu speichern. Der unwichtige Part sollte hier besonders kurz gehalten werden. Ich hab gestern zufällig ein anderes Beispiel für ListBox veröffentlicht und dort die Daten auch zuerst als Record angehängt. Allerdings war ich mir dann nicht sicher ob die Methode für den Empfänger zu komplex oder zu neu ist. Also habe ich die Daten in einen String gelegt. Das versteht jeder.

Aber um auf deine Aussage zu kommen - natürlich hast du Recht. Ist man erst mal gezwungen Daten als Objekt anzuhängen, was lediglich das Löschen der Daten geringfügig verkompliziert, kann man es letztendlich für alle Daten nutzen, denn dann sind die Möglichkeiten fast unendlich.
  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 05:56 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