Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Проблемы с ComboBox


Автор: awkarene 17.9.2012, 04:20
Доброго времени суток господа. Столкнулся с небольшой проблемой и не как не могу решить самостоятельно...

Ситуация такая: на форме имеется компонент типа TComboBox  

при нажатии на него он заполняется названиями txt файлов из определённой директории. Например так
Код

void __fastcall TForm10::ComboBox22Change(TObject *Sender)
{
struct ffblk ffblk;
int done;
done = findfirst("**.txt", &ffblk, 0);
while (!done)
  {
Form10->ComboBox22->Items->Add(ffblk.ff_name)  ;
done = findnext(&ffblk);
  }
}


После выбора определённого txt файла он должен открыться в Memo, но выдает ошибку.

Пробовал двумя способами и оба неудачно

1) способ

Код

void __fastcall TForm10::ComboBox22Select(TObject *Sender)
{
Form10->Memo2->Lines->LoadFromFile(ExtractFileDir(ParamStr(0))+"\\"+AnsiString(Form10->ComboBox1->Items->Strings[ComboBox1->ItemIndex]));
}

2) способ

Код

void __fastcall TForm10::ComboBox22Select(TObject *Sender)
{
Form10->Memo2->Lines->LoadFromFile(ExtractFileDir(ParamStr(0))+"\\"+AnsiString(Form10->ComboBox22->SelText));
}


Не считывается название активной строки в ComboBox.

Причем в    
Код


void __fastcall TForm10::ComboBox22KeyPress(TObject *Sender, char &Key) и  в void __fastcall TForm10::SpeedButton1Click(TObject *Sender)  
 оба способа работают, но вводить ключ или нажимать кнопку не очень удобно... хотелось бы сразу после выбора строки.

Автор: Dem_max 17.9.2012, 04:29
Причем тут эта  ExtractFileDir() функция ???

Автор: awkarene 17.9.2012, 10:12
Цитата

Причем тут эта  ExtractFileDir() функция ???


Функция извлекает часть полного файлового имени вплоть до названия папки, не включая " \ " перед файловым именем.
С этим проблем нет.  
Например мне нужно открыть файл  "C:\Users\Kuso4ek\Desktop\1\Debug_Build\file.txt"
нажимаю в Memo на строку   "file.txt"
При выборе строки выходит ошибка, что системе не удалось найти указанный путь   "C:\Users\Kuso4ek\Desktop\1\Debug_Build\"

куски кода

Код

AnsiString(Form10->ComboBox1->Items->Strings[ComboBox1->ItemIndex])

и
Код

AnsiString(Form10->ComboBox22->SelText)

не хотят работать. вопрос почему?

Автор: math64 17.9.2012, 10:44
Потому что ошибка в компиляторе. Может быть исправлена в новых версиях.
property типа AnsiString нельзя использовать в выражениях; их значения нужно сначала запомнить в переменную.

А тема должна быть в разделе билдера.

Автор: artsb 17.9.2012, 12:49
Попробуйте событие CloseUp:
Код

void __fastcall TForm1::ComboBox1CloseUp(TObject *Sender)
{
    Memo2->Lines->LoadFromFile(ExtractFilePath(ParamStr(0)) + ComboBox1->Items->Strings[ComboBox1->ItemIndex]);
}

И не используйте Form10->ComboBox22->SelText. Есть же Form10->ComboBox22->Text.

Добавлено через 14 минут и 36 секунд
Вот так прекрасно работает:
Код

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    struct ffblk ffblk;
    int done;

    ComboBox1->Items->Clear();

    done = findfirst("*.txt", &ffblk, 0);
    while (!done)
    {
        ComboBox1->Items->Add(ffblk.ff_name);
        done = findnext(&ffblk);
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Select(TObject *Sender)
{
    String sFilePath;

    sFilePath = ExtractFilePath(Application->ExeName);

    if(sFilePath[sFilePath.Length()] != '\\')
    {
        sFilePath += '\\';
    }

    sFilePath += ComboBox1->Text;

    Memo1->Lines->LoadFromFile(sFilePath);
}


Кстати, сейчас заметил:
1. Не нужно каждый раз перестраивать список в ComboBox22, при выборе записи из этого же списка.
2. Событие относится к ComboBox22, а индекс берётся из ComboBox1.
Код

void __fastcall TForm10::ComboBox22Select(TObject *Sender)
{
Form10->Memo2->Lines->LoadFromFile(ExtractFileDir(ParamStr(0))+"\\"+AnsiString(Form10->ComboBox1->Items->Strings[ComboBox1->ItemIndex]));
}


Наведите порядок в своём коде! И дайте человеческие имена компонентам!

Автор: awkarene 18.9.2012, 00:25
Большое спасибо! Всё работает.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)