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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2008, 13:38   #1
kalyan_ne_@
 
Регистрация: 07.05.2008
Сообщений: 6
По умолчанию TCombobox

Здравствуйте. Помогите пожалуйста разобраться а то я уже второй день голову ломаю...

Значит есть у меня программа для работы с базами. В ней как полагается есть DBGrid. Для редактирования полей грида я юзаю комбобокс который заполняется значениями из справочников базы...
комбобокс не висит постоянно на форме, он появляется только когда щёлкаешь по ячейке грида, то есть на событие DBGrid1DrawColumnCell, там устанавливаются всякие размеры и т.д. а затем комбобокс делаецца видимым...
так вот, до определённого момента всё работало нормально, но наступил тот чёрный день, когда этот самый комбобокс просто перестал работать, то есть работать то он работает, но вот список не раскрывается, хотя в самом комбобоксе присутствует порядка 150 элементов

когда у комбобокса родитель грид то список не раскрывается, а если сделать родителем форму или например ричэдит то всё работает нормально...

уже всю голову сломал. помогите пожалуйста разобраться
kalyan_ne_@ вне форума Ответить с цитированием
Старый 07.05.2008, 14:13   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Нечего нецензурщиной раскидываться.
По поводу вопроса, ошибка в коде, протрассируй по тем местам где заполняется этот бокс.
Может в нем у тебя где-то выставляется Enabled:=false
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.05.2008, 22:28   #3
Gladiator
Пользователь
 
Аватар для Gladiator
 
Регистрация: 18.04.2008
Сообщений: 70
По умолчанию

ты попробуй использовать не обычный combo а DBLookupCombobox с панели Data Controls.
Gladiator вне форума Ответить с цитированием
Старый 08.05.2008, 07:26   #4
kalyan_ne_@
 
Регистрация: 07.05.2008
Сообщений: 6
По умолчанию

Блин ну я же не настолько тупой... если бы я где ставил Enable:=false то он бы тогда отображался как неактивный и я бы ваще с ним ничего не смог бы сделать. а я могу нажать на кнопку выпадения списка, я даже вижу как чо то там происходит (выпадает какая то маленькая полосочка), и срабатывает событие OnEnter. а вот события OnDropDown и OnCloseUp ваще никак не обрабатываются.
причём такая ерунда происходит только если родителем является грид

ещё одну фигню заметил вчера: когда я попытался удалить с формы грид то делфя выдала мне эксепшн типа Access Violation at module rtl70.bpl или что то в этом духе. Вот этот вот рантайм эксепшн меня тоже очень смутил ибо не должно такого быть. Опять же, с другими компонентами всё в порядке, только с гридом проблемы %)
kalyan_ne_@ вне форума Ответить с цитированием
Старый 08.05.2008, 07:44   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В таком случае без кода не разобраться.
Цитата:
Вот этот вот рантайм эксепшн
Делфи не выдает ошибки Runtime это делает программа, с чего я могу понять что удалял ты грид во время ее работы, и где-то чего-то не учел.

Если ты удалял его в дизайне то выкинь эту делфу, или проверь правильно ли у тебя работает провайдер, к которому ДБГрид подключен, как ни странно иногда они глюкают (Один раз такое видел в колледже)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.05.2008, 08:02   #6
kalyan_ne_@
 
Регистрация: 07.05.2008
Сообщений: 6
По умолчанию

блин я ещё раз говорю что я не дурак. если я сказал что эксепшн выдавала делфя то значит так и есть, программа не запускалась, этот эксешн вылетал в дизайнере когда я пытался воткнуть на форму новый грид, после чего я даже закрыть делфи не мог... ну да ладно, это уже не важно так как с этим я разобрался...

вот код для бокса:

Код:
procedure TFormMain.DBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
var
  FieldValue: string;
  cccount: byte;
  i: integer;
  tp: integer;
  DateTimeValue: TDateTime;
begin
    if (gdFocused in State) then
      begin  {if Focused}
        CurField:='';
        if column.Field.DataType <> ftDateTime then
          if col <> column then
            begin  {if col}
              DateTimePicker1.Visible:=false;
              ComboBox1.Parent:=DBGrid1;
              if FillComboBox(ComboBox1, Column.FieldName, Rect) then
                begin   {if FillCombobox}
                  cccount:=ComboBox1.Items.Count - 1;
                  for i:= 0 to cccount do
                    if Column.Field.AsString=ComboBox1.Items.Strings[i] then
                      begin
                        ComboBox1.ItemIndex:=i;
                        break;
                      end;
                  ComboBox1.Left := Rect.Left + DBGrid1.Left;
                  ComboBox1.Top := Rect.Top + DBGrid1.top  - ToolBar2.Height - ToolBar3.Height;
                  ComboBox1.Width := Rect.Right - Rect.Left;
                  ComboBox1.Visible := True;
                  ComboBox1.SetFocus;
                  CurField:=Column.FieldName;;
                  col:=column;
                  rec:=rect;
                  stat:=state;
                  datcol:=datacol;
                end   {if FillCombobox}
              else   {if FillCombobox}
                begin   {else FillCombobox}
                  ComboBox1.Visible:=false;
                end;   {else FillCombobox}
            end  {if col}
          else  {else col}
            begin  {else col}
              DateTimePicker1.Visible:=false;
              cccount:=ComboBox1.Items.Count - 1;
              for i:= 0 to cccount do
                if Column.Field.AsString=ComboBox1.Items.Strings[i] then
                  begin
                    ComboBox1.ItemIndex:=i;
                    break;
                  end;
              ComboBox1.Left := Rect.Left + DBGrid1.Left;
              ComboBox1.Top := Rect.Top + DBGrid1.top - ToolBar2.Height - ToolBar3.Height;
              ComboBox1.Width := Rect.Right - Rect.Left;
              ComboBox1.Visible := True;
              ComboBox1.SetFocus;
              CurField:=Column.FieldName;;
              col:=column;
              rec:=rect;
              stat:=state;
              datcol:=datacol;
            end  {else col}
        else
          begin
            CurField:=Column.FieldName;
            col:=Column;
            OldDateTimeValue:=Column.Field.AsDateTime;
            DateTimePicker1.Parent:=DBGrid1;
            DateTimeValue:=Column.Field.AsDateTime;
            DateTimePicker1.DateTime:=DateTimeValue;
            DateTimePicker1.Left := Rect.Left + DBGrid1.Left;
            DateTimePicker1.Top := Rect.Top + DBGrid1.top - ToolBar2.Height - ToolBar3.Height;
            DateTimePicker1.Width := Rect.Right - Rect.Left;
            if Column.Field.AsString = '' then
              DateTimePicker1.Date:=Date;
            DateTimePicker1.Visible := True;
          end;
      end  {if Focused}
    else
      CurField:='';
  NeedToRepaint:=false;
end;

Последний раз редактировалось Alex21; 08.05.2008 в 17:39. Причина: оформляй код по правилам оформления
kalyan_ne_@ вне форума Ответить с цитированием
Старый 08.05.2008, 08:02   #7
kalyan_ne_@
 
Регистрация: 07.05.2008
Сообщений: 6
По умолчанию

Соответственно функция FillComboBox заполняет бокс, вот её код:

Код:
function TFormMain.FillComboBox(pComboBox: TComboBox; pFieldName: string; pRect: TRect): boolean;
var
  tab: TADOTable;
  i: integer;
  rcount: integer;
  ValidField: boolean;
begin
  Result:=false;
  ValidField:=false;
  tab:=TADOTable.Create(nil);
  tab.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+FormMain.Path+'\'+FormMain.BaseName+';Mode=ReadWrite|Share Deny None;Persist Security Info=False';
  if BaseName = 'RoadSign.mdb' then
    begin
      if pFieldName='DSign_GOST' then
        begin
          ValidField:=true;
          tab.TableName:='RefBookGOST (Справочник по ГОСТам)';
        end;
      if pFieldName='DInscription_on_Sign' then
        begin
          ValidField:=true;
          tab.TableName:='RefbookInscriptionOnSign (Справочник по надписям в поле знака)';
        end;
      if pFieldName='DSet_Type' then
        begin
          ValidField:=true;
          tab.TableName:='RefBookSetType (Справочник по способам крепления)';
        end;
      if pFieldName='DSign_Type' then
        begin
          ValidField:=true;
          tab.TableName:='RefBookSignType (Справочник по типам знаков)';
        end;
      if pFieldName='DSign_TypeSize' then
        begin
          ValidField:=true;
          tab.TableName:='RefBookSignTypeSize (Справочник по типоразмерам знаков)';
        end;
      if pFieldName='DUsing_Term' then
        begin
          ValidField:=true;
          tab.TableName:='RefBookUsingTerm (Справочник по срокам использования)';
        end;
    end;
  if ValidField then
    with tab do
      begin  {with}
        try
          open;
        except
          on e: exception do
            messagedlg('Не удалось прочитать справочник!', mtError, [mbOK], 0);
        end;
        pComboBox.Clear;
        DisableControls;
        rcount:=RecordCount - 1;
        for i:= 0 to rcount do
          begin  {for}
            pComboBox.Items.Add(Fields[1].AsString);
            CodeArray[i]:=Fields[0].AsString;
            next;
          end;  {for}
        close;
        free;
        ValidField:=false;
        Result:=true;
      end;  {with}
end;

Последний раз редактировалось Alex21; 08.05.2008 в 17:40. Причина: оформляй код по правилам оформления (2)
kalyan_ne_@ вне форума Ответить с цитированием
Старый 08.05.2008, 09:19   #8
kalyan_ne_@
 
Регистрация: 07.05.2008
Сообщений: 6
По умолчанию

короче, выглядело это так: в пятницу вечером всё проверил, всё работало, откомпилил, сохранил и ушёл домой... в понедельник прихожу на работу, запускаю и неожиданно для меня комбобокс не работает
вот честное слово нихрена в коде не менял
раньше такая ерунда случалась только под 2000 виндой а теперь и на ХР
кароче ваще писец
kalyan_ne_@ вне форума Ответить с цитированием
Старый 08.05.2008, 13:58   #9
Domovoy
Форумчанин
 
Регистрация: 24.10.2007
Сообщений: 254
По умолчанию

Здесь чёрт ногу сломит. Да и вообще мне кажется, что если ты расскажешь зачем ты так извращаешься, то мы нашли бы более разумное решение.
Domovoy вне форума Ответить с цитированием
Старый 08.05.2008, 15:30   #10
Ulagay700
Пользователь
 
Регистрация: 07.11.2007
Сообщений: 91
По умолчанию

Проблема возможно не в комбо, а в гриде, раз он родитель. Ничего там не менял?
Ulagay700 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TComboBox (ввод чисел в верхнюю позицию) Petrucci Общие вопросы Delphi 7 08.07.2008 14:26
TComboBox! samlay Общие вопросы Delphi 8 03.07.2008 22:11
..TComboBox.. Ensoph Компоненты Delphi 5 29.06.2007 16:36
Глючит TComboBox в Delphi7.0 And1 Компоненты Delphi 17 03.03.2007 01:00