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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2010, 08:11   #11
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

согласен с мнением Karabash
что-то в данных в этих строчках (№674, №678, №680) не хорошо.
Например, первое, что просится, так это сжать лишние пробелы в строке.
Например, так:
Код:
...
if (Trim(Form1.ADOQuery1.FieldValues['DocType']) = '02') and
     (Trim(Form1.ADOQuery1.FieldValues['Number application']) = '')  then begin
   ...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.10.2010, 08:22   #12
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

Серж, спасибо! Попробую обязательно это сделать. Слушайте, вот такой вопрос. Я решил сделать еще, чтоб в Lable62.Caption показывалась соотвествующий текст ошибки. Делаю так:
Код:
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') and
     (Form1.ADOQuery1.FieldValues['Number contract'] = '')  then
  begin
    Form1.Label62.Caption:='Ошибка: отсутствует номер контракта!';
    AFont.Color := clBlack;
    AFont.Style := [fsBold];
    Background := clRed;
  end;

  //если номер контракта есть
  if (Form1.ADOQuery1.FieldValues['DocType'] = '01') and
     (Form1.ADOQuery1.FieldValues['Number contract'] <> '')  then
  begin
    Form1.Label62.Caption:='';
    AFont.Color := clBlack;
    AFont.Style := [fsBold];
    Background := clGreen;
  end;
end;
Что получаю в результате: при открытии БД (я специально заранее удалил номер контракта из ячейки), у меня строка выделяется красным, с этим проблем нет, тут вопрос решен. Но, чтобы у меня в Lable62.Caption появился текст ошибки я должен 2 раза нажать на красную строчку, чтобы текст появился. Как можно сделать, чтобы после первого нажатия, неважно в какой ячейке этой строки я нажал, у меня текст появился?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 12.10.2010, 08:38   #13
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Если нужно чтобы текст ошибки появлялся при выделении строки (одним кликом мышки, или при движении по таблице клавишами), то, скорее всего вывод ошибки нужно делать в событии DataSet (ADOQuery1) AfterScroll. В нем так же проверить наличие номера контракта. Если нет выводить в лабел ошибку.
Karabash вне форума Ответить с цитированием
Старый 12.10.2010, 08:51   #14
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

На AfterScroll не получилось. Появилась ошибка. Сделал вроде так, правда получил EAccessViolation ошибку, но обработал ее так:
Код:
procedure TForm1.DBGridEh1CellMouseClick(Grid: TCustomGridEh;
  Cell: TGridCoord; Button: TMouseButton; Shift: TShiftState; X,
  Y: Integer);
var
  AFont: TFont;
  Background: TColor;
  State: TGridDrawState;
  error: integer;
begin
 try
 if (gdSelected in State) and not (gdFocused in State) then Exit;
 //åñëè íîìåð êîíòðàêòà îòñóòñòâóåò
 if (Form1.ADOQuery1.FieldValues['DocType'] = '01') and
     (Form1.ADOQuery1.FieldValues['Number contract'] = '')  then
  begin
    Form1.Label62.Caption:='Îøèáêà: îòñóòñòâóåò íîìåð êîíòðàêòà!';
    AFont.Color := clBlack;
    AFont.Style := [fsBold];
    Background := clRed;
  end;

  //åñëè íîìåð êîíòðàêòà åñòü
  if (Form1.ADOQuery1.FieldValues['DocType'] = '01') and
     (Form1.ADOQuery1.FieldValues['Number contract'] <> '')  then
  begin
    Form1.Label62.Caption:='';
    AFont.Color := clBlack;
    AFont.Style := [fsBold];
    Background := clGreen;
  end;
  except on EAccessViolation do
  begin
   error:=1;
  end;
end;
end;
вроде пока ошибки нет. Текст появляется когда выбираю красную строчку и исчезает, когда выбираю зеленую. Буду пробовать дальше условия писать.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 12.10.2010, 08:57   #15
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Ошибка то понятно откуда. Объект AFont не создан, а обращение к нему происходит (AFont.Color, например). Но даже если его и создавать, то откуда ему взять нужные свойства. Наверное, надо оставить раскраску в OnGetCellParams, а в этой процедуре только выводить ошибку. Конечно выбросить объявления
Код:
АFont: TFont;
Background: TColor;
State: TGridDrawState;
И обращения к ним в процедуре.


Да, еще добавлю.
OnCellMouseClick, конечно, хорош, спору нет, но AfterScroll более универсально что ли. Оно возникает на любое изменение выделенной строки. Неважно по какой причине это происходит. Тыкаем мышкой в другую строку или бегаем по гриде с помощью клавиатуры. OnCellMouseClick же срабатывает только на мышиный клик.

Последний раз редактировалось Karabash; 12.10.2010 в 09:30.
Karabash вне форума Ответить с цитированием
Старый 12.10.2010, 09:29   #16
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

Тут другой вопрос у меня остался еще пока что . Извините за назойливость, но, "народ просит разобраться" (с) . Итак. Что нужно: если в поле Number contract отсутствует значение (т.е. пусто в ячейке) и/или количество символов в ячейке меньше трех, то эта строка выделяется красным. Если значение в ячейке есть, т.е. первое условие не нарушается, то строка остается красным до тех пор, пока количество символов не станет в ячейке больше трех. Если количество символов становится больше трех либо равно трем, то строка закрашивается в зеленый цвет. Если нарушаются оба условия, то отображается соотвествующий текст ошибок. Исправили нарушение первого условия - текст первой ошибки исчез, строка осталась красной. Исправили нарушение второго условия - текст второй ошибки исчез, строка закрасилась в зеленый. Вот, делаю так:
Код:
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') and
    (Form1.ADOQuery1.FieldValues['Number contract'] = '') and
    (Length(Form1.ADOQuery1.FieldValues['Number contract']) <= 3)  then
  begin
    Form1.Label62.Caption:='Ошибка: отсутствует номер контракта!';
    Form1.Label63.Caption:='Ошибка: количество символов в номере контракта должно быть не меньше 3!';
    AFont.Color := clBlack;
    AFont.Style := [fsBold];
    Background := clRed;
  end;

  //если номер контракта есть
  if (Form1.ADOQuery1.FieldValues['DocType'] = '01') and
     (Form1.ADOQuery1.FieldValues['Number contract'] <> '')  and
     (Length(Form1.ADOQuery1.FieldValues['Number contract']) >= 3)  then
  begin
    Form1.Label62.Caption:='Информация: ошибка устранена!';
    Form1.Label63.Caption:='Информация: ошибка устранена!';
    AFont.Color := clBlack;
    AFont.Style := [fsBold];
    Background := clGreen;
  end;
end;
но не получается немного. Данный код дает результат: если изначально ячейка пустая, то строка закрашивается красным, т.е. работает этот код (текст ошибок показывается):
Код:
 if (gdSelected in State) and not (gdFocused in State) then Exit;
 //если номер контракта отсутствует
 if (Form1.ADOQuery1.FieldValues['DocType'] = '01') and
    (Form1.ADOQuery1.FieldValues['Number contract'] = '') and
    (Length(Form1.ADOQuery1.FieldValues['Number contract']) <= 3)  then
  begin
    Form1.Label62.Caption:='Ошибка: отсутствует номер контракта!';
    Form1.Label63.Caption:='Ошибка: количество символов в номере контракта должно быть не меньше 3!';
    AFont.Color := clBlack;
    AFont.Style := [fsBold];
    Background := clRed;
  end;
.
Если я введу в ячейку значения, например всего два значения, то строка закрашивается в белый, а должно оставаться красным до тех пор пока не выполнится это условие:
Код:
(Length(Form1.ADOQuery1.FieldValues['Number contract']) > 3)  then
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 12.10.2010 в 09:34.
artemavd вне форума Ответить с цитированием
Старый 12.10.2010, 09:37   #17
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Вот это условие лишнее и оно мешает:
Код:
    (Form1.ADOQuery1.FieldValues['Number contract'] = '')
"Пусто" - это всегда меньше 3-х.
Если будет 2 символа (1 ли), то сработает указанное лишнее условие и мы не провалимся в блок if чтобы закраситься красным.

Последний раз редактировалось Karabash; 12.10.2010 в 09:40.
Karabash вне форума Ответить с цитированием
Старый 12.10.2010, 11:46   #18
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

Вроде как с этим более менее разобрались . Нужно вот такой код:
Код:
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;
 //åñëè íîìåð êîíòðàêòà îòñóòñòâóåò èëè ìåíüøå 3
 if (Form1.ADOQuery1.FieldValues['DocType'] = '01') and
    (Form1.ADOQuery1.FieldValues['DocType'] = '02') 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') and
     (Form1.ADOQuery1.FieldValues['DocType'] = '02') and
     (Form1.ADOQuery1.FieldValues['Number contract'] <> '') and
     (Length(Form1.ADOQuery1.FieldValues['Number contract']) > 3)  then
  begin
    Form1.Label62.Caption:='';
    Form1.Label63.Caption:='';
    AFont.Color := clBlack;
    AFont.Style := [fsBold];
    Background := clGreen;
  end;

 //åñëè íîìåð êîíòðàêòà îòñóòñòâóåò èëè ìåíüøå 3
 if (Form1.ADOQuery1.FieldValues['DocType'] = '01') and
    (Form1.ADOQuery1.FieldValues['DocType'] = '02') 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') and
    (Form1.ADOQuery1.FieldValues['DocType'] = '02') 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;

 //åñëè íîìåð êîíòðàêòà îòñóòñòâóåò èëè ìåíüøå 3
 if (Form1.ADOQuery1.FieldValues['DocType'] = '01') and
    (Form1.ADOQuery1.FieldValues['DocType'] = '02') 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;
заставить работать так, что для каждого значения
Код:
(Form1.ADOQuery1.FieldValues['DocType'] = '02')
код работал аналогично как и для
Код:
(Form1.ADOQuery1.FieldValues['DocType'] = '01')
а то сейчас получается, что работает для второо условия, т.е.
Код:
(Form1.ADOQuery1.FieldValues['DocType'] = '02')
а для первого нет. Как бы реализовать это перечисление? Или задать общее значение для DocType?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 12.10.2010, 11:54   #19
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Здесь просто. Вместо and поставить or. И все дела.
Код:
  if ((Form1.ADOQuery1.FieldValues['DocType'] = '01') or
    (Form1.ADOQuery1.FieldValues['DocType'] = '02')) and
    (Form1.ADOQuery1.FieldValues['Number contract'] <> '') and
    (Length(Form1.ADOQuery1.FieldValues['Number contract']) >= 3)  then
  begin
    ...
За скобками только следите. Важно.

Последний раз редактировалось Karabash; 12.10.2010 в 11:56.
Karabash вне форума Ответить с цитированием
Старый 12.10.2010, 12:16   #20
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

Karabash, даже не знаю как тебя благодарить . Че-т не получается замутить проверку цвета грида. Хочу, чтобы DBGridEh1 имеет красный цвет, то выдавалось сообщение. Пробовал так:
Код:
procedure TForm1.BtnClick(Sender: TObject);
//var
begin
 if Form1.DBGridEh1.FieldColumns['Number contract'].Color = clRed then
 begin
  ShowMessage(' Траляляля! ');
 end;
end;
но, реакции на сие действие - ноль.

???
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 12.10.2010 в 12:29.
artemavd вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Раскраска диаграммы dayfuaim Microsoft Office Excel 8 22.08.2010 15:44
Раскраска эллипса rubik Мультимедиа в Delphi 1 02.05.2010 05:21
цветовая раскраска эллипса rubik Помощь студентам 1 01.05.2010 15:52
раскраска матрицы jeyjoe Помощь студентам 0 12.11.2009 18:49
Раскраска домика в графике Tirr Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 28.10.2009 22:10