Форум: "Начинающим";
Текущий архив: 2016.01.03;
Скачать: [xml.tar.bz2];
ВнизPascal Script передать указатель на контрол Найти похожие ветки
← →
Sakipiel (2014-06-28 12:05) [0]Рабочий вариант:
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 получить указатель на контрол?
← →
Rouse__ (2014-06-28 12:22) [1]Любой обьект уже указатель, используй приведение типов, а в процедуру передавай TObject
← →
Sakipiel (2014-06-28 12:31) [2]дело в том, что это не моя процедура, а сторонний компонент, нельзя ли как то не модифицируя его? второй параметр там с типом System.Pointer (
← →
Sakipiel (2014-06-28 12:34) [3]а понял
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;
← →
turbouser © (2014-06-28 15:07) [4]
> Sakipiel (28.06.14 12:34) [3]
>
> а понял
>
> end;
>
> T := Components[j];
нельзя так делать
← →
turbouser © (2014-06-28 15:10) [5]1) j не определено
2) нет проверки на валидность j
3) нет проверки на валидность T
4) try except
← →
Sakipiel (2014-06-28 22:01) [6]
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 указатель на мемо! (мемо это последний компонент который перебирается в цикле)
← →
Sakipiel (2014-06-28 22:04) [7]
T := Owner.Components[i];
Sender.SetPointerToData(Owner.Components[i].Name, @T, Sender.FindNamedType(T.ClassName));
T := nil;
мда, а если вот так, то будет работать так, как будто мы в @T передали nil
← →
turbouser © (2014-06-28 23:10) [8]бредятина. где весь код?
← →
Sakipiel (2014-06-29 08:56) [9]
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;
а это и был весь код, переделал на вот так, работает
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2016.01.03;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.031 c