Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.05;
Скачать: CL | DM;

Вниз

Клонирование TPanel с содержимым.   Найти похожие ветки 

 
Gnobobel   (2006-01-28 22:51) [0]

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


 
tesseract ©   (2006-01-28 22:55) [1]

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


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

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

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);


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

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


 
Gero ©   (2006-01-30 23:53) [4]

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

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

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

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


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

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

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


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

NewFrame.Label1.@OnClick := Func;

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


 
Shirson ©   (2006-02-01 15:11) [7]

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


 
msguns ©   (2006-02-01 15:30) [8]

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



Страницы: 1 вся ветка

Текущий архив: 2006.03.05;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.036 c
2-1140001677
VitV
2006-02-15 14:07
2006.03.05
Panel


3-1136738288
аматор
2006-01-08 19:38
2006.03.05
может кто поможет (только если ругать то не сильно)


6-1132745304
NorthMan
2005-11-23 14:28
2006.03.05
Как посчитать объем данных


15-1139681490
PARUS
2006-02-11 21:11
2006.03.05
Телефонный вопрос.


4-1134495543
Volf_555
2005-12-13 20:39
2006.03.05
Как в реестре можно сделать расширенное контекстное меню?