?
Solved

Moving TStringGrid Rows

Posted on 1997-05-02
3
Medium Priority
?
1,514 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
3 Comments
 
LVL 4

Accepted Solution

by:
erajoj earned 70 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

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
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…
In this video we outline the Physical Segments view of NetCrunch network monitor. By following this brief how-to video, you will be able to learn how NetCrunch visualizes your network, how granular is the information collected, as well as where to f…
NetCrunch network monitor is a highly extensive platform for network monitoring and alert generation. In this video you'll see a live demo of NetCrunch with most notable features explained in a walk-through manner. You'll also get to know the philos…
Suggested Courses
Course of the Month11 days, 6 hours left to enroll

752 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