Einzelnen Beitrag anzeigen

venice2
(Gast)

n/a Beiträge
 
#20

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

  Alt 24. Mai 2022, 12: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 13:04 Uhr)
  Mit Zitat antworten Zitat