AGB  ·  Datenschutz  ·  Impressum  







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

TDataset.Locate mit ListView Integer

Ein Thema von Stewag · begonnen am 1. Mär 2018 · letzter Beitrag vom 1. Mär 2018
Antwort Antwort
Stewag

Registriert seit: 12. Jun 2008
161 Beiträge
 
Delphi 12 Athens
 
#1

TDataset.Locate mit ListView Integer

  Alt 1. Mär 2018, 16:46
In einem TListview habe ich als zweite Spalte eine ID als SubItem gesetzt.

Da SubItem nur Strings akzeptiert ist die ID dort als String abgelegt, obwohl das Feld in der Datenbank ein Integer ist.

Nun will ich per Locate nach der ID suchen:

if tdata1.Locate('ID', VarArrayOf([StrToInt(Listview1.items[i].Subitems.Text)]), []) then schlägt aber fehlt mit dem Hinweis, dass "12345" kein gültiger Integer ist.
Offenbar exportiert Variant hier stets einen String.

Hat jemand eine Idee, wie ein Integer exportiert werden kann?
Steffen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.167 Beiträge
 
Delphi 12 Athens
 
#2

AW: TDataset.Locate mit ListView Integer

  Alt 1. Mär 2018, 16:53
Ein Variant kann einen Integer enthalten.
Wenn man einem Variant einen Integer zuweist, dann ist der auch als Typ "Integer" im Variant gespeichert und nicht als String. (Variant kann nicht alles, was Delphi kann, aber den kann er)


Da du nur in einem Feld suchst, lass mal das Array weg und versuche es so
Delphi-Quellcode:
if tdata1.Locate('ID', Listview1.items[i].Subitems.Text, []) then

if tdata1.Locate('ID', StrToInt(Listview1.items[i].Subitems.Text), []) then
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 1. Mär 2018 um 17:12 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.431 Beiträge
 
Delphi 7 Professional
 
#3

AW: TDataset.Locate mit ListView Integer

  Alt 1. Mär 2018, 17:08
himitsus erste Variante sollte eigentlich funktionieren.

Ein VarArrayOf braucht man nur, wenn man gleichzeitig nach mehreren Werten suchen will, z. B. sowas: tdata1.Locate('SpalteVerzeichnis;SpalteDateiname', VarArrayOf([VariabelMitVerzeichnisnamen, VariabelMitDateiname]),[])
Also wenn man beim Locate mehrere Spaltennamen angibt und dann für jede Spalte einen Wert übergeben muss.

Eventuell hilft auch noch ein if tdata1.Locate('ID', Trim(Listview1.items[i].Subitems.Text), []) then . Wenn dann das Problem bleibt, müsste man nach weiteren Fehlern suchen, die nicht zwingend direkt vom Locate, sondern eher von den Daten herrühren könnten.

Dann eventuell mal prüfen, ob es in der ID-Spalte eventuell einen Wert gibt, der kein Integer ist. (Bei 'ner Integerspalte natürlich eher unwahrscheinlich, aber ein NULL-Wert könnte da schon zu einem "komischen" Ergebnis führen.)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.167 Beiträge
 
Delphi 12 Athens
 
#4

AW: TDataset.Locate mit ListView Integer

  Alt 1. Mär 2018, 17:15
Ach ja, ein TDataSet kann eigentlich fast garnichts. (ist mehr sowas wie TStrings, also vor allem eine gemeinsamme Schnittstelle)

Je nach DB-Komponenten kann es sein, dass die hier bissl anders reagieren.
Beim TClientDataSet und bei den DevArt-Komponenten kann man eigentlich auch problemlos einen String mit Zahl rein geben, obwohl man in einem Integer-Feld sucht.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: TDataset.Locate mit ListView Integer

  Alt 1. Mär 2018, 17:16
Hallo,
ich würde einfach mal mit einer lokalen Variable arbeiten.
Da macht das Debuggen auch noch mehr Spaß.
Heiko
  Mit Zitat antworten Zitat
Stewag

Registriert seit: 12. Jun 2008
161 Beiträge
 
Delphi 12 Athens
 
#6

AW: TDataset.Locate mit ListView Integer

  Alt 1. Mär 2018, 17:18
Hallo,

danke für die schnellen Antworten.
Habe nun fest gestellt, dass das Variant gar nicht der Grund für den Fehler war sondern der im Subitem enthaltene Zeilenumbruch.

showmessage('M'+Listview2.items[i].Subitems.Text+'M'); ergibt nämlich diese Ausgabe:

M12345
M

und nicht diese: M12345M

Die Zuweisung sieht so aus: ListItem2.SubItems.Add(qCompare2.FieldByName('ID').AsString);
Steffen
  Mit Zitat antworten Zitat
Stewag

Registriert seit: 12. Jun 2008
161 Beiträge
 
Delphi 12 Athens
 
#7

AW: TDataset.Locate mit ListView Integer

  Alt 1. Mär 2018, 17:22
... bzw. vollständige Zuweisung:

Delphi-Quellcode:
ListItem1, ListItem2: TListItem;

  ListItem2 := ListView2.Items.Add;
  ListItem2.Caption := qCompare2.FieldByName('Bezeichnung').AsString;
  ListItem2.SubItems.Add(qCompare2.FieldByName('ID').AsString);
Steffen
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.431 Beiträge
 
Delphi 7 Professional
 
#8

AW: TDataset.Locate mit ListView Integer

  Alt 1. Mär 2018, 17:32
Dann sollte das Trim ausreichen, da das u. a. führende und folgende Zeilenumbrüche wegnimmt.

Bei Stringlisten (und SubItems scheint hier dann jeweils eine zu sein (TListItem.SubItems Property)), bekommt man beim Zugriff auf Text immer einen Zeilenumbruch am Ende "mitgeliefert". Der ist bei Integer nicht so wirklich hilfreich.

Mögliche Lösung (grob und ungetestet):
Delphi-Quellcode:
if Listview1.items[i].Subitems.Count > 0 then begin
  if tdata1.Locate('ID', Listview1.items[i].Subitems[0]), []) then begin

  end;
end;
// oder
if Listview1.items[i].Subitems.Count > 0 then begin
  if tdata1.Locate('ID', StrToInt(Listview1.items[i].Subitems[0])), []) then begin

  end;
end;
// oder
if tdata1.Locate('ID', StrToInt(Trim(Listview1.items[i].Subitems.Text))), []) then begin

end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.167 Beiträge
 
Delphi 12 Athens
 
#9

AW: TDataset.Locate mit ListView Integer

  Alt 1. Mär 2018, 17:33
Zitat von Stewag:
schlägt aber fehlt mit dem Hinweis, dass "12345" kein gültiger Integer ist.
Habe nun fest gestellt, dass das Variant gar nicht der Grund für den Fehler war sondern der im Subitem enthaltene Zeilenumbruch.
Ich würde fast wetten das hätte man auch in der Fehlermelung gesehn, wenn du sie "komplett" kopiert hättest.

Strg+C im Exception-Dialog (geht in fast allen Delphi-Dialogen)
und Strg+V hier im Forum, mit [QUOTE]...[/QUOTE] drumrum.

Zitat:
Listview1.items[i].Subitems.Text
Joar, wenn SubItems z.B. eine StringList wäre
und du auch alle Subitems abfragst, anstatt nur das Gewünschte, dann wäre natülich nach jedem SubItem ein Zeilenumbruch.
Listview1.Items[i].SubItems[0] , Listview1.Items[i].SubItems[0].Text oder irgendwie so, für das erste SubItem.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Stewag

Registriert seit: 12. Jun 2008
161 Beiträge
 
Delphi 12 Athens
 
#10

AW: TDataset.Locate mit ListView Integer

  Alt 1. Mär 2018, 17:39
... sooo simpel, ihr seid klasse - vielen Dank!
Und ja, man hätte es an der Fehlermeldung sehen können
Steffen
  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 19: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