Size: a a a

2020 March 02

DB

Dmitry Belkevich in Delphi & Lazarus
procedure TViewPlaceThumb.ImgStartDrag(Sender: TObject; var DragObject: TDragObject);
var
Bmp: Vcl.Graphics.TBitmap;
SenderAs: TMakhImage;
begin
SenderAs := (Sender as TMakhImage);
try
 Bmp := Vcl.Graphics.TBitmap.Create;
 Bmp.Width := SenderAs.Width;
 Bmp.Height := SenderAs.Height;
 Bmp.Canvas.CopyRect(Bmp.Canvas.ClipRect, SenderAs.Canvas, Bmp.Canvas.ClipRect);
 DragObject := TCustomDragObject.Create(SenderAs, Bmp, SenderAs.Tag, Self.OwnerForm.Handle);
 DragObject.AlwaysShowDragImages := True;
except
 On E: EInvalidOperation do
 begin
  FreeAndNil(Bmp);
  DragObject  := nil;
  FDragObject := nil;
  Exit;
 end;
end;
FDragObject := DragObject;
end;
источник

DB

Dmitry Belkevich in Delphi & Lazarus
примерно так
источник

DB

Dmitry Belkevich in Delphi & Lazarus
OnStartDrag присваиваешь, ну и дальше рисуешь на канвасе что нужно
источник

AS

Alexey Shumkin in Delphi & Lazarus
Dmitry Belkevich
procedure TViewPlaceThumb.ImgStartDrag(Sender: TObject; var DragObject: TDragObject);
var
Bmp: Vcl.Graphics.TBitmap;
SenderAs: TMakhImage;
begin
SenderAs := (Sender as TMakhImage);
try
 Bmp := Vcl.Graphics.TBitmap.Create;
 Bmp.Width := SenderAs.Width;
 Bmp.Height := SenderAs.Height;
 Bmp.Canvas.CopyRect(Bmp.Canvas.ClipRect, SenderAs.Canvas, Bmp.Canvas.ClipRect);
 DragObject := TCustomDragObject.Create(SenderAs, Bmp, SenderAs.Tag, Self.OwnerForm.Handle);
 DragObject.AlwaysShowDragImages := True;
except
 On E: EInvalidOperation do
 begin
  FreeAndNil(Bmp);
  DragObject  := nil;
  FDragObject := nil;
  Exit;
 end;
end;
FDragObject := DragObject;
end;
EInvalidOperation?
что-то может пойти не так? )

 Bmp := Vcl.Graphics.TBitmap.Create после try -  FixInsight бы ругался )
источник

DB

Dmitry Belkevich in Delphi & Lazarus
Alexey Shumkin
EInvalidOperation?
что-то может пойти не так? )

 Bmp := Vcl.Graphics.TBitmap.Create после try -  FixInsight бы ругался )
бывает )
источник

DB

Dmitry Belkevich in Delphi & Lazarus
сейчас еще класс-обертку кину
источник

DB

Dmitry Belkevich in Delphi & Lazarus
непонятно как есть будет
источник

DB

Dmitry Belkevich in Delphi & Lazarus
 TCustomDragObject = class(TDragObjectEx)
private
 FDragImages:    TDragImageList;
 FImageControl:  TWinControl;
 FMakSeriesView: TMakSeriesViewCustom;
 FTag:           integer;
 FBtm:           Vcl.Graphics.TBitmap;
 FOwnerFormHandle: HWND;
protected
 function GetDragImages: TDragImageList; override;
public
 constructor Create(ImageControl: TWinControl; Btm: Vcl.Graphics.TBitmap; Tag: integer; OwnerFormHandle: HWND);
 destructor Destroy; override;
 property Btm: Vcl.Graphics.TBitmap Read FBtm;
 property Tag: integer Read FTag;
 property MakSeriesView: TMakSeriesViewCustom Read FMakSeriesView Write FMakSeriesView;
end;

{ TCustomDragObject  }

constructor TCustomDragObject.Create(ImageControl: TWinControl; Btm: Vcl.Graphics.TBitmap;
Tag: integer; OwnerFormHandle: HWND);
begin
inherited Create;
FTag := Tag;
FBtm := Btm;
FImageControl := ImageControl;
FOwnerFormHandle := OwnerFormHandle;
end;

destructor TCustomDragObject.Destroy;
begin
FreeAndNil(FDragImages);
FreeAndNil(FBtm);
if Assigned(FMakSeriesView) then
begin
 FMakSeriesView.DelOverlays([otDragFrame]);
 FMakSeriesView.ResetDDPolygons;
end;
inherited;
end;

function TCustomDragObject.GetDragImages: TDragImageList;
var
Pt: TPoint;
begin
if not Assigned(FDragImages) then
 //  try
begin
 FDragImages := TDragImageList.Create(nil);
 FDragImages.Width := Btm.Width;
 FDragImages.Height := Btm.Height;
 Pt := Mouse.CursorPos;
 MapWindowPoints(HWND_DESKTOP, FImageControl.Handle, Pt, 1);
 FDragImages.DragHotspot := Pt;
 FDragImages.Masked := True;
 FDragImages.AddMasked(Btm, clFuchsia);
 //  finally
end;
Result := FDragImages;
end;
источник

DB

Dmitry Belkevich in Delphi & Lazarus
ну остальное по ключевикам в гугле как обычно. частично частное решение, сразу не взлетит
источник

DB

Dmitry Belkevich in Delphi & Lazarus
выглядит вживую это примерно так (смотреть на тягающуюся картинку
источник

DB

Dmitry Belkevich in Delphi & Lazarus
источник

N

Nik in Delphi & Lazarus
Alex Bekhtin
Вот если результирующий класс результрующего объекта не руками пишется, а генерируется, то другое дело.
Нарисовал TDataContainer, который умеет загружать в себя данные из dataset'а. Контейнер можно инициализировать как по настройкам метаданных, так и просто выдернуть список полей из самого dataset'а.
источник

N

Nik in Delphi & Lazarus
Перевёл одну форму редактирования справочника на этот TDataContainer - вроде работает также как и ранее работало с классом, специально написанным для этого справочника..
источник

AS

Alexey Shumkin in Delphi & Lazarus
Nik
Нарисовал TDataContainer, который умеет загружать в себя данные из dataset'а. Контейнер можно инициализировать как по настройкам метаданных, так и просто выдернуть список полей из самого dataset'а.
А в этот TDataContainer мо́жно данные загружать "снаружи" это класса? Чтобы не он сам в себя загружал, а в него загружал другой класс?
источник

N

Nik in Delphi & Lazarus
Alexey Shumkin
А в этот TDataContainer мо́жно данные загружать "снаружи" это класса? Чтобы не он сам в себя загружал, а в него загружал другой класс?
Можно.
источник

AS

Alexey Shumkin in Delphi & Lazarus
Nik
Можно.
В книжках пишут, что так и лучше делать
источник

N

Nik in Delphi & Lazarus
Сейчас имеется для загрузки метод LoadData(ADataset: TDataset).
источник

N

Nik in Delphi & Lazarus
И есть методы добавления строк и задания значений полям.
источник

N

Nik in Delphi & Lazarus
Значения полей потом можно прочитать так:
Data: TDataContainer;
Row: TDataContainerRow;
Data[Row, 'Name']
источник

N

Nik in Delphi & Lazarus
Возвращается значение типа variant
источник