Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];

Вниз

рисование   Найти похожие ветки 

 
Мыш   (2003-03-25 10:44) [0]

Делаю перетаскивание строк в stringgrid-e с помощью dragndrop, сетка с двумя колонками, первая fixed. Отрисовывать место, куда после перетаскивания вставится строка приходиться вручную, делаю это с помощью динамически создаваемого битмапа, накладываемого на канву сетки инверсно. По-идее, битмап-чистый синий прямоугольник, но после нескольких перетаскиваний он превращается вдруг в кучу мусора - размеры те же, а заполнение - полный хаос из пикселов.
Вот код:
-----------------------------------------------------------------
var

FormPreview: TFormPreview;
CellRctLast:Trect;
startcell:tpoint;
CellDrawed:boolean;
bm:tbitmap;

procedure TFormPreview.SG1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
c,r:integer;
begin
bm.Width:=CellRctLast.Right-CellRctLast.Left;
bm.Height:=4;//CellRctLast.Bottom-CellRctLast.Top;
bm.Canvas.Brush.Color:=clblue;
bm.Canvas.Rectangle(0,0,bm.Width,bm.Height);
sg1.Canvas.CopyMode:=cmSrcInvert;
sg1.Canvas.Draw(CellRctLast.Left, CellRctLast.Top,bm);
end;

procedure TFormPreview.SG1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
c,r:integer;
begin
sg1.BeginDrag(false);
sg1.MouseToCell(x,y,c,r);
CellRctLast:=sg1.CellRect(c,r);
startcell:=point(c,r);
caption:=floatToStr(CellRctLast.Top);
CellDrawed:=true;

bm.Width:=CellRctLast.Right-CellRctLast.Left;
bm.Height:=4;//CellRctLast.Bottom-CellRctLast.Top;
bm.Canvas.Brush.Color:=clblue;
bm.Canvas.Rectangle(0,0,bm.Width,bm.Height);
sg1.Canvas.CopyMode:=cmSrcInvert;
sg1.Canvas.Draw(CellRctLast.Left, CellRctLast.Top,bm);
end;


procedure TFormPreview.SG1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
var
c,r:integer;
CellRct:Trect;
begin
sg1.MouseToCell(x,y,c,r);
CellRct:=sg1.CellRect(c,r);
if (CellRctLast.Top<>CellRct.Top) then
begin
sg1.Canvas.CopyMode:=cmSrcInvert ;
sg1.Canvas.Draw(cellrct.Left, cellrct.Top,bm);

sg1.Canvas.Draw(CellRctLast.Left, CellRctLast.Top,bm);
CellRctLast:=CellRct;
end;

if source=sg1 then accept:=true;
end;


 
vlad40   (2003-03-25 12:32) [1]

А зачем такие сложности с битмапами, если не секрет? Ведь можно при перетаскивании просто делать ячейку (строку) текущей и присваивать значения перетаскиваемой ячейки (строки).


 
MBo   (2003-03-25 12:38) [2]

>Мыш
В статьи загляни


 
Мыш   (2003-03-25 14:36) [3]

2vlad: Желательно конечно, помучиться (с) Сухов.

И красивше хоца.
2MBo; сенк ю.


 
vlad40   (2003-03-25 14:59) [4]

Попробуй этот вариант, может понравится:


var
Form1: TForm1;
drRow, drCol: integer;

procedure TForm1.StringGrid1DragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
var
c,r: integer;
tRow: tstringlist;
begin
StringGrid1.MouseToCell(x,y,c,r);
if r>=0 then
begin
tRow:=tstringlist.Create;
tRow.Assign(StringGrid1.Rows[r]);
StringGrid1.row:=r;
StringGrid1.Rows[r]:=StringGrid1.Rows[drRow];
StringGrid1.Rows[drRow]:=tRow;
drRow:=r;
tRow.free;
Accept:=true;
end
else
Accept:=false;
end;

procedure TForm1.StringGrid1DragDrop(Sender, Source: TObject; X,
Y: Integer);
var
c,r: integer;
begin
StringGrid1.MouseToCell(x,y,c,r);
StringGrid1.row:=r;
StringGrid1.Rows[r]:=StringGrid1.Rows[drRow];
StringGrid1.DragMode:=dmManual;
end;

procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
if ssLeft in Shift then StringGrid1.BeginDrag(true);
end;

procedure TForm1.StringGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
StringGrid1.MouseToCell(x,y,drCol,drRow);
if drRow<0 then exit;
StringGrid1.col:=drCol;
StringGrid1.row:=drRow;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
i,j: integer;
begin
for i:=0 to StringGrid1.RowCount-1 do
for j:=0 to StringGrid1.ColCount-1 do
StringGrid1.cells[j,i]:=IntToStr(i);
StringGrid1.Options:=StringGrid1.Options+[goRowSelect];
end;


 
Мыш   (2003-03-25 20:05) [5]

Да, все замечательно, только хочется еще и линеечку отрисовывать, которая показывает, между какими строчками вставится перетаскиваемая



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.008 c
6-19739
Sr_pr
2003-02-16 02:00
2003.04.07
Receive bytes (Winsock)


1-19667
Zhizhko
2003-03-26 05:07
2003.04.07
Определить последнюю строку в таблице Excel


1-19544
Дядя Будда
2003-03-26 17:35
2003.04.07
Защита печатной формы


7-19902
Alex Shulg
2003-02-14 09:32
2003.04.07
NT Service & CreateProcess


6-19721
still
2003-02-04 16:04
2003.04.07
Получить список комппьютеров





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский