Solved

Moving TStringGrid Rows

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

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

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…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
Along with being a a promotional video for my three-day Annielytics Dashboard Seminor, this Micro Tutorial is an intro to Google Analytics API data.
Many functions in Excel can make decisions. The most simple of these is the IF function: it returns a value depending on whether a condition you describe is true or false. Once you get the hang of using the IF function, you will find it easier to us…

867 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

19 Experts available now in Live!

Get 1:1 Help Now