Solved

delete a row in stringgrid

Posted on 2001-06-04
14
1,404 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
 
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
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
Delphi 2010 Export to pdf 2 287
Strange code, can use it, but i cant figure out what it does. 3 54
Delphi IDE crash without error message ... 7 76
Delphi 2 48
Have you ever had your Delphi form/application just hanging while waiting for data to load? This is the article to read if you want to learn some things about adding threads for data loading in the background. First, I'll setup a general applica…
Hello everybody This Article will show you how to validate number with TEdit control, What's the TEdit control? TEdit is a standard Windows edit control on a form, it allows to user to write, read and copy/paste single line of text. Usua…
This is used to tweak the memory usage for your computer, it is used for servers more so than workstations but just be careful editing registry settings as it may cause irreversible results. I hold no responsibility for anything you do to the regist…
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…

920 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

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now