Форум: "Основная";
Текущий архив: 2002.05.13;
Скачать: [xml.tar.bz2];
ВнизStringGrid Найти похожие ветки
← →
Executor (2002-04-20 14:14) [0]Где взять компонент StringGrid с мультиселектом? Не путать с ранжселект.
← →
Song (2002-04-20 14:28) [1]Вы можете использовать стандартный, но рисовать самому выделение ряда/ячейки + пунктирный прямоугольник. Это не сложно.
Жалко что Selection не подходит.
← →
olookin (2002-04-20 15:42) [2]А у меня работает мульти и на обычном...
← →
olookin (2002-04-20 15:54) [3]Или я неправлиьно понял вопрос?
← →
Executor (2002-04-20 20:27) [4]2olookin:
Мультиселект - значит можно с Ctrl выделить к примеру 3, 12, 80-90 строки.
Рэнжселет - выделяет только строки по порядку, то есть к примеру 5-20.
2Song:
Не слодно? Ну тогда сделайте пожалуйста, я просто не очень представляю как это сделать. Я пробывал сам сделать, но у меня чухня какая-то получалась.
← →
Song (2002-04-21 10:04) [5]1. DefaultDrawinng:=False;
2. Для каждой ячейки на onDrawCell рисуете клетку и выводите текст
3. Заводите доп. колонку (кот. за клиентской областью) которая будет содержать 0 или 1 (выд, не выд)
3. На onMouseDown меняте предыдущий шаг.
4. Если для текущей ячейки выд=1 рисуте с цветом фона (синий например). И ставите условие: IF osSelected in State then DrawFocusRect(Rect)
Сложно?
← →
Executor (2002-04-23 09:51) [6]2Song: Парюсь сижу, уж сложно это, сделать с Ctrl - сделал, а вот чтобы с Shift - проблемы. Ну раз для тебя не сложно, так сделал бы. :)
← →
Song (2002-04-23 09:59) [7]C Shift проблемы?
Обрабатывайте onMouseDown и используйте GetKeyboardState() или GetAsyncKeyState()
В чём именно проблемы? Что в коде не получается?
← →
kull (2002-04-23 10:34) [8]Не понимаю я вас, ну на кой перец изобретать велосипед. Неужели не посоветовать готовый компонент, где все за вас сделано и без никому не нужной отладки и стандартных багов. Не знаете компонента, так чего чушь молоть про перерисовку ячеек и обработку событий, вы еще WINAPI вызовы посоветуйте... Зачем возврашаться в пещерный век - Delphi не для того разработали.
← →
Song (2002-04-23 11:19) [9]2kull © (23.04.02 10:34)
Вы такими словами "чушь молоть" поосторожней бросайтесь, если Вы лично не знаете человека, к которому эта реплика относится. Это первое. Второе - я не знаю такого компонента. Если Вы знаете, милости просим - автор вопроса будет рад. А если человек всё сделает сам, не пользовавшись готовым - это ему только в пользу. А мой совет вполне рабочий и отлично работает, если его отладить.
← →
Lusha (2002-04-23 12:32) [10]Предлагаю обратиться к исходникам TCustomDBGrid и посмотреть как это делается у Borland...
Присоединяюсь к Song... Нет тут ничего сложного...
← →
Executor (2002-04-26 11:23) [11]В TCustomDBGrid мутота какая-то, если вам ребята все это кажется таким простым, то давно бы сделали и выслали мне.
Вообщем я вот какую лабуду написал.
G - это StringGrid.
procedure TForm1.FormCreate(Sender: TObject);
begin
S:=TStringList.Create;
S.Clear;
S.Add("1");
G.Row:=1;
end;
procedure TForm1.GMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
C, R: Integer;
OldS: TStringList;
procedure WithCtrl;
var
ClickRow: Integer;
begin
ClickRow:=S.IndexOf(IntToStr(R));
if ClickRow<>-1 then
S.Delete(ClickRow)
else
S.Add(IntToStr(R));
end;
procedure WithShift;
var
LastRow, RowI: Integer;
begin
LastRow:=StrToInt(S[S.Count-1]);
S.Clear;
if R<LastRow then
begin
RowI:=R;
while RowI<=LastRow do
begin
S.Add(IntToStr(RowI));
Inc(RowI);
end;
end
else
begin
RowI:=R;
while RowI>=LastRow do
begin
S.Add(IntToStr(RowI));
Dec(RowI);
end;
end;
end;
procedure WithOut;
begin
S.Clear;
S.Add(IntToStr(R));
end;
procedure WithCtrlShift;
var
I: Integer;
begin
WithShift;
for I:=0 to OldS.Count-1 do
if S.IndexOf(OldS[I])=-1 then
S.Insert(0, OldS[I]);
end;
procedure InvalidateRow(ARow: Integer);
var
RR: TRect;
begin
RR:=G.CellRect(0, ARow);
RR.Left:=0;
RR.Right:=G.Width;
Windows.InvalidateRect(G.Handle, @RR, False);
end;
var
Key_Ctrl, Key_Shift: Boolean;
I: Integer;
begin
if not (ssLeft in Shift) then Exit;
// Заполнить переменные
Key_Ctrl:=(ssCtrl in Shift);
Key_Shift:=(ssShift in Shift);
G.MouseToCell(X, Y, C, R);
if R=0 then Exit;
// Создать OldS и записать в него S
OldS:=TStringList.Create;
OldS.Clear;
OldS.AddStrings(S);
if Key_Ctrl and Key_Shift then
WithCtrlShift
else
if Key_Ctrl then
WithCtrl
else
if Key_Shift then
WithShift
else
WithOut;
// Перерисовать старые строки
for I:=0 to OldS.Count-1 do
InvalidateRow(StrToInt(OldS[I]));
// Перерисовать новые строки
for I:=0 to S.Count-1 do
InvalidateRow(StrToInt(S[I]));
// Убить OldS
OldS.Free;
OldS:=nil;
/////////////////////////////////////////
LB.Clear;
LB.Items:=S;
end;
procedure TForm1.GDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if S.IndexOf(IntToStr(ARow))<>-1 then
begin
G.Canvas.Brush.Color:=clNavy;
end
else
begin
G.Canvas.Brush.Color:=clWhite;
end;
G.Canvas.FillRect(Rect);
end;
← →
Song (2002-04-26 11:43) [12]Ok :)
Приду с обеда, напишу.
← →
Song (2002-04-26 13:27) [13]Как и обещал. За 20 мин справился:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
With TStringGrid(Sender),TStringGrid(Sender).Canvas Do
Begin
IF (ACol=0) or (ARow=0) then DrawEdge(Canvas.Handle,Rect,EDGE_RAISED,BF_ADJUST) else
Begin
IF Cells[ColCount-1,ARow]="1" then Brush.Color:=clHighLight else Brush.Color:=clCaptionText;
FillRect(Rect);
TextOut(Rect.Left+2,Rect.Top+2,Cells[ACol,ARow]);
End;
End;
end;
procedure TForm1.StringGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Var ACol,ARow:Integer;
begin
With TStringGrid(Sender) Do
IF (Button=mbLeft) and ((ssShift in Shift) or (ssCtrl in Shift)) then
Begin
MouseToCell(X,Y,ACol,ARow);
try
IF (Cells[ColCount-1,ARow]="0") or (Cells[ColCount-1,ARow]="") then
Begin
Cells[ColCount-1,ARow]:="1";
StringGrid1.RePaint;
Exit;
End;
IF Cells[ColCount-1,ARow]="1" then Cells[ColCount-1,ARow]: ="0";
StringGrid1.RePaint;
except
end;
End;
end;
← →
Executor (2002-04-26 14:18) [14]СПАСИБО!!!!!
← →
Executor (2002-04-27 07:22) [15]2Song:
Хех! :)
Ты же не доделал, и прилично не доделал, мой код куда лучше.
Ты поставь на форму ListBox, включи у него мультиселект, добавь
штук 20-30 итемов и посмотри что происходит при выделение с
клавишой Shift, с клавишой Ctrl, с клавишой Ctrl+Shift. Посмотрел?
А теперь посмотри, что сделал ты. Ну как? Разница видна? У меня,
помоему, больше похоже на мультиселект. Правда у меня Ctrl+Shift
работает не совсем правильно, но главное работает.
← →
Song (2002-04-27 08:12) [16]Ну дык я и не утверждал, что это готовый к применению компонент. Я показал Вам как сделать быстрее, качественнее и с меньшим объёмом кода. А доделать уже Вам. Ещё не хватало, чтобы всю Вашу задачу полностью сделал я. Это уже невежестливо.
← →
Song (2002-04-27 08:16) [17]Ну что? Проверил я на примере TListBox. И что же у меня не так? Единственное, что не рисуется пунктирная рамка - дык DrawFocusRect() Вы и сами можете сделать.
вообще пишите мне на мыло, а то эта ветка сейчас в потрепаться уйдёт.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.05.13;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.004 c