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/)
-   -   Listenindex überschreitet das Maximum (https://www.delphipraxis.net/82540-listenindex-ueberschreitet-das-maximum.html)

arne99 15. Dez 2006 10:49


Listenindex überschreitet das Maximum
 
Hallo folgender Tatbestand:

Ich habe eine Form, eine Listview1 und 2 ValueListEditoren.
Nun vesuche ich das selektierte Listview1.Selected ITEM auszulesen und in den ValueListEdit1 und 2 reinzupacken!

Fehler:
Wenn ich jedoch einen Lsitview1 Eintrag habe, wo nicht alle Substrings ausgefüllt sind erhalte ich die Message: Listenindex überschreitet das Maximum (4).

Frage:
// Für dieses Beispiel/Problem gibt es leider noch keine genaue Hilfe bei DP, daher meine Frage:

Wie kann ich den SelectedCode umschreiben, dass er mir die Felder die im Listview1 LEER sind einfach im ValueListEditor auch LEER macht. (aber hinzufügt!) ???

Hier mein Code:

Delphi-Quellcode:
procedure TForm1.ListView1Click(Sender: TObject);
begin

 if (listview1.Items.Count <> 0) and (listview1.Selected <> nil) then

  begin

            vle1.Strings.Clear;
            vle1.Strings.BeginUpdate;
           
            vle1.TopRow:=vle1.InsertRow('Config-Name',listview1.Selected.Caption,true);
            vle1.InsertRow('Datasource-Name',listview1.Selected.SubItems[0],true);
            vle1.InsertRow('Service-URL',listview1.Selected.SubItems[1],true);
            vle1.InsertRow('LFS-Cache-Path',listview1.Selected.SubItems[2],true);
            vle1.InsertRow('LFS-Config-Name',listview1.Selected.SubItems[3],true);
            vle1.Strings.EndUpdate;

           
            vle2.Strings.Clear;
            vle2.Strings.BeginUpdate;

            if listview1.Selected.SubItems[4]<>'' then
                                 begin
            vle2.TopRow:=vle1.InsertRow('Datasource-Name',listview1.Selected.SubItems[4],true);
                                             end
                                             else begin
                                                 showmessage('The Configuration ' +listview1.Selected.Caption + ' is corrupt!');
                                             end;

          vle2.InsertRow('Database-Type',listview1.Selected.SubItems[5],true);

            vle2.InsertRow('Database-URL',listview1.Selected.SubItems[6],true);

            vle2.InsertRow('Database-Driver',listview1.Selected.SubItems[7],true);

           vle2.InsertRow('LFS-Config-Name',listview1.Selected.SubItems[8],true);

           vle2.InsertRow('LFS-Cache-Path',listview1.Selected.SubItems[9],true);
          try
            vle2.InsertRow('DB-User',listview1.Selected.SubItems[10],true);
          except
            begin
                          vle2.DeleteRow(6);

                                    vle2.InsertRow('DB-User','',true);
            end;
               end;
          try
            vle2.InsertRow('DB-Password',listview1.Selected.SubItems[11],true);

        except
            begin
                          vle2.DeleteRow(7);

                          vle2.InsertRow('DB-Password','',true);
            end;
          end;
           try
            vle2.InsertRow('LFS-User',listview1.Selected.SubItems[12],true);
             except
            begin
                          vle2.DeleteRow(8);

                          vle2.InsertRow('LFS-User','',true);
            end;
           end;
           try
            vle2.InsertRow('LFS-Password',listview1.Selected.SubItems[13],true);
             except
            begin
                          vle2.DeleteRow(9);

                          vle2.InsertRow('LFS-Password','',true);
            end;
           end;
           vle2.Strings.EndUpdate;
     
end
else exit;





end;
Selbst durch Anhaltepunkte finde ich nicht genau den Fehler, leider.

DAnke im Vorraus!

ibp 15. Dez 2006 10:56

Re: Listenindex überschreitet das Maximum
 
gibt es denn mindestens 14 subitems?

arne99 15. Dez 2006 11:00

Re: Listenindex überschreitet das Maximum
 
Genau das ist es ja, die 14 SubItems sind mal vorhanden, und mal nicht.

ibp 15. Dez 2006 11:06

Re: Listenindex überschreitet das Maximum
 
dann liegt da dein fehler! vorher testen ob der jeweilige subitem existiert, dann erst darauf zugreifen!

arne99 15. Dez 2006 11:18

Re: Listenindex überschreitet das Maximum
 
Jetzt habe ich komplett alle Abfragen so gemacht:

Delphi-Quellcode:
 try
         vle2.InsertRow('Database-Type',listview1.Selected.SubItems[5],true);
            except vle2.InsertRow('Database-Type','',true);
            end;
Jedoch kommt immer noch die Fehlermeldung! Was mache ich falsch?

Also er erkennt schon, dass dort nix ist (geprüft mit MSGBOX ausgabe), aber die Fehlerausgabe ist immer noch vorhanden.

ibp 15. Dez 2006 11:56

Re: Listenindex überschreitet das Maximum
 
Delphi-Quellcode:
 try
         vle2.InsertRow('Database-Type',listview1.Selected.SubItems[5],true);  <-------- da greifst du auf ich denke mal ein nicht vorhandenes item zu! dann gibts ne fehlermeldung!
            except vle2.InsertRow('Database-Type','',true);
            end;
[/quote]

also vorher prüfen ob listview1.Selected.SubItems[5] existiert! schau dir mal den begriff assigned an!

Constructor 15. Dez 2006 12:11

Re: Listenindex überschreitet das Maximum
 
Hallo,

mit "ListView1.Items[0].SubItems.Count" kannst du prüfen, wieviele SubItems ein ListView- Eintrg enthält.

arne99 15. Dez 2006 12:34

Re: Listenindex überschreitet das Maximum
 
Da ich keine for-to-do schleife nutze sondern alles manuell auslesen möchte (WEIL EBEN SO UNTERSCHIEDLCIHE SUBITEMS RUHIG FEHLEN KÖNNEN) hilft der .count nicht viel.

Also mit Try klappts nicht, mit Assign geht nix weil ich brauche TPErsistens (???)

und nun versuchte ich das hier:
Delphi-Quellcode:
if listview1.Items[4].Data <> nil then
                                       
            vle2.TopRow:=vle2.InsertRow('Datasource-Name',listview1.Selected.SubItems[4],true)

             else
                   showmessage('EEROR ES FUNZT');
= result: Klappt auch nicht.

Das muss eigentlich möglich sein odeR?

hoika 15. Dez 2006 12:41

Re: Listenindex überschreitet das Maximum
 
Hallo,

reicht es nicht, bei "fehlendem" SubItem ein SubItems.Add('') zu machen ?


Heiko

ibp 15. Dez 2006 12:41

Re: Listenindex überschreitet das Maximum
 
Zitat:

Zitat von arne99
...mit Assign geht nix...

ich hatte assigned gesagt!


wenn subitems fehlen, dann läuft der zähler nur bist count-1 !

wenn du 5 items hast mit der hausnummer (0..4) und die ersten zwei löschst, dann hast du danach 3 items mit der hausnummer (0..2)

arne99 15. Dez 2006 12:42

Re: Listenindex überschreitet das Maximum
 
Genau das will ich ja erreichen, jedoch weiß ich nicht wie ich analysieren wann das SubItem vorhanden ist und wann nicht. Danke fuer die Tipps bislang.

arne99 15. Dez 2006 12:45

Re: Listenindex überschreitet das Maximum
 
Zitat:

Zitat von ibp
Zitat:

Zitat von arne99
...mit Assign geht nix...

ich hatte assigned gesagt!

Delphi-Quellcode:
if assigned(listview1.Selected.SubItems[4]) then
geht ja auch nicht. er erwartet "("

inherited 15. Dez 2006 13:12

Re: Listenindex überschreitet das Maximum
 
Du willst praktisch, dass keine Fehlermeldung kommt, sondern er lediglich bei einem Fehler etwas anderes tut?
Beachte dann bitte das, solang nicht anders eingestellt, immer ein Fehler angezeigt wird solange du den Delphi-Debugger dranhängen hast
(Sorry wenn ich dich falsch verstanden habe)

arne99 15. Dez 2006 13:18

Re: Listenindex überschreitet das Maximum
 
Also nochmal, weiß nich ob ich das hier zu kompliziert beschreibe, dennoch:

Was ich will:

1. Listview-SubItems von einem selektierten Item sollen ausgelesen werden
2. Falls ein SubItem nicht vorhanden ist (= nil oder so) soll er ''-String Nutzen um dennoch etwas zu haben, was er evtl. wieder zurückschreiben kann.

Also die Frage:

Wie frage ich ab ob ein SubItem da ist oder nicht. (oder nil etc)

Christian Seehase 15. Dez 2006 13:28

Re: Listenindex überschreitet das Maximum
 
Moin Arne,

da Du keine Lücken in den Subitems haben kannst sollte die Prüfung auf "Index des abzufragenden SubItems < Count" ausreichen.

arne99 15. Dez 2006 13:40

Re: Listenindex überschreitet das Maximum
 
Das kann man aber nicht in einer IF-Anweisung / Abfrage verschachteln.
Beispielcode? (Klingt ja logisch, habs verstanden, umzusetzen geht es aber nich)

Christian Seehase 15. Dez 2006 14:36

Re: Listenindex überschreitet das Maximum
 
Moin Arne,

als Funktion, die Du noch mit in die Methode einbauen kannst (der Übersicht halber):


Delphi-Quellcode:
procedure TForm1.ListView1Click(Sender : TObject);

  function IsValidSubitemIndex(const AiIndex : integer) : boolean;
  begin
    Result := AiIndex < ListView1.Selected.SubItems.Count;
  end;

begin
  //...
  if IsValidSubitemIndex(5) then begin
    // Hier ist dann sichergestellt, dass ListView1.Selected.SubItems[5] existiert
  end;
  //...
end;

marabu 15. Dez 2006 15:01

Re: Listenindex überschreitet das Maximum
 
Hallo,

oder du stellst deinen Code noch etwas mehr um:

Delphi-Quellcode:
function AddString(vle: TValueListEditor; li: TListItem;
    const name: String; index: Integer): Integer;
var
  value: String;
begin
  if index < 0 then
    Result := vle.InsertRow(name, li.Caption, True) else
  begin
    if index < li.SubItems.Count
      then value := li.SubItems[index]
      else value := '';
    Result := vle.InsertRow(name, value, True);
  end;
end;

procedure TForm1.ListView1Click(Sender: TObject);
begin
  with ListView1 do
    if Assigned(Selected) then
    begin
      vle1.Strings.Clear;
      vle1.Strings.BeginUpdate;
      vle1.TopRow := AddString(vle1, Selected, 'Config-Name', -1);
      AddString(vle1, Selected, 'Datasource-Name', 0);
      AddString(vle1, Selected, 'Service-URL', 1);
      AddString(vle1, Selected, 'LFS-Cache-Path', 2);
      AddString(vle1, Selected, 'LFS-Config-Name', 3);
      vle1.Strings.EndUpdate;

      vle2.Strings.Clear;
      vle2.Strings.BeginUpdate;
      vle2.TopRow := AddString(vle2, Selected, 'Datasource-Name', 4);
      AddString(vle2, Selected, 'Database-Type', 5);
      AddString(vle2, Selected, 'Database-URL', 6);
      AddString(vle2, Selected, 'Database-Driver', 7);
      AddString(vle2, Selected, 'LFS-Config-Name', 8);
      AddString(vle2, Selected, 'LFS-Cache-Path', 9);
      AddString(vle2, Selected, 'DB-User', 10);
      AddString(vle2, Selected, 'DB-Password', 11);
      AddString(vle2, Selected, 'LFS-User', 12);
      AddString(vle2, Selected, 'LFS-Password', 13);

      if vle2.Strings.Values['Datasource-Name'] = '' then
        ShowMessage('The Configuration ' + listview1.Selected.Caption + ' is corrupt!');

      vle2.Strings.EndUpdate;
    end;
end;
Getippt und nicht getestet.

Freundliche Grüße

arne99 15. Dez 2006 15:23

Re: Listenindex überschreitet das Maximum
 
Hey danke, konnte beides gebrauchen und verwenden. Funzt+VIELEN DANK!!!

xZise 15. Dez 2006 15:36

Re: Listenindex überschreitet das Maximum
 
Ansonsten hätte ich auch noch die Idee, dass du die Substrings schon immer erstellst. Egal, ob vorhanden oder nicht.

arne99 15. Dez 2006 15:38

Re: Listenindex überschreitet das Maximum
 
Stimmt, wäre genauso eine Möglichkeit, naja schon gelöst. Danke dennoch!

Hätte ich echt drauf kommen müssen! GRML! :wall:

DP-Maintenance 16. Dez 2006 13:41

DP-Maintenance
 
Dieses Thema wurde von "Christian Seehase" von "Programmieren allgemein" nach "VCL / WinForms / Controls" verschoben.
Falsche Sparte, da delhpispezifisch


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