Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.036 c
14-1089057319
ANNIHILATOR
2004-07-05 23:55
2004.07.25
Когда разваляться штаты?


3-1088619879
Zlod3y
2004-06-30 22:24
2004.07.25
Окно ввода логина и пароля при подключении к алиасу в ODBC


3-1088683383
ligor
2004-07-01 16:03
2004.07.25
SQL-запрос


9-1081921850
Мараканец
2004-04-14 09:50
2004.07.25
Шейдеры


14-1088768593
AlexG
2004-07-02 15:43
2004.07.25
Кто может объяснить, что это за ошибка?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский