![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| PILOT |
|
|||
|
производство ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2724 Регистрация: 4.4.2002 Где: москва Репутация: нет Всего: 54 |
Как переделать StringGrid так чтобы выделение ячеек было не прямоугольным, а таким же как при выделении текста. Т.е. как будто текст это есть таблица где Row это строка, а Col это позиция символа в строке.
т.е. так: sdgflkjs;flkgjsd;gflkjs;dflkgjsf;dglkjcbvnxcbjstnglsoinfoijse;roijtgdf;glisndoigjseg;ndfgklsdng;sgs o;erjgdflkgjsd;ogisjerg;osdfjgsdfl;kgjserigojs;fglsjdgo;isdrj;sojg где выделение выделено italic+bold. СУВ. -------------------- тут могла быть Ваша реклама... |
|||
|
||||
| Song |
|
|||
![]() Sysman.ru ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1095 Регистрация: 2.6.2002 Репутация: 2 Всего: 4 |
Вручную это делать #опа...
Сказать как могу: TStringGrid.onDrawCell а программируй сам -------------------- Прежде чем сказать "Невозможно", подумай, прав ли ты |
|||
|
||||
| Dapo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 18.4.2002 Репутация: нет Всего: 1 |
Можно так:
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 |
|
|||
![]() Sysman.ru ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1095 Регистрация: 2.6.2002 Репутация: 2 Всего: 4 |
Dapo, ты ничего не понял...
-------------------- Прежде чем сказать "Невозможно", подумай, прав ли ты |
|||
|
||||
| PILOT |
|
|||
|
производство ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2724 Регистрация: 4.4.2002 Где: москва Репутация: нет Всего: 54 |
А почему #опа то?
Сам я конечно без подсказки не смогу (быстро) сделать это если сидеть недельку, то нгаверное можно. Я к тому что может кто-то уже делал это или знает куда носом меня ткнуть (к #опе никакого отношения). СУВ. ЗЫ. А VIT мне может помочь? ;) -------------------- тут могла быть Ваша реклама... |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Я этого не делал, подозреваю что работа не маленькая. Попробуй поискать готовые компоненты -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Spawn |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 278 Регистрация: 3.6.2002 Репутация: нет Всего: нет |
Я с такой проблемой еще не сталкивался, но вот первое, что пришло на ум(может как то поможет):
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 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 18.4.2002 Репутация: нет Всего: 1 |
Бывает, с тупил. А если на OnMouseMove поставить MouseToCell + запись положения ячейки в массив + вычисление положений других ячеек (которые должны попасть в селект) и на OnDrawCell перекраска другим цветом, всех запомненых ячеек. Тут хоть змейкой выделяй. Или я опять |
|||
|
||||
| Dapo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 18.4.2002 Репутация: нет Всего: 1 |
Выделить - это закрасить другим цветом и как-то это запомнить? Чем не вариант?
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 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 18.4.2002 Репутация: нет Всего: 1 |
Еще не забыть gdRangeSelect снять
|
|||
|
||||
| Spawn |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 278 Регистрация: 3.6.2002 Репутация: нет Всего: нет |
Насколькл я понимаю, то таким способом закрасятся тоько те ячейки, над которыми прошел курсор мышки, а нужно чтобы закрасились все ячейки начиная от места нажатия до текущего положения курсора. |
|||
|
||||
| Dapo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 18.4.2002 Репутация: нет Всего: 1 |
Дык я же и написал, что нужно поставить условия выделения. У нас матрица получается с 0-ми и 1-ми. Ими и нужно оперировать. С массивом то проще работать.
|
|||
|
||||
| PILOT |
|
|||
|
производство ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2724 Регистрация: 4.4.2002 Где: москва Репутация: нет Всего: 54 |
Спасибо, только сложности все-таки возникают если таблица со скролом, кроме того выделение вшитое тоже мешает.
СУВ. -------------------- тут могла быть Ваша реклама... |
|||
|
||||
| Dapo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 18.4.2002 Репутация: нет Всего: 1 |
Да, скрол мешает, когда мышка уходит за пределы StringGrid-а. Но это можно обойти (ведь мышка все равно вернется на StringGrid или вернуть ее). А по поводу встроенного выделения - убери опцию gdRangeSelect. То что я там написал еще дорабатывать и дорабатывать, но начало положено
|
|||
|
||||
| Dapo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 18.4.2002 Репутация: нет Всего: 1 |
Извините за флуд (нужно сначала проверять, а потом писать).
Можно на OnSelectCell повесить: SGA[ACol,ARow]:=1; это будет наверное более лучший вариант, проблема соскролом отпадает. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |