andreybear
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters, cxStyles, cxCustomData, cxFilter, cxData, cxDataStorage, cxEdit, cxGridCustomView, cxGridCustomTableView, cxGridTableView, cxGridBandedTableView, cxClasses, cxGridLevel, cxGrid, ComCtrls, dxtree; type TForm1 = class(TForm) Tree: TdxTreeView; cxGrid1Level1: TcxGridLevel; cxGrid1: TcxGrid; View: TcxGridBandedTableView; procedure TreeMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure ViewDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure ViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure ViewMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private FDragAccept: Boolean; FNewBand: TcxGridBand; FGridBandHeaderMovingObject: TcxGridBandHeaderMovingObject; FBandDragAccept: Boolean; FDraggedBandID: Integer; FOgrigY: Integer; public { Public declarations } end; type TcxGridBandHeaderMovingObjectAccess = class(TcxGridBandHeaderMovingObject); var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.TreeMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if ((Button = mbLeft) and (ssLeft in Shift)) then Tree.BeginDrag(false); end; procedure TForm1.ViewDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Tree.EndDrag(False); // комментарий по этой строке ниже // Почему-то в упор не видит, что Source = Tree, показывает, что Source = (), // а значит Accept = false (впрочем и Sender = ()) Accept := true; //Source = Tree; FDragAccept := Accept; if not Accept then Exit; if not Assigned(FGridBandHeaderMovingObject) then begin FOgrigY := Y; FNewBand := View.Bands.Add; FNewBand.Caption := Tree.Selected.Text; FNewBand.Index := 0; FNewBand.Width := 100; FDraggedBandID := FNewBand.ID; FGridBandHeaderMovingObject := TcxGridBandHeaderMovingObject.Create(TcxGridSite(Sender)); // После строчки ниже вызывается ViewDragOver и, соответственно, условие // if not Assigned(FGridBandHeaderMovingObject) then не выполняется, // а значит не вызывается Init и BeginDragAndDrop // Tree.EndDrag(False); // После сторочки ниже возникает исключение "Invalid class typecast" и, // соответственно, на этом все движения заканчиваются FGridBandHeaderMovingObject.Init(Mouse.CursorPos, View.ViewInfo.GetHitTest(10, 10)); TcxGridBandHeaderMovingObjectAccess(FGridBandHeaderMovingObject).BeginDragAndDrop; View.Controller.PressedBand := FNewBand; end; end; procedure TForm1.ViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if Assigned(FGridBandHeaderMovingObject) then begin FGridBandHeaderMovingObject.CurMousePos := cxGrid1.ClientToScreen(Point(X, Y + FOgrigY)); TcxGridBandHeaderMovingObjectAccess(FGridBandHeaderMovingObject).DragAndDrop( cxGrid1.ScreenToClient(Mouse.CursorPos), FBandDragAccept); end; end; procedure TForm1.ViewMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Assigned(FGridBandHeaderMovingObject) then begin TcxGridBandHeaderMovingObjectAccess(FGridBandHeaderMovingObject).EndDragAndDrop(FBandDragAccept); FreeAndNil(FGridBandHeaderMovingObject); if not FBandDragAccept then View.Bands.Delete(View.Bands.FindItemID(FDraggedBandID).Index); end; end; end. |