Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Текстовое поле как массив [D7, WinXP]


ko ©   (2004-07-10 16:55:00) 

Меня интересует такая фишка: как использовать текстовое поле как массив? Например: есть текстовое поля Edit34  и Edit35, нужно при известном b=34,или b=35 выполнить Edit[b].Text=…


Igorek   (2004-07-13 13:30:00) [1]


> ТУФТА! При таком написании вы не сдвинетесь с первой формы
> к концу жизни!

Голословно и оффтоп. Можете создать ветку в Потрепаться.


> Если уж такое пишете - напишите просто:
>  Edit34.Text := ...;

Блестяще! Как я не подумал. :-(
Вот одно из самых красивых, быстрых и главное адекватных и уместныхпо безглючности решений:
Добавляем в форму св-во.

property TextFieldAsArray[Index: Integer]: TEdit read GetTFAA;
...
function TForm1.GetTFAA(Index: Integer): TEdit;
begin
 if Index = 34 then
   Result := Edit34
 else
   if Index = 35 then
     Result := Edit35
   else
     Result := FindComponent('.');
end;


Кстати я в своей практике стараюсь, когда пишу код, не полагаться на другой свой код, поскольку он может позже поменяться, и прога будет глючить. Напр. предпочитаю использовать FreeAndNil вместо .Free. Это мне рекоммендовал и программист, у которого практики поболее моего.

> Не советуйте то, что знаете только в теории!

Взаимно.

> До полногопросветления.

Так не бывает.

> Весь пост был бы верен если бы не эта фраза.

Большой LOL!


Rem   (2004-07-12 18:20:00) [2]

2 Igorek
 Читаем вопрос. Внимательно. Сосредоточенно. До полного просветления.
 " текстовое полекак массив"
 Все остальное - на откуп программиста.

Вот это:

var
C: TComponent;
begin
C := Form1.FindComponent('Edit34');
if Assigned(C) then
  if C is TEdit then
    with TEdit(C) do
    ...//юзаем С

ТУФТА! При таком написании вы не сдвинетесь с первой формы к концу жизни!

Если уж такое пишете - напишите просто:
 Edit34.Text := ...;

Зачем его искать (FindComponent)? Вы же пишете "Edit34"! Или вы не знаете в момент проектирования, что такое у вас Edit34? Вы все компоненты искать так будете? И писать ступеньками десятки if'ов? Или вам хватит ума поменять Edit34: TEdit на Edit34: TLabel?
Не советуйте то, что знаете только в теории!


Тимохов   (2004-07-12 18:13:00) [3]

Не заводите флуд.
Игорек привел уместное замечание.
Зачем трепаться.


Igorek   (2004-07-12 18:09:00) [4]


> Igorek ©   (10.07.04 20:14) [4]
>
> > Rem   (10.07.04 17:07) [1]
> > афвуд   (10.07.04 17:09) [2]
>
> Неправильно. Ничто не мешает напр. лейбу назвать "Edit34"

Правильно, если допустить, что "текстовое поле" - экземпляр компонента TEdit.


Igorek   (2004-07-12 17:15:00) [5]


> Mim1 ©   (11.07.04 19:53) [10]

ignored by my LMD firewall


Mim1   (2004-07-11 19:53:00) [6]

Слушайте, тогда после созданий экземпляра обьекта проверяйте его тип, мы ведь сами себе не доверяем (по крайней мере в вашем случае).

Случай когда компонент типа TLabel имеет имя Edit34 как раз частный, а не общий. Хотя иногда слова не могут отразить реальной жизни. Думается что фразами "неправильно" вы уже всех замучали так же как и багами в приводимвых приводимых примерах, и вместо того чтобы извинится вы встуаете в словестные перемплки, разводите демагогию и т.п. Кажется уже говорили что вы не можете остановиться. признайте что ваша фраза "неправильно" была неуместна. Весь пост был бы верен если бы не эта фраза.

LMD


Igorek   (2004-07-11 16:43:00) [7]


> Mim1 ©   (11.07.04 16:02) [8]
> В общем случае код правильный,

Как раз в общемслучае код неправильный - в том смысле, что имена могут измениться и код перестанет работать. Код правильный в частномслучае.


> так что впредь рекрмендую сначало думать а потом писать

Взаимно.


Mim1   (2004-07-11 16:02:00) [8]


> Я просто хотел сказать, что решение недоскональное

В общем случае код правильный, так что впредь рекрмендую сначало думать а потом писать, чтобы потом небыло фраз "Я просто хотел сказать".


Igorek   (2004-07-11 15:38:00) [9]

> Mim1 ©   (10.07.04 20:24) [5]
> KilkennyCat ©   (10.07.04 20:28) [6]
Я просто хотел сказать, что решение недоскональное в том смысле, что имена могут измениться и код перестанет работать.


> Igorek ©   (10.07.04 20:14) [4] не увидел главного - ищется
> TEdit, а лэйбла - TLabel

Причем тут это? FindComponent не принимает ограничения по поиску в виде класса.

Короче я бы написал так:

var
 C: TComponent;
begin
 C := Form1.FindComponent('Edit34');
 if Assigned(C) then
   if C is TEdit then
     with TEdit(C) do
     ...//юзаем С


KilkennyCat   (2004-07-10 20:28:00) [10]


> Mim1 ©   (10.07.04 20:24) [5]


В данном случае даже неважно, знает программер название или не очень :) > Igorek ©   (10.07.04 20:14) [4]не увидел главного - ищется TEdit, а лэйбла - TLabel


Mim1   (2004-07-10 20:24:00) [11]

[4] Igorek ©   (10.07.04 20:14)

Так же может не найтись указанный компонент.
Очень даже правильно, кому как не програмисту значть как называются компоненты.
В случае [2] афвуд   (10.07.04 17:09)  бедет сгенерированно исключение - довольно адекватное и уместное действие.


Igorek   (2004-07-10 20:14:00) [12]


> Rem   (10.07.04 17:07) [1]
> афвуд   (10.07.04 17:09) [2]

Неправильно. Ничто не мешает напр. лейбу назвать "Edit34"


Rem   (2004-07-10 17:14:00) [13]

А список компонентов ("текстовое поле как массив" - круто сказано) хранится в свойстве Components. Только это не массив, а именно список.
  if (Components[34] is TEdit) then
   TEdit(Components[34]).Text := ...;

В общем случае лучше не опираться на фиксированные значения индексов элементов в массиве. Во-первых, компоненты регистрируются в списке динамически, во время выполнения. А во-вторых, (и это следствие первого) этот индекс может меняться, да и узнать его можно только во время выполнения.


афвуд   (2004-07-10 17:09:00) [14]

var Edit:TEdit
.....
.....
Edit=Form1.FindComponent('Edit'+IntToStr(b)) as TEdit;
// Вот теперь колбасься с этим Edit. Оно будет то самое, что нужно.


Rem   (2004-07-10 17:07:00) [15]

sNum := '34'; // это известно по условию задачи
TEdit(FindComponent('Edit' + sNum)).Text := ...;


Наверх

Титульная страница Поиск, карта сайта Написать письмо