AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein EListError, warum? ObjectList mit Daten füllen
Thema durchsuchen
Ansicht
Themen-Optionen

EListError, warum? ObjectList mit Daten füllen

Ein Thema von delphifan2004 · begonnen am 20. Mai 2022 · letzter Beitrag vom 24. Mai 2022
Antwort Antwort
Delphi.Narium

Registriert seit: 27. Nov 2017
2.554 Beiträge
 
Delphi 7 Professional
 
#1

AW: EListError, warum? ObjectList mit Daten füllen

  Alt 20. Mai 2022, 20:07
Zitat von delphifan2004:
Ich bekommen einen EListError, der mir als Meldung die letzte Zeile der Objektliste FRowsContainer anzeigt.
Und welche Zeile genau ist das?

Die letzte im Eingangspost oder die letzte in welcher der Prozeduren?

Zitat:
EListError is the exception class for list and string errors.

EListError is raised when an error is made in a list, TStrings, or TStringList object. This exception commonly occurs when an application refers to an item that is out of the list's range.

EListError also occurs if an application tries to add a duplicate string to a TStringList object when the value of the Duplicates property is dupError.

An EListError exception is raised when an application attempts to insert a string into a sorted string list, since the insertion of a string at a specified position may put the list out of order.
Welche Variante des Fehler EListError kommt denn hier in Frage?

Ein Fehler, der durch nicht ganz korrekte Zählweise entstehen könnte oder die Variante, dass da irgendwo eine Dublette in 'ner Stringliste eingefügt wird?

Bei Zählfehlern könnte man ggfls. hier im Forum behilflich sein, wenn die exakte Fehlerzeile mal bekanntgegeben wird. Einen potentiellen Dublettenfehler können wir so ohne weiteres nicht erkennen. Weder kennen wir die zu verarbeitenden Daten noch wissen wir, ob die Stringlisten sortiert sein könnten und das Einfügen von Dubletten eventuell nicht möglich ist.

Die dritte Variante könnte eintreten, wenn bei einer Liste, deren AList.Capacity := 5; ist, das sechste Element eingefügt wird.
Hier könnte ggfls. ein SetCols(6); (oder ein beliebiger anderer Wert > 5?) Fehlerursache sein.

Oder ich könnte mit meinen Mutmaßungen auch vollständig daneben liegen
  Mit Zitat antworten Zitat
delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
275 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: EListError, warum? ObjectList mit Daten füllen

  Alt 21. Mai 2022, 13:53
Huch! Doublette!

Wie macht delphi das in seinem Stringgrid?

Ich codiere:

TStringList(FRowsContainer.Items[ARow]).AddObject(' ', gridColumn); Und da ist sie, die Doublette! Trotz AList.Duplicates := dupAccept in SetRows! tritt jetzt der Feler immr noch auf, allerdings verändert, das Programm hängt fest, der EListError erscheint nun nicht mehr, aber das Programm hängt.

Wie macht das Delphi mit der Stringliste die auch dort die Strings aufnimmt?

Der Fehler trat zuerst hier auf:
Delphi-Quellcode:
 if (ACol<TStringList(FRowsContainer.Items[ARow]).Capacity) and Assigned(TGridColumn(TStringList(FRowsContainer.Items[ARow]).Objects[ACol])) then
    begin
    w := gc.Width; //TGridColumn(TStringList(FRowsContainer.Items[ARow]).Objects[ACol]).Width; //#### Hier der EListError ####[]
Hier noch mal die ganze Methode:
Delphi-Quellcode:
procedure TCustomGrid.Paint;
var ACol,ARow,w,h,l,t,r,b: Integer; gc: TGridColumn; sl: TStringList; rc: TObjectList;
begin
  inherited Paint;
  for ARow:=0 to FRowsContainer.Count-1 do
  for ACol:=0 to TStringList(FRowsContainer.Items[ARow]).Count-1 do
  begin
    rc := FRowsContainer;
    sl := TStringList(rc.Items[ARow]);
    gc := TGridColumn(sl.Objects[ACol]);
    if (ACol<TStringList(FRowsContainer.Items[ARow]).Capacity) and Assigned(TGridColumn(TStringList(FRowsContainer.Items[ARow]).Objects[ACol])) then
    begin
    w := gc.Width; //TGridColumn(TStringList(FRowsContainer.Items[ARow]).Objects[ACol]).Width; //#### Hier der EListError ####
    h := gc.Height; //TGridColumn(TStringList(FRowsContainer.Items[ARow]).Objects[ACol]).Height;
    l := gc.Left; //TGridColumn(TStringList(FRowsContainer.Items[ARow]).Objects[ACol]).Left;
    t := gc.Top; //TGridColumn(TStringList(FRowsContainer.Items[ARow]).Objects[ACol]).Top;
    end;
    DrawRectangleClip(vscreen,l,t,l+w,t+h,ToColor(colBlack));

    t := t + h;
    l := l + w;
  end;
end;
Siehe auch Eingangsbeitrag, dortiger Code.


In SetRows -> AList.Capacity:=5 muss ich natürlich noch anpassen auf beliebig viele Elemente. Aktuell aber sollen für den Test 5 Spalten genügen.

Die Schwierigkeit ist hier, dass ich zunächst eine Zeile erzeigen will, aber noch nicht weiß, wie viele Spalten die haben soll, das entscheidet sich danach erst in SetCols().
Ich brauchte hier eine dynamische Anpassung der Spalten nachdem die Zeile erzeugt ist. Auch hier die Frage, wie macht Delphi das in seinem Stringgrid? Da guck ich inzwischen mal in den Code rein. Vielleicht finde ich ja dort die Lösung des Problems. Vorausgesetzt Emba programmiert nicht zu trickreich.

Geändert von delphifan2004 (21. Mai 2022 um 14:18 Uhr)
  Mit Zitat antworten Zitat
delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
275 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: EListError, warum? ObjectList mit Daten füllen

  Alt 21. Mai 2022, 18:06
Debuggen ergibt in SetRows die Fortsetzung

for ACol := 0 to FCols-1 do

eine Zählung über Spalte 9 hinaus. Warum das? Ich will 9 Spalten haben und nicht 10 SetCols(9)! 0..9 sind doch schon 10 Spalten, FCols -1 sind 9 Spalten!

Offenbar wird die Abbruchbedingung nicht eingehalten. Wie kann das sein? Die For Schleife sollte doch automatisch weiter zählen und bei Erreichen des Maximalwertes abbrechen.

Ich habe in SetCols() die Zeile

if ACol >= FCols-1 then break ergänzt.
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#4

AW: EListError, warum? ObjectList mit Daten füllen

  Alt 21. Mai 2022, 18:28
Ich verweise nochmals auf diese Bitte.. Mit den Fehlern wie sie aktuell sind.
So können wir leider nur raten.
Zitat:
vielleicht solltest du ein kleines Test-Programm posten, dann kann man das auch leichter testen.

Geändert von venice2 (21. Mai 2022 um 18:35 Uhr)
  Mit Zitat antworten Zitat
delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
275 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: EListError, warum? ObjectList mit Daten füllen

  Alt 21. Mai 2022, 19:02
Da versuch ich mal ein Testprogramm zu bauen, das aktuelle verwendet noch andere Units, die machen die Suche nur unübersichtlich. Ich baue ein neues Programm nur mit dem Grid.

Wo ist dieses Edit, das ich mir anschauen soll?
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#6

AW: EListError, warum? ObjectList mit Daten füllen

  Alt 21. Mai 2022, 19:49
Da versuch ich mal ein Testprogramm zu bauen, das aktuelle verwendet noch andere Units, die machen die Suche nur unübersichtlich. Ich baue ein neues Programm nur mit dem Grid.

Wo ist dieses Edit, das ich mir anschauen soll?
Hier!

So wie es vorher(aktuell ist) kann es nicht funktionieren.
Delphi-Quellcode:
    
  l := TGridColumn(TStringList(FRowsContainer.Items[ARow]).Objects[ACol]).Left; // left wird l zugewiesen
  t := TGridColumn(TStringList(FRowsContainer.Items[ARow]).Objects[ACol]).Top; // Top wird t zugewiesen

  DrawRectangleClip(vscreen,l,t,l+w,t+h,ToColor(colBlack));
  
  // Beide variablen werden nicht verwendet daher gehen diese Zuweisungen auf dieser Basis ins leere.
  t := t + h; // t wird anschließend incrementiert aber nicht mehr benutzt weil die Variable t nicht global definiert ist und vorher nicht zugewiesen wird.
  l := l + w; // l wird anschließend incrementiert aber nicht mehr benutzt weil die Variable l nicht global definiert ist und vorher nicht zugewiesen wird.
Du hättest es spätestens bemerkt wenn du über deinen Fehler hinweg gekommen wärst.

Geändert von venice2 (21. Mai 2022 um 20:24 Uhr)
  Mit Zitat antworten Zitat
delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
275 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: EListError, warum? ObjectList mit Daten füllen

  Alt 21. Mai 2022, 21:21
In diesem Testprojekt ist der EListerror weg aber von Paint wird nichts ausgegeben nur die Zeile "Zurück mit << ENTER > >> ...'

Delphi-Quellcode:
program Project3;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,System.Classes,Contnrs;

type
  TGridColumn = class(Tobject)
  private
    FWidth: Integer;
    FHeight: Integer;

  public
    constructor Create;
    property Width: Integer read FWidth write FWidth;
    property Height: Integer read FHeight write FHeight;
  end;

  TCustomGrid = class(TObject)
  private
    FCols: Integer;
    FRows: Integer;
    FRowsContainer: TObjectList;

    procedure SetCols(AValue: Integer);
    procedure SetRows(AValue: Integer);
  public
    constructor Create;
    destructor Destroy; override;
    procedure Paint;
    property Cols: Integer read FCols write SetCols;
    property Rows: Integer read FRows write SetRows;
  end;

{ TGridColumn }

constructor TGridColumn.Create;
begin
  inherited Create;
end;

{ TCustomGrid }

constructor TCustomGrid.Create;
begin
  inherited Create;
  FRowsContainer := TObjectList.Create;
end;

destructor TCustomGrid.Destroy;
begin
  FRowsContainer.Free;
  inherited;
end;

procedure TCustomGrid.SetCols(AValue: Integer);
var ACol,ARow: Integer; gridColumn: TGridColumn;
begin
  if FCols=AValue then Exit;
  FCols:=AValue;

  for ARow := 0 to FRows -1 do
  begin
    for ACol := 0 to FCols-1 do
    begin
      gridColumn := TGridColumn.Create;
      gridColumn.Width := 200;
      gridColumn.Height := 20;
      TStringList(FRowsContainer.Items[ARow]).AddObject(' ', gridColumn);
      if ACol >= FCols-1 then break;
    end;
  end;
end;

procedure TCustomGrid.SetRows(AValue: Integer);
var ARow: Integer; AList: TStringList;
begin
  if FRows=AValue then Exit;
  FRows:=AValue;
  for ARow := 0 to FRows-1 do
  begin
    AList := TStringList.Create; AList.Capacity := 5;
    AList.Duplicates:=dupAccept;
    FRowsContainer.Add(AList);
  end;
end;

procedure TCustomGrid.Paint;
var ACol,ARow,w,h,l,t,r,b: Integer; gc: TGridColumn; sl: TStringList; rc: TObjectList;
begin
  for ARow:=0 to FRowsContainer.Count-1 do
  begin
    for ACol:=0 to TStringList(FRowsContainer.Items[ARow]).Count-1 do
    begin
      rc := FRowsContainer;
      sl := TStringList(rc.Items[ARow]);
      gc := TGridColumn(sl.Objects[ACol]);
      if (ACol<TStringList(FRowsContainer.Items[ARow]).Capacity) and Assigned(gc) then
      begin
        w := gc.Width; //TGridColumn(TStringList(FRowsContainer.Items[ARow]).Objects[ACol]).Width;
        h := gc.Height; //TGridColumn(TStringList(FRowsContainer.Items[ARow]).Objects[ACol]).Height;
       // l := gc.Left; //TGridColumn(TStringList(FRowsContainer.Items[ARow]).Objects[ACol]).Left; //aus Originalcode übernommen
       // t := gc.Top; //TGridColumn(TStringList(FRowsContainer.Items[ARow]).Objects[ACol]).Top; //aber hier weggelassen
      end;
     // DrawRectangleClip(vscreen,l,t,l+w,t+h,ToColor(colBlack));
     writeln('Breite: ',w); //wird nicht angezeigt, warum?
     writeln('Höhe : ',h); //wird nicht angezeigt, warum?
     //writeln('Links : ',l);
     //writeln('Oben : ',t);
      {
      t := t + h; //t (Top  soll um h (Zeilenhöhe) nach unten, nachdem Gridrahmenlinie oben gezeichnet ist
      l := l + w; //l (Left) soll um w (Spaltenbreite) nach rechts, nachdem Gridrahmenlinie links gezeichnet ist
      }

      inc(t, h);
      inc(l, w);
    end;
    if ARow >= FRows then break;
  end;
end;


var
  Grid: TCustomGrid;

begin
  try
    { TODO -oUser -cConsole Main : Code hier einfügen }
    Grid:=TCustomGrid.Create;
    Grid.Cols := 9;
    Grid.Rows := 5;
    Grid.Paint;
    writeln('Zurück mit << ENTER >> > >>> ... ');
    readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
@venice2:

Mein Code:

Delphi-Quellcode:
      DrawRectangleClip(vscreen,l,t,l+w,t+h,ToColor(colBlack));
      {
      t := t + h;
      l := l + w;
      }

      inc(t, h);
      inc(l, w);
    end;
    if ARow >= FRows then break;
    //Diese Zeile habe ich hinzugefügt, damit nach Zeile 5 keine weitere hinzugefügt wird. Ich weiß zwar, dass die FOR Schleife automatisch abbricht, ja abbrechen sollte,
    //wenn der Endwert erreicht ist, aber ich habe nun mal den EListError. Übrigens mit Freepascal geschrieben, der Code, aber auch dort ist mir kein Fehler im Compiler bekannt, deshalb habe ich das
    //bisher nicht erwähnt.
Damit werden doch die Variablen l,t,w und h in der DrawRectangleClip Prozedur verwendet. Aber der EListError verhindert, dass ich dorthin komme.
l=Left und t=Top werden zwar mit erhöht, aber da sollte ich ddoch wenigstens die erste Gridspalte sehen, so wie der Code hier aussieht.

Zitat von venice2:
// t wird anschließend incrementiert aber nicht mehr benutzt weil die Variable t nicht global definiert ist und vorher nicht zugewiesen wird.
Warum müssen diese vars global definiert sein. Ich will doch lokal zeichnen? Und nach meinem Verständnis ist doch DrawRectangleClip() innerhalb der Schleife. Einen Strich oder Punkt müsste ich doch dann wenigstens sehen? Leider ist mir hier gar nichts klar.


Der von mir gesuchte Fehler muss hier liegen:

Delphi-Quellcode:
      rc := FRowsContainer;
      sl := TStringList(rc.Items[ARow]); //das hier nicht Assigned oder
      gc := TGridColumn(sl.Objects[ACol]); //das hier nicht Assigned
      if (ACol<TStringList(FRowsContainer.Items[ARow]).Capacity) and Assigned(gc) then
Wenn es das ist, wie kann ich solche Zuweisung zuverlässiger erreichen. Schließlich werden auch in meinem Testprojekt Breite und Höhe nicht angezeigt.

Geändert von delphifan2004 (21. Mai 2022 um 21:44 Uhr)
  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 08:55 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 by Thomas Breitkreuz