Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Listview verhält sich komisch (https://www.delphipraxis.net/194827-listview-verhaelt-sich-komisch.html)

Vienesko 11. Jan 2018 10:36

Delphi-Version: 7

Listview verhält sich komisch
 
Moin Moin,

Ich habe auf meiner Datenbankoberfläche eine ListView, die sich ihre Daten aus einer MySQL Datenbank holt.

Nun möchte ich mehrere Werte aus dieser Listview miteinander vergleichen und die Zeilen dann dementsprechenden einfärben.
Das ganze habe ich nach folgendem Beispiel realisiert:
http://www.delphipraxis.net/54915-li...n-faerben.html

Bei mir sieht das dann so aus:
Delphi-Quellcode:
procedure TmainFrm.ListView2CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
 if Item.SubItems[2] < Item.SubItems[3]
    then Sender.Canvas.Brush.Color := clYellow
    else if DateToStr(Date) = Item.SubItems[4]
          then Sender.Canvas.Brush.Color := clRed
end;
In SubItems[2] stehen "ist" Werte und in SubItems[3] stehen "soll" Werte. Fallen die "ist" Werte unter die "soll" Werte, sollen die Zeilen gelb eingefärbt werden.
In SubItems[4] steht ein Datum. Stimmt das mit dem heutigen Datum überein, soll die Zeile rot eingefärbt werden.

Das funktioniert grundsätzlich auch prima.
Jedoch spinnt der Vergleich der "soll" und "ist" Werte.
Ein Beispiel: Ein Artikel ist mit einem "soll" Wert von 3 in der ListView und hat einen "ist" Wert von 177. Er wird gelb eingefärbt.

Ein anderer Artikel hat einen "soll" Wert von 10 und einen "ist" Wert von 9. Dieser ist nicht gelb eingefärbt.
Lösche ich hier 8 sodass der "ist" Wert 1 beträgt wird der Artikel gelb eingefärbt.

Es wirkt so, als würde nicht die ganze Zahl verglichen sondern nur die erste Stelle. Kann das sein?
Wie kann ich das ändern?

Danke im Voraus.

Luckie 11. Jan 2018 10:41

AW: Listview verhält sich komisch
 
Was für einen Datentyp haben die Werte? Fließkommazahlen kann man nicht direkt mit einem Gleichheitszeichen vergleichen.

Gollum 11. Jan 2018 10:43

AW: Listview verhält sich komisch
 
Hallo,

die Werte in den Subitems sind als String gespeichert. Wenn du Zahlen vergleichen willst, musst Du die Strings vorher umwandeln.
Falls es Integer-Werte sind, müsste folgendes funktionieren:

Delphi-Quellcode:
  if StrToInt(Item.SubItems[2])<StrToInt(Item.SubItems[3]) then
    Sender.Canvas.Brush.Color := clYellow
  else if DateToStr(Date) = Item.SubItems[4] then
    Sender.Canvas.Brush.Color := clRed
  else
   Sender.Canvas.Brush.Color := clWindow;

Vienesko 11. Jan 2018 13:38

AW: Listview verhält sich komisch
 
Das ging ja schnell:lol:

Vielen Dank. Hat super geklappt und läuft jetzt.:lol:

Aber wo wir schon bei Listview sind:
In einer anderen Listview werden ebenfalls Einträge aus einer MySQL Datenbank geladen und angzeigt. Das sind Artikel. Sie haben einen Namen, einen Hersteller, Preise usw und eben auch einen Lieferanten. Die Einträge werden in der Listview nach Lieferant sortiert.

Ich möchte jetzt in die Listview eine Zeile zwischenschießen, mit dem Lieferanten. Quasi als Überschrift.
Ich könnte natürlich auch eine weitere Spalte hinzufügen und dort den Lieferanten anzeigen lassen jedoch ist dafür auf meiner Oberfläche kein Platz.

Ich habe schon den Befehl Listview.Items.Insert gefunden weiß damit aber nichts so recht damit anzufangen.:|

Es soll im Grunde so aussehen:
Lieferant A:
Artikel 1 | Hersteller X
Artikel 2 | Hersteller X
Artikel 3 | Hersteller Y
Lieferant B:
Artikel 4 | Hersteller X
Lieferant C:
Artikel 5 | Hersteller X
Artikel 6 | Hersteller Y
usw

Habt ihr da eine Idee?
Vielen Dank

Delphi.Narium 11. Jan 2018 14:30

AW: Listview verhält sich komisch
 
In der Delphi-7-Hilfe findet sich dazu folgendes Beispiel:
Delphi-Quellcode:
Im folgenden Beispiel wird in eine Listenansicht ein neues Element eingefügt, und zwar direkt nach dem markierten Eintrag.

procedure TForm1.Button1Click(Sender: TObject);

var InsertItem : TListItem;
begin
  with ListView1 do
    InsertItem := Items.Insert(Selected.Index);
  InsertItem.Caption := Edit1.Text;

end;
Würde bei Dir doch dann "nur" heißen:
Passende Stelle im ListView suchen
Delphi-Quellcode:
var InsertItem : TListItem;
iIndex : Integer;
begin
  iIndex := irgendeinwertvon0bisItemsCount-1; // Der Index des auszuwählenden Eintrages.
  InsertItem := ListView1.Items.Insert(iIndex);
  InsertItem.Caption := 'Lieferant A:' // oder wie auch immer.
end;
Oder beim Befüllen des Listviews aus der Datenbank immer dann, wenn ein neuer Lieferant auftaucht, eine Zeile mit dem Lieferantennamen einfügen und erst dann die Artikel. Sprich: Beim ersten Artikel eines Lieferanten werden zwei Zeilen erzeugt. Dann muss man auch nicht nachher suchen, ob und ggfls. wo man noch was einfügen muss.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 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-2025 by Thomas Breitkreuz