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

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

Клонирование TPanel с содержимым. [D7]


Gnobobel ©   (2006-01-28 22:51:00) 

У меня есть готовая TPanel с картинкой и парой лейбелов/кнопоко etc. Мне нужно Runtime добавлять и убирать новые панельки и получать Event'ы от них и их дочерних компонентов.
Как?


msguns   (2006-02-01 15:30:00) [1]

А что, обработка кликов одной и той же кнопки разных экземпляров одного и того жеблока контролов ("нагруженная" панель или фрэйм) различается ?


Shirson   (2006-02-01 15:11:00) [2]

Gnobobel, собаку убрать, просто NewFrame.Label1.OnClick:=Func;


аноним   (2006-01-31 20:18:00) [3]

NewFrame.Label1.@OnClick := Func;

что за привычка пошла так к методам относиться у народа? уже не первый раз вижу. как только не извращаются. учите матчасть.


Gnobobel   (2006-01-31 19:39:00) [4]

Ну я так себе и представлял. Описать класс фрейма со всеми фишками и создавать его копии, но как сообщения получать?

NewFrame.Label1.@OnClick := Func; //? =)


Gero   (2006-01-30 23:53:00) [5]

> Мда... ну и что мне даст использование фреймов?

Можно без проблем создавать сколько угодно копий.
Клонировать не нужно, просто

NewFrame := TMySuperFrame.Create(..);
NewFrame.Parent := ...;

Обращаться очень просто, через NewFrame.что_угодно.


Gnobobel   (2006-01-30 17:06:00) [6]

Мда... ну и что мне даст использование фреймов? Как клонировать панельки, обращатся к их компонентам, получать их ивенты?


AbrosimovA   (2006-01-30 08:52:00) [7]

Например, через буфер обмена:

Uses Clipbrd, ...;

const S = 'bla-bla-bla';

procedure WriteToClipBoard(strFormat: PChar; Component: TComponent);
var
 CF_MYFORMAT : cardinal;
 hbuf        : THandle;
 bufptr      : Pointer;
 mstream     : TMemoryStream;
begin
CF_MYFORMAT := RegisterClipboardFormat(strFormat);
mstream := TMemoryStream.Create;
try
  mstream.WriteComponent(Component);
  mstream.Seek(0, soFromBeginning);
  hbuf := GlobalAlloc(GMEM_MOVEABLE, mstream.size);
  try
   bufptr := GlobalLock(hbuf);
   try
    Move(mstream.Memory^, bufptr^, mstream.size);
    Clipboard.SetAsHandle(CF_MYFORMAT, hbuf);
   finally
    GlobalUnlock(hbuf);
   end;
  except
   GlobalFree(hbuf);
   raise;
  end;
finally
 mstream.Free;
end;
end;

function ReadFromClipBoard(fmtText: string; Component: TComponent): string;
var
 hbuf    : THandle;
 bufptr  : Pointer;
 mstream : TMemoryStream;
 buf: array[0..60] of Char;
 n: Integer;
 fmt: Word;
begin
 fmt:=0;
 Result:='';
 for n := 0 to Clipboard.FormatCount - 1 do
 begin
  fmt := Clipboard.Formats[n];
  if GetclipboardFormatName(fmt, buf, Pred(Sizeof(buf))) <> 0 then
   if StrPas(buf) = S then  Break;
 end;
 hbuf := Clipboard.GetAsHandle(fmt);
 if hbuf <> 0 then
 begin
  bufptr := GlobalLock(hbuf);
  if bufptr <> nil then begin
   try
    mstream := TMemoryStream.Create;
     try
      mstream.WriteBuffer(bufptr^, GlobalSize(hbuf));
      mstream.Position := 0;
      mstream.Seek(0, soFromBeginning);
      mstream.ReadComponent(Component);
     finally
      mstream.Free;
     end;
   finally
    GlobalUnlock(hbuf);
   end;
  end;
 end;
end;

Вызов функций:

WriteToClipBoard(PChar(S),Panel1);
ReadFromClipBoard(S, Panel1);


tesseract   (2006-01-28 22:55:00) [8]

С парой и более компонетов - лучше сделать фрейм. А в любом Event есть параметр - Sender.


Наверх

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