Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
6-1279021557
Black123
2010-07-13 15:45
2016.01.03
IdHTTP.Post и глобальные переменные.


15-1429530476
4h Q
2015-04-20 14:47
2016.01.03
Посоветуйте снифер, пожалуйста


15-1430999628
фыва
2015-05-07 14:53
2016.01.03
Годную книжку по C#


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


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский