На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Изменение каждого цвета ячейки StringGrid по палитре
    Приветствую!

    Очень глупый запрос помощи, понимаю, но что-то не смог я нагуглить решения. В основном везде цвета ячеек StringGrid красятся по каким-то условиям. В моем же случае мне надо красить пустые ячейки второго столбца (кроме первой строки) в тот цвет, что будет выбран в TColorDialog, т.е у каждой ячейки второго столбца должен быть свой цвет в зависимости от сделанного выбора в палитре. При этом по умолчанию цвет в этих ячейках должен быть черным.

    Я пробовал вот так:

    ExpandedWrap disabled
      // цвет ячейки по умолчанию
      procedure TForm1.StringGrid1DrawCell(Sender: TObject;
        ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
      begin
        if (ACol = 1) and (ARow > 0) then
        begin
          StringGrid1.Canvas.Brush.Color := clBlack;
          StringGrid1.Canvas.FillRect(Rect);
        end;
      end;
       
      // закрашивание ячейки по выбранному цвету из палитры
      procedure TForm1.StringGrid1SelectCell(Sender: TObject;
        ACol, ARow: Integer; var CanSelect: Boolean);
      begin
        if (ACol = 1) and (ARow > 0) then
        begin
          if ColorDialog1.Execute then
          begin
            StringGrid1.Canvas.Brush.Color := ColorDialog1.Color;
            StringGrid1.Canvas.FillRect(StringGrid1.CellRect(ACol, ARow));
          end;
        end;
        StringGrid1.Repaint;
      end;

    Также пробовал вот так (находил где-то пример), но тоже не робит:

    ExpandedWrap disabled
      type
        TCellData = class(TObject)
        private
          FStateYes: Boolean;
          FForeground: TColor;
          FBackground: TColor;
        public
          property StateYes: Boolean read FStateYes write FStateYes;
          property Foreground: TColor read FForeground write FForeground;
          property Background: TColor read FBackground write FBackground;
        end;
       
      // закрашивание ячейки по выбранному цвету из палитры
      procedure TForm1.StringGrid1SelectCell(Sender: TObject;
        ACol, ARow: Integer; var CanSelect: Boolean);
      var
        CellData: TCellData;
      begin
        if (ACol = 1) and (ARow > 0) then
        begin
          if ColorDialog1.Execute then
          begin
            CellData := TCellData.Create;
            CellData.Foreground := ColorDialog1.Color;
            CellData.Background := ColorDialog1.Color;
            StringGrid1.Objects[ACol, ARow] := CellData;
          end;
        end;
        StringGrid1.Repaint;
      end;


    Вроде банальнейшая задача, а завис :( Подскажите, пожалуйста, где туплю...

    Спасибо!
    Сообщение отредактировано: The_Immortal -
      CellData не зря сохраняется в примере.
      Ты, выходит, в StringGrid1SelectCell установил цвета, а потом в StringGrid1DrawCell их обратно перебил.
      Сделай так:
      ExpandedWrap disabled
        type
          TCellData = class(TObject)
          private
            FStateYes: Boolean;
            FForeground: TColor;
            FBackground: TColor;
          public
            property StateYes: Boolean read FStateYes write FStateYes;
            property Foreground: TColor read FForeground write FForeground;
            property Background: TColor read FBackground write FBackground;
          end;
         
        var
          DefaultData: TCellData;
         
        procedure TForm1.Create();
        begin
          DefaultData = TCellData.Create;
          DefaultData.Background = clBlack;
        end;
         
        procedure TForm1.StringGrid1DrawCell(Sender: TObject;
          ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
        var
          CellData: TCellData;
        begin
          if (ACol = 1) and (ARow > 0) then
          begin
            CellData := StringGrid1.Objects[ACol, ARow];
            if CellData = nil
              CellData := DefaultData;
            StringGrid1.Canvas.Brush.Color := CellData.Background;
            StringGrid1.Canvas.FillRect(Rect);
          end;
        end;
         
        procedure TForm1.StringGrid1SelectCell(Sender: TObject;
          ACol, ARow: Integer; var CanSelect: Boolean);
        var
          CellData: TCellData;
        begin
          if (ACol = 1) and (ARow > 0) then
          begin
            if ColorDialog1.Execute then
            begin
              CellData := TCellData.Create;
              CellData.Background := ColorDialog1.Color;
              StringGrid1.Objects[ACol, ARow] := CellData;
            end;
          end;
          StringGrid1.Repaint;
        end;

      P.S. Писал сразу сюда. Мог где ошибиться.
      Сообщение отредактировано: Profi -
        Не забудь в StringGrid1SelectCell проверять старый Object, и если он есть - просто обновлять. А то утечка памяти будет!
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0342 ]   [ 16 queries used ]   [ Generated: 27.02.24, 04:37 GMT ]