Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.16;
Скачать: CL | DM;

Вниз

Переменные и 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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.017 c
14-49764
Думкин
2003-12-24 00:07
2004.01.16
С днем рождения! 24 декабря.


14-49716
copyr25
2003-12-22 18:58
2004.01.16
---|Ветка была без названия|---


14-49752
Serginio666
2003-12-24 13:52
2004.01.16
Когда Форум По Delphi.Net откроется


14-49740
Ozod
2003-12-23 19:05
2004.01.16
Как программно мозжно изменить размер Рабочего стола


1-49546
Noname
2004-01-06 11:11
2004.01.16
Combobox