Форум программистов, компьютерный форум, киберфорум
popryduhin
Войти
Регистрация
Восстановить пароль
Карта форума Блоги Сообщество Поиск Заказать работу  
Оценить эту запись

CheckBox в StringGrid

Запись от popryduhin размещена 01.05.2017 в 00:06
Обновил(-а) popryduhin 01.05.2017 в 15:14

Приветствую читателя!

Совсем недавно писал некую программу для репостинга в социальной сети ВК. Речь пойдет как указанно в заголовке о CheckBox в StringGrid. Как говорится, полез в Гуголь за информацией по этой теме, скажу честно, не там искал, потратил более 2 часов, что бы засунуть Чек Бокс в СтрингГрид.

И тут меня осенило! Оказывается можно обойтись и без TCheckBox вместо него можно использовать всего 2 символа!!!
Для начала продемонстрирую результат:
Нажмите на изображение для увеличения
Название: 2017-04-30_234545.png
Просмотров: 477
Размер:	21.4 Кб
ID:	4251

Конечно, на премию в области информационных технологий не тянет, но меня улыбнула простота исполнения.

Не буду писать подробную инструкцию как это сделать, в общих чертах...

1. Берем TStringGrid
2. Так же понадобится шрифт "Wingdings"
3. 2 символа "ю" и "o" (Замечу ю русская, а о латинская и обе в нижнем регистре)

Код в обработчике рисования:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TMainForm.SGDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
   SG_  : TStringGrid;
begin
 
 SG_ := (Sender as TStringGrid);
 
 if (ACol = 1) and (ARow <> 0 ) then
 begin
  SG_.Canvas.FillRect(Rect);
  SG_.Canvas.Font.Name := 'Wingdings';
  SG_.Canvas.Font.Size := 16;
  SG_.Canvas.TextOut(Rect.Location.X+5,Rect.Location.Y+2, SG_.Cells[ACol,ARow] );
  SG_.Canvas.Brush.Color:=clWindow;
 end;


А в событии OnClick:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TMainForm.SGClick(Sender: TObject);
begin
 if point.col = 1 then
 begin
   // DEFAUTL_CHECK  это константа, хранит символ 'ю'
   if SG.Cells[point.col, point.row] = DEFAUTL_CHECK then
   begin
     // UNCHECKED = о
     SG.Cells[point.col, point.row] := UNCHECKED;
   end
   else
     SG.Cells[point.col, point.row] := DEFAUTL_CHECK;
 
 end;
end;


переменная point это

Type
TDGPoint = record
col,
row : integer;
end;


в ней я храню координаты выделенных ячеек.

Далее я думаю понятно, как получать статус нашего ЧекБокса
И если в одной или нескольких ячейках поместить один из символов, мы получаем желаемый результат

Исходник не выкладываю по некому обстоятельству.

Концепция проста до безобразия!
Размещено в Delphi
Показов 4346 Комментарии 18
Всего комментариев 18
Комментарии
  1. Старый комментарий
    Аватар для Avazart
    Цитата:
    Концепция проста до безобразия!
    Простая концепция в Qt там взял и вставил.

    А в VCL нужно повозится.
    Кроме того касательно этой статьи -для таких целей лучше использовать DrawGrid и рисовать в "стилях".

    Есть тема с рисованием прогресс-бара правда для С++Builder, но принцип тот же:

    https://www.cyberforum.ru/cpp-... 58481.html

    И еще такая тема:

    https://www.cyberforum.ru/cpp-... 13986.html
    Запись от Avazart размещена 01.05.2017 в 13:49 Avazart вне форума
  2. Старый комментарий
    Аватар для Avazart
    Да еще стоит сказать про FMX там вроде более гибко реализовано. Но я честно говоря не осилил концепцию, как то все замутно.
    Запись от Avazart размещена 01.05.2017 в 13:53 Avazart вне форума
  3. Старый комментарий
    Цитата:
    Кроме того касательно этой статьи -для таких целей лучше использовать DrawGrid и рисовать в "стилях".
    Возможно, я поначалу не думал об этом мне нужна просто таблица была, да и не ожидал что заказчик хочет дорабатывать ее для себя.

    Что касается DrawGrid - TStringGrid наследник TDrawGrid

    Кстати таким методом можно и анимацию замутить, например нумерация у меня реализована в этом проекте в другом потоке и использует общую ячейку памяти, и без всякой синхронизации.
    Запись от popryduhin размещена 01.05.2017 в 15:09 popryduhin вне форума
  4. Старый комментарий
    Аватар для Avazart
    Цитата:
    Что касается DrawGrid - TStringGrid наследник TDrawGrid
    да именно по этому лучше TDrawGrid, в нем не страдает так прорисовка, если "лезть руками".

    Цитата:
    Кстати таким методом можно и анимацию замутить, например нумерация у меня реализована в этом проекте в другом потоке и использует общую ячейку памяти, и без всякой синхронизации.
    К чему это вы? К тому что вы не умете писать код с многопоточностью?
    Соболезную...
    Запись от Avazart размещена 01.05.2017 в 15:32 Avazart вне форума
    Обновил(-а) Avazart 01.05.2017 в 16:59
  5. Старый комментарий
    Цитата:
    К чему это вы? К тому что вы не умете писать код с многопоточностью?
    Соболезную...
    У нас с вами разное понимание.

    Я же не сую нос свой в >>многопоточностью?<<
    Запись от popryduhin размещена 01.05.2017 в 16:08 popryduhin вне форума
  6. Старый комментарий
    Уважаемый Avazart вы бы поменьше умели на форуме.
    Вы наверное думаете что у меня этот код не работает???
    Запись от popryduhin размещена 01.05.2017 в 16:11 popryduhin вне форума
  7. Старый комментарий
    Аватар для Avazart
    Я вас понимаю все меньше.
    Цитата:
    Вы наверное думаете что у меня этот код не работает???
    Было бы странно если бы он работал нормально при отсутствии синхронизации.
    Запись от Avazart размещена 01.05.2017 в 16:30 Avazart вне форума
  8. Старый комментарий
    Цитата:
    Было бы странно если бы он работал нормально при отсутствии синхронизации.
    Сам удивляюсь, дело в том что зачем мне синхронизация??? мне ненужно ждать пока пронумеруются строки.
    Я же написал что использую одну ячейку памяти где хранится StringGrid
    и меняю значение

    Класс
    Delphi
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    Type
      /// <summary>
      ///  Поток для нумирации строк
      ///  Обращается к одной ячейки памяти таблицы
      /// </summary>
      TSGHreadNumbering = class(TTHread)
        private
        FPointSG: Pointer;
        FExit   : boolean;
        public
          procedure ExitHread;
          procedure execute; override;
          Property  PointSG : Pointer read FPointSG write FPointSG;
     
      end;
    Delphi
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    { TSGHreadNumbering }
     
    procedure TSGHreadNumbering.execute;
    var
     i_sg : integer;
     sg   : TStringGrid;
     rowsC: integer;
    begin
     sg   := Pointer(FPointSG^);
      while FExit = false do
      begin
        if sg <> nil then
          for i_sg := sg.FixedRows to sg.RowCount -1 do
          begin
            sg.cells[0, i_sg] := i_sg.ToString;
          end;
        sleep(40);
      end;
    end;
    Запись от popryduhin размещена 01.05.2017 в 17:49 popryduhin вне форума
  9. Старый комментарий
    Вы сначала попробуйте, а после комментарий.
    Хотя критика тоже уместна, Вы случаем не критик?
    Запись от popryduhin размещена 01.05.2017 в 17:51 popryduhin вне форума
  10. Старый комментарий
    Как вы думаете что в переменной находится? --->> sg := Pointer(FPointSG^);
    Запись от popryduhin размещена 01.05.2017 в 17:52 popryduhin вне форума
  11. Старый комментарий
    Аватар для Avazart
    Delphi
    1
    
    sg.cells[0, i_sg] := i_sg.ToString;
    Нельзя к TStringGrid(и любому другому VCL компоненту) обращаться без синхронизация во вторичных потоках(не GUI потоках).

    Это будет приводить к разным глюкам, типа намертвоподвисших окон или ошибок доступа к памяти.

    Цитата:
    Вы сначала попробуйте, а после комментарий.
    А что тут пробовать? Коль и так видно... а главное предсказуемо тупо...
    Запись от Avazart размещена 01.05.2017 в 18:10 Avazart вне форума
    Обновил(-а) Avazart 01.05.2017 в 18:14
  12. Старый комментарий
    Цитата:
    Нельзя к TStringGrid(и любому другому VCL компоненту) обращаться без синхронизация во вторичных потоках(не GUI потоках).

    Это будет приводить к разным глюкам, типа намертвоподвисших окон или ошибок доступа к памяти.
    Мне это известно! Я сталкивался с подобным и обращался через синхронизацию.
    Но здесь идет не обращение к объекту, а изменение значения в конкретной ячейке памяти...

    Прилагаю видео!
    ТЫК

    Исходник не могу скинуть зависимости есть, лень собирать все в кучу.
    Запись от popryduhin размещена 01.05.2017 в 21:37 popryduhin вне форума
    Обновил(-а) popryduhin 01.05.2017 в 21:39
  13. Старый комментарий
    Цитата:
    А что тут пробовать? Коль и так видно... а главное предсказуемо тупо...
    Для конкретного случая не каких конфликтов нет. Единственное что может, так это если высвободить общую ячейку памяти.
    Ошибка доступа к памяти.

    Я настаивать не буду. У меня работает безотказно как бы я не изменял значения и количество строк в SG.
    Запись от popryduhin размещена 01.05.2017 в 21:43 popryduhin вне форума
  14. Старый комментарий
    Аватар для Avazart
    Цитата:
    У меня работает безотказно как бы я не изменял значения и количество строк в SG.
    Да нифига оно не работает...

    Вы попробуйте взять мышкой за заголовок окна программы и потаскать по экрану в момент когда вторичный поток пишет в ячейки и ваша программа повиснет наглуха.

    Цитата:
    Для конкретного случая не каких конфликтов нет.
    Конфликт очевиден, и будет проявляться при перерисовке окна.

    Цитата:
    Но здесь идет не обращение к объекту, а изменение значения в конкретной ячейке памяти...
    Вы как раз обращаетесь к объекту, а точнее к его свойству, которое может косвенно вызывать перерисовку компонента.

    При использование потоков неправильно написанная программа может "работать" в 9 случаях из 10, а при 1 падать...
    Запись от Avazart размещена 02.05.2017 в 00:06 Avazart вне форума
    Обновил(-а) Avazart 02.05.2017 в 00:13
  15. Старый комментарий
    Аватар для Avazart
    Цитата:
    Нельзя к TStringGrid(и любому другому VCL компоненту) обращаться без синхронизация во вторичных потоках(не GUI потоках).
    Цитата:
    Мне это известно!
    И каким обидным словом вас называть после этого?
    Если вы заведомо делаете через опу...
    Запись от Avazart размещена 02.05.2017 в 00:15 Avazart вне форума
  16. Старый комментарий
    Цитата:
    И каким обидным словом вас называть после этого?
    Если вы заведомо делаете через опу...
    Мне все ясно... Слишком уж ты заумный...
    Потаскал я за шапку программы. Не чего не висит и не падает. Я не настаиваю на этом. И к статье это не как не относится к этой теме. Развел базар, обидным словом он решил назвать. Иди на базаре бабкам рассказывай про конфликт и AV. Я намеренно без синхронизации реализовал, ради эксперимента и он успешен по крайней мере пока.

    И если ты уж такой не угомонный, реализуй и покажи мне этот конфликт, а не пускай пузыри...
    Или ты только коменты можешь оставлять?

    И я считаю, что на счет ЧекБоксов в СтрингГрид, твоя критика не уместна...

    Такое ощущение что я кому то навязал свою идею и пытаюсь на этом настоять.
    Запись от popryduhin размещена 02.05.2017 в 00:56 popryduhin вне форума
  17. Старый комментарий
    Аватар для Avazart
    Цитата:
    Мне все ясно... Слишком уж ты заумный...
    Может не я умный- может вы слишком глупый?
    Запись от Avazart размещена 02.05.2017 в 11:05 Avazart вне форума
    Обновил(-а) Avazart 02.05.2017 в 16:28
  18. Старый комментарий
    Цитата:
    Может не я умный, может вы слишком глупый?
    Зря я с тобой связываюсь. Это последнее сообщение которое когда либо я тебе написал.
    Запись от popryduhin размещена 02.05.2017 в 11:07 popryduhin вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru