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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2010, 13:48   #11
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Это совершенно разные записи и не по порядку идут.
Тогда обьясни как это
Цитата:
(Form1.ADOQuery1.FieldValues['DocType'] = '02') or
(Form1.ADOQuery1.FieldValues['DocType'] = '03') or
Научилась сама выбирать значения из разных записей?

Ты что-то путаешь...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.10.2010, 13:54   #12
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Stilet, но ведь OnGetCellParams и OnCalcFields будут работать с одинаковой скоростью и тормоза (если они из-за этого) не изчезнут.
_SERGEYX_ вне форума Ответить с цитированием
Старый 12.10.2010, 14:17   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
_SERGEYX_
Никто не знает кроме автора что у него творится. Только пошаговка.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.10.2010, 15:09   #14
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Полагаю, что тормоза были из-за лишних проверок и перерисовок. Сейчас сократил код на данный момент до минимума. Вот такой код получился:
Код:
procedure TForm1.DBGridEh1GetCellParams(Sender: TObject; Column: TColumnEh;
  AFont: TFont; var Background: TColor; State: TGridDrawState);
begin
{ if (gdSelected in State) and not (gdFocused in State) then Exit;}
 //если номер контракта отсутствует
 if ((Form1.ADOQuery1.FieldValues['DocType'] = '01') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '02') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '03') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '04') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '05') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '06') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '07') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '08') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '09') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '10') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '99')) and
    (Form1.ADOQuery1.FieldValues['Number contract'] = '') then
  begin
    Form1.Label62.Font.Color:=clRed;
    Form1.Label62.Caption:='Ошибка: отсутствует номер контракта!';
    Form1.Label63.Caption:='';
    AFont.Color := clBlack;
    AFont.Style := [fsBold];
    Background := clRed;
  end;

 //если номер контракта отсутствует и меньше 3
 if ((Form1.ADOQuery1.FieldValues['DocType'] = '01') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '02') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '03') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '04') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '05') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '06') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '07') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '08') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '09') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '10') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '99')) and
    (Form1.ADOQuery1.FieldValues['Number contract'] <> '') and
    ((Length(Form1.ADOQuery1.FieldValues['Number contract']) < 3)) then
  begin
    Form1.Label62.Font.Color:=clGreen;
    Form1.Label62.Caption:='Статус: исправлено!';
    Form1.Label63.Font.Color:=clRed;
    Form1.Label63.Caption:='Ошибка: количество символов в номере ' + #13#10 +
                           'контракта должно быть больше 3!';
    AFont.Color := clBlack;
    AFont.Style := [fsBold];
    Background := clRed;
  end;

 //если номер контракта отсутствует или меньше 3
 if ((Form1.ADOQuery1.FieldValues['DocType'] = '01') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '02') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '03') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '04') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '05') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '06') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '07') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '08') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '09') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '10') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '99')) and
    (Form1.ADOQuery1.FieldValues['Number contract'] <> '') and
    (Length(Form1.ADOQuery1.FieldValues['Number contract']) >= 3)  then
  begin
    Form1.Label62.Font.Color:=clGreen;
    Form1.Label62.Caption:='Статус: исправлено!';
    Form1.Label63.Font.Color:=clGreen;
    Form1.Label63.Caption:='Статус исправлено!';
    AFont.Color := clBlack;
    AFont.Style := [fsBold];
    Background := clGreen;
  end;
end;
и вот куда-то еще нужно добавить условие, что "не больше 20". По аналогии с числом "3" как я делал. Подскажите как компактнее записать?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 12.10.2010, 16:01   #15
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

ну и ответь все-таки - в чем смысл этого в коде раскраски?
Код:
 Form1.Label62.Font.Color:=clRed;
    Form1.Label62.Caption:='Ошибка: отсутствует номер контракта!';
    Form1.Label63.Caption:='';
в данном случае никто по датасету не бежит
и состояние лейбаков будет соответствовать последней отрисованной строке в гриде - смысла 0!

теперь про проверки:
проще всего код сократить до первого условия с ор-ами, а дальше внутри уже проверять равенство пустому и отдельно величину значения

Код:
 if ((Form1.ADOQuery1.FieldValues['DocType'] = '01') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '02') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '03') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '04') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '05') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '06') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '07') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '08') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '09') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '10') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '99')) then
  begin
   if (Form1.ADOQuery1.FieldValues['Number contract'] = '') then
  begin    
    AFont.Color := clBlack;
    AFont.Style := [fsBold];
    Background := clRed;
  end;
  if (Form1.ADOQuery1.FieldValues['Number contract'] <> '') and
    ((Length(Form1.ADOQuery1.FieldValues['Number contract']) < 3)) then
  begin    
    AFont.Color := clBlack;
    AFont.Style := [fsBold];
    Background := clRed;
  end;
  // etc.

  end;
soleil@mmc вне форума Ответить с цитированием
Старый 12.10.2010, 16:55   #16
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Воо, вот счас вроде без тормозов работает. Но мне все таки нужны отображать в лэйблах текст ошибок. Но у меня текст показывается только после повторного нажатия на ячейку с ошибкой. Как сделать, чтобы после первого клика появлялся текст?
Код:
procedure TForm1.DBGridEh1GetCellParams(Sender: TObject; Column: TColumnEh;
  AFont: TFont; var Background: TColor; State: TGridDrawState);
begin
 if ((Form1.ADOQuery1.FieldValues['DocType'] = '01') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '02') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '03') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '04') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '05') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '06') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '07') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '08') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '09') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '10') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '99')) then
  begin
   if (Form1.ADOQuery1.FieldValues['Number contract'] = '') then
  begin
    AFont.Color := clBlack;
    AFont.Style := [fsBold];
    Background := clRed;
    Form1.Label62.Font.Color:=clRed;
    Form1.Label62.Caption:='Ошибка: отсутствует номер контракта!';
  end;

  if (Form1.ADOQuery1.FieldValues['Number contract'] <> '') and
    ((Length(Form1.ADOQuery1.FieldValues['Number contract']) < 3)) then
  begin
    AFont.Color := clBlack;
    AFont.Style := [fsBold];
    Background := clRed;
    Form1.Label63.Font.Color:=clRed;
    Form1.Label63.Caption:='Ошибка: номер контракта должен быть больше 3 символов!';
  end;

  if (Form1.ADOQuery1.FieldValues['Number contract'] <> '') and
    ((Length(Form1.ADOQuery1.FieldValues['Number contract']) > 3)) then
  begin
    AFont.Color := clBlack;
    AFont.Style := [fsBold];
    Background := clGreen;
    Form1.Label62.Font.Color:=clGreen;
    Form1.Label63.Font.Color:=clGreen;
    Form1.Label62.Caption:='Статус: ошибка исправлена!';
    Form1.Label63.Caption:='Статус: ошибка исправлена!';
  end;
  end;
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 12.10.2010, 17:46   #17
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

придется процитировать себя же
Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
ну и ответь все-таки - в чем смысл этого в коде раскраски?
Код:
 Form1.Label62.Font.Color:=clRed;
    Form1.Label62.Caption:='Ошибка: отсутствует номер контракта!';
    Form1.Label63.Caption:='';
в данном случае никто по датасету не бежит
и состояние лейбаков будет соответствовать последней отрисованной строке в гриде - смысла 0!
чтобы в лейбаках писалось адекватно нужно вешать еще доп. обработчик на датасет.онафтерскрол

имхо в принципе не надо никаких лейбаков - достаточно ввести нормальную дифференциацию по цвету штанов /*зачеркнуто*/ и вывесить легенду: красный - отсутствует номер контракта, и т.д.
раскраска-то уже есть
soleil@mmc вне форума Ответить с цитированием
Старый 12.10.2010, 17:52   #18
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Да, вы снова правы . Я тогда просто под каждый тип ошибки сделаю свой цвет. Отсутствие контракта - красный. Количество символов меньше трех - желтый. Буду дальше мутить...
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макросы перемещения в таблице Окоча Юра Microsoft Office Excel 2 22.01.2010 16:30
Как сделать чтобы во время поиска по таблице не было видно перемещения по dbgrid? alxsev БД в Delphi 4 10.04.2009 19:03
help! тормоза с DataTable?! billidean Общие вопросы .NET 2 24.08.2008 13:16
Тормоза винды Altera Операционные системы общие вопросы 4 08.07.2008 18:23
Контроль перемещения мыши Falling_Tear Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 29.11.2007 19:43