Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 02.03.2011
Сообщений: 15
1

Проблема с TwinControl

02.03.2011, 13:34. Показов 2668. Ответов 18
Метки нет (Все метки)

Доброго дня!
Пожалуйста, подскажите ошибку\недоработку в коде.
Условие задачи: есть более десятка компонентов типа Combobox и Edit.
Для них нужно после прочтения из файла в свойство Text вписать данные и сделать их не редактируемыми (Enabled = false).
Хочется сделать это все в цикле, чтобы не писать для каждого компонента имя->Text = ...;.
Вроде логично это сделать с помощью FindNextControl - просматривая по TabOrder по порядку компоненты заносить данные, но весь вопрос в том, что никак не могу заставить компилятор понимать что это имя компонента.

C++
1
2
3
4
5
6
7
8
9
10
11
12
        TStringList *text = new TStringList();
    AnsiString fileName = StartWindowForm->IntermediateSupportType->Text + ".txt";
    text->LoadFromFile(fileName);
 
    TWinControl * object;
    for (int i = 0; i < 21; i++) {
        object = AddBasicDataForm->FindNextControl(object, true, true, false);
        object->Enabled = false;
 
        TEdit *object = (TEdit *)Sender;
        object->Text = text->Strings[i];
        }
После приведения типов:
C++
1
TEdit *object = (TEdit *)Sender;
запись object->Name выдает имя формы а не компонентов и в итоге в самих компонентах свойство Text не меняется.
А если не делать приведения типов, то компилятор выдает ошибку, что свойства Text нет в TWinControl.

Подскажите, пожалуйста как решить проблему. Спасибо!
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.03.2011, 13:34
Ответы с готовыми решениями:

Преобразование массива указателей на TPanel в TWinControl
Доброго времени года. У меня используется динамически созданный массив указателей на динамически...

В чем разница между классами TWinControl, TControl, TComponent?
Вопрос в названии темы.

TWinControl и String
Приветствую. Подскажите возможно ли как-тнибудь назначить NameOfParent свойству Parent? var ...

Изображение скрытого TWinControl
Среда разработки C++ Builder XE Есть динамически созданный и скрытый наследник от TWinControl,...

18
Покинул форум
3184 / 1363 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
02.03.2011, 13:40 2
Если ваши обьекты имеют имена, типа "Edit1", "Edit2", "Edit3".., "Edit21", то можно сделать так:
C++
1
2
3
4
5
for(int i=1;i<21;i++)
 {
       ((TEdit*)FindComponent("Edit"+String(i)))->Enabled=false;
        ((TEdit*)FindComponent("Edit"+String(i)))->Text=text->Strings[i-1];
 }
1
0 / 0 / 0
Регистрация: 02.03.2011
Сообщений: 15
02.03.2011, 13:45  [ТС] 3
В том то и дело, что у каждого свое имя: ChainChoise, CableNumber, W1, C и т.д.
В таком случае, подскажите пожалуйста как выйти из положения
0
Покинул форум
3184 / 1363 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
02.03.2011, 13:55 4
Тогда можно так, только обработаны будут все обьекты, типа TEdit:
C++
1
2
3
4
5
6
7
8
 for(int i=0;i<Form1->ComponentCount;i++)
 {
   if(Form1->Components[i]->ClassNameIs("TEdit")){
 
       ((TEdit*)Form1->Components[i])->Enabled=false;
        ((TEdit*)Form1->Components[i])->Text="test";
        }
 }
Добавлено через 2 минуты
Или в вашем списке зделать записи вот так (имя обьекта, значение его поля Text):
ChainChoise=Test1
CableNumber=Test2
......
А потом:
C++
1
2
3
4
5
6
7
for(int i=0;i<text->Count;i++)
 {
 
       ((TEdit*)text->Names[i])->Enabled=false;
       ((TEdit*)text->Names[i])->Text=text->Values[text->Names[i]];
        }
 }
0
0 / 0 / 0
Регистрация: 02.03.2011
Сообщений: 15
02.03.2011, 13:59  [ТС] 5
У меня там еще Combobox... можно попробовать тогда циклы отдельно для Combobox и отдельно для Text ...
хорошо, спасибо БОЛЬШОЕ, сейчас попробую)))

ChainChoise=Test1
CableNumber=Test2

... это имеется ввиду в заголовочном файле?
0
Покинул форум
3184 / 1363 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
02.03.2011, 14:36 6
Sanyaf, у вас в файле, который вы загружаете через StartWindowForm->IntermediateSupportType->Text + ".txt" записи, типа
Код
строка1
строка2
строка3
А я предлагаю заменить на
Код
имя компонента=значение свойства text
1
0 / 0 / 0
Регистрация: 02.03.2011
Сообщений: 15
02.03.2011, 14:41  [ТС] 7
ааа, Семен Семеныч
Спасибо огромное, попытаюсь это сделать...
0
Покинул форум
3184 / 1363 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
02.03.2011, 15:00 8
Sanyaf, эт я как вариант предложил. Просто не знаю, как еще можно.
0
0 / 0 / 0
Регистрация: 02.03.2011
Сообщений: 15
02.03.2011, 16:31  [ТС] 9
... у меня уже нервишки здают, второй день над одним циклом
ничего не могу родить. Из вариантов предложенных Вами тоже ничего не получается.
что касается варианта из поста #4. Во-первых снова таки у меня по TabOrder и по расположению на форме чередуются Combobox и Edit и получается что надо делать не 1 и не 2 цикла, да еще и индексы текстового массива подбирать(.
Во-вторых , сам текстовый файл у меня формируется на этой форме и я хотел запись в файл тоже сделать циклом, а тут снова нужны имена компонентов.

Вот такой еще вариант (он правда похож на первый) сначала, занести имена в массив, опять таки через FindNextControl:

C++
1
2
3
4
5
6
TCustomEdit *count[21];               
TWinControl * object;
        for (int i = 0; i < 21; i++) {
            object = AddBasicDataForm->FindNextControl(object, true, true, false);
            count[i] = object->Name;
        }
НО он ругается:
C++
1
E2034 Cannot convert 'const UnicodeString' to 'TCustomEdit *'
как это побороть?
0
LK
Заблокирован
02.03.2011, 18:33 10
Цитата Сообщение от Sanyaf Посмотреть сообщение
C++
1
2
3
4
5
6
TCustomEdit *count[21];               
TWinControl * object;
  for (int i = 0; i < 21; i++) {
    object = AddBasicDataForm->FindNextControl(object, true, true, false);
    count[i] = object->Name;
}
НО он ругается:
C++
1
E2034 Cannot convert 'const UnicodeString' to 'TCustomEdit *'
как это побороть?
может, все же, если это, как я понимаю, Эдит, то что-нибудь типа:
C++
1
count[i]->Text = object->Name;
или что-то подобное. И еще замечание - то, чтотпонятно Вам, как правило, не понятно другим, например, что у Вас в object->Name, откуда оно. Экстрасенсы ж на Карибах...
0
0 / 0 / 0
Регистрация: 02.03.2011
Сообщений: 15
02.03.2011, 19:17  [ТС] 11
LK, в выше приведенном цикле подразумевался пересмотр компонентов у которых TabOrder = true (в данном случае интересует Edit и ComboBox), для того чтобы занести в них информацию из файла и сделать недоступными (Enabled = false). А с помощью object->Name я пытаюсь получить имя компонента чтобы занести в свойство Text данные из файла для каждого компонента.
Сделать недоступными (Enabled = false) с помощью указателя object получается
C++
1
object->Enabled = false;
а вот добраться до свойства Техт не получается
C++
1
object->Text = text->Strings[i];
C++
1
E2247 'TControl::Text' is not accessible
но я это в первом посте писал

да то что Вы написали
C++
1
count[i]->Text = object->Name;
создает просто пустой массив...
Спасибо!
0
LK
Заблокирован
02.03.2011, 19:25 12
у вас тут все кусками разбросано - делается оно в одной функции/обработчике, или как? может, стоит
C++
1
TStringList *text;
объяаить глобально , может, (TEdit*)Sender хочет...
0
0 / 0 / 0
Регистрация: 02.03.2011
Сообщений: 15
02.03.2011, 19:35  [ТС] 13
LK, я прошу прощения, я в этом деле совсем не спец, но если я не ошибаюсь то что Вы пишите есть в моем первом посте, пожалуйста посмотрите

У меня бы наверное все получилось способом,который предложил NiTan, только тут другая проблема... У меня компоненты добавлялись не по логическому порядку, а мне теперь бы их выстроить по нужному мне Components[i]->ComponentIndex.

LK, пожалуйста скажите как можно изменить ComponentIndex не создавая всю форму с компонентами сначала? В Object Inpector этого свойства нет.
Спасибо!
0
LK
Заблокирован
02.03.2011, 19:37 14
настроить порядок табуляции или о чем вы?
0
0 / 0 / 0
Регистрация: 02.03.2011
Сообщений: 15
02.03.2011, 19:41  [ТС] 15
нет не табуляции...
Свойство ComponentIndex

Затрагиваемые объекты Все компоненты
Назначение Свойство ComponentIndex указывает позицию текущего компонента в списке Components владельца.
Объявление property ComponentIndex: Integer;
Пример синтаксиса
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := IntToStr(RadioButton3.ComponentIndex);
end;
0
LK
Заблокирован
02.03.2011, 19:44 16
мы говорим об одном, но по-разному
У меня компоненты добавлялись не по логическому порядку, а мне теперь бы их выстроить по нужному мне Components[i]->ComponentIndex.
а вот это для меня не понятно, как и многое друго
0
0 / 0 / 0
Регистрация: 02.03.2011
Сообщений: 15
02.03.2011, 19:53  [ТС] 17
Вот все компоненты на форме (цифра в конце это ComponentIndex получил эти цифры так: Memo1->Lines->Add(AddBasicDataForm->Components[i]->Name + " " + AddBasicDataForm->Components[i]->ComponentIndex)):

ExitlAdd 0
SupportSave 1
BasicDataPanel 2
ChainChoiseLabel 3
TypeOfSupportLabel 4
WireLocationLabel 5
CableNumberLabel 6
VoltageLineLabel 7
VoltageLineLabel2 8
ChainChoise 9
TypeOfSupport 10
WireLocation 11
CableNumber 12
VoltageLine 13
SupportView 14
Image1 15
W3 16
W2 17
W1 18
W3_ 19
W2_ 20
W1_ 21
C_ 22
H1 23
H2 24
H3 25
H 26
MainData 27
SupportBase 28
SupportWeight 29
SupportSingleWind 30
SupportName 31
C 32
Memo1 33
SaveDialog1 34
Мне их нужно сгруппировать примерно так (конечно индексы должны быть по порядку(это моя проблема сейчас)):
SupportName 31
SupportBase 28
SupportWeight 29
SupportSingleWind 30
ChainChoiseLabel 3
ChainChoise 9
TypeOfSupport 10
WireLocation 11
CableNumber 12
VoltageLine 13
SupportView 14
C 32
W3 16
W2 17
W1 18
W3_ 19
W2_ 20
W1_ 21
C_ 22
H1 23
H2 24
H3 25
H 26
MainData 27
TypeOfSupportLabel 4
WireLocationLabel 5
CableNumberLabel 6
VoltageLineLabel 7
VoltageLineLabel2 8
BasicDataPanel 2
ExitlAdd 0
SupportSave 1
Memo1 33
SaveDialog1 34
Image1 15
а потом с помощью
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
for(int i = 0; i < AddBasicDataForm->ComponentCount; i++)
         {
            if(AddBasicDataForm->Components[i]->ClassNameIs("TLabeledEdit")){
 
               ((TEdit*)AddBasicDataForm->Components[i])->Enabled = false;
               ((TEdit*)AddBasicDataForm->Components[i])->Text = text->Strings[i];
 
            }
            if(AddBasicDataForm->Components[i]->ClassNameIs("TComboBox")){
 
               ((TEdit*)AddBasicDataForm->Components[i])->Enabled = false;
               ((TEdit*)AddBasicDataForm->Components[i])->Text = text->Strings[i];
 
            }
             if(AddBasicDataForm->Components[i]->ClassNameIs("TEdit")){
 
               ((TEdit*)AddBasicDataForm->Components[i])->Enabled = false;
               ((TEdit*)AddBasicDataForm->Components[i])->Text = text->Strings[i];
            }
         }
решить поставленную задачу (правда индексы при Strings[i] надо подкорректировать)

Извините за надоедливость
0
LK
Заблокирован
02.03.2011, 20:11 18
простите за тупость , какова цель этого
Мне их нужно сгруппировать примерно так (конечно индексы должны быть по порядку(это моя проблема сейчас)):
ну а индексы можно менять так
C++
1
2
3
if (Components[1]->ComponentIndex == x)  {
  Components[1]->ComponentIndex = y;
}
, я думаю...
0
0 / 0 / 0
Регистрация: 02.03.2011
Сообщений: 15
02.03.2011, 22:21  [ТС] 19
Цитата Сообщение от LK Посмотреть сообщение
простите за тупость
, Вы уж тоже не обессудьте я ведь писал, что любитель в программировании, может я и глупости пишу но я просто это так вижу.

Цитата Сообщение от LK Посмотреть сообщение
какова цель этого
цель в том чтобы данные (строки) из файла заносились в поля Edit1->Text =..., Edit2->Text =..., и т.д. согласно наименованию этих Edit1, Edit2 и т.д. А так так я все это хочу сделать циклом в строке
C++
1
((TEdit*)AddBasicDataForm->Components[i])->Text = text->Strings[i];
то и нужен порядок чтобы данные из text->Strings[i] заносились согласно их порядка.
Незнаю, как еще донести что я хотел



Цитата Сообщение от LK Посмотреть сообщение
ну а индексы можно менять так
да я об этом думал (хотелось бы это сделать не программно а с помощью самой Рад Студии), но у меня такая каша там в этих ComponentIndex, что придется перезадавать каждый компонет , а если так то это все и не нужно, т.к цель всей этой лабуды которой я морочу Вам голову было бы сделать цикл (чтоб было красиво)... а придется по корявому:
C++
1
2
3
4
5
6
7
8
TStringList *text = new TStringList();
        AnsiString fileName = StartWindowForm->IntermediateSupportType->Text + ".txt";
        text->LoadFromFile(fileName);
        W1_->Text = text->Strings[0];
        W2->Text = text->Strings[1];
        W2_->Text = text->Strings[2];
        W3->Text = text->Strings[3];
        W3_->Text = text->Strings[4];
и т.д. по всем компонентам

Спасибо огромное, LK, NiTan за отзывчивость!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.03.2011, 22:21

Свой компонент на основе TWinControl
И сново здравствуйте :) На этот раз пишу к Вам с небольшой проблемкой, касательно компонентов. ...

Дочернее окно на основе TWinControl
Всем привет. Какое то время программировал на mfc, там можно было создать к примеру дочернее окно...

проблема при работе с китайским J-LINK 8 или же проблема с с
Всем привет. Решил Сам собрать себе дисковери кит на базе at91sam7s64-ek. Подарили мне китайский...

Холодильник LG .мод GR-M392YQ.Проблема с дверю, Проблема с дверю при закрывании
Доброго времени суток уважаемые! Холодильник LG GR-M392YQ с первых дней клиент жалуется на то что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.