Page 1 of 2 1 2 LastLast
Results 1 to 15 of 19

Thread: Stringgrid - Last Row

  1. #1
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685

    Question Stringgrid - Last Row

    CodeTyphon 5.5 met Windows 8.1.

    Onderstaande code (Google) werkt voor het verwijderen van één ROW, beginnende bij de "eerste" row.
    Wat ik wens is dat de row verwijderd wordt, beginnende bij de LAATSTE row.
    Reeds dank.

    Code:
     ....
     type
        TMyStringGrid = class(TStringGrid);
      { TFmain }
     TFmain = class(TForm)    
       .....
    procedure TFmain.SpeedButton1Click(Sender: TObject);
    var
      MyStringGrid: TMyStringGrid;
    begin
       MyStringGrid := TMyStringGrid(StringGrid1);
       MyStringGrid.deleteRow(1);
    end;

  2. #2
    *+E13818MU01F0F* Norrit's Avatar
    Join Date
    Aug 2001
    Location
    Landgraaf
    Posts
    967
    1 rij beginnende bij de laatste?
    Is toch net zoiets als: verwijder me de laatste rij...

    Maar de "1" die je meegeeft is de rij die je wil verwijderen.
    Zou dus niets anders moeten zijn dan vervangen door MyStringGrid.RowCount
    Objective reality is a delirium caused by lack of alcohol in blood

  3. #3
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685
    Dank voor snelle reactie.
    Code:
    procedure TFmain.SpeedButton1Click(Sender: TObject);
    var
      MyStringGrid: TMyStringGrid;
    begin
       MyStringGrid := TMyStringGrid(StringGrid1);
       MyStringGrid.deleteRow(MyStringGrid.RowCount);
    end;
    Dit geeft ERROR: Gridindex out of range

  4. #4
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Een grid (net als veel andere array-achtige zaken in Pascal) zijn 0-based.
    Count geeft het aantal regels, de eerste regel zit op 0.

    Je moet dus DeleteRow(RowCount - 1) doen.
    TMemoryLeak.Create(Nil);

  5. #5
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685

    Question

    Sorry. Heb het niet goed verwoord.
    Het is ENKEL de inhoud van de laatste ROW die verwijderd moet.
    Het aantal rows moet blijven.

  6. #6
    Dan is deleteRow() natuurlijk de verkeerde optie.
    Je kunt gewoon StringGrid1.Rows[StringGrid1.RowCount - 1].Clear; doen.

    Als je de laatst gevulde rij wil wissen dan moet je dus eerst zoeken welke dat is.

  7. #7
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685

    Question

    Je kunt gewoon StringGrid1.Rows[StringGrid1.RowCount - 1].Clear; doen.
    Dat zal het zijn.
    Als je de laatst gevulde rij wil wissen dan moet je dus eerst zoeken welke dat is.
    Dank rvk.
    Je weet beter dan ik wat ik wil.
    Het is inderdaad de laatste row + de vorige die zouden moeten leeg gemaakt worden.
    Het gebeurt soms dat men bij de verkeerde persoon punten invuld en dan kan men niet op zijn stappen terugkomen.
    Attached Thumbnails Attached Thumbnails Click image for larger version. 

Name:	Wiezen.jpg 
Views:	116 
Size:	78.8 KB 
ID:	7731  

  8. #8
    Dit haalt de laatst gevulde regel leeg.
    Delphi Code:
    1. var
    2.   I: Integer;
    3. begin
    4.   I := StringGrid1.RowCount - 1;
    5.   while (I > 0) and (StringReplace(StringGrid1.Rows[I].CommaText, ',', '', [rfReplaceAll]) = '') do Dec(I);
    6.   if I > 0 then StringGrid1.Rows[I].Clear;

  9. #9
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685
    Dank.
    Moet nu weg.
    Ik geef je morgen het resultaat.

  10. #10
    Clean(StartCol,StartRow,EndCol,EndRow: integer; CleanOptions: TGridZoneSet) ?

    Bart

  11. #11
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685

    Exclamation

    Heb de procedure iets aangepast met een loop zodat dadelijk de inhoud wordt verwijderd
    van de laatste 2 rows.
    Er worden telkens in de witte row de punten ingevuld en in de volgende gele row het totaal.
    Code:
    procedure TFmain.btnTERUGClick(Sender: TObject);
    var
      I,x: Integer;
    begin
      For x := 1 downto 0 do
      begin
        I := StringGrid1.RowCount - 1;
        while (I > 0) and (StringReplace(StringGrid1.Rows[I].CommaText, ',', '', [rfReplaceAll]) = '') do Dec(I);
        if I > 0 then StringGrid1.Rows[I].Clear;
      end;
    end;
    rvk,
    Jouw code werkt prima, maar er zijn nog enkele bijkomende problemen.
    Wanneer er terug een nieuw spel( en de punten) wordt ingevuld, dan worden er 2 rows overgeslagen, wat natuurlijk niet de bedoeling is want dan is het aantal gespeelde spellen niet meer juist.
    Tevens zou de "varGift" (aantal gespeelde spellen of giften) moeten aangepast worden, ttz -1.
    Attached Files Attached Files

  12. #12
    Ja, maar je houdt hier dus zelf een tellertje bij waar de laatste punten geschreven zijn. Waarom zou je dan "de laatst gevulde" rij in je StringGrid willen zoeken????

    Je kunt dan veel beter zoiets doen:

    Delphi Code:
    1. procedure TFmain.btnTERUGClick(Sender: TObject);
    2. begin
    3.   Dec(varGift);
    4.   StringGrid1.Rows[(varGift * 2) - 1].Clear; // punten weg
    5.   StringGrid1.Rows[(varGift * 2)].Clear; // totaal weg
    6. end;

    Nu ga je alleen nog een ander probleem krijgen. Je hebt ook varSpeler1Totaal e.d. waar je de totaalpunten in bij houdt. Die moet je dus ook aflagen in plaats van de punten alleen verwijderen.

    En inmiddels wordt het veeeeeeel beter om het punten-mechanisme te gaan scheiden van je GUI (i.e. StringGrid). Want nu doe je alles in een event (btnBEWAARPUNTENClick). Het bijwerken van je punten integer en het vullen van je stringgrid.

    Het is dus beter om een aparte Array van records bij te gaan houden. Je maakt dan een aparte routine voor AddPunten(speler1, speler2, speler3, speler4: integer) en een VerwijderPunten(Spel: Integer);
    Verder heb je 1 routine VulGrid die gewoon je hele grid opnieuw vult met alle punten.

    pseudo code:
    Delphi Code:
    1. procedure btnBEWAARPUNTENClick
    2. begin
    3.   if QuestionDlg
    4.   begin
    5.     AddPunten(s1, s2, s3, s4);
    6.     VullGrid;
    7.   end;
    8. end;
    9.  
    10. procedure btnTERUGClick
    11. begin
    12.   VerwijderPunten(High(puntenArray));
    13.   VulGrid;
    14. end;

    Op dit moment zul je echt wat code uit elkaar moeten gaan trekken naar nuttige functies want anders groeit je code tot een groot waterhoofd.

  13. #13
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685

    Lightbulb

    rvk,
    Amaai .... amaai...
    Zal trachten om het te snappen.
    In ieder geval dank voor je steun.

  14. #14
    Ander zul je iets als dit moeten doen:
    Delphi Code:
    1. procedure TFmain.btnTERUGClick(Sender: TObject);
    2. begin
    3.   if varGift <= 1 then exit;
    4.   Dec(varGift);
    5.  
    6.   // hier moet je nu voordat je een clear doet de punten
    7.   // van speler 1-4 van de spelerstotalen af halen.
    8.   // die punten staan dus in StringGrid1.Cell[1 tot 4, (varGift * 2) - 1]
    9.   // ik neem dat je dat wel lukt.
    10.  
    11.   StringGrid1.Rows[(varGift * 2) - 1].Clear; // punten weg
    12.   StringGrid1.Rows[(varGift * 2)].Clear; // totaal weg
    13. end;

  15. #15
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685

    Exclamation

    Rvk, Sorry ... het is toch een niveau te hoog voor mij.

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •