Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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;f
glsjdgo;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
Цитата(PILOTIK @ 14.12.2002, 14:10)
ЗЫ. А VIT мне может помочь? ;)

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

Автор: 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
Цитата(Song @ 13.12.2002, 20:54)
Dapo, ты ничего не понял... :)

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

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

Тут хоть змейкой выделяй. Или я опять :withstupid ?  :hehe

Автор: 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, 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;

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

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

Автор: 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).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)