Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2009, 10:18   #1
grey
Пользователь Подтвердите свой е-майл
 
Регистрация: 24.10.2007
Сообщений: 36
По умолчанию Как вывести панель (TPanel) из переменной?

Извиняюсь за неопытность))
При определённых условиях необходимо делать скрины с определённых панелей. Конечно написал громоздко через условия, но:
Можно ли вывести панель из переменной? Возможно ли это?

этот код естественно выдаёт ошибку
Код:
procedure TForm1.Button3Click(Sender: TObject);
var
   .... 
   PanelX: TPanel;
begin
  PanelX:=Panel1;
  ........... 
  ScreenDC := GetDC(Form1.PanelX.Handle); 
  .........
  end;
grey вне форума Ответить с цитированием
Старый 08.11.2009, 12:04   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

чтоб сграбить с любого контекста (окромя случаев работы с directshow), сделайте следующее...
Код:
 ...
 b:= tbitmap.Create;
 CaptureClientImage(panel.Handle,b);
 ...

procedure CaptureClientImage(h: hwnd; b: tbitmap);
var DC   : hDC;
    Rect : TRect;
    wX,wY: integer;
begin
 GetWindowRect(h,Rect);
 wX:= Rect.Right - Rect.Left;
 wY:= Rect.Bottom - Rect.Top;
 DC:= GetWindowDC(h);
 //
 b.Handle:= CreateCompatibleBitmap(dc,wX,wY);
 BitBlt(b.Canvas.Handle,0,0,wX,wY,dc,0,0,SRCCOPY);
 ReleaseDC(h,DC)
end;
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 08.11.2009 в 12:06.
raxp вне форума Ответить с цитированием
Старый 08.11.2009, 12:31   #3
grey
Пользователь Подтвердите свой е-майл
 
Регистрация: 24.10.2007
Сообщений: 36
По умолчанию

Спасибо, но грабится у меня нормально (и даже всё работает), просто в программе много панелей (больше чем может вместить экран), по RadioButton осуществляется визуализация определённых панелей, а кнопкой Button3 возможность (если необходимо) создания скрина панели и автоматом сохранения в jpg.

Что бы не писать проверку переключателя RadioButton для каждой панели, я и хотел заносить переключателем название панели в переменную PanelX, а потом в procedure TForm1.Button3Click(Sender: TObject); вызывать, типа:
Код:
ScreenDC := GetDC(Form1.PanelX.Handle);
Ну если нельзя, то ладно.

Последний раз редактировалось grey; 08.11.2009 в 12:35.
grey вне форума Ответить с цитированием
Старый 08.11.2009, 13:13   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

надо не название панели заносить, а handle соотвествующей панели... попробуйте
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 08.11.2009, 14:40   #5
grey
Пользователь Подтвердите свой е-майл
 
Регистрация: 24.10.2007
Сообщений: 36
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
надо не название панели заносить, а handle соотвествующей панели... попробуйте
Извините, а как это?
grey вне форума Ответить с цитированием
Старый 08.11.2009, 14:52   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

покажу на примере... возъем n- панелей timage на форме... по клику на панели будем определять по какой и заносить в image (см. вложение)
Код:
procedure TForm1.Panel1Click(Sender: TObject);
begin
 //
 with (sender as tpanel) do
 CaptureClientImage(handle,image1.Picture.Bitmap);
end;
Изображения
Тип файла: jpg Копировать из новый-2.jpg (36.6 Кб, 65 просмотров)
Тип файла: jpg Копировать из новый-3.jpg (18.7 Кб, 73 просмотров)
Вложения
Тип файла: zip скрин панели.zip (1.4 Кб, 10 просмотров)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 08.11.2009, 17:00   #7
grey
Пользователь Подтвердите свой е-майл
 
Регистрация: 24.10.2007
Сообщений: 36
По умолчанию

да, спасибо большое, понял))
grey вне форума Ответить с цитированием
Старый 08.11.2009, 21:18   #8
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
Что бы не писать проверку переключателя RadioButton для каждой панели, я и хотел заносить переключателем название панели в переменную PanelX
Возможно имелось ввиду нечто подобное: for функция и Label
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 09.11.2009, 19:42   #9
grey
Пользователь Подтвердите свой е-майл
 
Регистрация: 24.10.2007
Сообщений: 36
По умолчанию

c Label-ями или с Panel-ями, когда в начале стоят, то просто получается (проще некуда):
Если сделать:
Код:
rocedure TForm1.Button1Click(Sender: TObject);
var
   PanelX: TPanel;
begin
  PanelX:=Panel1;
  PanelX.Color:=clred;
  end;
то работает, и по ссылке от DomiNick тоже работает
а как в моём варианте:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
   .... 
   PanelX: TPanel;
begin
  PanelX:=Panel1;
  ........... 
  ScreenDC := GetDC(Form1.PanelX.Handle); 
  .........
  end;
работать не желает

Я по неопытности и думал: может где в синтаксисе немного ошибся (забыл поставить волшебную закорючку)

Последний раз редактировалось grey; 09.11.2009 в 19:45.
grey вне форума Ответить с цитированием
Старый 09.11.2009, 19:55   #10
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

вы б уже объединили несколько кнопок под одним кликом такой конструкцией:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
 case (sender as tbutton).tag of
  0: CaptureClientImage(panel1.handle,image1.Picture.Bitmap);
  1: CaptureClientImage(panel2.handle,image1.Picture.Bitmap);
  2: CaptureClientImage(panel3.handle,image1.Picture.Bitmap);
  3: CaptureClientImage(panel4.handle,image1.Picture.Bitmap);
 end
end;

...или заводим массив панелей и тогда можно будет просто передавать ее номер:
Код:
var panel: array[0..3] of tpanel;
...

procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin
 for i:= low(panel) to high(panel) do begin
  panel[i]:= tpanel.Create(nil);
  panel[i].Caption:= 'дин '+ inttostr(i+1);
  panel[i].Top:= i*50;
  panel[i].Parent:= self
 end
end;

procedure TForm1.ButtonClick(Sender: TObject);
begin
 with (sender as tbutton) do
  CaptureClientImage(panel[tag].Handle,image1.Picture.Bitmap)
end;
Изображения
Тип файла: jpg 1.JPG (34.7 Кб, 119 просмотров)
Вложения
Тип файла: zip dinbutton.zip (1.7 Кб, 4 просмотров)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 09.11.2009 в 20:13.
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Win32 как вывести на экран значение переменной STill_ace Общие вопросы C/C++ 11 22.08.2009 17:47
Имя переменной как переменная. Как получить доступ к такой переменной? Denni Microsoft Office Access 8 02.04.2009 10:06
Вывести имя переменной wall66 PHP 11 13.12.2008 10:48
Вывести на панель задач Shouldercannon Общие вопросы Delphi 9 07.11.2008 21:23
Как создать программу-панель (как панель Msoffice), чтобы была поверх всех окон Romanbl4 Общие вопросы Delphi 6 27.06.2007 17:23