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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.006 c
2-1404192194
Sw
2014-07-01 09:23
2016.01.03
включить в инсталлятор файлы


15-1430976222
Денис Комаров
2015-05-07 08:23
2016.01.03
Александр Попов продемонстрировал сеанс радиосвязи.


6-1279021557
Black123
2010-07-13 15:45
2016.01.03
IdHTTP.Post и глобальные переменные.


15-1430848589
ВладОшин
2015-05-05 20:56
2016.01.03
NCONVERT, PDF -> Jpeg (Error: Don t know how to read..)


15-1430333783
Rouse_
2015-04-29 21:56
2016.01.03
Никто не хочет задачку от GunSmoker-а решить? :)