Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> StringGrid, выделение 
:(
    Опции темы
PILOT
Дата 12.12.2002, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: нет
Всего: 54



Как переделать StringGrid так чтобы выделение ячеек было не прямоугольным, а таким же как при выделении текста. Т.е. как будто текст это есть таблица где Row это строка, а Col это позиция символа в строке.
т.е. так:

sdgflkjs;flkgjsd;gflkjs;dflkgjsf;dglkjcbvnxcbjstnglsoinfoijse;roijtgdf;glisndoigjseg;ndfgklsdng;sgs
o;erjgdflkgjsd;ogisjerg;osdfjgsdfl;kgjserigojs;f
glsjdgo;isdrj;sojg

где выделение выделено italic+bold.

СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
Song
Дата 13.12.2002, 06:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Вручную это делать #опа...
Сказать как могу: TStringGrid.onDrawCell а программируй сам :)


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Dapo
Дата 13.12.2002, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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;

Т.е. на канву рисуешь то, что написано в ячейке.
PM MAIL   Вверх
Song
Дата 14.12.2002, 04:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Dapo, ты ничего не понял... :)


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
PILOT
Дата 15.12.2002, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: нет
Всего: 54



А почему #опа то?
Сам я конечно без подсказки не смогу (быстро) сделать это :)
если сидеть недельку, то нгаверное можно. Я к тому что может кто-то уже делал это или знает куда носом меня ткнуть (к #опе никакого отношения).


СУВ.
ЗЫ. А VIT мне может помочь? ;)


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
Vit
Дата 15.12.2002, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Цитата(PILOTIK @ 14.12.2002, 14:10)
ЗЫ. А VIT мне может помочь? ;)

Я этого не делал, подозреваю что работа не маленькая. Попробуй поискать готовые компоненты


--------------------
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
PM MAIL WWW ICQ   Вверх
Spawn
Дата 15.12.2002, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 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;

Думаю можно сделать так - построить регион на основе запомненных координат и потом его закрашивать хотя точно сказать не могу(мало опыта еще))))
Надеюсь тебе ето как то поможет)
PM MAIL   Вверх
Dapo
  Дата 16.12.2002, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: нет
Всего: 1



Цитата(Song @ 13.12.2002, 20:54)
Dapo, ты ничего не понял... :)

Бывает,  с тупил. :withstupid .

А если на OnMouseMove поставить MouseToCell + запись положения ячейки в массив + вычисление положений других ячеек (которые должны попасть в селект) и на OnDrawCell перекраска другим цветом, всех запомненых ячеек.

Тут хоть змейкой выделяй. Или я опять :withstupid ?  :hehe
PM MAIL   Вверх
Dapo
Дата 16.12.2002, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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;

Ну так примерно можно, конечно еще снятие выделения нужно предусмотреть.
PM MAIL   Вверх
Dapo
Дата 16.12.2002, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: нет
Всего: 1



Еще не забыть gdRangeSelect снять
PM MAIL   Вверх
Spawn
Дата 16.12.2002, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 278
Регистрация: 3.6.2002

Репутация: нет
Всего: нет



Цитата(Dapo @ 16.12.2002, 07: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;

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

Насколькл я понимаю, то таким способом закрасятся тоько те ячейки, над которыми прошел курсор мышки, а нужно чтобы закрасились все ячейки начиная от места нажатия до текущего положения курсора.
PM MAIL   Вверх
Dapo
Дата 16.12.2002, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: нет
Всего: 1



Дык я же и написал, что нужно поставить условия выделения. У нас матрица получается с 0-ми и 1-ми. Ими и нужно оперировать. С массивом то проще работать.
PM MAIL   Вверх
PILOT
Дата 16.12.2002, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: нет
Всего: 54



Спасибо, только сложности все-таки возникают если таблица со скролом, кроме того выделение вшитое тоже мешает.

СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
Dapo
Дата 16.12.2002, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: нет
Всего: 1



Да, скрол мешает, когда мышка уходит за пределы StringGrid-а. Но это можно обойти (ведь мышка все равно вернется на StringGrid или вернуть ее). А по поводу встроенного выделения - убери опцию gdRangeSelect. То что я там написал еще дорабатывать и дорабатывать, но начало положено ;-) .
PM MAIL   Вверх
Dapo
Дата 16.12.2002, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: нет
Всего: 1



Извините за флуд (нужно сначала проверять, а потом писать).
Можно на OnSelectCell повесить:
SGA[ACol,ARow]:=1;
это будет наверное более лучший вариант, проблема соскролом отпадает.
PM MAIL   Вверх
PILOT
Дата 17.12.2002, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: нет
Всего: 54



А что это за SGA такой?

СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
Dapo
Дата 17.12.2002, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: нет
Всего: 1



SGA - сокращенно от StringGridArray (да как назвал не важно) с размерностью 2х2 (от 0 до кол-ва столбцов-1 х от 0 до кол-ва строк-1).
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0578 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.