C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Номер строки combobox  (Прочитано 4238 раз)
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Номер строки combobox
« : 26 Март 2014, 20:10:55 »

Собственно в продолжении работы с экселем. задача такая получилась:
из файла эксель при загрузки программы переношу данные в Combobox  с помощью параметра Add
теперь походу того как исполняется программа, я ввожу какую-то строку в этот комбобокс, соответсвтенно он видит  соответсвтие и выдает такую строку, но тепреь мне нужно получить ее номер. Конечно я могу передать эту строку обратно в эксель.. и начать поиск, но это явно замедлит программу, да и ни к чему...  ведь не просто атк загружал в начале из экселя.... вот собтвенно и вопрос а как получить номер этой строки???! голову ломаю второй день... понимаю что истина где то рядом но где не могу понять....
Записан
d7d1cd
Участник


Сказали спасибо: +59/-24
Offline

Сообщений: 1005


Re: Номер строки combobox
« Ответ #1 : 26 Март 2014, 20:49:50 »

Если данные из Excel заносятся в ComboBox подряд строка за строкой без пропусков, то определить номер строки в Excel можно так:
Код
int LineInExcel;
LineInExcel = ComboBox1->ItemIndex + 1; // Если данные из Excel заносились с 1 строки
LineInExcel = ComboBox1->ItemIndex + 5; // Если данные из Excel заносились с 5 строки
 
Если же список ComboBox заполнялся из Excel не построчно, то при заполнении надо в массиве запоминать индекс строки Excel:
Код
int IndexLines[3];
ComboBox1->Lines->Add(data); // Данные Excel из 3 строки
IndexLines[0] = 3; // Запоминаем индекс строки
ComboBox1->Lines->Add(data); // Данные Excel из 8 строки
IndexLines[1] = 8; // Запоминаем индекс строки
ComboBox1->Lines->Add(data); // Данные Excel из 123 строки
IndexLines[2] = 123; // Запоминаем индекс строки
 
// Определение индекса
LineInExcel = IndexLines[ComboBox1->ItemIndex]
Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Re: Номер строки combobox
« Ответ #2 : 27 Март 2014, 06:29:15 »

Код
 n=1;                                                           
    shs=App.OlePropertyGet("Cells").OlePropertyGet("Cells",n,1);  
    res=shs.OlePropertyGet("Text");
 
    ComboBox1->Items->Add(AnsiString(res));    
   LineInExcel=ComboBox1->ItemIndex+1;
   Label10->Caption=LineInExcel;

Собственно вот кусок  из программы, где мы считываем из эксель в данном случае первую строчку (дальше идет цикл и считывает все остальные строчки)   в комбобокс все добавляется но LineInExcel =0.... После цикла тоже этот параметр равен 0, хотя общее количество строк n не пустых в Эксель оно считается, а вот итеминдекс для кобобокса получается нет....
Записан
d7d1cd
Участник


Сказали спасибо: +59/-24
Offline

Сообщений: 1005


Re: Номер строки combobox
« Ответ #3 : 27 Март 2014, 20:25:36 »

Цитата: leoboec от 27 Март 2014, 06:29:15
Код
 n=1;                                                           
    shs=App.OlePropertyGet("Cells").OlePropertyGet("Cells",n,1);  
    res=shs.OlePropertyGet("Text");
 
    ComboBox1->Items->Add(AnsiString(res));    
   LineInExcel=ComboBox1->ItemIndex+1;
   Label10->Caption=LineInExcel;

Собственно вот кусок  из программы, где мы считываем из эксель в данном случае первую строчку (дальше идет цикл и считывает все остальные строчки)   в комбобокс все добавляется но LineInExcel =0.... После цикла тоже этот параметр равен 0, хотя общее количество строк n не пустых в Эксель оно считается, а вот итеминдекс для кобобокса получается нет....

Если у тебя ComboBox изначально пуст, то когда ты добавляешь в него данные, в нем не отображаются добавленные строки потому что ItemIndex=-1. Добавь такой код на изменение ComboBox (вкладка Event инспектора объектов, событие OnChange):
Код
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
int LineInExcel = ComboBox1->ItemIndex+1;
Label10->Caption = IntToStr(LineInExcel);
}
Записан
Stroicikin
Stroicikin Sergey
новенький


Сказали спасибо: +0/-0
Offline

Сообщений: 1


стены из керамических блоков
« Ответ #4 : 27 Март 2014, 23:21:47 »

Познавательно.
Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Re: Номер строки combobox
« Ответ #5 : 28 Март 2014, 13:36:35 »

Цитата: d7d1cd от 27 Март 2014, 20:25:36
Цитата: leoboec от 27 Март 2014, 06:29:15
Код
 n=1;                                                           
    shs=App.OlePropertyGet("Cells").OlePropertyGet("Cells",n,1);  
    res=shs.OlePropertyGet("Text");
 
    ComboBox1->Items->Add(AnsiString(res));    
   LineInExcel=ComboBox1->ItemIndex+1;
   Label10->Caption=LineInExcel;

Собственно вот кусок  из программы, где мы считываем из эксель в данном случае первую строчку (дальше идет цикл и считывает все остальные строчки)   в комбобокс все добавляется но LineInExcel =0.... После цикла тоже этот параметр равен 0, хотя общее количество строк n не пустых в Эксель оно считается, а вот итеминдекс для кобобокса получается нет....

Если у тебя ComboBox изначально пуст, то когда ты добавляешь в него данные, в нем не отображаются добавленные строки потому что ItemIndex=-1. Добавь такой код на изменение ComboBox (вкладка Event инспектора объектов, событие OnChange):
Код
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
int LineInExcel = ComboBox1->ItemIndex+1;
Label10->Caption = IntToStr(LineInExcel);
}


Спасибо!!!! Отлично вообще помогло это! загвоздка была )))
Но появилась еще одна загвоздка

 есть у меня такая строка

Код
shs=App.OlePropertyGet("Cells").OlePropertyGet("Cells",LineInExcel,3);  
      res=shs.OlePropertyGet("Text");
и вот получается этот параметр он удачно принимает данные и потом записывает все в res, однако если я нажимаю клавишу bakspace то есть удаляю один из символов он у меня вылетает в ошибку... я так понимаю потому что параметр  LineInExcel "слетает" вопрос,  как обрабатывать клавишу bakspace
Записан
d7d1cd
Участник


Сказали спасибо: +59/-24
Offline

Сообщений: 1005


Re: Номер строки combobox
« Ответ #6 : 28 Март 2014, 16:49:21 »

Цитата: leoboec от 28 Март 2014, 13:36:35
Есть у меня такая строка:
Код
shs=App.OlePropertyGet("Cells").OlePropertyGet("Cells",LineInExcel,3);  
      res=shs.OlePropertyGet("Text");
и вот получается этот параметр он удачно принимает данные и потом записывает все в res, однако если я нажимаю клавишу bakspace то есть удаляю один из символов он у меня вылетает в ошибку... я так понимаю потому что параметр  LineInExcel "слетает" вопрос,  как обрабатывать клавишу bakspace

В каком компоненте ты делаешь это "удаляю один из символов"? В ComboBox?
Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Re: Номер строки combobox
« Ответ #7 : 29 Март 2014, 06:38:20 »

Цитата: d7d1cd от 28 Март 2014, 16:49:21
Цитата: leoboec от 28 Март 2014, 13:36:35
Есть у меня такая строка:
Код
shs=App.OlePropertyGet("Cells").OlePropertyGet("Cells",LineInExcel,3);  
      res=shs.OlePropertyGet("Text");
и вот получается этот параметр он удачно принимает данные и потом записывает все в res, однако если я нажимаю клавишу bakspace то есть удаляю один из символов он у меня вылетает в ошибку... я так понимаю потому что параметр  LineInExcel "слетает" вопрос,  как обрабатывать клавишу bakspace

В каком компоненте ты делаешь это "удаляю один из символов"? В ComboBox?

да в комбобокс, то есть допустим набираю 1201 и потом нажимаю bakspace чтобы ввести 1202 и он выдает ошибку
Записан
d7d1cd
Участник


Сказали спасибо: +59/-24
Offline

Сообщений: 1005


Re: Номер строки combobox
« Ответ #8 : 29 Март 2014, 09:38:33 »

Покажи полный код функции ComboBox1Change(TObject *Sender) и скажи, какую ошибку выдает.
Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Re: Номер строки combobox
« Ответ #9 : 29 Март 2014, 17:53:37 »

Код
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
 
LineInExcel = ComboBox1->ItemIndex+1;        
 
   App.OlePropertyGet("Workbooks").OlePropertyGet("Item",1);
   Sh=App.OlePropertyGet("Worksheets");                        
        shs=Sh.OlePropertyGet("Item",1);                            
        shs.OleProcedure("Activate");
      shs=App.OlePropertyGet("Cells").OlePropertyGet("Cells",LineInExcel,2);  
      res=shs.OlePropertyGet("Text");
             ce=StrToFloat(res);                                      
      shs=App.OlePropertyGet("Cells").OlePropertyGet("Cells",LineInExcel,3);  
      res=shs.OlePropertyGet("Text");
              mu=StrToFloat(res);                                        
 
 
}

 вот код.. получается проблемма именно когда я удаляю символ сбивается LineExcel

скрин ошибки тоже прилагаю
Записан
d7d1cd
Участник


Сказали спасибо: +59/-24
Offline

Сообщений: 1005


Re: Номер строки combobox
« Ответ #10 : 29 Март 2014, 18:11:41 »

Когда ты удаляешь символ, то ItemIndex = -1, то есть ничего не выбрано. Можно попробовать такой код:
Код
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
if(ComboBox1->ItemIndex = -1) return;
 
LineInExcel = ComboBox1->ItemIndex+1;        
 
App.OlePropertyGet("Workbooks").OlePropertyGet("Item",1);
Sh=App.OlePropertyGet("Worksheets");                        
shs=Sh.OlePropertyGet("Item",1);                            
shs.OleProcedure("Activate");
shs=App.OlePropertyGet("Cells").OlePropertyGet("Cells",LineInExcel,2);  
res=shs.OlePropertyGet("Text");
ce=StrToFloat(res);                                      
shs=App.OlePropertyGet("Cells").OlePropertyGet("Cells",LineInExcel,3);  
res=shs.OlePropertyGet("Text");
mu=StrToFloat(res);                                        
}

Или запрети ввод в ComboBox каких-либо значений: в Инспекторе объектов для ComboBox свойство Style установи в csDropDownList.
Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Re: Номер строки combobox
« Ответ #11 : 29 Март 2014, 20:20:07 »

про запретить ввод вряд ли получиться... оиентировано на то что пользователь начинает что-то туда вводить а ему предлагается похожее.... а вот с первым вариантом попробовал он мне вот что выдал при компиляции

[C++ Error] Unit1.cpp(225): E2492 Properties may only be assigned using a simple statement, e.g. "prop = value;"
[C++ Warning] Unit1.cpp(225): W8060 Possibly incorrect assignment
[C++ Error] Unit1.cpp(225): E2369 Cannot use the result of a property assignment as an rvalue
Записан
d7d1cd
Участник


Сказали спасибо: +59/-24
Offline

Сообщений: 1005


Re: Номер строки combobox
« Ответ #12 : 29 Март 2014, 20:32:36 »

Цитата: leoboec от 29 Март 2014, 20:20:07
про запретить ввод вряд ли получиться... оиентировано на то что пользователь начинает что-то туда вводить а ему предлагается похожее.... а вот с первым вариантом попробовал он мне вот что выдал при компиляции

[C++ Error] Unit1.cpp(225): E2492 Properties may only be assigned using a simple statement, e.g. "prop = value;"
[C++ Warning] Unit1.cpp(225): W8060 Possibly incorrect assignment
[C++ Error] Unit1.cpp(225): E2369 Cannot use the result of a property assignment as an rvalue


Ну да... Ошибочка...  Надо 2 знака равно (==):
Код
if(ComboBox1->ItemIndex == -1) return;
Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


« Ответ #13 : 30 Март 2014, 06:41:13 »

блииин спасибо большое!!!! и я вчера вечером уже не сообразил
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.14 секунд. Запросов: 21.