Выбрать главу

Ответ:

Перехватите F2 на событии keydown.

Пример:

procedure TForm1.ListView1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

 if Ord(Key) = VK_F2 then ListView1.Selected.EditCaption;

end;

Вопрос:

Когда я добавляю обьект в список TStrings как мне его потом уничтожить?

Ответ:

Просто вызовите метод free этого обьекта.

Пример:

procedure TForm1.FormCreate(Sender: TObject);

var Icon: TIcon;

begin

 Icon := TIcon.Create;

 Icon.LoadFromFile('C:\Program Files\BorlandImages\CONSTRUC.ICO');

 ListBox1.Items.AddObject('Item 0', Icon);

end;

procedure TForm1.FormDestroy(Sender: TObject);

begin

 ListBox1.Items.Objects[0].Free;

end;

Вопрос:

Вместо печати графики я хочу использовать резидентный шрифт принтера. Как?

Ответ:

Используте функцию Windows API — GetStockObject() чтобы получить дескриптор (handle) шрифта по умолчанию устройства (DEVICE_DEFAULT_FONT) и передайте его Printer.Font.Handle.

Пример:

uses Printers;

procedure TForm1.Button1Click(Sender: TObject);

var

 tm : TTextMetric;

 i : integer;

begin

 if PrintDialog1.Execute then begin

  Printer.BeginDoc;

  Printer.Canvas.Font.Handle := GetStockObject(DEVICE_DEFAULT_FONT);

  GetTextMetrics(Printer.Canvas.Handle, tm);

  for i := 1 to 10 do begin

   Printer.Canvas.TextOut(100,i * tm.tmHeight + tm.tmExternalLeading,'Test');

  end;

  Printer.EndDoc;

 end;

end;

Вопрос:

Мне нужно программно установить некоторые файлы с установочного диска Windows. На многих компьютерах CAB-файлы установки Windows находятся в каком-то каталоге на жестком диске, на других — Windows был установлен с CD. Как узнать откуда была установленна Windows?

Ответ:

Эту информацию можно получить из реестра.

Пример:

uses Registry;

procedure TForm1.Button1Click(Sender: TObject);

var reg: TRegistry;

begin

 reg := TRegistry.Create;

 reg.RootKey := HKEY_LOCAL_MACHINE;

 reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\SETUP',false);

 ShowMessage(reg.ReadString('SourcePath'));

 reg.CloseKey;

 reg.free;

end;

Вопрос:

Как получить строку сообщения об ошибке Windows код которой получен функцией GetLastError?

Ответ:

Функция RTL SysErrorMessage(GetLastError).

Пример:

procedure TForm1.Button1Click(Sender: TObject);

begin

 {Cause a Windows system error message to be logged}

 ShowMessage(IntToStr(lStrLen(nil)));

 ShowMessage(SysErrorMessage(GetLastError));

end;

Вопрос:

Как заставить Delphi выполнять еще более строгую проверка типов? Например — я создаю пользовательский тип, унаследованный от double и могу передавать его любым функциям, принимающим параметр типа double. Как заставить компилятор проводить более строгую проверку типов и выдавать предупреждение в таких случаях?

Ответ:

См. ответ.

Пример:

type TStrongType = type Double;

type TWeakType = Double;

procedure AddWeakType(var d : TWeakType);

begin

 d := d + 1;

end;

procedure AddStrongType(var d : TStrongType);

begin

 d := d + 1;

end;

procedure AddDoubleType(var d : Double);

begin

 d := d + 1;

end;

procedure TForm1.Button1Click(Sender: TObject);

var

 d : Double;

 s : TStrongType;

 w : TWeakType;

begin

 AddDoubleType(d); {compiles fine}

 AddDoubleType(w); {compiles fine}

 AddDoubleType(s); {<- compile error}

 AddDoubleType(double(s)); {compiles fine}

 AddWeakType(d); {compiles fine}

 AddWeakType(w); {compiles fine}

 AddWeakType(s); {<- compile error}

 AddWeakType(TWeakType(s)); {compiles fine}

 AddStrongType(d); {<- compile error}

 AddStrongType(TStrongType(d)); {compiles fine}

 AddStrongType(w); {<- compile error}

 AddStrongType(TStrongType(w)); {compiles fine}

 AddStrongType(s); {compiles fine}

end;

Вопрос:

Где в Delphi обьявленны VK_Key для A-Z и 0-9?

Ответ:

Они не обьявлены в Delphi поскольку они просто могуть быть заменены буквами. VK_0 до VK_9 то же что и ASCII '0' до '9' ($30 – $39), VK_A до VK_Z то же что и ASCII 'A' до 'Z' ($41 – $5A).

Вопрос:

Как изменить оконную процедуру для TForm?

Ответ:

Переопределите в подклассе TForm оконную процедуру WinProc класса. В примере оконная процедура переопределяется для того чтобы реагировать на сообщение WM_CANCELMODE, показывающее, что выполняется messagebox или какой-либо еще диалог.

Пример:

type TForm1 = class(TForm)

 Button1: TButton;

 procedure WndProc (var Message: TMessage); override;

 procedure Button1Click(Sender: TObject);

private

 {Private declarations}

public

 {Public declarations}

end;

var Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WndProc(var Message: TMessage);

begin

 if Message.Msg = WM_CANCELMODE then begin

  Form1.Caption := 'A dialog or message box has popped up';

 end else inherited // <- остальное сделает родительская процедура

end;

procedure TForm1.Button1Click(Sender: TObject);

 begin ShowMessage('Test Message');

end;

Вопрос:

Как узнать размеры TComboBox с показанным выпадающим списком до показа списка?

Ответ:

На событии FormShow пошлите сообщение CB_SHOWDROPDOWN в ComboBox дважды — один раз чтобы заставить список выпасть, второй — чтобы убрать его. Затем пошлите сообщение CB_GETDROPPEDCONTROLRECT, передав в качестве параметра адрес TRect. TRect будет содержать экранные кординаты прямоугольника описывающего ComboBox вместе с выпавшим списком. Затем Вы можете вызвать ScreenToClient чтобы преобразовать экранные кординаты в координаты клиентской области окна.