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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.03.2011, 09:57   #1
voverrr
Пользователь
 
Регистрация: 25.08.2010
Сообщений: 62
По умолчанию Как в комбобоксе скрыть ненужные строки.

Подскажите пожалуйста, есть ли какой-то фильтр(или как там его), чтобы не отображал в комбобоксе выпадающие пустые строки?
В комбобокс импортируется список из таблицы Excel. В экселе список не сплошной, а с пропущенными строчками(третья колонка - панели ДСП).

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

Код:
procedure TForm2.FormCreate(Sender: TObject);
var Excel: variant;  ii, jj, i, j: word;

begin
  ///////////////////////////////////////////
  /////////////////////////////////////////// при создании формы импортим данные из Экселя
  ////////////////////////////////////////////////////////////////////////////
    begin
         Excel := CreateOleObject('Excel.Application');
         Excel.Workbooks.Open('c:\Program files\Doors\articles.xls');
         
         with Form2.strngrd1 do

         for ii := 1 to Rowcount do
         for jj := 1 to colCount do
         Form2.strngrd1.Cells[jj-1, ii-1] := Excel.Sheets[1].Cells[ii, jj].Text;
         Excel.quit;
         Excel := Unassigned;
    end;
 
  with strngrd1 do
  for i := 2 to ColCount - 1 do             //до количество колонок-1
  begin
    Form1.cbb7.Items.Add(strngrd1.Cells[i,1]);
    Form1.cbb8.Items.Add(strngrd1.Cells[i,1]);
    Form1.cbb9.Items.Add(strngrd1.Cells[i,1]);
    Form1.cbb10.Items.Add(strngrd1.Cells[i,1]);
  end;


  with strngrd1 do
  for j := 24 to RowCount - 1 do    // во второй строчке будет артикул типа 1831
  begin
  Form1.cbb2.Items.Add(Strngrd1.Cells[2,j]);
  Form1.cbb7.ItemIndex := 0;
  Form1.cbb2.ItemIndex := 0;
  end;

end;
этот код скорее всего не нужен, тут довольно долго объяснять - что за комбобоксы, какой за что отвечает, не суть важно. Код я привёл , чтобы показать, как организую импорт из экселя.

и вторая задача - тут на форме у меня есть ещё кнопка(ну две). Как можно настроить, чтобы видимость этих кнопок была true, если в комбике выбрано значение, скажем до 30 строки. Если значение выбрано из 31 и дальше строки - то видимость кнопок = False.

Последний раз редактировалось voverrr; 08.03.2011 в 10:03.
voverrr вне форума Ответить с цитированием
Старый 08.03.2011, 10:10   #2
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
По умолчанию

1. Не копируйте пустые строки в TComboBox.
2. У TComboBox есть соответствующие события, на вкладке events - OnChange, вот в нем и проверяйте номер выбранной строки, и в зависимости от этого номера, видимость кнопок true/false.
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"
AlDelta вне форума Ответить с цитированием
Старый 08.03.2011, 10:24   #3
voverrr
Пользователь
 
Регистрация: 25.08.2010
Сообщений: 62
По умолчанию

Цитата:
Сообщение от AlDelta Посмотреть сообщение
1. Не копируйте пустые строки в TComboBox.
как раз этого и добиваюсь. Тут же цикл у меня - захватывает строки от второй до конечной. Значит попадают строки все гуртом - пустые и заполненные. Как вариант проверку если значение в строке>0, то добавлять её в список итемсов комбика? Вы это имеете в виду?

Цитата:
Сообщение от AlDelta Посмотреть сообщение
2. У TComboBox есть соответствующие события, на вкладке events - OnChange
есть:
Код:
procedure TForm1.cbb2Change(Sender: TObject);
begin
  lbl1.Caption := Form2.strngrd1.Cells[(cbb7.ItemIndex+2), 2] + ' ' + cbb2.Text;
end;
убей - не пойму как тут добавить проверку выбранной строки.В лайбеле1 отображается инфа по результатам выбранных двух комбобоксов, соседненго(Cbb7) и данного(Cbb2)
voverrr вне форума Ответить с цитированием
Старый 08.03.2011, 10:41   #4
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
По умолчанию

1.
Код:
  with strngrd1 do
  for i := 2 to ColCount - 1 do             //до количество колонок-1
  begin
    if Trim(strngrd1.Cells[i,1])<>'' then // <----------- Проверка на пустоту 
    Begin
      Form1.cbb7.Items.Add(strngrd1.Cells[i,1]);
      Form1.cbb8.Items.Add(strngrd1.Cells[i,1]);
      Form1.cbb9.Items.Add(strngrd1.Cells[i,1]);
      Form1.cbb10.Items.Add(strngrd1.Cells[i,1]);
    end;
  end;
2. TComboBox.ItemIndex - номер выбранной строки
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"
AlDelta вне форума Ответить с цитированием
Старый 08.03.2011, 10:55   #5
voverrr
Пользователь
 
Регистрация: 25.08.2010
Сообщений: 62
По умолчанию

1. Спасибо! Trim - то что нужно. Эта часть работает. А я -то колупался
Код:
if IntToStr(Cells[(cbb7.ItemIndex + 2), j]) > IntToStr(0) then
и всё он мне ошибку выкидывал/

2. а тут всё не совсем так просто. таблица экселя может состоять из 100 напр строчек. Заполнены в ней только три - десятая, двенадцатая и сороковая. Таким образом количество итемсов в комбике будет равно=3: 0, 1, 2.
Мы же, выбрав третье комбобоксное значение(отобразится то, что расположено в экселевской сороковой строчке), должны связать его с номером 40, а не с номером 3.
Проверять тут надо не итеминдекс, а номер строки в экселе.

Последний раз редактировалось voverrr; 08.03.2011 в 10:58.
voverrr вне форума Ответить с цитированием
Старый 08.03.2011, 11:04   #6
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

создаи стринглист и сохраняи в него аналогично тексту его позиции, а по выше указаному индексу выбираи оттуда координаты
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 08.03.2011, 11:16   #7
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
По умолчанию

2. Тогда храните список строк не TComBoBox, а в TStringList. Т.е. отображать то вы их будете в TComBoBox, но полный список, с пустыми строками, в TStringList

Код:
var list:TStringList; <-- глобальная переменная
В OnCreate главной формы:
Код:
  ...
  list:=TStringList.create;
  ...
Заполнение TComBoBox:
Код:
procedure TForm2.FormCreate(Sender: TObject);
   ...
  with strngrd1 do
  for i := 2 to ColCount - 1 do             //до количество колонок-1
  begin
    if Trim(strngrd1.Cells[i,1])<>'' then // <----------- Проверка на пустоту 
    Begin
      Form1.cbb7.Items.Add(strngrd1.Cells[i,1]);
      Form1.cbb8.Items.Add(strngrd1.Cells[i,1]);
      Form1.cbb9.Items.Add(strngrd1.Cells[i,1]);
      Form1.cbb10.Items.Add(strngrd1.Cells[i,1]);
    end;
    Form1.list.append(strngrd1.Cells[i,1]); // <------ Список всех строк
  end;
...
В OnChange:
Код:
var ch:integer;
Begin
  // Ищем выбранный итем TComboBox.Items[TComboBox.ItemIndex] в списке всех строк. Метод IndexOf.
  ch:=Form1.list.IndexOf(TComboBox.Items[TComboBox.ItemIndex]);
  if (ch<30) and (ch>-1) then
    TButton.Visible:=true
  else
    TButton.Visible:=False;
end;
Писал без IDE, могут быть ошибки
http://www.delphibasics.ru/TStringList.php
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"
AlDelta вне форума Ответить с цитированием
Старый 08.03.2011, 16:26   #8
voverrr
Пользователь
 
Регистрация: 25.08.2010
Сообщений: 62
По умолчанию

вот часа четыре сидел над этим TStringList, но потихоньку разобрался. Он не настолько очевидный, как простая команда, но принцип работы его всё же понятен.
Спасибо! Оказалось это как раз то, что было нужно!
voverrr вне форума Ответить с цитированием
Старый 08.03.2011, 18:03   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Мы же, выбрав третье комбобоксное значение(отобразится то, что расположено в экселевской сороковой строчке), должны связать его с номером 40, а не с номером
при копировании строки Excel в combobox запоминайте и номер строки
Код:
var
  ss: string;  //здесь будет текст добавляемый в combobox
  nn: integer; //а здесь номер с какой строки берем
ss:=....;
nn:=....;
combobox.AddObject(ss, Tobject(nn));
потом узнаем номер строки excel связанной с выбранной строкой combobox.ItemIndex
Код:
nn:=integer(combobox.items.objects[combobox.itemindex]);
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 08.03.2011 в 18:05.
evg_m вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сделать чтобы картинка менялась соответственно выбранному в комбобоксе значению voverrr Общие вопросы Delphi 19 09.02.2011 22:21
Как в комбобоксе cделать появление хинта при наведениии на длинный текст? TwiX Общие вопросы Delphi 3 01.06.2010 15:31
как из строки ТМемо удалить ненужные символы MixanMM Общие вопросы Delphi 3 10.06.2009 13:49
Как в VBA скрыть неиспользуемые строки при условии berliozz Microsoft Office Excel 16 24.11.2008 08:47
Как частично скрыть строки таблицы... krupnoff PHP 11 21.08.2007 23:49