Solved

Moving TStringGrid Rows

Posted on 1997-05-02
3
1,356 Views
Last Modified: 2008-03-10
I have created a TStringGrid object, and can edit etc..
I wish to be able to move the rows up and down, as appropriate, yet it doesn't matter whether I set the goRowMoving flag in the Options property, I cannot move rows. I have created the grid at run time, and I have set options to allow editing etc, but it seems just this one command is problematical. Neither the manual nor the on-line help is helpful, so I hope you may be able tohelp.

Many thanks.
0
Comment
Question by:ian-smith
  • 2
3 Comments
 
LVL 4

Accepted Solution

by:
erajoj earned 35 total points
ID: 1335854
I tested it with this code, and it works:

  with TStringGrid.Create(Mainform) do begin
    Name     := 'StringGrid1';
    Parent   := Mainform;
    Left     := 100;
    Top      := 300;
    Width    := 300;
    Height   := 200;
    Options  := Options + [goEditing,goRowMoving];
  end;


0
 

Author Comment

by:ian-smith
ID: 1335855
The problem seems to occur because you seem to need at least one fixed column to perform the row dragging/ moving. In my application, I have one fixed row, but no fixed columns, so I still have no joy. I have tried using a single fixed column of 0 width, but this is not a neat solution, and it becomes fairly difficult to "catch" before moving.
If there is a way to move the rows without having a fixed column and without excessive programming, I will be most happy.
Thanks for your help.
0
 
LVL 4

Expert Comment

by:erajoj
ID: 1335856
Couldn't find an easy way to do exactly what you want, so I
had to write some "excessive" code ;-)
It does what you want (I think) and you only need to paste
it into your own code to make it work.
To be able to drag a row, press shift while you grab
any cell (nonfixed) with the mouse. Then just drag it where
you want.
I might have forgotten something, but it worked fine when I
tested it.

    .
    .
    .
  private
      .
      .
      .
    MovingRow  : Boolean;
    LastRow    : Integer;
    procedure SMD(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure SMM(Sender: TObject;
      Shift: TShiftState; X,  Y: Integer);
    procedure SMU(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure DrawMove(Sender: TObject;
      MoveIndex, MovePos: Integer);
  end;
    .
    .
    .
procedure TMainForm.SMD(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  with (Sender as TStringGrid) do begin
    { Select shiftstate sensibility below }
    if (ssShift in Shift) and (Row>=FixedRows) then begin
      Update;
      DrawMove(Sender, Row, Row);
      MovingRow := True;
      LastRow   := Row;
    end;
    try
      inherited MouseDown(Button, Shift, X, Y);
    except
      if MovingRow then DrawMove(Sender, Row, Row);
      MovingRow := False;
    end;
  end;
end;

procedure TMainForm.SMM(Sender: TObject;
  Shift: TShiftState; X,  Y: Integer);
var
  ACol, ARow: LongInt;
begin
  if MovingRow then with (Sender as TStringGrid) do begin
    MouseToCell(X, Y, ACol, ARow);
    if (LastRow<>ARow) and (ARow>=FixedRows) then begin
      DrawMove(Sender, Row, LastRow);
      DrawMove(Sender, Row, ARow);
      LastRow   := ARow;
    end;
  end;
end;

procedure TMainForm.SMU(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  ACol: Integer;
begin
  if MovingRow then
  with (Sender as TStringGrid) do begin
    DrawMove(Sender, Row, LastRow);
    for ACol := 0 to ColCount-1 do begin
      Cols[ACol].ExChange(Row, LastRow);
    end;
    Row := LastRow;
  end;
  MovingRow := False;
end;

procedure TMainForm.DrawMove(Sender: TObject;
  MoveIndex, MovePos: Integer);
var
  OldPen: TPen;
  Pos   : Integer;
  R     : TRect;
begin
  with (Sender as TStringGrid) do begin
    OldPen := TPen.Create;
    try
      with Canvas do
      begin
        OldPen.Assign(Pen);
        try
          Pen.Style := psDot;
          Pen.Mode  := pmXor;
          Pen.Width := 5;
          R := CellRect(0, MovePos);
          if MovePos > MoveIndex then
            Pos := R.Bottom else
            Pos := R.Top;
          MoveTo(0, Pos);
          LineTo(ClientWidth, Pos);
        finally
          Canvas.Pen := OldPen;
        end;
      end;
    finally
      OldPen.Free;
    end;
  end;
end;

procedure TMainForm.FormCreate(Sender: TObject);
    .
    .
    .
  with TStringGrid.Create(Mainform) do begin
    Name     := 'StringGrid1';
    Parent   := Mainform;
    Left     := 100;
    Top      := 300;
    Width    := 300;
    Height   := 200;
    FixedCols := 0;
    OnMouseDown := SMD;
    OnMouseMove := SMM;
    OnMouseUp   := SMU;
    Options  := Options + [goEditing,goRowMoving];
  end;
    .
    .
    .
end;

Enjoy!

/// John
0

Featured Post

Netscaler Common Configuration How To guides

If you use NetScaler you will want to see these guides. The NetScaler How To Guides show administrators how to get NetScaler up and configured by providing instructions for common scenarios and some not so common ones.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
code issue 8 130
Error E2158 compiling with Delphi XE10 Seattle 2 100
Is anyone willing to have a look through this code and help debug? 25 76
How to build JSON File in Delphi 6 3 34
This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
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…
This video shows how to quickly and easily add an email signature for all users on Exchange 2016. The resulting signature is applied on a server level by Exchange Online. The email signature template has been downloaded from: www.mail-signatures…

777 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