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

if Sender is TEdit then …

2. Проблемы с полями класса типа TObject, TTable и т.д.

Я объявляю поле класса как TTable, но при обращении к нему происходит ошибка.

Дело в том, что в Delphi все экземпляры объектов, объявленых как class, являются динамическими. Соответственно поле MyTable, объявленное как

type 

   TMyClass = class(TObject) 

   public 

     MyTable: TTable; 

     constructor Create; 

     destructor Destroy; override

   end;    

является указателем на класс TTable, и должно быть инициализировано в конструкторе вашего объекта и соответственно разрушено в деструкторе следующим образом:

constructor TMyClass.Create; 

begin 

  MyTable := TTable.Create(nil); 

  MyTable.DatabaseName := 'DBDEMOS'

end

destructor TMyClass.Destroy; 

begin 

  MyTable.Free; 

end

Подробнее см. Changes in Object Pascal Language в документации или on-line help.

3. Как закрыть модальную форму (ShowModal)? И вообще, каков лучший способ закрыть любую форму?

Вообще говоря, нужно вызывать метод Close для формы. Close вызывает событие OnClose (обработчик которого может решить, что форму нельзя закрывать, например, если имеются несохраненные данные). Close не освобождает память, связанную с формой, если вы, конечно, не поместите в обработчик события вызов метода Release.

Если вы хотите уничтожить форму без вызова события OnClose, используйте метод Release. Этот метод работает подобно Free, но позволяет всем обработчикам событий данной формы закончить работу перед тем, как память будет освобождена.

Модальные формы "прекращают свой модальный статус", когда вы устанавливаете свойство ModalResult формы в любое значение, отличное от нуля. Если вы поместите кнопку на модальную форму и установите свойство ModalResult для кнопки в некоторое значение, то, когда пользователь нажмет на эту кнопку, форма закроется с результатом, который вы определили. Этот результат можно узнать вызывая ShowModal как функцию. То есть:

Result := Form.ShowModal;

4. Перемещение существующих компонентов на TPanel, TGroup и т.п.

Я поместил кнопку (или что-то другое) на форму, затем поместил панель, и решил переместить кнопку на панель, но ничего не получилось.

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

Но и в вашей ситуации есть решение. Скопируйте (Copy) или вырежьте (Cut) нужный компонент, выберите панель, и сделайте вставку (Paste). Рекомендуется предварительно "подогнать" копируемый компонент в левый верхний угол формы, иначе компонент на панели может выпасть из "пределов видимости" панели (или любого другого группового компонента).

Если компонент все-таки "выпал" из пределов видимости - найдите этот компонент в Инспекторе Объектов, и установите нужные значения его свойств Left и Top.

Используя группы компонент можно огранизовать форму-шаблон, на которой можно складывать (например в Notebook) компоненты с предварительно заданными свойствами, отличными от стандартных. Это решение проще чем добавлять такие компоненты в палитру компонент — не увеличивается размер библиотеки компонентов DCL (Delphi 3.0 не считается), не загромождается палитра компонент.

Учтите, что при таком копировании компонент их имена меняются на новые (Button1, Button2 и т.д.).

5. Как можно добавить новый компонент на страницу TTabbedNoteBook во время выполнения программы? Как нужно определить свойство Parent для этого компонента?

Для того, чтобы добавить компонент на страницу TabbedNotebook, свойству Parent нового компонента нужно присвоить указатель на требуемую страницу. Способ для доступа к любой странице TTabbedNotebook во время выполнения — массив свойств Objects у свойства Pages компонента TTabbedNotebook. Другими словами, страницы сохранены в виде объектов в свойстве Pages (тип TStringList). Пример демонстрирует создание кнопки TButton на второй странице TabbedNotebook1:  

var 

  NewButton: TButton; 

begin 

  NewButton := TButton.Create(Self); 

  NewButton.Parent := TWinControl(TabbedNotebook1.Pages.Objects[0]); 

То же самое справедливо и для компонента TNotebook.

6. Как включить символ & в надпись (Caption)?

Попробуйте: &&

7. Как сделать окно (TForm) без заголовка (Caption)?

Попробуйте использовать следующий код:  

constructor TPanelForm.Create(AOwner: TComponent); 

{ Вызов SetWindowLong API для изменения стиля окна главной формы. } 

{ Берется существующий стиль и убирается флаг WS_CAPTION          } 

var  

  LStyle: Longint; 

begin 

  inherited Create(AOwner); 

  BorderIcons := []; 

  LStyle := GetWindowLong(Handle, GWL_STYLE); 

  LStyle := LStyle and not WS_CAPTION; 

  SetWindowLong(Handle, GWL_STYLE, LStyle); 

{ Перерисуем окно } 

  ForceRepaint; 

end

procedure TPanelForm.ForceRepaint; 

var 

  RectWnd: TRect; 

  WWidth, WHeight: Integer; 

begin 

{ получаем размер окна } 

  GetWindowRect(Handle, RectWnd); 

  WWidth := RectWnd.Right-RectWnd.Left; 

  WHeight := RectWnd.Bottom-RectWnd.Top; 

{ Форсируем полную перерисовку. Это должен делать InvalidateRect() } 

{ но почему-то не делает  : (  } 

{ "сожмем" окно }