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

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

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


Наверх

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