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
delphifan2004

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

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

  Alt 22. Mai 2022, 16:39
[QUOTE=venice2;1506171]Ok du hast Rows und Cols vertauscht.. deshalb wurde deine TStringliste nicht gefüllt in deinem Beispiel!
Versuche das hier. Habe keinen ElistError läuft wie es soll.

Delphi-Quellcode:
program Project3;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils, System.Classes, Contnrs;

type
  TGridColumn = class(Tobject)
  private
    FWidth: Integer;
    FHeight: Integer;
    FLeft: Integer;
    FTop: Integer;
  public
    constructor Create;
    property Width: Integer read FWidth write FWidth;
    property Height: Integer read FHeight write FHeight;
    property Left: Integer read FLeft write FLeft;
    property Top: Integer read FTop write FTop;
  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;

var
  l, t, w, h: Integer;
  { 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;
      gridColumn.Left := 10;
      gridColumn.Top := 10;
      TStringList(FRowsContainer.Items[ARow]).AddObject(' ', gridColumn);
    end;
  end;
end;

procedure TCustomGrid.SetRows(AValue: Integer);
var
  ARow: Integer;
  AList: TStringList;
begin
  if FRows = AValue then
    Exit;
  FRows := AValue;
  
  if FRowsContainer.Count > 0 then
    FRowsContainer.Clear; // falls mehrfacher Aufruf von SetRows Container löschen;

  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 { , 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(TGridColumn(TStringList(FRowsContainer.Items[ARow]).Objects[ACol])) then
      begin
        // TGridColumn(TStringList(FRowsContainer.Items[ARow]).Objects[ACol]).Width;
        w := gc.Width;
        // TGridColumn(TStringList(FRowsContainer.Items[ARow]).Objects[ACol]).Height;
        h := gc.Height;
        // TGridColumn(TStringList(FRowsContainer.Items[ARow]).Objects[ACol]).Left; //aus Originalcode übernommen
        l := l + gc.Left;
        // TGridColumn(TStringList(FRowsContainer.Items[ARow]).Objects[ACol]).Top; //aber hier weggelassen
        t := t + gc.Top;
      end;

      writeln('Top: ', t);
      writeln('Left: ', l);

      inc(t, h);
      inc(l, w);
    end;
  end;
end;

var
  Grid: TCustomGrid;

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

end.
Danke wie verrückt! Brett vorm Kopp gehabt, bei den vertauschten Dimensionen. Oh Mann, manchmal ist es einfach zum Verzweifeln, man findet den Fehler nicht und dann ist es so ne simple Sache. Vier Augen sehen oft mehr als nur zwei! Danke! Funktioniert nun wie es soll.

Zitat von venice2:
w, h müssen ebenfalls global definiert werden weil diese ansonsten nicht initialisiert sind.
Alternativ kannst du die auch local definieren mußt diese dann aber selbst initialisieren und zwar vor der schleife
Das also ist es, warum die Variablen global definiert sein müssen, die Anfangsinitialisierung auch NULL! Hätte gedacht, dass diese Initialisierung auch bei likalen Variablen automatisch vorgenommen wird. Wieder was dazu gelernt.
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#2

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

  Alt 24. Mai 2022, 11:43
Zitat:
Das also ist es, warum die Variablen global definiert sein müssen
Einfach erklärt. (Ohne Informatiker Kauderwelsch)

Du weist(Initialisierst) einer variable den wert innerhalb einer Schleife zu.
Der Compiler erkennt das aber nicht und gibt die Warnung aus das deine variable nicht initialisiert ist.
w, h kann also einen imaginären wert enthalten.

Definierte Variablen innerhalb deiner procedure, function können sich nicht selbst initialisieren das mußt du schon selber tun wenn der Compiler die Warnung ausgibt.
Und zwar immer vor der entsprechenden Schleife innerhalb nutzt es nichts, wie schon gesagt der Compiler kennt den wert nicht.
Deshalb sollte man Warnungen nicht einfach ignorieren.

Mit t, l verhält es sich wie folgt.
Diese Variablen in der procedure, function zu initialisieren macht keinen sinn weil du diese ja hochzählen willst "Außerhalb der Funktion" deshalb muß diese global oder zumindest
innerhalb der Class definiert werden damit diese den Standard wert erhält in diesen Fall 0.
Nur außerhalb deiner procedure, function können diese Hochgezählt werden damit die neuen Werte beim nächsten Aufruf erhalten bleiben.
Innerhalb dieser wären sie wieder nicht initialisiert.

Dein Aufruf!
l := l + gc.Left; ergibt also das Ergebnis l = 0 + 10 inkrementiert mit width l := 220 + 200 usw..
Wäre l in deiner Procedure definiert könnte das Ergebnis so aussehen l = 12345 + 10 (weil deine Variable l nicht initialisiert bzw. global definiert wurde)
Ein hochzählen der Variable l bringt nichts wenn diese nicht global definiert ist da diese innerhalb der Schleife immer wieder neu zugewiesen wird
und somit immer den wert "Irgendeine Zahl + 10" erhält.

Wenn dir irgendein Informatiker das hier besser erklären kann. Bitte schön!

EDIT:
Wenn du nicht möchtest das man von außen global auf die Variablen zugreifen kann dann addiere diese zu deiner TCustomGrid Class
Delphi-Quellcode:
  TCustomGrid = class(Tobject)
  private
    FCols: Integer;
    FRows: Integer;
    FRowsContainer: TObjectList;
    l, t, w, h: Integer; // hier!
    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;

Geändert von venice2 (24. Mai 2022 um 12:04 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:27 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