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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2015, 16:33   #1
delboske
 
Регистрация: 19.05.2015
Сообщений: 9
По умолчанию Выделение ячеек в StringGrid по содержанию (Delphi)

Здравствуйте. Есть StringGrid в который выводится список запущенных процессов и время их создания. Необходимо чтоб при нажатии на кнопку выделялись цветом все процессы которые моложе двух недель (меньше 14ти дней от текущей даты) . Пока удалось только выделить ячейку по заранее написанному содержанию, а с временем не получается.

Код:
begin
if (gdFocused in State) then
begin
StringGrid1.Canvas.Brush.Color := clWhite;
StringGrid1.Canvas.Font.Color := clBlack;
end
else
if StringGrid1.Cells[ACol, ARow] = '05.05.2005 05:05:05' then
StringGrid1.Canvas.Brush.color := clRed
else
StringGrid1.canvas.brush.Color := clWhite;

if (ACol > 0) and (ARow > 0) then
begin

StringGrid1.Canvas.FillRect(Rect);

StringGrid1.Canvas.TextOut(Rect.Left, Rect.Top, StringGrid1.Cells[ACol, ARow]);
end;
delboske вне форума Ответить с цитированием
Старый 27.06.2015, 17:55   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Используй функцию WeeksBetween().
Проблема только в том, что ты, как я понял, хранишь дату в виде строки. Было бы совсем неплохо хранить ее в виде даты в неком списке.
На данный момент твой код можно подкостылить только так:
Код:
if WeeksBetween(now, StrToDateTime(StringGrid1.Cells[ACol, ARow])<2 then
StringGrid1.Canvas.Brush.color := clRed
else
StringGrid1.canvas.brush.Color := clWhite;
Сразу предупреждаю - могут быть ошибки из-за формата даты. Тогда придется настраивать FormatSettings, чтоб указать формат даты.
Код:
FormatSettings.LongDateFormat:='dd.mm.yyyy hh:nn:ss'
Но это все равно не по феншую.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.06.2015, 19:48   #3
delboske
 
Регистрация: 19.05.2015
Сообщений: 9
По умолчанию

Stilet

Спасибо за совет!

Дату в виде строки я написал для примера. Так дата у меня получается с помощью FileAge из procentry.szexefile и заполняется как все остальные ячейки. Я снял снапшот процессов через CreateToolHelp32Snapshot и уже из него заполнял всю таблицу.

Код:
begin
k:=1;
hsnap:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);
procentry.dwSize:=sizeof(procentry);
Process32First(hsnap,procentry);
repeat
with procinfogrid do
 begin
  if k>rowcount-1 then
  rowcount:=rowcount+1;
  cells[0,k]:=procentry.szexefile;
  cells[1,k]:=inttostr(procentry.th32ProcessID);
  cells[3,k]:=GetExeFilePath(procentry.szexefile)+procentry.szexefile;      // тут будет путь
  dt:= FileAge(GetExeFilePath(procentry.szexefile));
   if dt > 1 then
    cells[2,k]:= DateTimetoStr(FileDateToDateTime(dt))
    else
     cells[2,k]:= '-------';
 end;

Последний раз редактировалось delboske; 27.06.2015 в 19:50.
delboske вне форума Ответить с цитированием
Старый 27.06.2015, 19:56   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
и уже из него заполнял всю таблицу
Да, но все равно при отрисовке событие должно получать дату. А ты, как я понял, хранишь ее именно в виде строки. А я бы создавал для каждой строки грида объект некоего класса с полями, в которых будут характеристики процесса, и уже отрисовывал бы опираясь на них.
Например класс
Код:
TProc=class
 private
  Data:TDateTime;
... Еще чето
end
Пихаем в грид:
Код:
With StringGrid do begin
 RowCount:=RowCount+1;
 Objects[0,RowCount-1]:=TProc.Create();
 TProc(Objects[0,RowCount-1]).Data:=...
...
end;
И в отрисовке обрашался бы к Objects
Цитата:
снапшот процессов через CreateToolHelp32Snapshot
Ремарка: Он устарел, рекомендую работать с модулем PsAPI.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.06.2015, 19:57   #5
delboske
 
Регистрация: 19.05.2015
Сообщений: 9
По умолчанию

Stilet

Большое спасибо! Буду допиливать
delboske вне форума Ответить с цитированием
Старый 27.06.2015, 20:08   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ага. Удачи )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.06.2015, 20:19   #7
delboske
 
Регистрация: 19.05.2015
Сообщений: 9
По умолчанию

Stilet

Только выдает ошибку на <2 "incompatible types Tdatetime and boolean"
delboske вне форума Ответить с цитированием
Старый 27.06.2015, 20:23   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не может оно такого выдавать. Покажи как написал.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.06.2015, 20:26   #9
delboske
 
Регистрация: 19.05.2015
Сообщений: 9
По умолчанию

Stilet

processlist - название моей таблицы

Код:
begin
  if (gdFocused in State) then
 begin
    processlist.Canvas.Brush.Color := clWhite;
   processlist.Canvas.Font.Color := clBlack;
 end
 else
    if WeeksBetween(now, StrToDateTime(processlist.Cells[ACol, ARow])< 2 then
processlist.Canvas.Brush.color := clRed
else
processlist.canvas.brush.Color := clWhite;

  if (ACol > 0) and (ARow > 0) then
  begin

    processlist.Canvas.FillRect(Rect);

    processlist.Canvas.TextOut(Rect.Left, Rect.Top, processlist.Cells[ACol, ARow]);
  end;
  end;
delboske вне форума Ответить с цитированием
Старый 27.06.2015, 20:44   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Эх... Ну ладно я невнимательный. Писал с потолка. Но ты хотя бы мог не копипастить код втупую как штатное школоло, а разобраться в нем и написать по своему? Шо за манера такая у новичков - брать из тырнета даже не читая?
Скобочки там закрывающей не хватает.

P.S. Все. Я баиньки. Глаза слипаются...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделение ячеек в StringGrid virtuhay266 C++ Builder 2 21.11.2012 23:28
выделение ячеек в StringGrid belyjj Компоненты Delphi 9 08.04.2011 15:22
StringGrid - выделение нескольких ячеек 6AZblJlb Общие вопросы Delphi 3 26.11.2010 22:48
Выделение цветом ячеек в StringGrid (Delphi) Lost'яра)) Помощь студентам 2 03.10.2010 10:55
StringGrid, выделение ячеек. robin39 Помощь студентам 17 27.05.2010 00:14