Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поймать изображение кнопки 
:(
    Опции темы
drinkOut
  Дата 18.5.2005, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 10.2.2005
Где: мой стакан?

Репутация: нет
Всего: нет



Собственно сабж: я ловлю - оно не ловится... smile
Очень хотелось бы узнать, в чём причина... smile
smile
Код

var
  hTaskbar : HWND;
  StartBtn : HWND;
  ButtonDC : HDC;
  Bitmap   : TBitmap;
begin
  hTaskbar := FindWindow('Shell_TrayWnd', nil);
  StartBtn := FindWindowEx(hTaskbar, 0, 'Button', nil);
  ButtonDC := GetDC(StartBtn);
  try
    Bitmap := TBitmap.Create;
    Bitmap.Handle := ButtonDC;
    if Bitmap <> nil then
      Canvas.Draw(10, 10, Bitmap)
    else
      MessageDlg('Empty Bitmap', mtWarning, [mbOk], 0);
  finally
    Bitmap.Free;
  end;
end;

Сообщение 'Empty Bitmap' у меня не появляется, а картинка на форме всё равно не рисуется. smile
--------------------
Жизнь жестока - когда у меня на руках все карты, она начинает играть в шахматы...www.certifications.ru - проверь себя
PM MAIL ICQ   Вверх
s-mike
Дата 18.5.2005, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 16.1.2005
Где: Киев

Репутация: 9
Всего: 16



Код

procedure TForm1.Button2Click(Sender: TObject);
var
  hTaskbar : HWND;
  StartBtn : HWND;
  ButtonDC : HDC;
  Bitmap   : TBitmap;
begin
  hTaskbar := FindWindow('Shell_TrayWnd', nil);
  StartBtn := FindWindowEx(hTaskbar, 0, 'Button', nil);
  ButtonDC := GetDC(StartBtn);
  Bitmap := TBitmap.Create;
  try
    Bitmap.Width := 32;
    Bitmap.Height := 32;
    BitBlt(Bitmap.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, ButtonDC, 0, 0, SRCCOPY);
    if (Bitmap.Width > 0) and (Bitmap.Height > 0) then
      Canvas.Draw(10, 10, Bitmap)
    else
      MessageDlg('Empty Bitmap', mtWarning, [mbOk], 0);
  finally
    Bitmap.Free;
  end;
  ReleaseDC(ButtonDC);
end;


Это сообщение отредактировал(а) s-mike - 18.5.2005, 00:50
PM MAIL WWW   Вверх
jack128
Дата 18.5.2005, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 18.5.2005

Репутация: 2
Всего: 4



Утечки памяти есть ;)

Код

procedure TForm1.PaintBox1Paint(Sender: TObject);
var
  hTaskbar : HWND;
  StartBtn : HWND;
  ButtonDC : HDC;
  TempCanvas: TCanvas;
  TempRect: TRect;
begin
  hTaskbar := FindWindow('Shell_TrayWnd', nil);
  Win32Check(hTaskbar <> 0);
  StartBtn := FindWindowEx(hTaskbar, 0, 'Button', nil);
  Win32Check(StartBtn <> 0);
  ButtonDC := GetDC(StartBtn);
  Win32Check(ButtonDC <> 0);
  try
    TempCanvas := TCanvas.Create;
    try
      TempCanvas.Handle := ButtonDC;
      TempRect := Rect(0, 0, PaintBox1.Width, Paintbox1.Height);
      PaintBox1.Canvas.CopyRect(TempRect, TempCanvas, TempRect)
    finally
      TempCanvas.Handle := 0;
      TempCanvas.Free;
    end;
  finally
    ReleaseDC(StartBtn, ButtonDC); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  end;
end;

PM MAIL   Вверх
drinkOut
  Дата 18.5.2005, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 10.2.2005
Где: мой стакан?

Репутация: нет
Всего: нет



--Resize_Images_Alt_Text--
jack128, supreme! smile Я только не понимаю, что не так в моей версии кода?.. smile
Пока не скажешь, плюс не поставлю! smile
--------------------
Жизнь жестока - когда у меня на руках все карты, она начинает играть в шахматы...www.certifications.ru - проверь себя
PM MAIL ICQ   Вверх
jack128
Дата 18.5.2005, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 18.5.2005

Репутация: 2
Всего: 4



Bitmap.Handle - это хендл битмапа, а не канвы. Это разные объекты.
PM MAIL   Вверх
s-mike
Дата 18.5.2005, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 16.1.2005
Где: Киев

Репутация: 9
Всего: 16



Цитата(drinkOut @ 18.5.2005, 00:45)
Я только не понимаю, что не так в моей версии кода?

1. Создание класса внутри блока try..finally
2.
Цитата(jack128 @ 18.5.2005, 00:40)
Утечки памяти есть ;)

Вот про ReleaseDC и я забыл.
PM MAIL WWW   Вверх
drinkOut
Дата 18.5.2005, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 10.2.2005
Где: мой стакан?

Репутация: нет
Всего: нет



Цитата(s @ 18.5.2005, 00:49)
Создание класса внутри блока try..finally
А чем это плохо? smile

--------------------
Жизнь жестока - когда у меня на руках все карты, она начинает играть в шахматы...www.certifications.ru - проверь себя
PM MAIL ICQ   Вверх
Rennigth
Дата 18.5.2005, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



Цитата

Цитата (s-mike @ 18.5.2005, 00:49)
Создание класса внутри блока try..finally

А чем это плохо? 

ни чем... просто создание класса теоритически(я с этим не соглачен smile) не может вызвать исключения, вот и принято вначале создавать класс потом try а в finally уничтожать.

одно исключение TAdoConnection и да и конструктор своих классов легко может глючить,
все по ситуации.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
s-mike
Дата 18.5.2005, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 16.1.2005
Где: Киев

Репутация: 9
Всего: 16



Цитата(Rennigth @ 18.5.2005, 17:43)
ни чем... просто создание класса теоритически(я с этим не соглачен smile) не может вызвать исключения, вот и принято вначале создавать класс потом try а в finally уничтожать.

Да прям таки ничем, если класс не будет создан в блоке try..finally в результате какой-то ошибки, то в блоке finally получится большооой AV.
PM MAIL WWW   Вверх
Rennigth
Дата 19.5.2005, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



s-mike
Цитата

Да прям таки ничем, если класс не будет создан в блоке try..finally в результате какой-то ошибки, то в блоке finally получится большооой AV.

это с чего это? ты смотрел код free?
Код

  if Assigned(self)  then
    self.destroy;

и как это может вызвать AV


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
jack128
Дата 19.5.2005, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 18.5.2005

Репутация: 2
Всего: 4



Цитата(Rennigth @ 19.5.2005, 10:16)
и как это может вызвать AV

а с чего ты взял, что в переменной Bitmap изначально nil будет?
вот в таком коде AV не будет
Код

Bitmap := nil;
try
  Bitmap := TBitmap.Create;
finally
  Bitmap.Free;
end;


а в твоем вполне

Это сообщение отредактировал(а) jack128 - 19.5.2005, 10:40
PM MAIL   Вверх
Rennigth
Дата 19.5.2005, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



jack128
Цитата

  Bitmap := nil;

все объекты по умолчанию nil
Цитата

а в твоем вполне

каком моем smile я вроде только напомнил код из system.pas.
Цитата

Bitmap := nil;
try
Bitmap := TBitmap.Create;
finally
Bitmap.Free;
end;


я об этом и говорю... что все по обстоятельством но принято писать
Код

  Bitmap := TBitmap.Create;
  try
    Bitmap.LoadFromResourceID(0, 666) ;
  finally
    Bitmap.Free;
  end;

этот код в любом случае нормально отработает, но есть ситуации когда один Create надо в try except заключать...






--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
s-mike
Дата 19.5.2005, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 16.1.2005
Где: Киев

Репутация: 9
Всего: 16



Цитата(Rennigth @ 19.5.2005, 10:44)
этот код в любом случае нормально отработает, но есть ситуации когда один Create надо в try except заключать...

Никогда не надо! Это грубая ошибка! Вот представь, что в конструкторе произойдет ошибка. Тогда в переменную не будет занесен адрес класса или будет занесен ошибочный. А по умолчанию все классы не равны nil, попробуй запустить:
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  Bmp: TBitmap;
begin
  if Bmp = nil then
    ShowMessage('nil')
  else
    ShowMessage('not nil');
end;

В переменной будет хранится адрес несуществующего класса, так что при попытке его освобождения будет серьезная ошибка.
PM MAIL WWW   Вверх
Rennigth
Дата 19.5.2005, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



s-mike
я привык проверять существование объекта на Assigned,
ты попробуй запустить
Код

 procedure TForm1.FormCreate(Sender: TObject);
var
  Bmp: TBitmap;
begin
  if Assigned(bmp) then
   ShowMessage('nil')
  else
    ShowMessage('not nil');
end; 


попробуй хотябы создать TADOConnection если у проекта небыло
Application.init (одит из примеров) а если у тебя класс с прооверайженным конструктором и там ошибка...


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
jack128
Дата 19.5.2005, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 18.5.2005

Репутация: 2
Всего: 4



Rennigth Assigned проверяет на НЕ равенство nil'у. Так что писать нужно так

Код

  if Assigned(bmp) then
   ShowMessage('not nil')
  else
    ShowMessage('nil');

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0552 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.