Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Stringgrid - Objekt aufrücken


LittleBen - So 30.01.11 22:24
Titel: Stringgrid - Objekt aufrücken
Hallo,

ich versteh es einfach nicht!
Mein Problem:

Der 1 Zelle der 1 Zeile meines Stringgrids weise ich ein Objekt als Integer zu und fülle diese Zelle dann:

Delphi-Quelltext
1:
2:
Stringgrid1.Objects[0,1]:= Pointer(4);
Stringgrid1.Cells[0,1]:= 'Test';

Das Gleiche mach ich dann mit der 1 Zelle der 2 Zeile:

Delphi-Quelltext
1:
2:
Stringgrid1.Objects[0,2]:= Pointer(8);
Stringgrid1.Cells[0,2]:= 'Test2';

Funktioniert wunderbar!
Aber wenn ich nun die 1 Zeile löschen, dem Objekt der 1 Zelle dann den Wert nil zuweise, dann rückt der Inhalt aus der 2 Zeile zwar auf, aber das Objekt deren nicht. Warum?

Also löschen tu ich so:

Delphi-Quelltext
1:
2:
Stringgrid1.Objects[0,1].Free;
DeleteRow(Stringgrid1,1//Eine Procedure aus dem Internet;


Wenn ich nun das Objekt der 1 Zelle der 1 Zeile abfrage bekomme ich den Wert 0 Zurück?! (Also wirklich "0")
Wenn ich das bei der 1 Zelle der 2 Zeile mache bekomme ich immer noch den Wert 8 zurück.

Delphi-Quelltext
1:
showmessage(inttostr(Integer(Stringgrid1.Objects[01])));                    

und

Delphi-Quelltext
1:
showmessage(inttostr(Integer(Stringgrid1.Objects[01])));                    

Kann mir jemand helfen?

Grüße,
Benny


Moderiert von user profile iconNarses: Topic aus Dateizugriff verschoben am So 30.01.2011 um 22:51


Bergmann89 - So 30.01.11 23:21

Hey,

guck dir ma die DeleteRow-Methode an, da wird sicherlich nur der Inhalt aller nachfolgenden Reihen nach oben kopiert und dann die letzte Reihe gelöscht. So musst du das auch mit deinen Objekten machen. Ein Free gibt lediglich die Instanz frei (wenn du eine hast) aber da du ja in dem Object nur Integer-Werte speicherst ist es sowieso falsch da Free zu benutzen, da das Programm dann versucht den Wert in Objects als TObject zu interpretieren und dann dessen Speicher freigeben will.

MfG Bergmann.


jaenicke - Mo 31.01.11 06:17

Für diesen Zweck ist eine TListView oder noch besser eine TVirtualStringTree viel besser geeignet.

Diese Komponenten bieten direkt die Möglichkeit einzelne Zeilen zu löschen. Und da sind die einzelnen Zeilen direkt gekapselt inkl. der dazu gehörenden Daten, so dass man sich da gar nicht erst etwas eigenes zum Löschen einer Zeile basteln muss.

Und eine TVirtualStringTree hilft dazu noch bei einer richtigen Trennung zwischen Daten und Oberfläche und ist extrem schnell.


LittleBen - Mo 31.01.11 15:22

Vielen Danke!!!

Die DeleteRow-Methode hat das Objekt nicht gelöscht.

Gruß,
Benny