Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Реализация события OnColumnClick из TListView для TStringGrid

Delphi , Компоненты и Классы , TStringGrid и TDrawGrid

Реализация события OnColumnClick из TListView для TStringGrid

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
 There are two routines to implement the OnColumnClick Methods for a TStringGrid. 
 Set the first row as fixed and the Defaultdrawing to True. 

 Mit folgenden zwei Routinen kann man in einem TStringgrid 
 die Methode OnColumnClick eines TListView erzeugen (visuell). 
 Reihe 0 mu? fixiert sein undDefaultDrawing = True 
}


 type
   TForm1 = class(TForm)
     StringGrid1: TStringGrid;
     procedure StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: Integer);
     procedure StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: Integer);
   private
     zelle: TRect; // cell 
    acol, arow: Integer;
   public
   end;

 var
   Form1: TForm1;

 implementation

 {$R *.DFM}

 procedure TForm1.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
 var
   Text: string;
 begin
   with stringgrid1 do
   begin
     MouseRoCell(x, y, acol, arow);
     if (arow = 0) and (button = mbleft) then
       case acol of
         0..2:
           begin
             // Draws a 3D Effect (Push) 
            // Zeichnet 3D-Effekt (Push) 
            zelle := CellRect(acol, arow);
             Text := Cells[acol, arow];
             Canvas.Font := Font;
             Canvas.Brush.Color := clBtnFace;
             Canvas.FillRect(zelle);
             Canvas.TextRect(zelle, zelle.Left + 2, zelle.Top + 2, Text);
             DrawEdge(Canvas.Handle, zelle, 10, 2 or 4 or 8);
             DrawEdge(Canvas.Handle, zelle, 2 or 4, 1);
           end;
       end;
   end;
 end;

 procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
 var
   Text: string;
 begin
   with StringGrid1 do
   begin
     // Draws a 3D-Effect (Up) 
    // Zeichnet 3D-Effekt (Up) 
    Text := Cells[acol, arow];
     if arow = 0 then
     begin
       Canvas.Font := Font;
       Canvas.Brush.Color := clBtnFace;
       Canvas.FillRect(zelle);
       Canvas.TextRect(zelle, zelle.Left + 2, zelle.Top + 2, Text);
       DrawEdge(Canvas.Handle, zelle, 4, 4 or 8);
       DrawEdge(Canvas.Handle, zelle, 4, 1 or 2);
       MouseToCell(zelle.Left, zelle.Top, acol, arow);
     end;
   end;
   if (arow = 0) and (Button = mbleft) then
     case acol of
       0..2:
         begin
           // Code to be executed... 
          // Programmcode der ausgefuhrt werden soll 
          ShowMessage('Column ' + IntToStr(acol));
           zelle := stringgrid1.CellRect(1, 1);
         end;
     end;
 end;

 end.

Перевод контента на русский язык:

Код, который я предоставил, является решением для события OnColumnClick компонента TListView в TStringGrid. Два процедура StringGrid1MouseDown и StringGrid1MouseUp предназначены для создания визуального эффекта, аналогичного тому, который достигается при клике по столбцам в TListView.

Вот подробное описание того, что каждый процедура делает:

StringGrid1MouseDown

Эта процедура вызывается, когда левая кнопка мыши нажата (mbLeft) над ячейкой в TStringGrid. Она проверяет, является ли строка фиксированной (arow = 0), и если да, то рисует 3D-эффект вокруг ячейки с помощью методов Canvas.FillRect, Canvas.TextRect и DrawEdge.

StringGrid1MouseUp

Эта процедура вызывается, когда левая кнопка мыши отпущена над ячейкой в TStringGrid. Она проверяет, является ли строка фиксированной (arow = 0), и если да, то рисует другой 3D-эффект вокруг ячейки с помощью тех же методов, что и раньше. Кроме того, она выполняет код, который должен быть выполнен при клике по столбцу, в этом случае просто отображает сообщение с номером столбца.

Некоторые предложения для улучшения:

  1. Переменная zelle объявлена как приватное поле в типе формы, но не используется consistently throughout the code. Лучше объявить ее как локальную переменную внутри каждого процедура.
  2. Канвас-направленные свойства, такие как Canvas.Font, Canvas.Brush.Color и другие, устанавливаются несколько раз в каждой процедуре. Рекомендуется устанавливать эти свойства только один раз в начале каждой процедуры.
  3. Код использует некоторые жестко закодированные значения, например, 0..2 в случае switch. Лучше определить константу или переменную для этих значений, чтобы сделать код более читаемым и поддерживаемым.

Вот обновленная версия кода с некоторыми из этих предложений реализованными:

procedure TForm1.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Text: string;
begin
  with StringGrid1 do
  begin
    MouseToCell(X, Y, acol, arow);
    if arow = 0 and Button = mbleft then
      case acol of
        0..2:
          begin
            zelle := CellRect(acol, arow);
            Text := Cells[acol, arow];
            Canvas.Font := Font;
            Canvas.Brush.Color := clBtnFace;
            Canvas.FillRect(zelle);
            Canvas.TextRect(zelle, zelle.Left + 2, zelle.Top + 2, Text);
            DrawEdge(Canvas.Handle, zelle, 10, 2 or 4 or 8);
            DrawEdge(Canvas.Handle, zelle, 2 or 4, 1);
          end;
      end;
  end;
end;

procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Text: string;
begin
  with StringGrid1 do
  begin
    if arow = 0 then
    begin
      Canvas.Font := Font;
      Canvas.Brush.Color := clBtnFace;
      zelle := CellRect(acol, arow);
      Text := Cells[acol, arow];
      Canvas.FillRect(zelle);
      Canvas.TextRect(zelle, zelle.Left + 2, zelle.Top + 2, Text);
      DrawEdge(Canvas.Handle, zelle, 4, 4 or 8);
      DrawEdge(Canvas.Handle, zelle, 4, 1 or 2);
      MouseToCell(zelle.Left, zelle.Top, acol, arow);
    end;
    if arow = 0 and Button = mbleft then
      case acol of
        0..2:
          begin
            // Код для выполнения...
            ShowMessage('Column ' + IntToStr(acol));
            zelle := CellRect(1, 1);
          end;
      end;
  end;
end;

Обратите внимание, что я убрал переменную zelle из типа формы и объявил ее как локальную переменную внутри каждого процедура. Я также установил канвас-направленные свойства только один раз в начале каждой процедуры. Кроме того, я определил константу или переменную для жестко закодированных значений в случае switch.

Реализация события OnColumnClick из TListView для TStringGrid: в статье описаны два подхода к реализации метода OnColumnClick для TStringGrid, включая настройку первой строки как фиксированной и включение DefaultDrawing в True.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TStringGrid и TDrawGrid ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 02:49:43/0.003821849822998/0