![]() |
Datenbank: SQLite • Version: 3 • Zugriff über: SQLite4Delphi Wrapper von Tim Anderson
Datensätze aus ner ListView ohne ID ändern?
Hallo,
ich suche eine Lösung für folgendes Problem: ich lade aus der DB die Datensätze in eine ListView, die ID (Primärschlüssen) wird bei mir nirgendwo angezeigt. Nun möchte ich einen Datensatz ändern, dazu markiere ich die entsprechende Zeile, aber ich weiß nicht wie ich die Daten dieser Zeile aus der Datenbank holen soll, da ich nicht weiß welche ID sich hinter jeder Zeile verbirgt. Muss ich etwa beim Laden der Datensätze in die ListView noch eine Array Liste führen wo ich jeder Zeile in ListView die entsprechende ID zuweise, oder gibt's da bessere Lösungen? Danke! |
AW: Datensätze aus ner ListView ohne ID ändern?
So wie ich dein Problem versteh gibst du die die Daten deiner DB in einer ListBox aus, jedoch ohne den Primärschlüssel, der sowieso keinen interessiert. Und nun fragst du dich wie man die Item Zeile der LV identifizieren kann. Ist das korrekt?
Nun, erstelle einen Record oder eine simple Klasse für diese Information und binde sie an den Item. Bei Bedarf auslesen und gut ist es. In so ein Objekt kannst du ja alles reinpacken was nicht sichtbar sein soll. //Edit Sorry, meine natürlich ListView, habe oben ListBox geschrieben. Meinte aber trotzdem ListView. |
AW: Datensätze aus ner ListView ohne ID ändern?
Man kann bei vielen Komponenten Benutzerdefinierte Daten hinterlegen.
.Tag bi vielen Komponenten .Objects bei StringListen und sowas wie .Objects gibt's als .Data (glaub ich) bestimmt auch bei einem ListView, für jeden einzelnen Eintrag. Da kannst'e ganz bequem deine ID reinmachen. (notfalls ginge auch eine unsichtbare/ausgeblendete Spalte im View) |
AW: Datensätze aus ner ListView ohne ID ändern?
Zitat:
Jah... und wie blende ich eine Spalte aus? Hab auch schon danach gezielt gesucht, aber nix gefunden. P.S. ich verwende eine ListView! |
AW: Datensätze aus ner ListView ohne ID ändern?
Zitat:
|
AW: Datensätze aus ner ListView ohne ID ändern?
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:
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.
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; |
AW: Datensätze aus ner ListView ohne ID ändern?
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:
das
Info := TInfo.Create;
Info.ID := StrToIntDef(ExtractSubStr(sl[i], 4), -1);
Delphi-Quellcode:
Und schon ist die ID gespeichert.
//gepfuscht
ListItem.Data := Pointer(StrToIntDef(ExtractSubStr(sl[i], 4), -1)); Gelesen wird das so: Statt
Delphi-Quellcode:
so
Info := TInfo(Selected.Data);
ShowMessage(IntToStr(Info.ID));
Delphi-Quellcode:
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.
//gepfuscht
ShowMessage(IntToStr(Integer(Selected.Data))); 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. |
AW: Datensätze aus ner ListView ohne ID ändern?
@Popov
warum nicht nachmachen, solange jeder der damit umgeht weiß was da passiert ... |
AW: Datensätze aus ner ListView ohne ID ändern?
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.
|
AW: Datensätze aus ner ListView ohne ID ändern?
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. :oops: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:49 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 by Thomas Breitkreuz