Форум: "Основная";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
ВнизТекстовое поле как массив Найти похожие ветки
← →
ko (2004-07-10 16:55) [0]Меня интересует такая фишка: как использовать текстовое поле как массив? Например: есть текстовое поля Edit34 и Edit35, нужно при известном b=34,или b=35 выполнить Edit[b].Text=…
← →
Rem (2004-07-10 17:07) [1]sNum := "34"; // это известно по условию задачи
TEdit(FindComponent("Edit" + sNum)).Text := ...;
← →
афвуд (2004-07-10 17:09) [2]var Edit:TEdit
.....
.....
Edit=Form1.FindComponent("Edit"+IntToStr(b)) as TEdit;
// Вот теперь колбасься с этим Edit. Оно будет то самое, что нужно.
← →
Rem (2004-07-10 17:14) [3]А список компонентов ("текстовое поле как массив" - круто сказано) хранится в свойстве Components. Только это не массив, а именно список.
if (Components[34] is TEdit) then
TEdit(Components[34]).Text := ...;
В общем случае лучше не опираться на фиксированные значения индексов элементов в массиве. Во-первых, компоненты регистрируются в списке динамически, во время выполнения. А во-вторых, (и это следствие первого) этот индекс может меняться, да и узнать его можно только во время выполнения.
← →
Igorek © (2004-07-10 20:14) [4]
> Rem (10.07.04 17:07) [1]
> афвуд (10.07.04 17:09) [2]
Неправильно. Ничто не мешает напр. лейбу назвать "Edit34"
← →
Mim1 © (2004-07-10 20:24) [5][4] Igorek © (10.07.04 20:14)
Так же может не найтись указанный компонент.
Очень даже правильно, кому как не програмисту значть как называются компоненты.
В случае [2] афвуд (10.07.04 17:09) бедет сгенерированно исключение - довольно адекватное и уместное действие.
← →
KilkennyCat © (2004-07-10 20:28) [6]
> Mim1 © (10.07.04 20:24) [5]
В данном случае даже неважно, знает программер название или не очень :) > Igorek © (10.07.04 20:14) [4] не увидел главного - ищется TEdit, а лэйбла - TLabel
← →
Igorek © (2004-07-11 15:38) [7]> 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
...//юзаем С
← →
Mim1 © (2004-07-11 16:02) [8]
> Я просто хотел сказать, что решение недоскональное
В общем случае код правильный, так что впредь рекрмендую сначало думать а потом писать, чтобы потом небыло фраз "Я просто хотел сказать".
← →
Igorek © (2004-07-11 16:43) [9]
> Mim1 © (11.07.04 16:02) [8]
> В общем случае код правильный,
Как раз в общем случае код неправильный - в том смысле, что имена могут измениться и код перестанет работать. Код правильный в частном случае.
> так что впредь рекрмендую сначало думать а потом писать
Взаимно.
← →
Mim1 © (2004-07-11 19:53) [10]Слушайте, тогда после созданий экземпляра обьекта проверяйте его тип, мы ведь сами себе не доверяем (по крайней мере в вашем случае).
Случай когда компонент типа TLabel имеет имя Edit34 как раз частный, а не общий. Хотя иногда слова не могут отразить реальной жизни. Думается что фразами "неправильно" вы уже всех замучали так же как и багами в приводимвых приводимых примерах, и вместо того чтобы извинится вы встуаете в словестные перемплки, разводите демагогию и т.п. Кажется уже говорили что вы не можете остановиться. признайте что ваша фраза "неправильно" была неуместна. Весь пост был бы верен если бы не эта фраза.
LMD
← →
Igorek © (2004-07-12 17:15) [11]
> Mim1 © (11.07.04 19:53) [10]
ignored by my LMD firewall
← →
Igorek © (2004-07-12 18:09) [12]
> Igorek © (10.07.04 20:14) [4]
>
> > Rem (10.07.04 17:07) [1]
> > афвуд (10.07.04 17:09) [2]
>
> Неправильно. Ничто не мешает напр. лейбу назвать "Edit34"
Правильно, если допустить, что "текстовое поле" - экземпляр компонента TEdit.
← →
Тимохов © (2004-07-12 18:13) [13]Не заводите флуд.
Игорек привел уместное замечание.
Зачем трепаться.
← →
Rem (2004-07-12 18:20) [14]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?
Не советуйте то, что знаете только в теории!
← →
Igorek © (2004-07-13 13:30) [15]
> ТУФТА! При таком написании вы не сдвинетесь с первой формы
> к концу жизни!
Голословно и оффтоп. Можете создать ветку в Потрепаться.
> Если уж такое пишете - напишите просто:
> 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!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.051 c