[Delphi] string grid

Pagina: 1
Acties:
  • 286 views sinds 30-01-2008
  • Reageer

  • RSP
  • Registratie: Juni 2001
  • Laatst online: 24-06 10:36
hoe kan ik 'n ingevuld string grid in 1x leeg gooien ?
heb alle commando's doorgelopen maar nix gevonden
(ik heb delphi6)

tia

Verwijderd

De StringGrid is in Delphi zo ontworpen dat je het eigenlijk alleen maar op zoiets als de volgende manier kunt doen:
code:
1
2
3
4
5
6
7
8
9
procedure ClearGrid(AGrid: TStringGrid);
var
  iCol, iRow: integer;
begin
  with AGrid do
    for iCol := 0 to ColCount-1 do
    for iRow := 0 to RowCount-1 do
      Cells[iCol, iRow] := '';
end;

(er even vanuit gaand dat je geen Objects hebt toegevoegd...)

Technisch gezien zou 't wel mogelijk zijn om in 1x de hele grid te clearen, maar in de praktijk kan 't gewoon niet:
TStringGrid heeft een field FData, wat een pointer is naar een TSparseList, en TSparseList heeft wel een Clear method. Maar FData is private, en daar kun je dus gewoon niet bij. Tenminste niet zonder de Grids unit aan te passen, en dat wil je niet... :)

  • RSP
  • Registratie: Juni 2001
  • Laatst online: 24-06 10:36
Op donderdag 06 december 2001 20:23 schreef Afterlife het volgende:
De StringGrid is in Delphi zo ontworpen dat je het eigenlijk alleen maar op zoiets als de volgende manier kunt doen:
code:
1
2
3
4
5
6
7
8
9
procedure ClearGrid(AGrid: TStringGrid);
var
  iCol, iRow: integer;
begin
  with AGrid do
    for iCol := 0 to ColCount-1 do
    for iRow := 0 to RowCount-1 do
      Cells[iCol, iRow] := '';
end;

(er even vanuit gaand dat je geen Objects hebt toegevoegd...)

Technisch gezien zou 't wel mogelijk zijn om in 1x de hele grid te clearen, maar in de praktijk kan 't gewoon niet:
TStringGrid heeft een field FData, wat een pointer is naar een TSparseList, en TSparseList heeft wel een Clear method. Maar FData is private, en daar kun je dus gewoon niet bij. Tenminste niet zonder de Grids unit aan te passen, en dat wil je niet... :)
thing works :) thanking you :P

Grid unit aanpassen ?? leuke opdracht voor in de les lijkt me... ff doorsturen naar m'n lerares :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:01
Erg eigenlijk. Sommige mensen denken dat je alles kunt doen met een één voorgedefinieerde functie. Waar zijn de echte hackers gebleven?

https://fgheysels.github.io/


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Op donderdag 06 december 2001 21:28 schreef whoami het volgende:
Erg eigenlijk. Sommige mensen denken dat je alles kunt doen met een één voorgedefinieerde functie. Waar zijn de echte hackers gebleven?
Ach, als je bijvoorbeeld denkt aan een TStringList of een TListView dan is het niet zo vreemd dat er voor een Grid ook wel een .Clear functie is. :)

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • RSP
  • Registratie: Juni 2001
  • Laatst online: 24-06 10:36
Op donderdag 06 december 2001 21:58 schreef jelmervos het volgende:

[..]

Ach, als je bijvoorbeeld denkt aan een TStringList of een TListView dan is het niet zo vreemd dat er voor een Grid ook wel een .Clear functie is. :)
dat was ook mijn 1e ged8e :) maar dat mocht niet zo zijn :)

Verwijderd

Wees blij dat je niet direct die TSparseList kunt clearen...
Voor alleen de Cells zou 't nog wel meevallen, maar wat als er ook nog Objects aan hangen?
Dat kunnen echte TObject afgeleiden zijn, die met FreeAndNil goed op te ruimen zijn, maar net als bij StringLists, etc. kunnen 't ook gewoon integers gecast naar pointers zijn, of pointers naar objecten die nog helemaal niet gefreed moeten worden.

Nu moet je dat zelf beslissen, en laat je 't niet aan die TSparseList over. :)

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 23:21

mulder

ik spuug op het trottoir

BTW, maakt het anders niet uit of je 0 to ColCount-1 of dat je ColCount-1 to 0 doet?

oogjes open, snaveltjes dicht


  • RSP
  • Registratie: Juni 2001
  • Laatst online: 24-06 10:36
dan maakt ie hem niet helemaal leeg volgens mij :)

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

Ik heb delphi hier niet bij de hand, maar als je de rows op vraagt krijg je toch een TStringlist? Als je die leeg gooit, IPV van handmatig de hele rij, dan heb je weer een stap omzeild.
Wat natuurlijk ook kan is:


StringGrid1.free;
StringGrid1 := TStringgrid.create(...);
form1. (voeg stringgrid opnieuw toe)

Het is wat rigoreus, maar ja...

Localhost, sweet localhost


Verwijderd

Op vrijdag 07 december 2001 05:02 schreef El_Mundo het volgende:
BTW, maakt het anders niet uit of je 0 to ColCount-1 of dat je ColCount-1 to 0 doet?
downto...

Bij een normale (String)List die over het algemeen sequentieel gevuld wordt, is de laatste manier iets efficienter voor het geheugenbeheer (er ontstaan niet of nauwelijks gaten in het geheugen), maar een SparseList is juist bedoeld om random aangesproken te worden, en daar maakt 't nauwelijks iets uit.

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 08-09 08:43

Bergen

Spellingscontroleur

Kun je dat ding niet rechtstreeks in het geheugen leegmaken?

Verwijderd

Op vrijdag 07 december 2001 09:52 schreef kvdveer het volgende:
Ik heb delphi hier niet bij de hand, maar als je de rows op vraagt krijg je toch een TStringlist? Als je die leeg gooit, IPV van handmatig de hele rij, dan heb je weer een stap omzeild.
Nee, je krijgt dan een TStringGridStrings terug. En wanneer je die leeg gooit gaat 'ie op zoek naar z'n TSparseList en zet iedere waarde die bij z'n row hoort op ''.

Is inderdaad een fractie efficienter, omdat niet voor iedere Cell de bijbehorende TStringSparseList hoeft worden opgehaald, maar per Row of Column. Maar aangezien dat puur pointers zijn die keihard gecast worden, kost 't vrijwel geen tijd. Niet merkbaar in ieder geval.

Verwijderd

Op vrijdag 07 december 2001 23:19 schreef GerbenW het volgende:
Kun je dat ding niet rechtstreeks in het geheugen leegmaken?
Zou leuk zijn wanneer 't 1 geheugenblok is, maar dat is 't niet.
De inhoud van een TSparseList wordt bijgehouden in een TSparsePointerArray, een lijst van pointers naar (mogelijk) willekeurige plaatsen in het geheugen waar de string voor de verschillende cellen staan.
Klinkt misschien ingewikkeld (en dat is 't ook wel), maar 't is wel weer erg slim in elkaar gezet. Een SparsePointerArray entry wordt pas aangemaakt op het moment dat 'ie wordt aangesproken. Tot die tijd neemt 'ie geen geheugen in beslag. De inhoud van een 100 x 100 StringGrid waar maar 2 cellen van zijn ingevuld, kost dus maar 2 pointers + de inhoud van die cellen. Normaal zou dat al sowieso 10.000 pointers (x 4 bytes) zijn.

Verwijderd

Afterlife:
code:
1
2
3
4
5
6
7
8
9
procedure ClearGrid(AGrid: TStringGrid);
var
  iCol, iRow: integer;
begin
  with AGrid do
    for iCol := 0 to ColCount-1 do
    for iRow := 0 to RowCount-1 do
      Cells[iCol, iRow] := '';
end;
In wezen hetzelfde, maar dit werkt ook: [Objects worden nu op nil gezet]
code:
1
2
3
4
5
6
7
8
procedure ClearGrid(AGrid: TStringGrid);
var
  I: Integer;
begin
  with AGrid do
    for I := 0 to RowCount - 1 do
    Rows[I].Clear;
end;

Verwijderd

Op zaterdag 08 december 2001 00:48 schreef DiFool het volgende:
In wezen hetzelfde, maar dit werkt ook: [Objects worden nu op nil gezet]
En juist vanwege die Objects gaf ik niet jouw manier als voorbeeld. De pointers naar die objects worden wel op nil gezet (sterker nog, ze bestaan helemaal niet meer in de CachedIndex), maar de objecten zelf worden niet gefreed. En het is ook maar de vraag of je dat op dat moment wel wilt...

Memory leaks worden heel gemakkelijk tot stand gebracht als je niet precies weet wat de gevolgen van zo'n actie zijn.
Pagina: 1