Solved

delete a row in stringgrid

Posted on 2001-06-04
14
1,408 Views
Last Modified: 2008-03-10
How can i delete a row in a stringgrid?
0
Comment
Question by:ryan_sabarre
  • 6
  • 5
  • 2
  • +1
14 Comments
 

Author Comment

by:ryan_sabarre
ID: 6152216
help me pls.
0
 

Author Comment

by:ryan_sabarre
ID: 6152229
and also how to sort an specified field in a stringgrid
0
 
LVL 4

Expert Comment

by:fva
ID: 6152326
TheStringGrid.Rows.Delete(row_number);

For sorting, unless someone gives you a better solution, you'll have to implement some sorting algorithm over TheStringGrid.Rows and use the Exchange method of TheStringGrid.Rows for exchanging items during sort.

HTH,
F.

0
Courses: Start Training Online With Pros, Today

Brush up on the basics or master the advanced techniques required to earn essential industry certifications, with Courses. Enroll in a course and start learning today. Training topics range from Android App Dev to the Xen Virtualization Platform.

 
LVL 27

Expert Comment

by:kretzschmar
ID: 6152415
a sample for sorting, digged out

unit stringgridsort_u;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    CheckBox1: TCheckBox;
    procedure StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button1Click(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
  private
    FSortedColIndex : Integer;
    FSortOrder      : Boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

Var AsIntegerFlag : Boolean;

Function SpecialSort(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := 0;
  try
    case AsIntegerFlag of
      //AnsiSort
      False : If List[Index1] < List[Index2] then Result := -1
              else If List[Index1] > List[Index2] then Result := 1;
      //IntegerSort
      True  : If StrToInt(List[Index1]) < StrToInt(List[Index2]) then Result := -1
              else If StrToInt(List[Index1]) > StrToInt(List[Index2]) then Result := 1;
    end;
  except
    Result := 0;  //No Sort on Error;
  end;
end;

Procedure SortGrid(AGrid : TStringGrid; ColIndex : Integer; SortOrder : Boolean;
                   //Optional Parameters
                   UseCustomSort : Boolean = False;
                   CustomSortProc : TStringListSortCompare = Nil);
//SortOrder=true->Ascending,SortOrder=False->Descending
//first row is excluded from the sort
var
  SL : TStringList;
  ARow : TStringList;
  I  : Integer;
begin
  if (assigned(AGrid)) and
     (ColIndex > -1) and
     (ColIndex < AGrid.ColCount) then
  begin
     SL := TStringList.Create;
    try
      For I := 1 to AGrid.RowCount - 1 do
      begin
        ARow := TStringList.Create;
        ARow.Assign(AGrid.Rows[i]);
        SL.AddObject(AGrid.Cells[ColIndex,I],ARow);
      end;
      if useCustomSort and assigned(CustomSortProc) then
      try
        SL.CustomSort(CustomSortProc);  //Userdefined sort
      except
        raise;
      end
      else
        SL.Sorted := true; //AnsiCompareString
      Case SortOrder of
        True : For I := 0 to SL.Count - 1 do
                 if Assigned(SL.Objects[I]) then
                   AGrid.Rows[I+1].Assign(TStringList(SL.Objects[I]));
       False : For I := SL.Count - 1  downto 0 do
                 if Assigned(SL.Objects[I]) then
                   AGrid.Rows[AGrid.RowCount - I - 1].Assign(TStringList(SL.Objects[I]));
      end;
    finally
      for I := 0 to sl.count-1 do
        if Assigned(SL.Objects[I]) then
        begin
          TStringList(SL.Objects[I]).Free;
          SL.Objects[I] := Nil;
        end;
      sl.free;
    end;
  end;
end;

Function RandomString(Lngth : Integer; CharSet : TSysCharset) : String;
var C : Char;
begin
  Result := '';
  if (lngth > 0) and not (CharSet = []) then
    while length(Result) < lngth do
    begin
      Repeat
        C := Chr(Random(255));
      Until C in CharSet;
      Result := Result + C;
    end;
end;



procedure TForm1.StringGrid1MouseDown(Sender: TObject;
 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  ACol,ARow : Integer;
  ASortProc : TStringListSortCompare;
begin
  ASortProc := SpecialSort;
  StringGrid1.MouseToCell(x,y,ACol,ARow);
  AsIntegerFlag := ACol in [1,2];
  if (ARow = 0) and
     (ACol > 0) and
     (Acol < StringGrid1.RowCount) then
    if Button =  mbleft then
    begin
      FSortedColIndex := ACol;
      FSortOrder := True;
      SortGrid(StringGrid1,ACol,True,Checkbox1.Checked,ASortProc)  //asc on columntitle-leftclick
    end
    else
    begin
      FSortedColIndex := ACol;
      FSortOrder := False;
      SortGrid(StringGrid1,ACol,False,Checkbox1.Checked,ASortProc);//Desc on columntitle-rightclick
    end;
end;

//Create a unsorted content
procedure TForm1.Button1Click(Sender: TObject);
var I : Integer;
begin
  StringGrid1.RowCount := 10001;
  StringGrid1.ColCount := 7;
  for i := 1 to 6 do
    StringGrid1.Cells[I,0] := Randomstring(5,['0'..'9','A'..'Z','a'..'z']);
  for i := 1 to 10000 do  //10000 Rows
  begin
    StringGrid1.Cells[1,I] := IntToStr(I);
    StringGrid1.Cells[2,I] := IntToStr(10001-I);
    StringGrid1.Cells[3,I] := Randomstring(10,['A'..'Z']);
    StringGrid1.Cells[4,I] := Randomstring(10,['0'..'9','A'..'Z','a'..'z']);
    StringGrid1.Cells[5,I] := Randomstring(10,[#0..#255]);
    StringGrid1.Cells[6,I] := '1000';
  end;
end;

//Draw a Triangle additional to the Caption
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
const CMargin = 5;
begin
  If (ARow = 0) and (ACol = FSortedColIndex) then  //FSortedColIndex->the col, which is sorted
  case FSortOrder of
    true : begin  //Ascending
             StringGrid1.Canvas.Pen.Color := clbtnShadow;
             StringGrid1.Canvas.MoveTo(Rect.Right-CMargin,Rect.Top+CMargin);
             StringGrid1.Canvas.LineTo(Rect.Right-7-CMargin,Rect.Top+CMargin);
             StringGrid1.Canvas.LineTo(Rect.Right-4-CMargin,Rect.Top+7+CMargin);
             StringGrid1.Canvas.Pen.Color := clBtnHighLight;
             StringGrid1.Canvas.LineTo(Rect.Right-CMargin,Rect.Top+CMargin);
           end;
   false : begin  //Descending
             StringGrid1.Canvas.Pen.Color := clBtnHighLight;
             StringGrid1.Canvas.MoveTo(Rect.Right-4-CMargin,Rect.Top+CMargin);
             StringGrid1.Canvas.LineTo(Rect.Right-CMargin,Rect.Top+7+CMargin);
             StringGrid1.Canvas.LineTo(Rect.Right-7-CMargin,Rect.Top+7+CMargin);
             StringGrid1.Canvas.Pen.Color := clbtnShadow;
             StringGrid1.Canvas.LineTo(Rect.Right-4-CMargin,Rect.Top+CMargin);
           end;
  end;
end;

initialization
  Randomize;
end.

meikl ;-)
0
 

Author Comment

by:ryan_sabarre
ID: 6152521
HELP ME
0
 

Author Comment

by:ryan_sabarre
ID: 6152536
please how to DELETE a row in a stringgrid

=fva= you gave me a wrong answer
      your code was not recognized
      delphi ask for '[' in Rows
      and you given me this one.
      TheStringGrid.Rows.Delete(row_number);
0
 
LVL 27

Expert Comment

by:kretzschmar
ID: 6152540
? maybe you should explain more
0
 
LVL 4

Expert Comment

by:fva
ID: 6152599
Deeply sorry. My fault. I didn't test the code, just wrote it directly. I'll try to find something better.

F.
0
 

Author Comment

by:ryan_sabarre
ID: 6152738
its ok
0
 
LVL 4

Accepted Solution

by:
fva earned 100 total points
ID: 6152875
Deletion:
Directly you can't.
Here it is a substitute:

     for i:=row_to_delete to StringGrid1.RowCount-1 do
         StringGrid1.Rows[i].Assign(StringGrid1.Rows[i+1]);
     StringGrid1.RowCount:=StringGrid1.RowCount-1;

For sorting meikl already gave you the solution.

F.
0
 

Author Comment

by:ryan_sabarre
ID: 6153304
thank you so so much fva
0
 
LVL 4

Expert Comment

by:fva
ID: 6153395
Don't mention it. Delete the other question with the same title and having 50 pts hanging. You'll get back the points and probably fast since no one commented it yet. Thank you for accepting my comments.

BTW, you should have requested in Community Support for a point split on this one instead of giving me 100 and posting another 50 for Meikl.

Yours,
F.
0
 
LVL 17

Expert Comment

by:inthe
ID: 6153890
an old trick you can use is the protected DeleteRow method

i know this is already answered but i had this on the clipboard so ... ;-)

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids, StdCtrls;

type
 TDelGrid = Class( TStringGrid);
  TForm1 = class(TForm)
    Button1: TButton;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TDelGrid(StringGrid1) do
   DeleteRow( Stringgrid1.Row );
end;

end.
0
 
LVL 4

Expert Comment

by:fva
ID: 6155156
Hi inthe,

Just curious (2 issues):
1. Am I missing something here? (I'm in a D3 shop)
Looks like you didn't expose DeleteRow in TDelGrid definition.
and
2. How did you get to comment a PAQ (haven't seen you on the comment list)? I guess you didn't buy it just for that.

Cheers,
F.
0

Featured Post

Courses: Start Training Online With Pros, Today

Brush up on the basics or master the advanced techniques required to earn essential industry certifications, with Courses. Enroll in a course and start learning today. Training topics range from Android App Dev to the Xen Virtualization Platform.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
Along with being a a promotional video for my three-day Annielytics Dashboard Seminor, this Micro Tutorial is an intro to Google Analytics API data.
Two types of users will appreciate AOMEI Backupper Pro: 1 - Those with PCIe drives (and haven't found cloning software that works on them). 2 - Those who want a fast clone of their boot drive (no re-boots needed) and it can clone your drive wh…

776 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question