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


Автор: D2fQ 5.10.2009, 21:10
Здравствуйте. 
Вот скрин программы: http://pic.ipicture.ru/uploads/091005/FWuXNGp3dR.png
В первом ComboBox'е находится афоризм, во втором - список слов из этого афоризма, а в третьем просто список разных слов.
Задача состоит в том, что при нажатии кнопки "Заменить" слово из второго ComboBox'а ищется в первом ComboBox'е и заменяется словом из третьего ComboBox'а.

У меня возникло две проблемы:
1. При выборе другого афоризма в первом ComboBox'е, во втором ComboBox'е все еще находятся слова из первой строки первого ComboBox'а.
2. Функция замены не работает.

Вот мой код:

Код

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
    ComboBox1->ItemIndex = 0;
    Label1->Caption = ComboBox1->Text;
    Form1->FillingComboBox2();
}
//---------------------------------------------------------------------------
void TForm1::FillingComboBox2() //функция для разбиения афоризма на слова и записи их в ComboBox2 
{
    AnsiString temp = ComboBox1->Text;
    int pos = 0;
    while(pos = temp.Pos(" ")){
        if (pos == 0) break;

        ComboBox2->Items->Add(temp.SubString(1,pos));
        temp.Delete(1,pos);
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
    Label1->Caption = ComboBox1->Text;
    Form1->FillingComboBox2(); //при вызове с этого места эта функция не работает, но когда вызывается в конструкторе - все ОК 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ReplaceButtonClick(TObject *Sender) // это функция замены, она не работает
{
    int pos = ComboBox1->Items->Strings[ComboBox1->ItemIndex].Pos(ComboBox2->Text);
    ComboBox1->Items->Strings[ComboBox1->ItemIndex].Delete(pos,pos + ComboBox2->Text.Length());
    ComboBox1->Items->Strings[ComboBox1->ItemIndex].Insert(ComboBox3->Text,pos);
    Label1->Caption = ComboBox1->Text;
}
//---------------------------------------------------------------------------


Помогите найти ошибки, пожалуйста.

Автор: V0LT 5.10.2009, 21:48
Указал на явные ошибки ... ну а об чистоте кода подумайте сами =)

в си я всего три месяца не судите строго  smile 

Код

void TForm1::FillingComboBox2()
{
    AnsiString temp = ComboBox1->Text;
    int pos = 0;
        ComboBox2->Items->Clear();
    while(pos = temp.Pos(" ")){

        if (pos == 0) break;

        ComboBox2->Items->Add(temp.SubString(1,pos));
        temp.Delete(1,pos);
    }
        if (temp != "") ComboBox2->Items->Add(temp);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
    Label1->Caption = ComboBox1->Items->Strings[ComboBox1->ItemIndex];
    Form1->FillingComboBox2();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ReplaceButtonClick(TObject *Sender)
{
    int pos = ComboBox1->Items->Strings[ComboBox1->ItemIndex].Pos(ComboBox2->Text);

        AnsiString temp = ComboBox1->Items->Strings[ComboBox1->ItemIndex];

    temp.Delete(pos,pos + ComboBox2->Text.Length());

    temp.Insert(ComboBox3->Text,pos);

        ComboBox1->Items->Strings[ComboBox1->ItemIndex] = temp;

    Label1->Caption = temp;
}


З.Ы. Брейкпоинты и логику никто не отменял 

Автор: D2fQ 5.10.2009, 22:09
V0LT, спасибо конечно, но я до этого и сам мог додуматься smile 
Меня больше интересует, почему мой код в функции ReplaceButtonClick не работает. Если можешь, объясни.
И осталась еще первая проблема...
В билдере я 2 дня, не судите строго smile

Автор: D2fQ 5.10.2009, 23:02
При выборе другого афоризма в первом ComboBox'е, во втором ComboBox'е все еще находятся слова из первой строки первого ComboBox'а.
Как исправить?

Автор: Anikmar 5.10.2009, 23:25
Цитата(D2fQ @  5.10.2009,  23:02 Найти цитируемый пост)
При выборе другого афоризма в первом ComboBox'е, во втором ComboBox'е все еще находятся слова из первой строки первого ComboBox'а.
Как исправить? 

А где вы очищаете второй комбобокс перед его заполнением словами?

Автор: D2fQ 5.10.2009, 23:56
Anikmar, спасибо.
V0LT, извините, что сразу не заметил эту строчку в вашем коде: ComboBox2->Items->Clear()

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