Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка существования TControl, Как? 
V
    Опции темы
CynicRus
  Дата 11.7.2012, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Приветствую уважаемых форумчан. Господа, подскажите - каким образом можно проверить переменую типа TControl на существование?
Тоесть - есть глобальная переменная допустим _comp. Есть функция, создающая этот контрол. Как проверить - что в переменной _comp?

Создание контрола:
Код

function TDsgnForm.CreateComponent(Sender: TObject; X, Y: Integer): TControl;
var
  comp:TComponent;
  none:Boolean;
  CreateClass:TComponentClass;
  cname:String;
  pInfo: PTypeInfo;
  //----------------------------------------------------------
  function __CreateComp():TComponent;
  begin
    Result := nil;
    if Assigned(CreateClass) then begin
      comp := CreateClass.Create(Self);
      pInfo := comp.ClassInfo;
      cname := pInfo^.Name;
      if (comp is TWinControl) then begin
        TWinControl(comp).ParentWindow := TWinControl(Sender).Handle;
        TWinControl(comp).Parent := TWinControl(Sender);
        TWinControl(comp).Name := cname + IntToStr(_ControlsCreated);
        TWinControl(comp).Left := X;
        TWinControl(comp).Top := Y;
        comp.Tag:=_ControlsCreated;
      end
      else if (comp is TControl) then begin
        TControl(comp).Parent := TWinControl(Sender);
        TControl(comp).Name := cname + IntToStr(_ControlsCreated);
        TControl(comp).Left := X;
        TControl(comp).Top := Y;
        comp.Tag:=_ControlsCreated;
      end;
      _ControlsCreated := _ControlsCreated + 1;
      Result := comp;
    end;
  end;
  //----------------------------------------------------------
  procedure __UpButton();
  begin
    if Assigned(CompForm.ButtonDown) then begin
      TToolBar(CompForm.ButtonDown.Parent).Buttons[0].Down := True;
      CompForm.ButtonDown := nil;
    end;
  end;
  //----------------------------------------------------------
  procedure __TrackEvent();
  begin
    if Assigned(comp) then begin
      THControl(comp).OnMouseDown :=@FormMouseDown;
    end;
  end;
begin
  comp := nil;
  none := False;
  CreateClass := nil;
  if (CompForm.ButtonIndex <> -1) then begin
      CreateClass := CompForm.ControlsClassPStd[CompForm.ButtonIndex];
    comp := __CreateComp();
    __UpButton();
    __TrackEvent();
  end
  else begin
    none := True;
  end;
  if (none) then begin
    if (Sender <> Self) then begin
      sor.SelectControl := TControl(Sender);
    end
    else begin
      sor.Selected := False;
      sor.SelectControl := nil;
    end;
  end
  else begin
    sor.SelectControl := TControl(comp);
  end;
  Result := TControl(comp);
end;                          



Это сообщение отредактировал(а) CynicRus - 11.7.2012, 08:50
PM MAIL   Вверх
CynicRus
Дата 11.7.2012, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Вспомнил про Assigned()-) Всем спасибо-)
PM MAIL   Вверх
Frees
Дата 11.7.2012, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



Цитата(CynicRus @  11.7.2012,  12:07 Найти цитируемый пост)
Assigned


не всегда выход

Код

var 
 a, b: TControl;
........
a := TControl.Createn(nil);
b := a;
FreeAndNil(b);
.............
Assigned(a) //будет true, а по факту ссылка на освобожденную память




--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
CynicRus
Дата 11.7.2012, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Да, я заметил-(

Вообщем используя приведеную выше функцию - создаю контрол
Код

_comp := CreateComponent(Sender, X, Y);

Он появляется на форме, создаю второй контрол - и он тоже появляется на форме.
Затем мне требуется работать с созданными контролами, я делаю проверку
Код

  if Assigned(_comp) then
   begin
     sor.SelectControl:=_comp;
   end

В этом куске кода, я хочу чтобы в случае, если контрол существует - передать его в свойство другого класса. В этом свойстве - всегда лежит последний созданый контрол, мне же необходимо - чтобы там ещё и текущий выделеный лежал. А по факту, при клике на существующий контрол - я получаю в _comp ссылку на nil, при этом он Assigned проходит. Как быть в такой ситуации?

Добавлено через 1 минуту и 20 секунд
PS: Ах да, вышеописаный код исполняется в обработчике FormMouseDown.
PM MAIL   Вверх
Frees
Дата 11.7.2012, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



По твоим сообщениям сложно понять чем помочь.
Цитата(CynicRus @  11.7.2012,  12:42 Найти цитируемый пост)
 чтобы там ещё и текущий выделеный лежал

Текущий контрол всегда доступен по Form1.ActiveContorl

PS
ИМХО ты огород ненужный огородишь. Как то все сложно и запутанно, возможно проще будет озвучить задачу и спросить форумчан как лучше сделать (решать тебе).




--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
CynicRus
Дата 11.7.2012, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Я делаю простенький редактор форм. Понятно, что проще взять готовое решение - но лично мне необходим велосипед. Собственно - из всего выше изложенного, мне всего лишь надо узнать - как проверить _comp типа TControl на nil, потому как Assigned - не всегда дает необходимый результат. 

Это сообщение отредактировал(а) CynicRus - 11.7.2012, 10:48
PM MAIL   Вверх
CynicRus
Дата 11.7.2012, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Код

if @_comp <> nil then
 - тоже не особо спасло.
PM MAIL   Вверх
БелАмор
Дата 14.7.2012, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 10.6.2010
Где: Россия

Репутация: 5
Всего: 17



PM   Вверх
northener
Дата 14.7.2012, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(CynicRus @  11.7.2012,  08:48 Найти цитируемый пост)
подскажите - каким образом можно проверить переменую типа TControl на существование?

Переменная существует всегда пока работает программа.
А вот что содержит эта переменная - вот это главное.

Имхо сначала нужно попытаться избавиться от "есть глобальная переменная допустим _comp".


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
CynicRus
Дата 14.7.2012, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Всем спасибо за ответы, я уже понял глубину своей ошибки, и в результате пошел вообще другим путем. При создании контрола, присваиваю ему на онклик обработчик, ну и в обработчике уже работаю собственно.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0487 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.