Solved

Moving TStringGrid Rows

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

Do You Know the 4 Main Threat Actor Types?

Do you know the main threat actor types? Most attackers fall into one of four categories, each with their own favored tactics, techniques, and procedures.

Join & Write a Comment

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…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
In this tutorial you'll learn about bandwidth monitoring with flows and packet sniffing with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're interested in additional methods for monitoring bandwidt…
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at http://bit.ly/XDcourse.

759 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

20 Experts available now in Live!

Get 1:1 Help Now