Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Цикл для записи Edit[i]  (Прочитано 15152 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Sample
Гость
« : 22-04-2004 11:02 » 

нужно сделать следущее
Form1->StringGrid1->Cells[0]=Form4->Edit->Text;
оно пишет [C++ Error] Unit1.cpp(53): E2316 'Edit' is not a member of 'TForm4'
а вообще это как-нибудь делается?

PS я понимаю, что, наверно, уже всех достал Улыбаюсь, но я пытаюсь выучить Builder по книжке. Жаль  А там етого нет Жаль  Жаль
Записан
x77
Команда клуба

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #1 : 26-04-2004 17:07 » 

а что, в билдере Edit[1] эквивалентно Edit1 ? я просто не знаю сишного синтаксиса, но по-моему, даже в си такие извраты не проходят.

если я правильно понял, у тебя на форме куча полей ввода (Edit1, Edit2, ..., EditN), текст которых надо положить в соотв. ячейки грида. проблема в том, что ты к ним неправильно обращаешься. в дельфях это выглядело бы так:

Form1.StringGrid1.Cells [0, i] := (Form4.FindComponent ('Edit' + IntToStr (i)) as TEdit).Text;

функция FindComponent вернёт тебе компонент (т.е. объект) по его имени. имя это ты получаешь, как 'Edit' + IntToStr (i) { опять же, не знаю, как в билдере перевести целое в строку, скорее всего, так же }. ну и всё, собственно. компонент этот надо привести к нужному типу, отсюда - ... as TEdit. и дальше уже работать с его свойством.
Записан

Never
Команда клуба

ua
Offline Offline
Пол: Женский

« Ответ #2 : 29-04-2004 08:53 » 

Sample, я тебе тут по быренькому проверила проход по Эдитам, правда выгнала их значения в листбокс. Работет. Думаю как его вогнать в твой Стринг Грид сам сообразишь, да?

{
int i;
for (i=0;i<ComponentCount ;i++)
        if (dynamic_cast<TEdit*>(Components ))
                ListBox1->Items ->Add (dynamic_cast<TEdit*>(Components )->Text);
}

Короче- фишка в чем: В билдере есть список всех компонентов. Ты их считаешь все с помощью ComponentCount. В твоем случае это надо сделать для формы4. Дальше циклом проходишь по всем компонентам выбирая из них те, которые можно привести к типу Эдит. И загоняешь куда тебе нужно текст из этих самых компонетнов, которые подходят под Эдит, т.е. на деле из самих Эдитов.
Ой, кажется не очень понятно сказала!
Записан

не умеете летать- не мучайте метлу!
x77
Команда клуба

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #3 : 29-04-2004 09:01 » 

Never, даже мне понятно Улыбаюсь

а что, в билдере FindComponent не работает?
Записан

Never
Команда клуба

ua
Offline Offline
Пол: Женский

« Ответ #4 : 29-04-2004 10:28 » 

x77, издеваешься? Ага
Ты знаешь- я насчет FindComponent просто без  понятия. Как о многом, в общем-то. Может и работает, только я его не знаю. Я шокирован!
Записан

не умеете летать- не мучайте метлу!
Never
Команда клуба

ua
Offline Offline
Пол: Женский

« Ответ #5 : 29-04-2004 10:38 » 

Гы...x77, а как твоя строка избегает того, чтобы зайти 2 раза в один и тот же компонент? Не поняла... Жаль
Записан

не умеете летать- не мучайте метлу!
x77
Команда клуба

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #6 : 29-04-2004 10:39 » 

Never, я не издеваюсь.  я не знаю билдер. но поскольку это во многом пародия на дельфи, конструкции и логика работы там совпадают.

ты ищешь все компоненты, приводишь их к опр. типу, и если это удалось - работаешь с компонентом дальше.

есть другой вариант:
у формы есть метод: FindComponent, который по имени компонента возвращает сам компонент или nil, если такового не нашлось. когда у тебя есть 20 полей ввода, Edit1..Edit20, можно перебрать только их этой функцией. для этого формирует имя компонента как 'Edit' + IntToStr (i), и работаем с полученным компонентом.

реально эти два подхода ничем не отличаются, т.к. FindComponent сам перебирает компоненты.

просто сумничать решил Улыбаюсь
Записан

Never
Команда клуба

ua
Offline Offline
Пол: Женский

« Ответ #7 : 29-04-2004 10:46 » 

А , я не въехала, что ты им номер цепляешь... Т.е. если они все имеют нормальные имена, а не порядковые, то ты их так не пройдешь?
Записан

не умеете летать- не мучайте метлу!
Sample
Гость
« Ответ #8 : 29-04-2004 10:50 » 

Цитата: Never

{
int i;
for (i=0;i<ComponentCount ;i++)
        if (dynamic_cast<TEdit*>(Components ))
                ListBox1->Items ->Add (dynamic_cast<TEdit*>(Components )->Text);
}

Never биг сенкс!! работает!
Записан
x77
Команда клуба

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #9 : 29-04-2004 10:55 » 

Never, нет, это имеет смысл только для компонентов с заранее известным именем.

на самом деле, вариантов масса. например, у каждого edit'а можно выставлять свойство Tag, которое, соб-но, и предназначено для таких вот вещей. и в переборе проверять, если Tag = 1, то приводим к Edit и пишем, если не равно - идём дальше.
Записан

Never
Команда клуба

ua
Offline Offline
Пол: Женский

« Ответ #10 : 29-04-2004 10:58 » 

x77, Ну да, в это я въехала, слава Богу. А то за последние  несколько дней, а уж было решила, что я совсем бум-бум, спасибо  Бейсику.
Sample,  Ага
Записан

не умеете летать- не мучайте метлу!
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines