Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.005 c
1-39746
Zuker
2002-04-27 21:25
2002.05.13
Определитель


1-39707
PaRL
2002-04-29 17:15
2002.05.13
Memo....


1-39749
Anton+
2002-04-27 19:27
2002.05.13
Строка в Memo


1-39760
Юляша
2002-04-27 21:16
2002.05.13
Почему PageControl не отображается?


3-39671
Филиппов Стас
2002-04-13 18:14
2002.05.13
Поиск





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский