powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Нарисовать треугольник в Title DBGrid
17 сообщений из 17, страница 1 из 1
Нарисовать треугольник в Title DBGrid
    #40050947
bors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, уважаемые! Столкнулся с трудностью при сортировке по нажатию на заголовок столбца. А именно: событие TitleClick обрабатываю, все красиво, НО нужно еще визуальное отображение в виде треугольника текущей сортировки (по возрастанию/убыванию) и в этом и возникли трудности. Шрифты менял, символы разные перепробывал, ну не видит среда Delphi 7 эти символы. Родилась идея: не получается напечатать - нужно нарисовать, но вот как, понятия не имею. Пытался через DBGrid1.Canvas.Draw но далеко пока от этого. Видел идеи на просторах интернета с переопределением и скачиванием другого DBG но хотелось бы обойтись без этого по возможности. Заранее спасибо всем откликнувшимся!
...
Рейтинг: 0 / 0
Нарисовать треугольник в Title DBGrid
    #40050956
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где вопрос в этом тексте ?
...
Рейтинг: 0 / 0
Нарисовать треугольник в Title DBGrid
    #40050991
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
procedure DrawUp3DTriangle(ACanvas: TCanvas; const ARect: TRect;
  AHiglighColor: TColor = clBtnHighlight; AShadowColor: TColor = clBtnShadow);
begin
  ACanvas.MoveTo(ARect.Left, ARect.Bottom);
  ACanvas.Pen.Color := AShadowColor;
  ACanvas.LineTo((ARect.Left + ARect.Right) div 2, ARect.Top);
  ACanvas.Pen.Color := AHiglighColor;
  ACanvas.LineTo(ARect.Right, ARect.Bottom);
  ACanvas.LineTo(ARect.Left, ARect.Bottom);
end;

procedure DrawDown3DTriangle(ACanvas: TCanvas; const ARect: TRect;
  AHiglighColor: TColor = clBtnHighlight; AShadowColor: TColor = clBtnShadow);
begin
  ACanvas.MoveTo(ARect.Right, ARect.Top);
  ACanvas.Pen.Color := clBtnHighlight;
  ACanvas.LineTo((ARect.Left + ARect.Right) div 2, ARect.Bottom);
  ACanvas.Pen.Color := clBtnShadow;
  ACanvas.LineTo(ARect.Left, ARect.Top);
  ACanvas.LineTo(ARect.Right, ARect.Top);
end;

function CalcGridRectTriangleSort(const ACellRect: TRect; AMargin: Integer = 6;
  AAlign: TAlignment = taRightJustify): TRect;
var
  LWidth: Integer;
begin
  Result := ACellRect;
  Inc(Result.Left, AMargin);
  Inc(Result.Top, AMargin);
  Dec(Result.Bottom, AMargin);
  Dec(Result.Right, AMargin);
  LWidth := Result.Bottom - Result.Top;
  case AAlign of
    taLeftJustify: Result.Right := Result.Left + LWidth;
    taRightJustify: Result.Left := Result.Right - LWidth;
    taCenter: begin
      Result.Left := (Result.Left + Result.Right - LWidth) div 2;
      Result.Right := Result.Left + LWidth;
    end;
  end;
end;

procedure TForm1.StringGridDrawCell(ASender: TObject; ACol,
  ARow: Integer; ARect: TRect; AState: TGridDrawState);
begin
  if (ARow = 0) and (ACol = Ord(FPrevSort)) then begin
    ARect := CalcGridRectTriangleSort(ARect);
    if FForwardSorted then
      DrawDown3DTriangle(TStringGrid(ASender).Canvas, ARect)
    else
      DrawUp3DTriangle(TStringGrid(ASender).Canvas, ARect)
  end;
end;

...
Рейтинг: 0 / 0
Нарисовать треугольник в Title DBGrid
    #40050994
bors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr, вопрос в том, каким образом можно реализовать подобную идею?
...
Рейтинг: 0 / 0
Нарисовать треугольник в Title DBGrid
    #40050998
bors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_, спасибо
И тут же подскажите, пожалуйста, за что отвечает ф-я CalcGridRectTriangleSort и что значит FPrevSort и FForwardSorted в TForm1.StringGridDrawCell, кателок что-то не варит или все же мой скил слабоват. И подскажите, я правильно понял: использовать в titleclick нужно StringGridDrawCell?
...
Рейтинг: 0 / 0
Нарисовать треугольник в Title DBGrid
    #40051000
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Эхлибе, сабж - штатная возможность.
Странно, что в 21 веке кто-то еще работает в ущербным делфийским DBGrid.
...
Рейтинг: 0 / 0
Нарисовать треугольник в Title DBGrid
    #40051002
bors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
L_argo, подскажите сылочкой пожалуйста где можно скачать ehlib для delphi 7
...
Рейтинг: 0 / 0
Нарисовать треугольник в Title DBGrid
    #40051026
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bors
L_argo, подскажите сылочкой пожалуйста где можно скачать ehlib для delphi 7
Внезапно - http://www.ehlib.com

авторSupport IDEs: Borland Delphi 7 – 2006, CodeGear Delphi 2007, RAD Studio 2009, Embarcadero RAD Studio 2010, XE - XE10.4, Lazarus (Win32/Linux), MS Visual Studio.
...
Рейтинг: 0 / 0
Нарисовать треугольник в Title DBGrid
    #40051036
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bors
за что отвечает ф-я CalcGridRectTriangleSort
Внезапно: за определение прямоугольника где нужно рисовать треугольник
bors
что значит FPrevSort и FForwardSorted
Это мои флаги, чтобы определить по какому столбцу и в каком направлении отсортированы данные
bors
правильно понял: использовать в titleclick нужно StringGridDrawCell?
Нет. StringGridDrawCell это обработчик события TStringGrid.OnDrawCell. В OnTitleClick вы должны запомнить какие столбцы и как сортировать, а потом вызвать StringGrid.Refresh

У меня сделано так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
// Обработчик события TStringGrid.OnMouseUp
procedure TForm1.StringGridMouseUp(ASender: TObject;
  AButton: TMouseButton; AShift: TShiftState; AX, AY: Integer);
var
  LGrid: TStringGrid absolute ASender;
  LCol, LRow: Integer;
begin
  if AButton = mbLeft then begin
    LGrid.MouseToCell(AX, AY, LCol, LRow);
    if LRow = 0 then begin
      if LCol = FPrevSort then
        FForwardSorted := not FForwardSorted
      else begin
        FPrevSort := LCol;
        FForwardSorted := True;
      end;
      GridSort(FPrevSort, FForwardSorted); // Процедура сортировки данных в гриде
      FFiles.RefreshGrid(LGrid);
      LGrid.Invalidate;
    end;  // if LRow = 0 then begin
  end;  // if AButton = mbLeft then begin
end;
...
Рейтинг: 0 / 0
Нарисовать треугольник в Title DBGrid
    #40051038
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у каждого свои велосипеды...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нарисовать треугольник в Title DBGrid
    #40051039
bors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

спасибо

Но подскажите еще как это прикрутить к DBGrid, там нет события .OnDrawCell
...
Рейтинг: 0 / 0
Нарисовать треугольник в Title DBGrid
    #40051040
bors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
asutp2,

Спасибо за идею и помощь
...
Рейтинг: 0 / 0
Нарисовать треугольник в Title DBGrid
    #40051052
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Нарисовать треугольник в Title DBGrid
    #40051057
bors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

да, но тут больше параметров нужно передать, нежели требуется для стандартного обработчика события
...
Рейтинг: 0 / 0
Нарисовать треугольник в Title DBGrid
    #40051058
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bors
да, но тут больше параметров нужно передать, нежели требуется для стандартного обработчика события
Вы издеваетесь?
...
Рейтинг: 0 / 0
Нарисовать треугольник в Title DBGrid
    #40051062
bors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_, прошу прощения если достаточно глуп чтоб не понять этого
...
Рейтинг: 0 / 0
Нарисовать треугольник в Title DBGrid
    #40051064
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как-то так
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Нарисовать треугольник в Title DBGrid
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]