![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Текстовое поле как массив [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 := ...;