Как перетащить целую колонку из StringGrid в ListBox
В Object Inspector установите свойство dragmode у StringGrid в
dmAutomatic.
Ниже приведён полный код:
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
ListBox1: TListBox;
procedure ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure StringGrid1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure StringGrid1DragDrop(Sender, Source: TObject; X, Y: Integer);
private{ Private declarations }
XMouseCord: Integer;
StartDrag: Boolean;
public{ Public declarations }end;
var
Form1: TForm1;
implementation{$R *.DFM}procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := Source is TStringGrid;
end;
procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
i: integer;
ColumVal, CurrentCol: Integer;
beginif Source is TStringGrid thenbegin//Вычисляем колонку
ColumVal := 0;
CurrentCol := 0;
for i := 0 to TStringGrid(Source).ColCount - 1 dobegin
ColumVal := ColumVal + TStringGrid(Source).ColWidths[i];
if XMouseCord <= ColumVal thenbegin
CurrentCol := i;
break;
end;
end;
//Убеждаемся, что это не первая колонка, которая не содержит данныхif CurrentCol <> 0 thenbeginfor i := 1 to TStringGrid(Source).RowCount - 1 dobegin
ListBox1.items.Add(TStringGrid(Source).Cells[CurrentCol, i]);
end;
end;
StartDrag := True;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin//Для демонстрационных целейwith StringGrid1 dobegin
Cells[1, 1] := 'T1';
Cells[1, 2] := 'T2';
Cells[1, 3] := 'T3';
Cells[1, 4] := 'T4';
Cells[2, 1] := 'T5';
Cells[2, 2] := 'T6';
Cells[2, 3] := 'T7';
Cells[2, 4] := 'T8';
Cells[3, 1] := 'T9';
Cells[3, 2] := 'T10';
Cells[3, 3] := 'T11';
Cells[3, 4] := 'T12';
Cells[4, 1] := 'T13';
Cells[4, 2] := 'T14';
Cells[4, 3] := 'T15';
Cells[4, 4] := 'T16';
end;
StartDrag := True;
end;
procedure TForm1.StringGrid1DragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin//Сохраняем колонку, когда начинается перетаскивание.if StartDrag thenbegin
XMouseCord := X;
StartDrag := False;
end;
end;
procedure TForm1.StringGrid1DragDrop(Sender, Source: TObject; X,
Y: Integer);
begin//В данном случае помещаем е¸ на грид
StartDrag := True;
end;
Перетащить целую колонку из StringGrid в ListBox можно, модифицируя процедуру ListBox1DragDrop. Вот пример кода:
procedureTForm1.ListBox1DragDrop(Sender,Source:TObject;X,Y:Integer);vari:integer;beginifSourceisTStringGridthenbegin// Получить индекс колонки из операции перетащенияvarColumVal:=0;fori:=0toTStringGrid(Source).ColCount-1dobeginColumVal:=ColumVal+TStringGrid(Source).ColWidths[i];ifX<=ColumValthenbeginCurrentCol:=i;break;end;end;// Добавить все элементы из колонки в ListBoxfori:=1toTStringGrid(Source).RowCount-1dobeginListBox1.Items.Add(TStringGrid(Source).Cells[CurrentCol,i]);end;end;end;
В этом модифицированном процедуре мы получаем индекс колонки, перебирая свойство ColWidths StringGrid. Затем мы добавляем все элементы из этой колонки в ListBox с помощью цикла.
Обратите внимание, что это код предполагает, что вы хотите перетащить целую колонку одновременно. Если вам нужно перетащить отдельные ячейки или строки вместо этого, вам придется модифицировать код соответствующим образом.
Перетащить целую колонку из StringGrid в ListBox можно, установив свойство dragmode у StringGrid в dmAutomatic и реализовав обработчики событий DragOver и DragDrop.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.