Solved

Moving TStringGrid Rows

Posted on 1997-05-02
3
1,461 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 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

Technology Partners: 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

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…
Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
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…
Do you want to know how to make a graph with Microsoft Access? First, create a query with the data for the chart. Then make a blank form and add a chart control. This video also shows how to change what data is displayed on the graph as well as form…

705 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