Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2010, 17:00   #1
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию Закрасить ячейки в строках StringGrid в потоках

Здравствуйте еще раз.
Мучаюсь таки вопросом, нужно в StringGrid закрашивать ячейки в потоках, в каждом потоке в отдельной строке, то есть, первый поток должен закрашивать ячейки первой строки, с определёнными индексами, как ему нужно, в своей DrawCell, второй поток - второй строки в своей DrawCell и как ему нужно т.д.
Ищущий да обрящет
fredwriter вне форума Ответить с цитированием
Старый 15.11.2010, 17:19   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

ИМХО ничего не выйдет.
За закраску ячеек отвечает канва грида, а срабатывать они будет только при перерисовке, плюс к тому закраску нужно по хорошему проводить в обработчике OnDrawCell того же Грида, так что потоки тут только мешать будут.
Или это бзик преподавателя?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.11.2010, 17:29   #3
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Или это бзик преподавателя?
Нет, просто хотел сделать визуальное сравнение четырёх алгоритмов поиска, то есть, как бы искали алгоритмы в массиве элемент, так бы и выделялись бы ячейки, например, линейный алгоритм выделял бы последовательно каждую ячейку, пока не найдётся ячейка, с искомым элементом, которая выделится последней. И, это с задержкой, чтобы было видно всё.
Может попробовать выделять не ячейку а менять цвет шрифта у элемента?
Ищущий да обрящет
fredwriter вне форума Ответить с цитированием
Старый 15.11.2010, 17:35   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Можно сделать. Обрабатывай OnDrawCell. В нем раскрашивай как нужно, в зависимости от условий. Когда нужно обновить, вызывай Repaint таблицы. А из потоков управляй переменными глобальными например, для каждого потока свою. Эти переменные и будут условиями раскраски. Главное потоки правильно разрули, синхронизируй, или критические секции организуй если надо.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 15.11.2010, 17:36   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Запутаешся быстро...
Единственное что могу посоветовать, так это решение поиска в потоке, а из него вызывай перерисовку грида. В перерисовке анализирую условие закраски.
Но не закрашивай ничего из потока, просто вызови всю перерисовку грида, и опиши OnDrawCell
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.11.2010, 17:45   #6
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

У меня решение поиска в потоке, а процедуру перерисовки в классе потока объявлять или нет?
например так?
Код:
Line_Find_Thread = class(TThread)
  private
  Protected
    procedure Execute; override;
  public
    procedure UpdateStringGrid. 
  end;
или как?

Прекращайте ненужное цитирование предыдущих сообщений!
Рекомендую. Помимо общих правил форума есть и дополнения к ним в каждом разделе...
А кроме кнопки "Цитата" внизу есть простое окно для ввода своего сообщения.
Или маленькая кнопочка "Быстрый ответ" справа от кнопки "Цитата".
Попадаете туда же.
Модератор
Ищущий да обрящет

Последний раз редактировалось mihali4; 15.11.2010 в 18:18.
fredwriter вне форума Ответить с цитированием
Старый 15.11.2010, 17:52   #7
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Вызывай ее когда какой-либо из потоков сделал что-то, что необходимо показать. Вызывается она так: Grid.Repaint; Следи только, чтобы одновременно потоки к одной и той же сущности не обращались. Это можно критическими секциями организовать.
А грид сам будет знать как ему отрисовываться, т.к. ты ему это укажешь в обработчике.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 15.11.2010, 18:00   #8
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Спасибо, Мутабор, попробую и, Stilet, тебе тоже спасибо.
Ищущий да обрящет
fredwriter вне форума Ответить с цитированием
Старый 16.11.2010, 14:52   #9
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Процедура OnDrawCell запускается сразу по открытии формы, а мне нужно перед её запуском поработать с формой, а потом нужно вызвать эту процедуру по нажатии кнопки, или я что-то не то говорю? В Delphi я недавно помогите пожалуйста новичку.
Ищущий да обрящет
fredwriter вне форума Ответить с цитированием
Старый 17.11.2010, 10:27   #10
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Никак не могу разобраться с OnDrawCell, в потоках у меня вычисляется какую ячейку нужно закрасить, потоки запускаются по нажатии на кнопку "поиск", перед тем как нажать на кнопку "поиск" я должен ввести в одно поле эдит размер массива, нажать на кнопку "Вывод случайного массива", после нажатия на эту кнопку четыре строки StringGrid заполняются числами, в каждой строке один и тот же массив, затем нужно ввести во второе поле эдит элемент, который нужно найти, и нажать на кнопку поиск. После нажатия на кнопку поиск запускаются потоки, каждый из которых по своему алгоритму поиска дает номер ячейки, которую нужно закрасить в OnDrawCell, первый поток вычисляет номер ячейи в первой строке, второй во второй строке и т.д. Я попробовал сделать это с одним потоком, хотя бы, но при открытии формы сразу запускается OnDrawCell, и не даёт ничего сделать.
Вот частичный код бреда, который я написал. Процедура потока, процедура OnDrawCell и процедура кнопки "поиск".

Код:
procedure Line_Find_Thread.Execute;
begin
  i_p := 1;
  Key_f2 := StrToInt(Form2.Edit2.Text);
  while (i_p <= n_f2) and (Mass_f2[i_p] <> Key_f2) do
  begin
    Inc(i_p);
    Sleep(100);
  end;
end;


procedure TForm2.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if i_p <> 0 then
    if (ARow = i_p) and (ACol = 0) then
      with TStringGrid(Sender), Canvas do
      begin
        Brush.Color := clRed;
        FillRect(Rect);
        TextRect(Rect, Rect.Left, Rect.Top, Cells[aCol, aRow]);
      end;
end;

 
procedure TForm2.Button1Click(Sender: TObject);
begin
 // QuickSort(C_Mass_f2, n_f2);
  //QuickSort(D_Mass_f2, n_f2);
  Line_Find_Thread.Create(False);
  //QLine_Find_Thread.Create(False);
 // Dixot_Find_Thread.Create(False);
  //Interpol_Find_Thread.Create(False);
end;
Ищущий да обрящет
fredwriter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Координаты ячейки в StringGrid??? aslanbek Общие вопросы Delphi 13 01.08.2014 16:53
ячейки в StringGrid Desha Компоненты Delphi 3 06.09.2010 20:32
Вопрос по выделению ячейки в stringgrid robin39 Помощь студентам 8 08.07.2010 10:18
Ячейки в StringGrid ImmortalAlexSan Общие вопросы Delphi 2 17.05.2010 17:41
Выделение ячейки цветом - StringGrid. Chudo4258 Помощь студентам 1 01.04.2009 07:03