Avatar billede tigertool Nybegynder
01. august 2004 - 18:43 Der er 11 kommentarer og
1 løsning

Fjerne row i StringGrid

Jeg har et StringGrid hvor jeg adder data:

StringGrid1->Cells[1][1] = "60";
StringGrid1->Cells[2][1] = "Test";

Jeg har sat goRowSelect til true.

Men hvordan fjerner jeg nu et helt row - og det skal være det row der er selected?
Avatar billede Slettet bruger
01. august 2004 - 18:49 #1
Avatar billede tigertool Nybegynder
01. august 2004 - 18:53 #2
Hmm... det hjalp jo ikke meget..
Avatar billede Slettet bruger
01. august 2004 - 18:59 #3
Hmm.. så virker det her måske:

procedure DeleteRow(StringGrid: TStringGrid; Row: Integer);
var
  i: Integer;
begin
  with yourStringGrid do
  begin
    for i := Row to RowCount-2 do
      Rows[i].Assign(Rows[i+1]);
    RowCount := RowCount - 1
  end;
end;
Avatar billede tigertool Nybegynder
01. august 2004 - 19:06 #4
Er det delphi kode?
Avatar billede Slettet bruger
01. august 2004 - 19:14 #5
Ja... Men har ikke testet den..

Lige en rettelse:

  with yourStringGrid do

skal være

  with StringGrid


og for at slette den markerede række, tror jeg du kan bruge:

procedure TForm1.Button1Click(Sender: TObject)
begin
  if (gdSelected in State) then
  begin
    DeleteRow(StringGrid1, StringGrid1.Selected.Left);
  end;
end;
Avatar billede tigertool Nybegynder
01. august 2004 - 19:17 #6
ikke for noget.. men det er et C/C++ forum?
Avatar billede Slettet bruger
01. august 2004 - 19:20 #7
Ups... undskyld... :(
Avatar billede tigertool Nybegynder
01. august 2004 - 19:23 #8
gør ikke noget.. kan bare ikke forstå delhpi kode :)
Avatar billede Slettet bruger
01. august 2004 - 21:00 #9
Måske virker det her så... Det skulle vist være C++ nu :-) :

void __fastcall RemoveRow(
  TStringGrid* StringGrid, int Index)
{
  SendMessage(StringGrid->Handle,
    WM_SETREDRAW, false, 0);
  try {
    const int row_count =
      StringGrid->RowCount;

    // (1) shift the contents of
    // the trailing columns
    for (int row = Index;
        row < row_count - 1; ++row) {
      StringGrid->Rows[row] =
        StringGrid->Rows[row + 1];
    }     

    // (2) remove the last column
    StringGrid->RowCount = row_count -1;
  }
  catch (...) {
    SendMessage(StringGrid->Handle,
      WM_SETREDRAW, true, 0);
  }
  SendMessage(StringGrid->Handle,
    WM_SETREDRAW, true, 0);

  // update (repaint) the shifted cols
  RECT R =
    StringGrid->CellRect(0, Index);
  InflateRect(&R, StringGrid->Width,
    StringGrid->Height);
  InvalidateRect(StringGrid->Handle,
    &R, false);
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        if(StringGrid1->Selection.Left > 0)
                RemoveRow(StringGrid1, StringGrid1->Selection.Left);
}

Fandt RemoveRow funktionen her:
http://www.cppbuilderdevjournal.com/articles/issues/0009/Working_with_string_grids.htm
Avatar billede tigertool Nybegynder
02. august 2004 - 01:28 #10
Hmm... den har bare et lille problem.. den fjerner kun den øverste på listen :( Den fjerner ikke det markerede
Avatar billede Slettet bruger
02. august 2004 - 07:59 #11
Hmm... tror egentlig det er fordi jeg har skrevet Left i stedet for Top :/... Prøv det her i stedet:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        if(StringGrid1->Selection.Top > 0)
                RemoveRow(StringGrid1, StringGrid1->Selection.Top);
}
Avatar billede tigertool Nybegynder
03. august 2004 - 02:18 #12
Ja ja.. så virker det :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester