Виртуальная библиотека Delphi (fb2) читать постранично, страница - 91


 [Настройки текста]  [Cбросить фильтры]

Поместите в конструктор компонента код, устанавливающий размеры по умолчанию. Переопределите метод SetBounds и проверяйте в нем "componentstate". Если компонет находится режиме "design-time" (csDesigning in ComponentState) просто передавайте значения ширины и высоты (width и heights) компонента по умолчанию (в нашем примере 50) методу класса-предка.

Пример:

procedure TVu.SetBounds(ALeft : integer; ATop : integer; AWidth : integer; AHeight : integer);

begin

 if csdesigning in componentstate then begin

  AWidth := 50;

  AHeight := 50;

  inherited; //вызываем унаследованный от предка метод

 end;

end;


Вопрос:

Можно ли уменьшить потребляемые компонентами TNotebook и TTabbedNotebook ресурсы?

Ответ:

Да. Можно уничтожать обьекты, расположенные не на текущей странице TNotebook или TTabbedNotebook. В примере вызывается защищенный (Protected) метод путем создания так называемый "class cracer'ов".

type TMyTabbedNotebook = class(TTabbedNotebook); //это наш "class cracer"

type TMyNotebook = class(TNotebook);


procedure TForm1.TabbedNotebook1Change(Sender: TObject; NewTab: Integer; var AllowChange: Boolean);

begin

 with TabbedNotebook1 do //вызываем защищенный метод родительского класса

  TMyTabbedNotebook(TWinControl(Pages.Objects[PageIndex])).DestroyHandle;

end;


procedure TForm1.TabSet1Change(Sender: TObject; NewTab: Integer; var AllowChange: Boolean);

begin

 with Notebook1 do //вызываем защищенный метод родительского класса

  TMyNotebook(TWinControl(Pages.Objects[PageIndex])).DestroyHandle;

 NoteBook1.PageIndex := NewTab;

 AllowChange := true

end;


Вопрос:

Функция keybd_event() принимает значения до 244 — как мне отправить нажатие клавиши с кодом #255 в элемент управления Windows?

Ответ:

Это может понадобится для иностранных языков или для специальных символов. (например, в русских шрифтах символ с кодом #255 — я прописное). Приведенный в примере метод не стоит использовать в случае, если символ может быть передан обычным способом (функцией keybd_event()).

procedure TForm1.Button1Click(Sender: TObject);

var KeyData : packed record

 RepeatCount : word;

 ScanCode : byte;

 Bits : byte;

end;

begin

 {Let the button repaint}

 Application.ProcessMessages;

 {Set the focus to the window}

 Edit1.SetFocus;

 {Send a right so the char is added to the end of the line}

 // SimulateKeyStroke(VK_RIGHT, 0);

 keybd_event(VK_RIGHT, 0,0,0);

 {Let the app get the message}

 Application.ProcessMessages;

 FillChar(KeyData, sizeof(KeyData), #0);

 KeyData.ScanCode := 255;

 KeyData.RepeatCount := 1;

 SendMessage(Edit1.Handle, WM_KEYDOWN, 255,LongInt(KeyData));

 KeyData.Bits := KeyData.Bits or (1 shl 30);

 KeyData.Bits := KeyData.Bits or (1 shl 31);

 SendMessage(Edit1.Handle, WM_KEYUP, 255, LongInt(KeyData));

 KeyData.Bits := KeyData.Bits and not (1 shl 30);

 KeyData.Bits := KeyData.Bits and not (1 shl 31);

 SendMessage(Edit1.Handle, WM_CHAR, 255, LongInt(KeyData));

 Application.ProcessMessages;

end;


Вопрос:

Некоторые компоненты не меняют курсор мыши до тех пор пока пользователь не сдвинет мышь. Как эмулировать движение мыши?

Ответ:

В примере мышка слегка "подталкивается" без участия пользователя.

procedure TForm1.Button1Click(Sender: TObject);

var pt : TPoint;

begin

 Application.ProcessMessages;

 Screen.Cursor := CrHourglass;

 GetCursorPos(pt);

 SetCursorPos(pt.x + 1, pt.y + 1);

 Application.ProcessMessages;

 SetCursorPos(pt.x - 1, pt.y - 1);

end;


Вопрос:

Как зарегистрировать расширение файла за своим приложением и контекстное меню, связанное с этим типом?

Ответ:

Пример регистрирует расширение файла(.myext) — файлы этого типа будут открываться приложением MyApp.Exe. Также регнстрируется одно действие (action) по умолчанию для файлов этого типа и два дополнительных пункта контекстного меню, связанного с этим типом файлов. Возможно, потребуется перезайти в систему чтобы изменения вступили в силу.

Пример:

uses Registry;


procedure TForm1.Button1Click(Sender: TObject);

var R : TRegIniFile;

begin

 R := TRegIniFile.Create('');

 with R do begin

  RootKey := HKEY_CLASSES_ROOT;

  WriteString('.myext','','MyExt');

  WriteString('MyExt','','Some description of MyExt files');

  WriteString('MyExt\DefaultIcon','','C:\MyApp.Exe,0');

  WriteString('MyExt\Shell','','This_Is_Our_Default_Action');

  WriteString('MyExt\Shell\First_Action', '','This is our first action');

  WriteString('MyExt\Shell\First_Action\command','', 'C:\MyApp.Exe /LotsOfParamaters %1');

  WriteString('MyExt\Shell\This_Is_Our_Default_Action','', 'This is our default action');

  WriteString('MyExt\Shell\This_Is_Our_Default_Action\command', '','C:\MyApp.Exe %1');

  WriteString('MyExt\Shell\Second_Action', '','This is our second action');

  WriteString('MyExt\Shell\Second_Action\command', '','C:\MyApp.Exe /TonsOfParameters %1');

  Free;

 end;

end;

Примечания

1

использовались только версии ODBC 2.0 и Access 2.0.

(обратно)

2

Local InterBase — однопользовательский SQL сервер базы данных. Версия, включенная в Delphi Desktop, предназначается для использования разработчиками, которые хотят разрабатывать SQL приложения (для последующего переноса их в среду клиент/сервер) без покупки собственной (дорогой) платформы сервера. Однако, Delphi Desktop не включает права распространения на Local InterBase. Если вы хотите распространять однопользовательское приложение, которое его использует, вы должны заплатить дополнительно за deployment kit.  

(обратно)

3

 Версия ReportSmith из Delphi Desktop специально обнаруживает и исключает из списка возможных соединений любой ODBC драйвер к удаленному серверу данных. Да, вы не ослышались. Даже если вы купили ODBC драйвер третьей фирмы, и даже если вы можете прекрасно общаться с этим драйвером из Delphi, ReportSmith еще не будет с ним