![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Клонирование 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.