DevProg: Блог для программистов

Секреты программирования. Примеры разработки. Обзоры программёрского софта, блогов и форумов и просто полезные советы!

Archive for the ‘Узелок впрок’ Category

Узелок впрок! Динамическое создание визульных элементов

Posted by tevton на Январь 13, 2010

Это моя первая публикация, в данном блоге и блоге вообще. Поэтому прощу не закидывать помидорами не первой свежести)

Данная тема, уже поднималась в данном блоге, о создании кнопки ToolBar. Я же хочу раскрыть ее с несколько другой стороны.

Разберем, как происходит создание динамического элемента формы, на примере TButton.
В нашем примере, кнопка будет существовать столько же, сколько существует форма. По большому счету мы сделаем тоже самое, что делает Delphi за нас, когда мы располагаем кнопку на форме в Design-time.
В первую очередь нам нужно объявить модуль, в котором объявлен класс TButton в данном случае это StdCtrls

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

Теперь объявим переменную класса TButton и процедуру обработки события OnClick, в секции private нашей формы:

TfrmExample = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
btnExample: TButton;
procedure DobtnExampleClick(Sender: TObject);
end;

Все подготовительные действия выполнены. Теперь приступаем непосредственно к созданию кнопки на форме.
Для этого в обработчике события создания формы пишем следующий код:

procedure TfrmExample.FormCreate(Sender: TObject);
begin
btnExample := TButton.Create(Self); // создали непосредственно кнопку
// теперь начинаем проставляет ее свойства
with btnExample do
begin
Caption := ‘Динамическая кнопка’;
Width := 150;
// Распологаем кнопку в середине формы
Left := Round((Self.Width / 2) — (Width / 2));
Top := Round((Self.Height / 2) — (Height / 2));
OnClick := DobtnExampleClick;
{Теперь очень важный момент. Чтобы элемент отображался, на другом элементе управления, будь то форма, панель, и т.д. нужно указать одно свойство}
Parent := Self;
end;
end;

Осталось 2 дописать детали.
Первая из которых это реализация процедуры обработки события OnClick

procedure TfrmExample.DobtnExampleClick(Sender: TObject);
begin
ShowMessage(‘http://www.devprog.wordpress.com‘);
end;

И последняя, это очистка памяти(очень не рекомендую забывать, чистить память):

procedure TfrmExample.FormDestroy(Sender: TObject);
begin
btnExample.Free;
end;

Подводя итог, можно сказать, что таким образом можно создать любой визуальный компонент, и «положить» его на элементы формы, или саму форму.

Posted in Узелок впрок | Отмечено: , , , | 3 комментария »

Узелок впрок! Как запустить Delphi 7 на Windows Vista!

Posted by devprog на Февраль 4, 2009

Для этого нужно скачать официальное исправление от Microsoft – KB947562. Данный патч предназначен для систем:

 Windows Vista x86/x64

 Windows Server 2008 x86/x64

Скачать исправление можно по этой ссылке: http://support.microsoft.com/kb/947562

Как запустить справку от Delphi 7 на Windows Vista?

Справка для Delphi 7 была разработана на устаревшей системе справки WinHlp32.exe. Для успешного использования оной – скачайте и установите следующее исправление:

http://support.microsoft.com/kb/917607

Posted in Delphi, Узелок впрок | Leave a Comment »

Узелок впрок! Как добавить колонки в TValueListEditor ?

Posted by devprog на Февраль 1, 2009

Сегодня утром в Клубе Программистов всплыл вопрос:

ValueListEditor, возможно-ли добавить колонки?

Очень странно, что при достаточной тривиальности задачи, автор не смог её решить, или просто не хотел думать.

Решение:

У этого компонента есть свойства:

ColCount:Integer; // кол-во колонок

TitleCaptions:TStrings; // колонки

Так, мы сначала должны установить ColCount в необходимое кол-во колонок, а потом добавлять новые колонки в TitleCaptions.

Пример:

procedure TForm1.Button1Click(Sender: TObject);
begin
val1.ColCount:=3;
val1.TitleCaptions.Add(‘Bobobo’);
end;

Posted in Узелок впрок | 1 Comment »

Узелок впрок! Как создать кнопку в режиме runtime, которая бы отображалась на компонетне ToolBar?

Posted by devprog на Январь 29, 2009

Мне пришло письмо от одного из моих читателей с вопросом о том, Как создать кнопку в режиме runtime, которая бы отображалась на компонетне ToolBar?

На самом деле сделать это очень даже просто:

 

 

• Киньте на форму компоненту TToolBar.

• Киньте на форму компоненту TButton.

• По событию OnClick у Button1 напишите следующий код:

procedure TForm1.Button1Click(Sender: TObject);
var NewBtn:TToolButton;
begin
NewBtn := TToolButton.Create(ToolBar1);
NewBtn.Caption := ‘RunTime Component!’;
NewBtn.OnClick := BtnClick;
ToolBar1.InsertControl(NewBtn);
end;

• Обьявите в поле Type, после procedure Button1Click(Sender: TObject); следующюю процедуру:

procedure BtnClick(Sender: TObject);

• Нажмите Ctrl+Shift+C (тем самым создав новую процедуру для обьявления)

• Напишите между begin и end следующий код:

ShowMessage(‘http://www.devprog.wordpress.com‘);

• Компилируйте проект и нажимайте на кнопку. Вы увидите, что в режиме runtime создаются новые кнопки типа TToolButton на панели ToolBar1, при нажатии на которые будет вызываться процедура BtnClick.

Вот вы и создали компонент в режиме runtime, который отображается на ToolBar. Всего хорошего.

 

 

Posted in Узелок впрок | 1 Comment »

Узелок впрок! Цветовые константы Borland.

Posted by devprog на Январь 16, 2009

 Цветовая константа  Цвет
clAqua
clBlack
clBlue
clCream
clDkGray
clGray
clGreen
clLime
clLtGray
clMaroon
clMedGray
clMoneyGreen
clNavy
clOlive
clPurple
clRed
clSilver
clSkyBlue
clTeal
clWhite
clYellow
ClScrollBar Цвет полос прокрутки
clBackground Цвет фона рабочего стола
clActiveCaption Цвет заголовка активного окна
clInactiveCaption Цвет заголовка неактивного окна
clMenu Цвет фона меню
clWindow цвет фона окон
clWindowFrame Цвет рамок окон
clMenuText Цвет текста меню
clWindowText Цвет текста окон
clCaptionText цвет текста заголовка неактивного окна
clActiveBorder Цвет юордюра активного окна
clInactiveBorder Цвет бордюра неактивного окна
clAppWorkSpace Цвет рабочей области компонента
clHighlight Цвет фона выделенного текста
clHightlightText Цвет выделенного текста
clBtnFace Цвет поверхности кнопок
clBtnShadow Цвет теней кнопок
clGrayText Цвет текста недоступных элементов
clBtnText Цвет текста кнопок
clInactiveCaptionText Цвет текста заголовка неактивного окна
clBtnHighlight Цвет выделенной кнопки
cl3DDkShadow Для Windows95 и NT. Цвет тёмных теней трёхмерных компонентов
cl3DLight Для Windows95 и NT. Цвет светлых частей трёхмерного компонента
clInfoText Для Windows95 и NT. Цвет текста всплывающих подсказок
clInfoBk Для Windows95 и NT. Цвет фона всплывающих подсказок
clGradientActiveCaption Для Windows98 и Windows2000. Цвет правой стороны градиентной заливки названия активного окна окна.
clGradientInactiveCaption Для Windows98 и Windows2000. Цвет правой стороны градиентной заливки названия неактивного окна окна.

 

Posted in Delphi, С и С++, Узелок впрок | Leave a Comment »

Работа с дисплеем и рабочим столом средствами Borland C++

Posted by devprog на Январь 16, 2009

Очень полезный FAQ по работе с десктопом и дисплеем найден мною на просторах интернета прямо сейчас. Почитаем?

Изменение картинки на рабочем столе

// Для изменения картинки на рабочем столе
// используйте следующий код:
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, «pic.bmp»,
SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
// где pic.bmp — имя вашего файла с картинкой

Изменение картинки на рабочем столе(вариант 2)

//Первый вариант в C++Builder 5 вызывает ругань
// BoundsChecker’a, хотя и работает.
// Нижеприведенный вариант никакой ругани не вызывает, но
// почему-то работает не на всех машинах. Для изменения картинки
// на рабочем столе используйте следующий код:
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, «pic.bmp»,
SPIF_UPDATEINIFILE);
// где pic.bmp — имя вашего файла с картинкой

Изменение параметров экрана

// Для изменения параметров экрана используйте следующий
// код:
DEVMODE DM;
DM.dmSize = sizeof(DEVMODE);
DM.dmBitsPerPel = 16;
// глубина цвета, бит на пиксель
DM.dmPelsWidth = 1024; // разрешение по горизонтали
DM.dmPelsHeight = 768; // разрешение по вертикали
DM.dmFields = DM_BITSPERPEL +
DM_PELSWIDTH +
DM_PELSHEIGHT +
DM_DISPLAYFREQUENCY;
DM.dmDisplayFrequency = 75;
// частота обновления экрана
ChangeDisplaySettings(&DM, 0);
// ЗАМЕЧАНИЕ: при изменении параметров смотрите чтобы
монитор поддерживал это режим

Как узнать частоту обновления экрана

// Для получения частоты обновления экрана напишите следующий код:
HDC hDCScreen = GetDC(NULL);
int Refresh = GetDeviceCaps(hDCScreen, VREFRESH);
ReleaseDC(NULL, hDCScreen);
// в Refresh содержится частота обновления экрана по горизонтали

Как узнать разрешение экрана (VCL вариант)

// Разрешение экрана можно узнать, прочитав значения
// свойств Screen->Width и Screen->Height:
int HorzRes = Screen->Width;
int VertRes = Screen->Height;

Как узнать разрешение экрана (WinAPI вариант)

// Для получения разрешения экрана напишите следующий код:
HDC hDCScreen = GetDC(NULL);
int Horres = GetDeviceCaps(hDCScreen, HORZRES);
int Vertres = GetDeviceCaps(hDCScreen, VERTRES);
ReleaseDC(NULL, hDCScreen);
// в Horres содержится разрешение экрана по горизонтали,
// в Vertres содержится разрешение экрана по вертикали.

Отображение свойств дисплея

// Следующий код отобразит на экране диалоговое
// окно свойств дисплея:

ShellExecute(NULL, «», «Desk.cpl», «», «», SW_SHOWNORMAL);

Как поместить вид рабочего стола в буфер

Напишите следующий код:
#include <Clipbrd.hpp>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
unsigned DataHandle;
HPALETTE APalette;
Word Format;
Graphics::TBitmap *Bitmap=new Graphics::TBitmap;
HDC DC=GetDC(0);
try{
Bitmap->Height=Screen->Height;
Bitmap->Width=Screen->Width;
BitBlt(Bitmap->Canvas->Handle , 0, 0, Screen->Width,
Screen->Height,DC, 0, 0, SRCCOPY);
//Изображение экрана теперь в Bitmap, запишем его в бyфеp обмена
Bitmap->SaveToClipboardFormat(Format,DataHandle,APalette);
Clipboard()->SetAsHandle(Format,DataHandle);
}
__finally
{
delete Bitmap;
ReleaseDC(0,DC);
}
}

Как рисовать на Десктопе

Напишите следующий код:
HDC hdc = CreateDC ( TEXT(«DISPLAY»), NULL, NULL, NULL );
Rectangle( hdc, 100,100, 200, 200);
DeleteDC ( hdc );

Как закрасить рабочий стол по пикселю

Напишите следующий код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{ TCanvas *dt = new TCanvas ;
randomize();
dt->Handle = GetDC(0);
while (dt)
{
dt->Pixels[random(1024)][random(768)]= 0 ;
}
}

Posted in С и С++, Узелок впрок | 1 Comment »

Узелок впрок! Как отобразить окно без заголовка в Ассемблере?

Posted by devprog на Ноябрь 4, 2008

блог программистовВозможно отображать окна, без их заголовка. Достаточно лишь удалить у них свойство WS_CAPTION, которое отвечает как раз за его отображение. Так же, таким способом можно удалять и выставлять другие свойства окон.

Рассмотрим пример:

invoke GetWindowLong,hWnd,GWL_STYLE ; получение информации об окне
and eax,not WS_CAPTION ; удаление WS_CAPTION
invoke SetWindowLong,hWnd,GWL_STYLE,eax ; установка свойств окна

Так, мы получаем сначала все стили окна, в одном числе. А потом из него убераем стиль WS_CAPTION и выставляем всё обратно, но уже без заголовка.

В Delphi, такое возможно путём установки поля BorderStyle значением bsNone.

Вы можете присылать свои советы для рубрики “Узелок впрок” по адресу seorobo@gmail.com

Posted in Ассемблер, Узелок впрок | 11 комментариев »