Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как получить имя компонента


Автор: SergV 14.1.2007, 13:38
Искал по поиску, и смотрел по предложенным ссылкам при вводе имени для темы, нечего не нашел.

Ситуация такая, я в реальном времени создаю вкладку и на ней компонент мемо, имена создаю для вкладки и мемо по имени открытого файла с префиксом. В данный момент имя мемо активной вкладки получаю обходным путём, через получение имени вкладки и удаления префикса и последующего добавления префикся для имени мемо:
Код

var M: TSynMemo;
name: String;
i: Integer;
begin
  name:=memopage.ActivePage.Name;
  i:=length(name);
  name:=copy(name,1,i-3);
  M := TSynMemo(FindComponent('m_'+name)));
end;

Всё работает, но меня не устраивает этот обходной путь, а как напрямую получить не пойму. 
Перепробовал несколько других вариантов, программа компилируется, но при старте вылетает ошибка обращения к памяти. Вобщем результат, имя компонента не определяется, это значить что неправильный брал подход, а как правильно получить так и не нарыл.

Автор: aktuba 14.1.2007, 14:53
Если я правильно понял - ты используешь TPageControl. Тогда:
Код

function GetMemoName(Sheet: TTabSheet): string;
var
  Idx: Integer;
begin
  Result := '';
  for Idx := 0 to Sheet.ComponentCount - 1 do
    if Sheet.Components[Idx] is TSynMemo then
      begin
        Result := (Sheet.Components[Idx] as TSynMemo).Name;
        Break;
      end;
end;


Писал без проверки, но суть должна быть ясна. Да, и еще, это сработает, если у мемо при создании Parent присваивать закладку...

Автор: SergV 14.1.2007, 20:13
aktuba, спасибо за ответ, но это не совсем то что мне надо. Я неправильно сформулировал вопрос, мне надо "М" определить как компонент а не как стринг. Это видно из примера что я привёл, после присвоения я использую эту переменную как имя компонента. 

Автор: aktuba 15.1.2007, 00:43
SergV, а немного подправить не судьба?  smile 

Код

function GetMemoName(Sheet: TTabSheet): TSynMemo;
var
  Idx: Integer;
begin
  Result := nil;
  for Idx := 0 to Sheet.ComponentCount - 1 do
    if Sheet.Components[Idx] is TSynMemo then
      begin
        Result := Sheet.Components[Idx] as TSynMemo;
        Break;
      end;
end;

Автор: VICTAR 15.1.2007, 02:13
Цитата(aktuba @  14.1.2007,  14:53 Найти цитируемый пост)
Да, и еще, это сработает, если у мемо при создании Parent присваивать закладку... 

A этот вариант сработает всегда. Так, на всякий случай
Код

function TForm1.GetSynMemo(const Sheet: TTabSheet): TSynMemo;
var i : integer;
begin
  result := nil;
  for i:= 0 to ComponentCount - 1 do
    if (Components[i] is TSynMemo)and
      ((Components[i] as TSynMemo).Parent=Sheet) then
        result:=(Components[i] as TSynMemo);
end;



Автор: SergV 15.1.2007, 20:12
*SergV, а немного подправить не судьба? *
aktuba, какже правил, вместо стринг подставлял TSynMemo, только в результ не подставил нил. Только есть одна проблема, я в дельфи спец фиговый, уже пол года не садился за дельфи, и не разу не пробовал писать с функциями, тоько с процедурами. Я так и не понял, как правильно обратиться к функции из процедуры? И пройдёт ли такой вариант, если я в функцию добавлю строку:
Код

m:=result;

Проблема в том что я в других процедурах делаю определённые действия, и обращаюсь к активному компоненту TSynMemo, как к "М". 
На другом форуме мне сказали что тот вариант что я использую, самый оптимальный. Тоесть я делаю обращение к компоненту TSynMemo через поиск его по имени закладки. Так как закладку с мемо создаю с одним именем, но с разным префиксом, а при определении я просто беру имя закладки, и меняю префикс, а потом ищу TSynMemo по имени. 

Кстате, может у меня и с созданием не всё впорядке:
Код

procedure TForm1.memocreate;
var
//m: TSynMemo;
T: TRzTabSheet;
begin
  T := TRzTabSheet.Create(self);
  with T do
  begin
    T.PageControl := MemoPage;
    n:= memopage.PageCount-1;
    t.Name:='p_'+name;
    memopage.ActivePageIndex:=n;
  end;
  m := TSynMemo.Create(self);
  with m do
    begin
      visible:=false;
      Parent := Form1.MemoPage.Pages[n]; 
      m.Name:='m_'+name;
    end;
  readmemoconfig;
end;

Просто в дискусии проскочил этот код:
Код

lMemo.Parent := Self;

В моём коде я не делал этого, но при этом всё работает, присвоение паренту этого зельфа обязательно?.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)