| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > StringGrid |
| Автор: PILOT 12.12.2002, 23:56 |
| Как переделать StringGrid так чтобы выделение ячеек было не прямоугольным, а таким же как при выделении текста. Т.е. как будто текст это есть таблица где Row это строка, а Col это позиция символа в строке. т.е. так: sdgflkjs;flkgjsd;gflkjs;dflkgjsf;dglkjcbvnxcbjstnglsoinfoijse;roijtgdf;glisndoigjseg;ndfgklsdng;sgs o;erjgdflkgjsd;ogisjerg;osdfjgsdfl;kgjserigojs;fglsjdgo;isdrj;sojg где выделение выделено italic+bold. СУВ. |
| Автор: Song 13.12.2002, 06:45 |
| Вручную это делать #опа... Сказать как могу: TStringGrid.onDrawCell а программируй сам |
| Автор: Dapo 13.12.2002, 15:07 |
| Можно так: procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if gdSelected in State then begin StringGrid1.Canvas.Brush.Color:=clWhite; StringGrid1.Canvas.FillRect(Rect); StringGrid1.Canvas.Font.Color:=clBlack; StringGrid1.Canvas.Font.Style:=[fsBold,fsItalic]; StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[ACol,ARow]); end; Т.е. на канву рисуешь то, что написано в ячейке. |
| Автор: Song 14.12.2002, 04:54 |
| Dapo, ты ничего не понял... |
| Автор: PILOT 15.12.2002, 07:10 |
| А почему #опа то? Сам я конечно без подсказки не смогу (быстро) сделать это если сидеть недельку, то нгаверное можно. Я к тому что может кто-то уже делал это или знает куда носом меня ткнуть (к #опе никакого отношения). СУВ. ЗЫ. А VIT мне может помочь? ;) |
| Автор: Vit 15.12.2002, 10:01 | ||
Я этого не делал, подозреваю что работа не маленькая. Попробуй поискать готовые компоненты |
| Автор: Spawn 15.12.2002, 15:43 |
| Я с такой проблемой еще не сталкивался, но вот первое, что пришло на ум(может как то поможет): FirstPos, SecondPos:TPoint; Downed:Boolean=False; //Сохранение координат при нажатии кнопки мышки procedure TForm1.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin FirstPos.X:=x; FirstPos.y:=y; Downed:= not Downed; end; procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Downed:= not Downed; end; //Сохранение координат при перемещении нажатой мышки procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if Downed then begin SecondPos.X:=x; SecondPos.Y:=y; end; end; // Я не стал додумывать прорисовку, так как думаю ето можно сделать самому //но вот к примеру как можно проверять вхождение запомненных координат в ячейку сетки procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if Downed then begin StringGrid1.Brush.Color:=clred; if PtInRect(StringGrid1.CellRect(ACol,ARow),FirstPos) then FillRect(GetDC(StringGrid1.Handle),Rect,StringGrid1.Brush.Handle); if PtInRect(StringGrid1.CellRect(ACol,ARow),SecondPos) then FillRect(GetDC(StringGrid1.Handle),Rect,StringGrid1.Brush.Handle) end; end; Думаю можно сделать так - построить регион на основе запомненных координат и потом его закрашивать хотя точно сказать не могу(мало опыта еще)))) Надеюсь тебе ето как то поможет) |
| Автор: Dapo 16.12.2002, 13:18 | ||
Бывает, с тупил. А если на OnMouseMove поставить MouseToCell + запись положения ячейки в массив + вычисление положений других ячеек (которые должны попасть в селект) и на OnDrawCell перекраска другим цветом, всех запомненых ячеек. Тут хоть змейкой выделяй. Или я опять |
| Автор: Dapo 16.12.2002, 15:17 |
| Выделить - это закрасить другим цветом и как-то это запомнить? Чем не вариант? var Form1: TForm1; SGA:array [0..9,0..9] of integer; MCol,MRow:integer; implementation {$R *.dfm} procedure TForm1.StrGrdMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin StrGrd.MouseToCell(x,y,MCol,MRow); SGA[MCol,MRow]:=1;//значит выделена, тут и условия выделения поставить end; procedure TForm1.StrGrdDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if SGA[ACol,ARow]=1 then begin StrGrd.Canvas.Brush.Color:=clBlue; StrGrd.Canvas.FillRect(Rect); end; end; Ну так примерно можно, конечно еще снятие выделения нужно предусмотреть. |
| Автор: Dapo 16.12.2002, 15:25 |
| Еще не забыть gdRangeSelect снять |
| Автор: Spawn 16.12.2002, 18:55 | ||
Насколькл я понимаю, то таким способом закрасятся тоько те ячейки, над которыми прошел курсор мышки, а нужно чтобы закрасились все ячейки начиная от места нажатия до текущего положения курсора. |
| Автор: Dapo 16.12.2002, 19:11 |
| Дык я же и написал, что нужно поставить условия выделения. У нас матрица получается с 0-ми и 1-ми. Ими и нужно оперировать. С массивом то проще работать. |
| Автор: PILOT 16.12.2002, 19:37 |
| Спасибо, только сложности все-таки возникают если таблица со скролом, кроме того выделение вшитое тоже мешает. СУВ. |
| Автор: Dapo 16.12.2002, 20:11 |
| Да, скрол мешает, когда мышка уходит за пределы StringGrid-а. Но это можно обойти (ведь мышка все равно вернется на StringGrid или вернуть ее). А по поводу встроенного выделения - убери опцию gdRangeSelect. То что я там написал еще дорабатывать и дорабатывать, но начало положено |
| Автор: Dapo 16.12.2002, 20:24 |
| Извините за флуд (нужно сначала проверять, а потом писать). Можно на OnSelectCell повесить: SGA[ACol,ARow]:=1; это будет наверное более лучший вариант, проблема соскролом отпадает. |
| Автор: PILOT 17.12.2002, 02:51 |
| А что это за SGA такой? СУВ. |
| Автор: Dapo 17.12.2002, 12:36 |
| SGA - сокращенно от StringGridArray (да как назвал не важно) с размерностью 2х2 (от 0 до кол-ва столбцов-1 х от 0 до кол-ва строк-1). |