Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Liste exceeds bounds (Schnelle Hilfe bitte) (https://www.delphipraxis.net/176238-liste-exceeds-bounds-schnelle-hilfe-bitte.html)

Finki 21. Aug 2013 12:44

Liste exceeds bounds (Schnelle Hilfe bitte)
 
Hey, dringend (ohne Stress zu machen:D)

Delphi-Quellcode:
procedure TForm2.btnLoadClick(Sender: TObject);
  var
    txti, lbli, memoi, j : integer;
    anztxti, anzlbli, anzmemoi : integer;
    txtstr, lblstr, memostr : string;
    Edit4 : TEdit;
    Label1 : TLabel;
    Memo2 : TMemo;
begin
    if Form1.OpenDialog1.Execute then
    begin
    Form1.zwischenspeicher.Lines.LoadFromFile(Form1.OpenDialog1.FileName);

    Form1.Memo1.Visible:=false;
    if pnlForm1<>NIL then
    begin
    pnlForm1.Destroy;

    end;

    pnlForm1 := TPanel.Create(Form1);
    pnlForm1.Parent := Form1;
    pnlForm1.SetBounds(8,Form1.Memo1.Top,Form1.Memo1.Width,Form1.Memo1.Height-5);

    pnlForm1.Visible:=true;

     CloseFormular := TSpeedButton.Create(pnlForm1);
     CloseFormular.Parent := pnlForm1;
     CloseFormular.SetBounds(pnlForm1.Width-20,0,20,20);
      //CloseFormular.Glyph.LoadFromFile('menu_close.bmp');
     CloseFormular.Font.Color:=clRed;
     CloseFormular.Font.Bold:=true;
     CloseFormular.Font.Name:='Arial';
     CloseFormular.Caption:='X';
     CloseFormular.OnClick:=@CloseFormularClick;
     CloseFormular.Caption:='X';
     CloseFormular.SetBounds(pnlForm1.Width-16,0,16,16);

    anztxti:=strtoint(Form1.zwischenspeicher.Lines[0]); //position der Anz txt
    anzlbli:=strtoint(Form1.zwischenspeicher.Lines[1]); //position der Anz lbl
    anzmemoi:=strtoint(Form1.zwischenspeicher.Lines[2]);

    for j:=3 to Form1.zwischenspeicher.Lines.Count do
    begin
    if Form1.zwischenspeicher.Lines[(j-3)*8+4]='1' then
    begin
    Edit4 :=TEdit.Create(pnlForm1);
    Edit4.Parent := pnlForm1;
    Edit4.Name:=Form1.zwischenspeicher.Lines[(j-3)*8+5];
    Edit4.Enabled:= true;
    Edit4.AutoSize:=false;
    Edit4.Setbounds(strtoint(Form1.zwischenspeicher.Lines[(j-3)*8+7]),
                    strtoint(Form1.zwischenspeicher.Lines[(j-3)*8+8]),
                    strtoint(Form1.zwischenspeicher.Lines[(j-3)*8+9]),
                    strtoint(Form1.zwischenspeicher.Lines[(j-3)*8+10]));
    Edit4.Text:=Form1.zwischenspeicher.Lines[(j-3)*8+6];
    end;
    if Form1.zwischenspeicher.Lines[(j-3)*8+4]='2' then
    begin
    Label1 :=TLabel.Create(pnlForm1);
    Label1.Parent := pnlForm1;
    Label1.Name:=Form1.zwischenspeicher.Lines[(j-3)*8+5];
    Label1.Enabled:= true;
    Label1.AutoSize:=true;
    Label1.Setbounds(strtoint(Form1.zwischenspeicher.Lines[(j-3)*8+7]),
                     strtoint(Form1.zwischenspeicher.Lines[(j-3)*8+8]),
                     strtoint(Form1.zwischenspeicher.Lines[(j-3)*8+9]),
                     strtoint(Form1.zwischenspeicher.Lines[(j-3)*8+10]));
    Label1.Caption:=Form1.zwischenspeicher.Lines[(j-3)*8+6];
    end;
    if Form1.zwischenspeicher.Lines[(j-3)*8+4]='3' then
    begin
    Memo2 :=TMemo.Create(pnlForm1);
    Memo2.Parent := pnlForm1;
    Memo2.Name:=Form1.zwischenspeicher.Lines[(j-3)*8+5];
    Memo2.Enabled:=true;
    Memo2.AutoSize:=false;
    Memo2.Setbounds(strtoint(Form1.zwischenspeicher.Lines[(j-3)*8+7]),
                    strtoint(Form1.zwischenspeicher.Lines[(j-3)*8+8]),
                    strtoint(Form1.zwischenspeicher.Lines[(j-3)*8+9]),
                    strtoint(Form1.zwischenspeicher.Lines[(j-3)*8+10]));
    end;
    if Form1.zwischenspeicher.Lines[(j-3)*8+4]='4' then
    begin
    Label1 :=TLabel.Create(pnlForm1);
    Label1.Parent := pnlForm1;
    Label1.Name:=Form1.zwischenspeicher.Lines[(j-3)*8+5];
    Label1.Enabled:= true;
    Label1.AutoSize:=true;
    Label1.Setbounds(strtoint(Form1.zwischenspeicher.Lines[(j-3)*8+7]),
                     strtoint(Form1.zwischenspeicher.Lines[(j-3)*8+8]),
                     strtoint(Form1.zwischenspeicher.Lines[(j-3)*8+9]),
                     strtoint(Form1.zwischenspeicher.Lines[(j-3)*8+10]));
    Label1.Caption:=datetostr(Now);

    end;

  end;
  Form1.zwischenspeicher.Clear;
  Close;
end;
end;
dieser Code erstellet verschiedene Objekte. aber aus irgendeinem Grund kommt da der Fehler
Delphi-Quellcode:
List index exceeds bounds (28)
in der datei, welche geöffnet wird steht

Code:
1
2
0

2
lblFeld1
Labeltext eingeben
135
44
100
16

4
lblFeld2
21.08.2013
137
53
55
16

1
txtFeld1
Name
134
72
50
23
sry für den unübersichtlichen Code, der ist so Step by Step entstanden :/!

uligerhardt 21. Aug 2013 12:53

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Dann debugge halt deinen Code. :cyclops:
Haltepunkt an den Anfang der Routine (per F5), Programm starten, an die kritische Stelle navigieren, dann mit F8 weitergehen, bis es kracht. Dann weißt du zumindest schonmal, in welcher Zeile dein Fehler ist.

Edit: Und folgenden Haken zu setzen kann auch nicht schaden:
Anhang 39787

Finki 21. Aug 2013 13:00

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
ne bringt nix des fehler kommt nach dem end; der procedure

Der schöne Günther 21. Aug 2013 13:13

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
Deine Datei hat doch auch nur so viel Zeilen :|

Delphi-Quellcode:
for j:=3 to Form1.zwischenspeicher.Lines.Count do
Count (von egal was) gibt an, wieviel drinsteckt. Angefangen zu zählen wird bei Null.
Wenn in irgendetwas drei Dinge stecken und machst etwas von den Dingen an Position Null bis inklusive drei. Dann sind das schon vier.

Also:
Delphi-Quellcode:
for j:=3 to (Form1.zwischenspeicher.Lines.Count-1) do


Außerdem habe ich grade voll den crazy Gedankengang: Möchtest du vielleicht einmal FreePascal in dein Profil eintragen?

Finki 21. Aug 2013 13:16

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
zu deiner Lösung hab ich schon versucht: ohne Veränderung!

und zu zweitens was soll das bringen:?

DeddyH 21. Aug 2013 13:17

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
An das "- 1" hab ich auch zuerst gedacht, aber es wird ja nirgends auf Form1.zwischenspeicher.Lines[j] zugegriffen, sondern immer auf abenteuerliche Indizes, die nach einer magischen Formel berechnet werden. Man darf mich jetzt meinetwegen hassen, aber nach dem ersten Blick auf den Code kam mir der alte Spruch "Niemand ist unnütz, er kann immer noch als schlechtes Beispiel dienen" in den Sinn.

uligerhardt 21. Aug 2013 13:18

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
Zitat:

Zitat von Finki (Beitrag 1225674)
ne bringt nix des fehler kommt nach dem end; der procedure

Dann setze den erwähnten Haken in den Debugger-Optionen. Dann hält der Debugger beim Werfen der Exception an der richtigen Stelle an.

p80286 21. Aug 2013 13:22

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
Da hast Du aber echt starken Source:
Delphi-Quellcode:
for j:=3 to Form1.zwischenspeicher.Lines.Count do
begin
if Form1.zwischenspeicher.Lines[(j-3)*8+4]='1' then
begin
Abgesehen von dem
Delphi-Quellcode:
.Count
ist
Delphi-Quellcode:
.Lines[(j-3)*8+4]
doch arg fehlerträchtig. Stell Dir mal vor in Zwischenspeicher gibt es 100 Datensätze.....

Gruß
K-H

taveuni 21. Aug 2013 13:32

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
Zitat:

Zitat von Finki (Beitrag 1225677)
und zu zweitens was soll das bringen:?

Weil gewisse Features von Delphi1 <> Delphi7 <> Delphi2007 <> DelphiXE <> Lazarus sind.
Wenn ich jetzt nach Monaten wieder mal an Delphi sitze und bei mir was ausprobiere
was Dein Problem betrifft - und kanns nicht nachvollziehen.
X Threads weiter erfahr ich dann dass es Lazarus ist.
Ich fühl mich dann verarscht und meine Zeit ist verschwendet.
Kapierst Du das und trägst das jetzt in dein Profil ein oder bist Du nur ein Troll?

Daniel 21. Aug 2013 13:39

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
@taveuni: Kein Grund, ausfallend zu werden.

@Finki: Wenn das tatsächlich Lazarus ist, womit Du arbeitest, wäre das natürlich eine wichtige Information.

taveuni 21. Aug 2013 14:01

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
Zitat:

Zitat von Daniel (Beitrag 1225689)
@taveuni: Kein Grund, ausfallend zu werden.

Ja sorry.

[OT]
Ich ärger mich seit einer Woche mit einem Problem rum Remobjects/Delphi 2007.
Und das Projekt ist von 2006. Der Code ist :roll:
[/OT]

Blup 21. Aug 2013 14:42

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
Der Code bezieht sich fast vollständig auf Form1, gehört also auch in diese Klasse.
Bitte rücke den Code ordentlich ein.
Verwende Unterfunktionen/Methoden zur Übersichtlichkeit und zum Testen.
Delphi-Quellcode:
procedure TForm2.btnLoadClick(Sender: TObject);
begin
  Form1.OpenFile;
  Close;
end;

type
  TForm1 = class(TForm)
  private
    procedure ReadData;
    procedure ReadTyp1(var j: Integer);
    procedure ReadTyp2(var j: Integer);
    procedure ReadTyp3(var j: Integer);
    procedure ReadTyp4(var j: Integer);
  public
    procedure OpenFile;
  end;


procedure TForm1.OpenFile;
begin
  if OpenDialog1.Execute then
  begin
    Zwischenspeicher.Lines.LoadFromFile(OpenDialog1.FileName);
    ReadData;
    Zwischenspeicher.Clear;
  end;
end;

procedure TForm1.ReadData;
var
  j, iTyp : integer;
  anztxti, anzlbli, anzmemoi : integer;
begin
  Memo1.Visible:=false;

  pnlForm1.Destroy;
  pnlForm1 := nil;
  pnlForm1 := TPanel.Create(Self);
  pnlForm1.Parent := Form1;
  pnlForm1.SetBounds(8, Memo1.Top, Memo1.Width, Memo1.Height-5);
  pnlForm1.Visible:=true;

  CloseFormular := TSpeedButton.Create(pnlForm1);
  CloseFormular.Parent := pnlForm1;
  CloseFormular.SetBounds(pnlForm1.Width-20,0,20,20);
  //CloseFormular.Glyph.LoadFromFile('menu_close.bmp');
  CloseFormular.Font.Color:=clRed;
  CloseFormular.Font.Bold:=true;
  CloseFormular.Font.Name:='Arial';
  CloseFormular.Caption:='X';
  CloseFormular.OnClick:=@CloseFormularClick;
  CloseFormular.Caption:='X';
  CloseFormular.SetBounds(pnlForm1.Width-16,0,16,16);

  anztxti := Zwischenspeicher[0]; //position der Anz txt
  anzlbli := Zwischenspeicher[1]; //position der Anz lbl
  anzmemoi := Zwischenspeicher[2];
  j := 3;
  while j < zwischenspeicher.Lines.Count do
  begin
    iTyp := StrToIntDef(Zwischenspeicher[j], 0);
    Inc(j);
    case iTyp of
      1: ReadTyp1(j);
      2: ReadTyp2(j);
      3: ReadTyp3(j);
      4: ReadTyp4(j);
    else
      raise Exception.CreateFmt('Typ nicht unterstützt Zeile(%d)', [j]);
    end;
  end;
end;

procedure TForm1.ReadTyp1(var j: Integer);
var
  Edit4 : TEdit;
begin
  Edit4 := TEdit.Create(pnlForm1);
  Edit4.Parent  := pnlForm1;
  Edit4.Name    := Zwischenspeicher[j];
  Edit4.Enabled := True;
  Edit4.AutoSize := False;
  Edit4.Text    := Zwischenspeicher[j + 1]
  Edit4.Setbounds(IntToStr(Zwischenspeicher[j + 2]),
                  IntToStr(Zwischenspeicher[j + 3]),
                  IntToStr(Zwischenspeicher[j + 4]),
                  IntToStr(Zwischenspeicher[j + 5]));
  Inc(j, 8); // <- so viele Zeilen, wie für diesen Typ erforderlich
end;

hoika 21. Aug 2013 15:56

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
Hallo,

Delphi-Quellcode:
//for j:=3 to Form1.zwischenspeicher.Lines.Count do
for j:=3 to Form1.zwischenspeicher.Lines.Count-1 do
begin
  if Form1.zwischenspeicher.Lines[(j-3)*8+4]='1' then
  begin
  end;
end;
Nehmen wir mal 10 Zeilen in der Datei an.
Dann kommt bei der letzten Zeile (j=9)
(9-3)*8+4 = 52 raus.

Wieso soll der Compiler zur Laufzeit dann nicht meckern ...


Heiko

Blup 21. Aug 2013 16:25

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
Wenn man die Prüfung auf Bereichsüberschreitung abschaltet ...
und dann mit die Compileroptionen so einstellt das man nicht debuggen kann...
... fehlt nur noch ein großes "try..except end" damit niemand die Fehlermeldungen sieht.

Der schöne Günther 21. Aug 2013 16:39

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
Das ist aber schon deluxe.

Wenn man überhaupt erstmal so weit kommt dass er überhaupt kompiliert könnte man eigentlich schon ausrollen.

p80286 21. Aug 2013 17:31

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1225718)
Das ist aber schon deluxe.

Wenn man überhaupt erstmal so weit kommt dass er überhaupt kompiliert könnte man eigentlich schon ausrollen.

Warum sollte er nicht kompilieren?
Wenn ich das richtig gelesen habe werden so 1..2 Datensätze klaglos verarbeitet und dann macht es bumm.

Gruß
K-H

Der schöne Günther 21. Aug 2013 17:41

._.
 
Nein, das war schon vollkommen abseits vom Thema, so halbwitz-weise in Richtung hochqualitativer Softwareentwicklung: "Hurra, er kompiliert! Wir liefern aus!"

Ich hätte besser nichts von mir gegeben, eigentlich gab es ja sowieso nichts mehr zu sagen.

JamesTKirk 22. Aug 2013 08:42

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1225676)
Also:
Delphi-Quellcode:
for j:=3 to (Form1.zwischenspeicher.Lines.Count-1) do

Kleine Anmerkung am Rande: die Klammern sind nicht nötig. :mrgreen:

Gruß,
Sven

Finki 11. Sep 2013 12:36

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
Vielen Dank für die Antworten.
Aber ich verstehe es noch nicht, last uns des mal durch gehen am beispiel:

Memo inhalt:

Code:
1
2
0

2
lblFeld1
Labeltext eingeben
135
44
100
16

4
lblFeld2
21.08.2013
137
53
55
16

1
txtFeld1
Name
134
72
50
23

gut, das Programm fängt an mit auslesen:

Delphi-Quellcode:
    for j:=3 to Form1.zwischenspeicher.Lines.Count do //j ist 3
    begin
    if Form1.zwischenspeicher.Lines[(j-3)*8+4]='1' then // 3 (j)-3= 0; 0*8=0; 0+4=4
und in der 4ten Zeile steht eine 2 also geht das Programm nicht in diese if schleife!

und das geht doch so weiter und dann am Ende is es halt zu Ende. Oder nicht?

DeddyH 11. Sep 2013 12:48

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
1. If-Schleife
2.
Zitat:

Delphi-Quellcode:
for j:=3 to Form1.zwischenspeicher.Lines.Count do //j ist 3
    begin
    if Form1.zwischenspeicher.Lines[(j-3)*8+4]='1' then

Nehmen wir mal an, das Memo enthält 4 Zeilen. Dann ergibt das im letzten Durchlauf 1*8+4 = 12. 12 ist aber um einiges größer als 4 (wobei die 4. Zeile auch noch den Index 3 hat, also noch einen weniger). Was soll denn dabei herauskommen?

Finki 11. Sep 2013 13:16

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
1. die seite ist richtig witzig!! :D

2. aha so langsam dämmert mir es was das Problem ist, vielen dank!!

Furtbichler 11. Sep 2013 13:58

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
Solche abenteuerlichen Schleifen macht man z.B. so
Delphi-Quellcode:
j := 0;
while j<List.Count do begin
  List[j] := irgendwas;
  List[j+1] := irgendwas anderes.
  ...
  List[j+7] := das Letzte;
  inc (j,8);
end;
Wobei hier wirklich eine INI-Datei angebracht wäre, weil dann die einzelnen Werte nicht durch eine Formel, sondern direkt durch Namen angesprochen werden.

DeddyH 11. Sep 2013 14:20

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
Das knallt aber genauso, wenn die Liste weniger als 8 Elemente hat. Besser so:
Delphi-Quellcode:
j := 8;
while j <= Liste.Count do
  begin
    Liste[j - 8] := Dideldum;
    Liste[j - 7] := Düdeldü;
    ...
    Liste[j - 1] := LetzterEintrag;
    inc(j, 8);
  end;

Finki 11. Sep 2013 14:40

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
Vielen dank für den Tipp, mit der INI Datei is echt ne sinnvolle sache. Vielen dank.

Furtbichler 11. Sep 2013 20:57

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
Zitat:

Zitat von DeddyH (Beitrag 1227958)
Das knallt aber genauso, wenn die Liste weniger als 8 Elemente hat. Besser so:

Angeber. :mrgreen:

DeddyH 12. Sep 2013 07:05

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
*Pfüh*. Allerdings ist mein Vorschlag genauso schwachsinnig, da bei weniger Elementen der Index negativ wird. Das ist mir aber erst später aufgefallen :roll:.

Furtbichler 12. Sep 2013 07:17

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
Zitat:

Zitat von DeddyH (Beitrag 1228054)
*Pfüh*. Allerdings ist mein Vorschlag genauso schwachsinnig, da bei weniger Elementen der Index negativ wird. Das ist mir aber erst später aufgefallen :roll:.

Das sehe ich jetzt nicht so.
Wg. j>=8 ist der kleinste Index, mit dem auf die Liste zugegriffen wird j-8 >= 0. Wo der jetzt negativ wird, erschließt sich mir nicht. Grundproblem ist eh die Möglichkeit, das die Liste nicht genau n*8 (n:int) Elemente hat.

Aber ich bin eh zu alt für sowas. Wo kann man hier eigentlich Bingo spielen? :stupid:

DeddyH 12. Sep 2013 07:20

AW: Liste exceeds bounds (Schnelle Hilfe bitte)
 
Hinten links am Rollator-Parkplatz vorbei, ich komme gleich nach. Auch meine Verkalkung scheint langsam voran... Hallo Fräulein? Wann gibt' s Essen?


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