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 Listview - Fehler: Überschreitet Maximum (https://www.delphipraxis.net/34920-listview-fehler-ueberschreitet-maximum.html)

schuetze09 30. Nov 2004 08:24


Listview - Fehler: Überschreitet Maximum
 
Hallo,

mein Probem ist, das ich bei meinen Listview immer die Fehlermeldung bekomme: Listview überschreitet Maximum (0).
Ich habe schon im Forum gesucht aber keine Lösung gefunden, die mir weiterhilft.

Die Exception wird hier ausgelöst:
Delphi-Quellcode:
procedure TForm_UserAnlegen.ListView1CustomDrawItem(
  Sender: TCustomListView; Item: TListItem; State: TCustomDrawState;
  var DefaultDraw: Boolean);
begin
 if ListView1.Items.Count = -1
 then exit
 else if StrToInt(Item.SubItems[0]) > 0 then Color := clgreen;
end;
Kann mir bitte jemand weiterhelfen?

MfG
schuetze09

jim_raynor 30. Nov 2004 08:27

Re: Listview - Fehler: Überschreitet Maximum
 
Ganz einfach. Du hast dem Item keine Untereinträge (weiteren Spalten) hinzugefügt. Die erste Spalte ist die Eigenschaft Caption. Die zweite Spalte wäre SubItems[0].

OLLI_T 30. Nov 2004 08:32

Re: Listview - Fehler: Überschreitet Maximum
 
Auch Hallo!

1. Wann wird Count=-1? Das kommt höchstens bei meinem Konto am Monatsende vor. :shock:

2. Viel mehr sollte Dich interessieren, ob das Item auch tatsächlich SubItems hat:
Delphi-Quellcode:
If Item.SubItems.Count=0 Then Exit;
3. Was passiert, wenn die Spalte keine gültige Zahl enthält? Exceptions in Paint Routinen sind höchst unangenehm.

4. Ich bin mal gespannt, was hier so alles grün wird.

Viele Grüsse

Der OLLI

schuetze09 30. Nov 2004 08:40

Re: Listview - Fehler: Überschreitet Maximum
 
@OLLI_T:
wie sollte ich es sonst machen? ich habe in der Spalte nur 1 oder 0 drin.
und wenn ich deins:
Delphi-Quellcode:
 If Item.SubItems.Count=0
 then exit
 else if StrToInt(Item.SubItems[0]) > 0 then ListView1.Canvas.Brush.Color := clgreen;
mit einbaue, bekomme ich die Fehlermeldung: Listenindex überschreitet Maximum (1)

MfG
schuetze09

jim_raynor 30. Nov 2004 08:48

Re: Listview - Fehler: Überschreitet Maximum
 
Irgendwas verheimlichst du uns. Aus dem Stückquellcode kann keine überschreitet Maximum (1) kommen. Du greifst ja nur auf das 0-te Element zu.

[Edit]Wenn du nur auf 0 oder eins prüfen möchtest und du die Werte selber einträgst kannst du dir das StrToInt sparen. Ein Item.SubItems[0] = '1' läuft auf das gleiche hinaus.

schuetze09 30. Nov 2004 08:50

Re: Listview - Fehler: Überschreitet Maximum
 
@jim_raynor: Also verheimlich will ich nix. Was brauchst du alles damit du mit helfen kannst?

MfG
schuetze09

PS: was ich machen will, ist, dass alle SubItems im Listview, die eine 0 als Wert haben, grün dargestellt werden.

jim_raynor 30. Nov 2004 08:52

Re: Listview - Fehler: Überschreitet Maximum
 
Okay. Zeigt doch mal deinen Code, wo ein Eintrag hinzugefügt wird.

schuetze09 30. Nov 2004 08:55

Re: Listview - Fehler: Überschreitet Maximum
 
OK, hier der Code mit dem ich das Listview befülle:
Delphi-Quellcode:
procedure AllUser(Listview: TListView);
var ADODataSet: TADODataSet;
    ListItem : TlistItem;
begin
  ADODataSet:= TADODataSet.Create(nil);
  ADODataSet.Connection:=DataModule_DBConnect.ADOConnection1;
  Listview.Items.BeginUpdate;
  try
    ADODataSet.CommandText:='SELECT * from tbl_username order by username';
    ADODataSet.Open;
    while not ADODataSet.EOF do
      begin
        ListItem:=Listview.Items.Add;
        ListItem.Caption:=ADODataSet.FieldByName('username').AsString;
        ListItem.SubItems.Add(ADODataSet.FieldByName('admin').AsString);
        ADODataSet.Next;
      end;
  except
    on E:Exception do
    begin
      MDialog(E.Message, mtError, [mbOK]);
    end;
  end;
  Listview.Items.EndUpdate;
  ADODataSet.Close;
  ADODataSet.Free;
end;

jim_raynor 30. Nov 2004 09:00

Re: Listview - Fehler: Überschreitet Maximum
 
Das sieht erstmal gut aus. Steht denn bei CustomDraw noch mehr drin? Weil eigentlich müsste es so funktionieren wie Olli_T gepostet hat.

:gruebel:

Gollum 30. Nov 2004 09:04

Re: Listview - Fehler: Überschreitet Maximum
 
Hallo,

Du musst in der OnDraw unbedingt als erstes prüfen ob der Item<>nil ist. In Deinem Fall also:
Delphi-Quellcode:
procedure TForm_UserAnlegen.ListView1CustomDrawItem(
  Sender: TCustomListView; Item: TListItem; State: TCustomDrawState;
  var DefaultDraw: Boolean);
begin
  if (Item=nil) then Exit;
  if (Item.SubItems.Count>0) then
  begin
    if (StrToInt(Item.SubItems[0])>0) then Sender.Canvas.Font.Color:=clGreen
      else Sender.Canvas.Font.Color:=clBlack;
  end; // if
end;

schuetze09 30. Nov 2004 09:04

Re: Listview - Fehler: Überschreitet Maximum
 
@jim_raynor: nein im CustomDraw steht sonst weiter nix drin, dass ist es ja, was mich so verwundert.

MfG
schuetze09

schuetze09 30. Nov 2004 09:07

Re: Listview - Fehler: Überschreitet Maximum
 
@Gollum:
deine Variante funzt auch nicht.
Ich bekomme die Fehlermeldung:

"eine Exception der Klasse EStringListError ist aufgetreten, ... Listenindex... Maximum(1)"

MfG
schuetze09

jim_raynor 30. Nov 2004 09:11

Re: Listview - Fehler: Überschreitet Maximum
 
Mhh. An der Draw-Funktion kann das irgendwie nicht liegen. Es muss irgendwo anders der Fehler sein :gruebel:

OLLI_T 30. Nov 2004 09:15

Re: Listview - Fehler: Überschreitet Maximum
 
Läuft Dein Programm, wenn Du den Code in der Methode ListView1CustomDrawItem komplett auskommentierst?

@Gollum:
Item=NIL im OnCustomDrawItem Event sollte auch ein ganz seltener Vogel sein. :cyclops:

Gollum 30. Nov 2004 09:21

Re: Listview - Fehler: Überschreitet Maximum
 
Hallo,

@OLLI_T
So ein seltener Vogel ist das nicht. Das OnDraw-Ereignis kann/wird zu den unmöglichsten Zeiten eintreten. Z.B. schon beim Erstellen eines Formulars, wenn in der Listview noch keine Einträge sind.
Abgesehen davon, ist mein Nickname Gollum und nicht "Gallon".

schuetze09 30. Nov 2004 09:26

Re: Listview - Fehler: Überschreitet Maximum
 
@All:ich habe jetzt alles auskommentiert und das Programm läuft...

OLLI_T 30. Nov 2004 09:32

Re: Listview - Fehler: Überschreitet Maximum
 
Hallo Gollum!

Sorry wegen des Nicks. Habe den Beitrag bereits editiert. :cheers:

Was das OnDraw Event angeht, geb ich Dir recht.

Aber auf dieser Baustelle geht´s doch um das OnCustomDrawItem Event. Und wo kein Item da auch kein Event. => Try it

Nichtsdestotrotz bin ich gespannt, was des Rätsels Lösung ist. :gruebel:

Gruss

Der OLLI

Gollum 30. Nov 2004 09:35

Re: Listview - Fehler: Überschreitet Maximum
 
Hallo,

@schuetze09:
Zeige doch noch einmal, welchen Code Du nun im OnDraw-Ereignis benutzt. Ich kann es nicht glauben, dass mein Beispiel nicht tut. Sonst dürfte ja in meinen Programmen gar nichts gehen...

OLLI_T 30. Nov 2004 09:38

Re: Listview - Fehler: Überschreitet Maximum
 
@Schuetze!

Stehen die Daten denn auch im richtigen Listview?

Teste mal folgendes:

procedure TForm_UserAnlegen.ListView1CustomDrawItem(
Sender: TCustomListView; Item: TListItem; State: TCustomDrawState;
var DefaultDraw: Boolean);
begin
Showmessage(StrToInt(Item.SubItems.Count));
end;

schuetze09 30. Nov 2004 09:39

Re: Listview - Fehler: Überschreitet Maximum
 
So, jetzt habe ich es gefunden und mache es so:
Delphi-Quellcode:
procedure TForm_UserAnlegen.ListView1CustomDrawSubItem(
  Sender: TCustomListView; Item: TListItem; SubItem: Integer;
  State: TCustomDrawState; var DefaultDraw: Boolean);
begin
 if (Item=nil) then Exit;
  if (Item.SubItems.Count>0) then
  begin
    if (StrToInt(Item.SubItems[0])>0) then ListView1.Canvas.Brush.Color:=clGreen;
  end;
end;
Dann hatte ich im Property-Editor OwnerDraw auf True, das habe ich jetzt auf False.

Jetzt funktioniert es.
Kleiner Fehler große Wirkung...

DANKE für eure Hilfe und Mühen..

MfG
schuetze09


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