![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Pascal Script передать указатель на контрол
Sakipiel © (2014-06-28 12:05:00)Рабочий вариант:
procedure TMainForm.ceExecute(Sender: TPSScript);
begin
ce.SetPointerToData('Memo2', @Memo2, ce.FindNamedType('TMemo'));
end;
Нерабочий вариант:
procedure TMainForm.ceExecute(Sender: TPSScript);
var
i,j:integer;
begin
for I := 0 to ComponentCount-1 do
begin
if Components[i].Name = 'Memo2' then
begin
j := i;
break;
end;
end;
Sender.SetPointerToData('Memo2', Components[j], Sender.FindNamedType('TMemo'));
end;
т.е. разница в том, что в первом случае передается @Memo2 в процедуру, а во втором Components[j]
в общем то, во втором случае явно не адрес передается, но при этом компилятор не ругается и запускает код, а если делать так @Components[j] то тогда уже компилятор не дает так сделать ( как из Components получить указатель на контрол?
Sakipiel (2014-06-29 08:56:00) [1]
procedure TEvent.ceExecute(Sender: TPSScript);
var
i, j: integer;
T: array of TObject;
begin
SetLength(T, Owner.ComponentCount);
for i := 0 to Owner.ComponentCount - 1 do
begin
if (Owner.Components[i].Name = '') or
(Owner.Components[i].ClassName = 'TClientDataSet') then
continue;
T[i] := Owner.Components[i];
Sender.SetPointerToData(Owner.Components[i].Name, @T[i],
Sender.FindNamedType(T[i].ClassName));
end;
T := nil;
end;
а это и был весь код, переделал на вот так, работает
turbouser (2014-06-28 23:10:00) [2]бредятина. где весь код?
Sakipiel (2014-06-28 22:04:00) [3]
T := Owner.Components[i];
Sender.SetPointerToData(Owner.Components[i].Name, @T, Sender.FindNamedType(T.ClassName));
T := nil;
мда, а если вот так, то будет работать так, как будто мы в @T передали nil
Sakipiel (2014-06-28 22:01:00) [4]
for I := 0 to Owner.ComponentCount-1 do
begin
if (Owner.Components[i].Name = '') or (Owner.Components[i].ClassName = 'TClientDataSet') then
continue;
if (Owner.Components[i].Name = 'Edit1') then
begin
T2 := Owner.Components[i];
Sender.SetPointerToData(Owner.Components[i].Name, @T2, Sender.FindNamedType(T2.ClassName));
end
else
begin
T := Owner.Components[i];
Sender.SetPointerToData(Owner.Components[i].Name, @T, Sender.FindNamedType(T.ClassName));
end;
end;
Почему вот такая вот загагулина приводит к тому, что абсолютно все компоненты вешаются на T который был самым последним?, специально сделал условие на Edit1 и специально для него сделал переменную T2, так вот едит отрабатывает нормально, если же это условие убрать и оставить только переменную T и то что идет после Else то работать будет так как будто мы вызывали процедуру как Sender.SetPointerToData('Edit1', @T, Sender.FindNamedType('TEdit')); а в переменной @T указатель на мемо! (мемо это последний компонент который перебирается в цикле)
turbouser (2014-06-28 15:10:00) [5]1) j не определено
2) нет проверки на валидность j
3) нет проверки на валидность T
4) try except
turbouser (2014-06-28 15:07:00) [6]
> Sakipiel (28.06.14 12:34) [3]
>
> а понял
>
> end;
>
> T := Components[j];
нельзя так делать
Sakipiel (2014-06-28 12:34:00) [7]а понял
procedure TMainForm.ceExecute(Sender: TPSScript);
var
i,j:integer;
T:Tobject;
begin
for I := 0 to ComponentCount-1 do
begin
if Components[i].Name = 'Memo2' then
begin
j := i;
break;
end;
end;
T := Components[j];
Sender.SetPointerToData('Memo2', @T, Sender.FindNamedType('TMemo'));
end;
Sakipiel (2014-06-28 12:31:00) [8]дело в том, что это не моя процедура, а сторонний компонент, нельзя ли как то не модифицируя его? второй параметр там с типом System.Pointer (
Rouse__ (2014-06-28 12:22:00) [9]Любой обьект уже указатель, используй приведение типов, а в процедуру передавай TObject