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.