Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

получить по имени переменной ее значение


Вася ©   (2013-09-19 13:08:00) 

Возможно ли сделать такое:
procedure set_all;
const
 controlsvalue: array[1..5,1..2] of string = (('Edit1','vall1'),('Edit1','vall2'),('Edit1','kll'),('Edit1','re'),('Edit1','io n'));
var
i,   vall1, vall2, kll, re, ion: integer;
begin
 for i:=0 to length(controlsvalue) do TEdit(FindComponent(controlsvalue[i,0])).Text:=IntToStr(controlsvalue[i,1]);

end;  


проблема в выражении IntToStr(controlsvalue[i,1]);не знаю как по имени переменной вытянуть ее значение


[ВладОшин]   (2013-09-20 13:11:00) [1]

ну а просто - передать массив параметров, показать, вернуть?

type
 TForm1 = class(TForm)
   btn1: TButton;
   procedure btn1Click(Sender: TObject);
 private     { Private declarations }
 public      { Public declarations }
   v: array[1..3] of string;
   procedure SetValue;
   procedure ShowValue;
 end;

var
 Form1: TForm1;

implementation
uses Unit2;
{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
begin
 SetValue;
 ShowValue;
 GetSetParam(v);
 ShowValue;
end;

procedure TForm1.SetValue;
var
 i: Integer;
begin
 for i := 1 to 3 do
   v[i] := Format('%d',[Random(999)]);
end;

procedure TForm1.ShowValue;
begin
   ShowMessageFmt('%s %s %s',[v[1], v[2], v[3]]);
end;

--------------

type
 TForm2 = class(TForm)
   edt1: TEdit;
   edt2: TEdit;
   edt3: TEdit;
   procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
   procedure FormShow(Sender: TObject);
 private     { Private declarations }
 public      { Public declarations }
   v: array[1..3] of string;
 end;

procedure GetSetParam( var a: array of string );

implementation
{$R *.dfm}

procedure GetSetParam( var a: array of string );
var
 F: TForm2;
 i: integer;
begin
 F := TForm2.Create(Application);
 for i := 1 to 3 do
  F.v[i] := a[i-1];
 F.ShowModal;
 for i := 1 to 3 do
  a[i-1] := F.v[i];
 FreeAndNil(F);
end;

procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
 i: integer;
 C: TComponent;
begin
 for i := 1 to 3 do
 begin
   C := FindComponent('edt'+inttostr(i));
   if (C <> nil) and (C is TEdit) then
     v[i] := TEdit(C).Text;
 end;
 CanClose := True;
end;

procedure TForm2.FormShow(Sender: TObject);
var
 i: integer;
 C: TComponent;
begin
 for i := 1 to 3 do
 begin
   C := FindComponent('edt'+inttostr(i));
   if (C <> nil) and (C is TEdit) then
     TEdit(C).Text := v[i];
 end;
end;


Вася   (2013-09-20 12:13:00) [2]

при загрузке программы из ини файла в переменные загружаются параметры программы, которые потом повсюду используются, а при открытии формы настроек нужно чтобы в каждый эдит попала соответствующая цифра, вот и решил сопоставить именам эдитов имена переменных. кстати пример что я привел, экспериментальный, если использовать глобальные переменные, все работает, но через отдельный класс еще удобнее получилось.
Возможно изобретаю велосипед конечно, если все уже придумали до меня, подтолкните плз.


Inovet   (2013-09-19 16:15:00) [3]

> [7] Вася   (19.09.13 16:06)

Кстати, для всяких таких целей у компонентов есть специальное поле Tag. Можно ему присвоить хоть указатели те же. А вообще не понятно для чего связывать переменные с едитами, что-то тут не то.


Вася   (2013-09-19 16:06:00) [4]

ага, сделал класс, в нем объявил нужные мне переменные, в основном модуле создал потомка класса, теперь все работает, СПАСИБО!!! :)
сейчас и есть через Case, но так намного нагляднее.


Inovet   (2013-09-19 15:57:00) [5]

> [5] Вася   (19.09.13 14:53)
> может особенности компилятора FPC 2.6.2?

Эээ, можно и так сказать, а можно - особенности Паскаля.

Во время компиляции массив инициализируется константами. Вот это

'Edit1'

константа, а это что

pointer(vall1)

? А это приведение значенияпеременной к типу указателя. Откуда оно во время компиляции известно? Нам это надо? Нет, такой указатель нам не нужен.
Вот они все у тебя Integer. Наверное, могут быть и другие? Или только такие?

Вобщем, для взятия адреса есть такая загогулина
@vall1

А почему бы не сделать просто case? Судя по подходу, динамически эти едиты не добавляются.


Вася   (2013-09-19 14:53:00) [6]

сделал так
type
setingi=record
n:string[20];
v:pointer;
end;

var
i,   vall1, vall2, kll, re, ion: integer;
controlsvalue: array[1..5] of setingi = ((n:'Edit1', v:pointer(vall1)),(n:'Edit2',v:pointer(vall2)),(n:'Edit3',v:pointer(kll)),(n:'Ed it4',v:pointer(re)),(n:'Edit5',v:pointer(ion)));  

, но ругается на строку controlsvalue: array[1..5] of setingi = ((n:'Edit1', v:pointer(vall1)),(n:'Edit2',v:pointer(vall2)),(n:'Edit3',v:pointer(kll)),(n:'Ed it4',v:pointer(re)),(n:'Edit5',v:pointer(ion)));, говорит rsfunk.pas(22,52) Fatal: Syntax error, ")" expected but "," found

П.С. может особенности компилятора FPC 2.6.2?


[ВладОшин]   (2013-09-19 13:29:00) [7]

ну, все верно, в принципе

только с индексами разберись

>  controlsvalue: array[1


>for  i:=0
controlsvalue[i,


Inovet   (2013-09-19 13:29:00) [8]

Заполни массив вместо имён переменных указателями на эти переменные.


Вася   (2013-09-19 13:15:00) [9]

а, да, не проверял, просто в браузере писал :)


[ВладОшин]   (2013-09-19 13:13:00) [10]

зачем IntToStr
просто controlsvalue[i,1]


Наверх

Титульная страница Поиск, карта сайта Написать письмо