Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.01.16;
Скачать: [xml.tar.bz2];

Вниз

Переменные и TEdit   Найти похожие ветки 

 
Lt   (2004-01-05 09:00) [0]

Добрый день.
На форме есть десятки TEdit-ов. Каждому из них соответствует своя переменная, например, TEdit-у "edtPart1" соответствует переменная "Part1", "edtPart2" соответствует переменная "Part2" и т.д. Нужно: присвоить всем переменным значения текстовых полей TEdit-ов. Работать последовательно с каждой переменной и каждым TEdit-ом не хочется - слишком громоздко. Есть ли способ это сделать в цикле?


 
alex_***   (2004-01-05 09:03) [1]

comp := FindComponent("edtPart"+IntToSTr(i+1));


 
Романов Р.В.   (2004-01-05 09:07) [2]


> alex_*** © (05.01.04 09:03) [1]

+ массив вместо переменных


 
asp   (2004-01-05 09:08) [3]

for i:= 0 to Form1.ControlCount - 1 do
if Form1.Controls[i] is TEdit then
begin
{ ... }
end


 
Zergling   (2004-01-05 09:11) [4]

tag компонента это порядковый номер элемента массива

Var
I: Integer;
S: array [0..3] of string;
begin
for I := 0 to Form1.ComponentCount - 1 do
if Form1.Components[I] is TEdit then S[Components[I].Tag] := TEdit(Components[I]).Text;
end;


 
ALEIIIKA   (2004-01-05 09:43) [5]

[2]
+ массив вместо переменных

Edit : Array [0..9] of TEdit;

и далее создаешь и юзаешь!


 
Zergling   (2004-01-05 09:49) [6]

ALEIIIKA © (05.01.04 09:43) [5]

Ню, если памяти нежалко, то...


 
Романов Р.В.   (2004-01-05 10:14) [7]


> Ню, если памяти нежалко, то...


40 байт не жалко, но для чего этот массив - непонятно???


 
Lt   (2004-01-05 13:33) [8]

А если без массива переменных? Уж больно хочется оставить "говорящие" переменные.


 
Sandman25   (2004-01-05 13:38) [9]

edtPart1 - более говорящяя, чем edtPart[1]? :)


 
Sandman25   (2004-01-05 13:38) [10]

говорящ ая
позор на мои седины :)


 
Lt   (2004-01-05 13:39) [11]

Говорящая ПЕРЕМЕННАЯ мне нужна, а не имя TEdit"а


 
Sandman25   (2004-01-05 13:41) [12]

edtPart[1] - переменная типа string
А в цикле edtPart[i] := TEdit(FindComponent("Edit"+IntToStr(i))).Text


 
alex_***   (2004-01-05 13:42) [13]

что за "говорящие перменные"?
нужно как-то закрепить переменную за Edit"ом. в Массиве это делает индекс. Не хочешь массив,заведи свой список записей типа
TRec = record
Value: String
Comp: TEdit;
end;

и бегай по нему


 
Lt   (2004-01-05 13:45) [14]

Уточняю. Переменные могут быть не только "Part1", "Part2", но и "my_first", "segment583", "stones" и т.д. Вот к ним я и привязываю TEdit"ы. В принципе, если от таких имен переменных отказаться, то меня полностью бы устроил совет Zergling-а. Но хочется уж больно гладко...


 
Lt   (2004-01-05 13:47) [15]


> alex_***

Во, это уже ближе к телу... Про записи-то я забыл.


 
Sandman25   (2004-01-05 13:49) [16]

[15] Lt (05.01.04 13:47)

Можно вообще TStringList завести, и использовать Objects и IndexOf


 
Sandman25   (2004-01-05 13:50) [17]

[14] Lt (05.01.04 13:45)

Кстати, такие "уточнения" нужно в первом посте писать


 
Романов Р.В.   (2004-01-05 13:50) [18]

const
Part1 = 1;
Part2 = 2;
...
stones = 8;

...
edtPart[stones] :=


 
Lt   (2004-01-05 13:52) [19]


> Кстати, такие "уточнения" нужно в первом посте писать

Прошу прощения, торопился


 
alex_***   (2004-01-05 14:00) [20]

за "гладкость" придется платить кодом. Заводить свой тип записей, массив этих записей, заполнять его и т.д ... (как вариант).


 
Zergling   (2004-01-05 14:01) [21]

var
I: Integer;
ss, my1, my2: string;
begin
for I := 0 to Form1.ComponentCount - 1 do
if Form1.Components[I] is TEdit then
begin
ss := TEdit(Form1.Components[I]).Text;
case TEdit(Form1.Components[I]).Tag of
0: My1 := SS;
1: My2 := SS;
end;
end;
end;


 
Lt   (2004-01-05 15:55) [22]

Так это то же самое, что

var
my1, my2: string;
begin
My1 := edtMy1.Text;
My1 := edtMy1.Text;
...
end;

Идет то же перечисление переменных. Вот если в без него...


 
Lt   (2004-01-05 16:00) [23]

Идея была в другом: переменная - "My452", TEdit - "edtMy452". Ищем на форме TEdit, по его имени находим переменную, и ей присваиваем значение TEdit.Text. Только вот как это сделать?...
Вся загвоздка в том, чтобы по имени TEdit найти соответстывующую ему переменную.


 
alex_***   (2004-01-05 16:09) [24]

вот маньяк - искать переменные по имени.
Так жить нельзя.
Придется выбрать один из выше перечисленных способов и ручками дорабатывать.


 
Lt   (2004-01-05 16:11) [25]

наверное... А за маньяка спасибо большое.


 
Плохиш_   (2004-01-05 16:19) [26]

>Lt (05.01.04 16:00) [23]

У переменных нет имён.


 
Lt   (2004-01-05 16:23) [27]

Ну, началось... Короче, можно по значению одной переменной создать другую переменную или нет?


 
alex_***   (2004-01-05 16:29) [28]

ну нельзя..
сколько памяти под переменные отводить определяет компиллятор. И имен у переменных нет. Только адреса.


 
Плохиш_   (2004-01-05 16:30) [29]


> Lt (05.01.04 16:23) [27]
> Ну, началось... Короче, можно по значению одной переменной
> создать другую переменную или нет?

А теперь по-медленнее и по-русски ешё раз.


 
yo   (2004-01-05 17:07) [30]

Есть такой вариант:

// Определяет абстрактную связь между контролом и переменной
ILink = interface
["{00C099E0-3F9C-11D8-9F00-0050BAF21D9F}"]
procedure Control2Var; // Запись значения контрола в переменную
procedure Var2Control; // Запись переменной в контрол
end;
// Интерфейс используется только для того, чтобы не беспокоиться
// о уничтожении объектов. Можно вместо этого использовать
// абстракный объект

// Описывает конкретную связь между переменной целого типа и Эдитом
TEditIntegerLink = class(TInterfacedObject, ILink)
private
FEdit: TEdit;
FVarAddr: PInteger;
public
constructor Create(AEdit: TEdit; var AVar: Integer);
//begin
// if not Assigned(AEdit) then raise Exception.Create("Bad link");
// FEdit := AEdit;
// FVarAddr := @AVar;
//end;

procedure Control2Var;
//begin
// FVarAddr^ := StrToInt(FEdit.Text);
//end;

procedure Var2Control;
//begin
// FEdit.Text := IntToStr(FVarAddr^);
//end;

end;

var
Links: TInterfaceList; // array of ILink;

procedure RegisterAllLinks;
begin
// Регистрируем все связи
Links.Add( TEditIntegerLink.Create(edtPart1, Part1) );
Links.Add( TEditIntegerLink.Create(edtPart2, Part2) );
...
end;

// Записываем текст эдитов в переменные в цикле
for i := 0 to Length(LinkArray)-1 do
(Links[i] as ILink).Control2Var;


 
alex_***   (2004-01-05 17:23) [31]

вот. не хотел с массивами заморачиваться, теперь есть возможность через интерфейсы сделать ))


 
yo   (2004-01-05 17:36) [32]

>alex_*** © (05.01.04 17:23) [31]
Чем проще вещь выглядит снаружи,
тем замороченней она обычно внутри :)


 
alex_***   (2004-01-05 17:55) [33]

ну не факт... в глобальном смысле ))
Только для человека, который хочет искать переменные по имени, грузить интерфейсами как-то слишком садистки )).



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.01.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.013 c
1-49502
Юрий Зотов
2004-01-06 12:00
2004.01.16
Прорисовка заголовка окна в различных стилях.


1-49535
Пубертанец
2004-01-06 11:24
2004.01.16
Что такое class function?


14-49751
ashnurov
2003-12-24 14:06
2004.01.16
поиск слова в заголовке


3-49423
senya
2003-12-18 15:16
2004.01.16
Данные из DBGrid не попадают в базу


3-49415
safo
2003-12-19 10:29
2004.01.16
компоненты zeos





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский