Delphi, C++
Главная
Вход
Регистрация
Пятница, 17.05.2024, 07:59Приветствую Вас Гость
Меню сайта

Категории раздела

Привет: Гость

Гость, мы рады вас видеть. Пожалуйста зарегистрируйтесь или авторизуйтесь!
Форма входа

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Друзья

Аниме онлайн Асайт. Сайт для тебя и твоих друзей. Для вашего общения!

Наш опрос
Язык программирования который вы используете
Всего ответов: 283

Мини-чат

Главная » FAQ [ Добавить вопрос ]


Для этого можно воспользоваться API функцией SetBkMode().

procedure
 TForm1.Button1Click(Sender: TObject);
var

  OldBkMode : integer;
begin

  with
 Form1.Canvas do begin
    Brush.Color := clRed;
    FillRect(Rect(0
0100100));
    Brush.Color := clBlue;
    TextOut(10
20'Not Transparent!');
    OldBkMode := SetBkMode(Handle, TRANSPARENT);
    TextOut(10
50'Transparent!');
    SetBkMode(Handle, OldBkMode);
  end
;
end
;


Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

procedure ShadeIt(f: TForm; c: TControl; Width: Integer; Color: TColor); 
var
 
  rect: TRect; 
  old: TColor; 
begin
 
  if
 (c.Visible) then 
  begin
 
    rect := c.BoundsRect; 
    rect.Left := rect.Left + Width; 
    rect.Top := rect.Top + Width; 
    rect.Right := rect.Right + Width; 
    rect.Bottom := rect.Bottom + Width; 
    old := f.Canvas.Brush.Color; 
    f.Canvas.Brush.Color := Color; 
    f.Canvas.fillrect(rect); 
    f.Canvas.Brush.Color := old; 
  end

end


procedure
 TForm1.FormPaint(Sender: TObject); 
var
 
  i: Integer; 
begin
 
  for
 i := 0 to Self.ControlCount - 1 do 
    ShadeIt(Self, Self.Controls[i], 3
, clBlack); 
end


Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php


  The example below demonstrates creating custom caret: 
}
 

unit
 Unit1; 

interface
 

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

type
 
  TForm1 = class
(TForm) 
    Memo1: TMemo; 
    Image1: TImage; 
    Edit1: TEdit; 
    procedure
 Memo1MouseDown(Sender: TObject; Button: TMouseButton; 
      Shift: TShiftState; X, Y: Integer); 
    procedure
 Edit1MouseDown(Sender: TObject; Button: TMouseButton; 
      Shift: TShiftState; X, Y: Integer); 
  private
 
    { Private declarations }
 
  public
 
    { Public declarations }
 
  end


var
 
  Form1: TForm1; 

implementation
 

{$R *.DFM}
 

procedure
 TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin
 
  CreateCaret(Memo1.Handle, Image1.Picture.Bitmap.Handle, 0
0); 
  ShowCaret(Memo1.Handle); 
end


procedure
 TForm1.Edit1MouseDown(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin
 
  CreateCaret(Edit1.Handle, 0
104); 
  ShowCaret(Edit1.Handle); 
end


end



{The form file source (*.dfm) }
 

object
 Form1: TForm1 
  Left = 192
 
  Top = 107
 
  Width = 544
 
  Height = 375
 
  Caption = 'Form1'
 
  Color = clBtnFace 
  Font.Charset = DEFAULT
_CHARSET 
  Font.Color = clWindowText 
  Font.Height = -11
 
  Font.Name
 = 'MS Sans Serif' 
  Font.Style = [] 
  OldCreateOrder = False 
  PixelsPerInch = 96
 
  TextHeight = 13
 
  object
 Image1: TImage 
    Left = 12
 
    Top = 4
 
    Width = 16
 
    Height = 16
 
    AutoSize = True 
    Picture.Data = 
      07544269746D6170B6020000424DB602000000000000B6000000280000001000 
      0000100000000100100000000000000200000000000000000000100000000000 
      000000000000000080000080000000808000800000008000800080800000C0C0 
      C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF 
      FF00000000000000000000000000000000000000000000000000000000000000 
      0000000000000000000000000000000000000000000000000000000000000000 
      000000000000FF7FFF7FFF7FFF7F000000000000FF7FFF7FFF7FFF7FFF7FFF7F 
      00000000FF7FFF7FFF7FFF7F000000000000FF7FFF7FFF7FFF7FFF7FFF7F0000 
      0000FF7FFF7FFF7FFF7FFF7F00000000FF7FFF7FFF7FFF7FFF7FFF7FFF7F0000 
      000000000000FF7FFF7FFF7F0000000000000000FF7FFF7FFF7FFF7F00000000 
      0000000000000000FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F00000000 
      0000000000000000FF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7F000000000000 
      0000000000000000FF7FFF7FFF7F00000000FF7FFF7FFF7FFF7F000000000000 
      00000000000000000000FF7FFF7FFF7FFF7FFF7FFF7FFF7F0000000000000000 
      00000000000000000000FF7FFF7FFF7FFF7FFF7FFF7FFF7F0000000000000000 
      000000000000000000000000FF7FFF7FFF7FFF7FFF7FFF7F0000000000000000 
      000000000000000000000000FF7FFF7FFF7FFF7FFF7F00000000000000000000 
      0000000000000000000000000000FF7FFF7FFF7FFF7F00000000000000000000 
      0000000000000000000000000000FF7FFF7FFF7F000000000000000000000000 
      00000000000000000000000000000000FF7F0000000000000000000000000000 
      0000}
 
  end
 
  object
 Memo1: TMemo 
    Left = 12
 
    Top = 36
 
    Width = 149
 
    Height = 149
 
    Lines.Strings = ('Memo1'

    TabOrder = 0
 
    OnMouseDown = Memo1MouseDown 
  end
 
  object
 Edit1: TEdit 
    Left = 220
 
    Top = 60
 
    Width = 121
 
    Height = 21
 
    TabOrder = 1
 
    Text = 'Edit1'
 
    OnMouseDown = Edit1MouseDown 
  end
 
end
 





Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php

Например, надо найти все TCheckBox на форме и установить из все в положение checked:

var i:integer;
begin


For i:=0 to ComponentCount-1 do  

if Components[i] is TCheckBox then  



(Components[i] as TCheckBox).Checked:=true;  


end
;

Автор Vit 
Взято с Vingrad.ru http://forum.vingrad.ru


Обратится к компоненту по имени можно например так, если стоит 10 CheckBox - от CheckBox1 до CheckBox10 то

For
 i:=1 to 10 do
  (FindComponent(Format('CheckBox%d'
,[i])) as TCheckBox).checked:=true;



Автор Vit
Взято с Vingrad.ru http://forum.vingrad.ru

Если например эти 10 CheckBox все время используются для групповых операций, чтобы не перебирать компоненты можно сделать так.

1) Берем ставим на форму 10 CheckBox
2) объявляем массив

var
 arr:array[1..10of TCheckBox

3) Далее присваиваем указатели массиву:

For i:=1 to 10 do
arr[i]:=FindComponent(Format('CheckBox%d'
,[i])) as TCheckBox;


Все, теперь к каждому CheckBox можно обратится как к элементу массива:

arr[5
].checked:=true;

Так как здесь массив статический никаких действий по освобождению памяти делать не надо, по уничтожении компонентов деструктором формы элементы массива будут показывать вникуда. В любом случае этот массив занимает в памяти 40 байт - не большая плата за скорость и удобство.

Автор Vit
Взято с Vingrad.ru http://forum.vingrad.ru

Возьмите форму, бросьте на нее панель, на onMouseDown панели прицепите код:

procedure
 TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin

ReleaseCapture;
Panel1.Perform(WM_SYSCOMMAND, $F012
0);
end
;


Теперь в run-time панель можно таскать как в дизайне...

Взято с Vingrad.ru http://forum.vingrad.ru

var
Butt:TButton;
begin

Butt:=TButon.Create(Self)
Butt.Parent:=self;
Butt.Visible:=true;
end


Автор ответа: Fantasist (Немного дополнено: Vit )
Взято с Vingrad.ru http://forum.vingrad.ru

procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType);
var


I: Integer;  

ChildControl: TControl;  


begin


for I:= 0 to GroupBox1.ControlCount -1 do  



begin  



ChildControl := GroupBox1.Controls[I];  

ChildControl.Top := ChildControl.Top + 15  



end;  


end
;


Проверить тип контрола надо оператором is:

if
 edit1 is
 TEdit then
....


Затем доступ ко всем свойствам путем приведения класса:

(edit1 as TEdit).text:=''



Автор ответа: Kiber_rat
Взято с Vingrad.ru http://forum.vingrad.ru

В обработчике события onKeyDown попробуй поставить:

Key:=0;

Автор ответа: Vit

Взято с Vingrad.ru http://forum.vingrad.ru

ssShift - это константа применяемая в типе TShiftState (являущемся типом Set) а не логическая, надо примерно так:

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


if (key=$97and (ssShift in Shift) then  

begin  

end;  


end
;

Автор ответа:
Vit
Взято с Vingrad.ru http://forum.vingrad.ru

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

if
 key=vk_F4 then key:=0;
end


Автор ответа:
Vit
Взято с Vingrad.ru http://forum.vingrad.ru

Следующий пример демонстрирует перехват сообщения CM_DIALOGCHAR на уровне формы. Это даст нам возможность реагировать на диалоговые комбинации клавишь только, если нажата клавиша Alt, не давая тем самым отработать стандартному обработчику.

type

  TForm1 = class
(TForm)
    Button1: TButton;
    StringGrid1: TStringGrid;
    procedure
 FormCreate(Sender: TObject);
    procedure
 Button1Click(Sender: TObject);
    procedure
 StringGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private

    { Private declarations }

    procedure
 CMDialogChar(var Message: TCMDialogChar);
      message
 CM_DIALOGCHAR;
  public

    { Public declarations }

  end
;

var

  Form1: TForm1;

implementation


{$R *.DFM}


procedure
 TForm1.FormCreate(Sender: TObject);
begin

  Button1.Caption := 'E&xit'
;
end
;

procedure
 TForm1.Button1Click(Sender: TObject);
begin

  Application.Terminate;
end
;

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

  ShowMessage('Grid keypress = '
 + Char(Key));
  Key := 0
;
end
;

procedure
 TForm1.CMDialogChar(var Message: TCMDialogChar);
begin

  if
 ssAlt in KeyDataToShiftState(Message.KeyData) then
    inherited
;
end
;

Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

Эта статья взята мной из рассылки "СообЧА. Программирование на Delphi". К сожалению авторство не указано, но думаю многим будет интересно.


Класс TApplication, являющийся наследником класса TComponent, представляет собой фундаметальный класс, свойства и методы которого описывают основные характеристики Windows-приложения. Этот класс активно используется для выполнения специфических действий, зависящих от операционной системы.
Иерархия TObject – TPersistent – TComponent
Модуль Forms
В каждом приложении автоматически создается объект Application типа TApplication – приложение. Application имеет ряд свойств, методов, событий, характеризующих приложение в целом.
Собственные свойства класса TApplication.

property Active: Boolean;

Свойство возвращает значение true, если текущее приложение активно. При переходе к другому приложению или при завершении работы, свойство получает значение false. (Ro)

property AllowTesting: Boolean;

Свойство представляет информацию для IDE и может использоваться только самим приложением.

property BiDiKeyboard: string;

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

property BiDiMode: TBiDiMode;

Свойство содержит указание на место размещения приложения при его выполнении в ближневосточных версиях Windows.

property CurrentHelpFile: string;

Свойство содержит имя текущего файла помощи, имеющего расширение .hlp. (Ro)

property : DialogHandle: HWnd;

Свойство обеспечивает доступ к механизму создания окон диалога, не использующих библиотеку VCL. Это свойство содержит дескриптор окна диалога, созваемого с помощью функции API CreateDialog.

property ExeName: string;

Свойство содержит полное имя файла, в котором находится программа, и полный путь к ней.

property Handle: HWnd;

Свойство содержит дескриптор программы, который используется операционной системой Windows.

property HelpFile: string;

Свойство содержит имя справочного файла, который используется по умолчанию, например, при отсутствии всей информации о справочном файле, указанном в свойстве CurrentHelpFile.

property Hint: string;

Свойство содержит строковое выражение, определяющее текст всплывающей подсказки.

property HintColor: TColor;

Свойство содержит значение цвета всплывающей подсказки.

property HintHidePause: integer;

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

property HintPause: integer;

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

property HintShowCuts: Boolean;

Свойство позволяет отображать во всплывающей подсказке "быстрые клаыиши". Если свойство имеет значение true, то комбинация клавиш отображается, если false – нет.

property HintShortPause: integer;

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

property Icon: TIcon;

Значок, который будет использоваться операционной системой для идентификации данного приложения.

property MainForm: TForm;

Свойство определяет главную форму приложения.

property NonBiDiKeyboard: string;

Свойство содержит название раскладки клавиатуры, которая должна использоваться, если текст читается слева направо. (Ro)

property ShowHint: Boolean;

Свойство определяет возможность появления всплывающих подсказок. Если свойство имеет значение true, то всплывающие подсказки появляются, если false – нет.

property ShowMainForm: Boolean;

Свойство определяет возможность отображения главной формы. Если свойство имеет значение true, то главной является форма, которая была главной при разработке. Если главной должна быть другая форма, то этому свойству необходимо присвоить значение false, а свойству MainForm – имя новой главной формы. Свойству Visible формы, которая была главной, необходимо присвоить значение false.

property Terminated: Boolean;

Свойство указывает на завершение работы приложения. Этому свойству присваивается значение true, если Windows посылает ему сообщение WM_QUIT, означающее, что приложение должно завершить работу. (Ro)

property Title: string;

Свойство содержит строковое выражение, являющееся заголовком приложения. Этот заголовок, например, отображается на кнопке панели задач Windows.

property UpdateFormatSetting: Boolean;

Свойство указыва5ет на возможность автоматического изменения формата при пользовательском изменении конфигурации опеарционной системы. Если свойство имеет значение true, то изменение выполняется автоматически.

property UpdateMetricSettings: Boolean;

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

.procedure ActivateHint (CursorPos: TPoint);

Метод позволяет отобразить всплывающую подсказку в заданной точке CursorPos.

procedure BringToFront;

Метод позволяет переместить последнее из активных окон приложения на передний план.

procedure CancelHint;

Метод позволяет убрать всплывающую подсказку.

procedure ControlDestroyed (Control: TControl);

Метод предназначен для внутреннего использования и вызывается автоматически объектом типа TControl.

procedure CreateForm (FormClass: TformClass; var Reference);

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

procedure HandleExeption (Sender: TObject);

Метод предназначен для обработки исключений по умолчанию. Этот метод вызывается, когда в программе не был найден обработчик соответствующего исключения. Метод прерывает выполнение приложения и выдает информационное окно с описанием возникшей ошибки.

procedure HandleMessage;

Метод позволяет прервать выполнение приложения для обработки одного системного сообщения Windows, предоставляя системе возможность выполнять иные действия в ситуациях, когда в приложении выполняются длительные операции, например сложные вычмсления.

function HelpCommand (Command: Word; Data: LongInt): Boolean;

Метод позволяет выполнить быстрый доступ к любой из справочных команд в WinHelp API. Перед отправкой команды Command метод HelpCommand генерирует исключение OnHelp для активной формы или объекта TApplication. О возможных командах справки Windows можно узгать в справочной информации Windows по ключу WinHelp.

function HelpContext (Context: THelpContext): Boolean;

type THelpContext = -MaxLongInt..MaxLongInt;

Метод позволяет отобразить указанный раздел Context справочной системы. Если раздел был удачно отображен, то метод возвращает значение true.

function HelpJump (const JumpID: string): Boolean;

Метод позволяет отобразить указанный раздел JumpID справочной системы. Если раздел был удачно отображен, то метод возвращает значение true.

procedure HideHint;

Метод позволяет скрыть текущую всплывающую подсказку.

procedure HintMouseMessage (Control: TControl; var Message: TMessage);

Метод предназначен для внутреннего пользования и позволяет управлять расположением окна подсказки.

procedure HookMainWindow (Hook: TWindowHook);

type TWindowHook = function (var Message: Tmessage): Boolean of object;

Метод позволяет создать перехватчик системных сообщений.

procedure Initialize;

Метод позволяет инициализировать все подсистемы, определенные для данного приложения. Этот метод при загрузке проекта выполняется первым.

function IsRightToLeft: Boolean;

Метод возвращает значение true, если в приложении используется обход элементов управления в режиме справа налево.

function MessageBox (const Text, Caption: Pchar; Flags: LongInt): integer;

Метод позволяет создать стандартное окно диалога. Подробнее

procedure Minimize;

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

procedure NormalizeAllTopMosts;

Метод позволяет перевести все окна приложения из состояния "всегда поверх остальных окон" в нормальное состояние.

procedure NormalizeTopMosts;

Метод позволяет перевести все окна приложения за исключением главного окна из состояния "всегда поверх остальных окон" в нормальное состояние.

procedure ProcessMessages;

Метод позволяет прервать выполнение приложения для обработки всех системных сообщений Windows, стоящих в очереди. Этот метод позволяет выполнять системе иные действия в ситуациях, когда в приложении выполняются длительные операции, например, сложные вычисления.

procedure Restore;

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

procedure RestoreTopMosts;

Метод позволяет восстановить все открытые окна приложения, находящиеся в нормальном состоянии, в состояние "поверх всех". Данный метод применим только к тем окнам, свойство FormStyle которых имеет значение fsStayOnTop.

procedure Run;

Метод предназначен для внутреннего использования и позволяет начать выполнение приложения. Этот метод вместе с методом инициализации (Initialize) и методом создания главной формы (CreateForm) автоматически записывается в основном блоке программы при создании ее заготовки.

procedure ShowExeption (E: Exeption);

Метод позволяет вывести информационное окно с сообщением, описывающим заданную исключительную ситуацию E.

procedure Terminate;

Метод позволяет завершить работу приложения.

function UpdateAction (Action TbasicAction): Boolean; reintroduce;

Метод позволяет генерировать событие OnActiveUpdate.

function UseRightToLeftAlignment: Boolean;

Метод возвращает значение true, если для выравнивания объектов используется режим ""права налево". Этот метод требуется для проверки приложений в ближневосточных версиях Windows, когда свойство BiDiMode имеет значение bdRightToLeft. Во всех остальных случаях метод возвращает значение false.

function UseRightToLeftReadinf: Boolean;

Метод возвращает значение true, если для вывода текстовой информации используется режим ""права налево". Этот метод требуется для проверки приложений в ближневосточных версиях Windows, когда свойство BiDiMode имеет значение bdRightToLeft. Во всех остальных случаях метод возвращает значение false.

procedure UnhookMainWindow (Hook: TwindowHook);

Метод позволяет удалить перехватчик системных сообщений Hook, созданный методом HookMainWindow.

function UseRightToLeftScrollBar: Boolean;

Метод возвращает значение true, если полосы прокрутки элементов управления должны отображаться с левой стороны. Этот метод используется для проверки приложений в ближневосточных версиях Windows, когда свойство BiDiMode имеет значение bdRightToLeft. Во всех остальных случаях метод возвращает значение false.

property OnActionExecute: TActionEvent;

Событие генерируется, если вызван, но не обработан метод Execute.

property OnActionUpdate: TActionEvent;

Событие генерируется, если вызван, но не обработан метод Update.

property OnActivate: TNotifyEvent;

Событие генерируется, когда приложение становится активным.

property OnDeactivate: TNotifyEvent;

Событие генерируется, когда приложение становится неактивным.

property OnException: TExceptionEvent;

type TExceptionEvent = procedure (Sender: TObject; E: Exception) of object;

Событие генерируется, когда в приложении возбуждается исключительная ситуация, которая не может быть программно обработана в блоке try…except.

property OnHelp: THelpEvent;

type THelpEvent = function (Command: Word; Data: LongInt; var CallHelp: Boolean): Boolean of object;

Событие генерируется, когда в приложении возникает запрос на получение справочной информации.

property OnHint: TNotifyEvent;

Событие генерируется, когда указатель мыши помещается на элемент управления, имеющий всплывающую подсказку.

property OnIdle: TIdleEvent;

type TIdleEvent = procedure (Sender: TObject; var Done: Boolean): of object;

Событие генерируется, когда приложение находится в режиме ожидания, не выполняя никаких действий. Например, ожидается ввод данных.
property OnMessage: TMessageEvent;

type TMessageEvent = procedure (var Msg: TMsg; var Handled: Boolean): of object;

Событие генерируется, когда приложение получает состемное сообщение от операционной системы.

property OnMinimize: TNotifyEvent;

Событие генерируется, когда окна приложения минимизируются.

property OnRestore: TNotifyEvent;

Событие генерируется, когда окна приложения восстанавливаются из свернутого приложения до нормального размера.

property OnShortCut: TShortCutEvent;

type TShortCutEvent = procedure (var Msg: TWMKey; var Handled: Boolean): of object;

Событие генерируется, когда пользователь нажимает на клавиатуре клавишу. Это событие генерируется первым из всех событий, связанных с обработкой нажатия клавиши: OnKeyDown, OnKeyPress и OnKeyUp.

property OnShowHint: TShowHintEvent;

type TShowHintEvent = procedure (var HintStr: string; var CanShow: Boolean; var HintInfo: THintInfo): of object;

Событие генерируется, когда приложение готовится вывести всплывающую подсказку. Параметр HintStr определяет текст подсказки, параметр CanShow – возможность отображения подсказки, а параметр HintInfo содержит информацию о внешнем виде и поведении окна справки.

Взято с Vingrad.ru http://forum.vingrad.ru


При минимизации формы я использую RxTrayIcon, чтобы при этом исчезла
кнопка из Панели задач вызываю ShowWindow(Application.Handle,SW_HIDE).
Но вот незадача - не получается при восстановлении приложения (после клика
на TrayIcon) добиться, чтобы оно становилось поверх других окон и обязательно было активным.

Дело оказалось в следующем : гасить Tray-иконку надо в последнюю очередь,
именно так все работает(ранее сначала гасил Tray-иконку, а уже потом восттанавливал свое приложение).
Таким образом правильно работает следующий код:

procedure
 TForm1.ApplicationMinimize(Sender : TObject);
begin

 RxTrayIcon1.Show;
 ShowWindow(Application.Handle,SW_HIDE);
end
;

procedure
 TForm1.RxTrayIcon1Click(Sender: TObject; Button: TMouseButton;
         Shift: TShiftState; X, Y: Integer);
begin

 Application.Restore;
 SetForeGroundWindow(Application.MainForm.Handle);
 RxTrayIcon1.Hide;
end
;

Авторы ответа:
Song, Den
Взято с Vingrad.ru http://forum.vingrad.ru

Если навсегда - то поставить у формы FormStyle свойство в fsStayonTop,
если надо чтобы просто программа была установлена в активное состояние (как будто кликнули на ней на таскбаре) - Application.BringtoFront


Кроме того можно играться API функцией ShowWindow передавая ей Form1.Handle, или Application.Handle и один из кучи параметров - посмотри на нее Help - там много вариантов.
Автор ответа: Vit

Взято с Vingrad.ru http://forum.vingrad.ru

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

ShowWindow (Application.handle, SW_HIDE); 

Данная команда в основном используется в приложениях, которае активируются через иконку в трее.


Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml


Для этого необходимо обработать сообщение WMQUERYOPEN. Однако обработчик сообщения необходимо поместить в секции private - т.е. в объявлении TForm.


procedure
 WMQueryOpen(var Msg: TWMQueryOpen); message WM_QUERYOPEN; 

Реализация будет выглядеть следующим образом:

procedure WMQueryOpen(var Msg: TWMQueryOpen); 
begin
 
  Msg.Result := 0

end
;

showwindow(Application.handle, SW_HIDE);
showwindow(Frorm1.handle, SW_HIDE);

Автор ответа:
Vit
Взято с Vingrad.ru http://forum.vingrad.ru

oncreate формы ставишь Application.Showmainform:=false; собственно и все , этим решается и вопрос с закладкой в таскбаре и с видимостью формы

Автор ответа: Diamond Cat


Взято с Vingrad.ru http://forum.vingrad.ru

PostMessage(Application.Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 1);     


Автор ответа:
Baa
Взято с Vingrad.ru http://forum.vingrad.ru

Обычная форма:

TForm.Style:=bsNone 

Автор ответа:
Song
Взято с Vingrad.ru http://forum.vingrad.ru




MDIChild форма:

setWindowLong (handle,GWL_STYLE,getWindowLong(handle, GWL_STYLE) and not WS_CAPTION);
width:=width+1
;
width:=width-1
;

Автор ответа: rhf
Взято с Vingrad.ru http://forum.vingrad.ru



{ Private Declaration } 
procedure
 CreateParams(var Params : TCreateParams); override

... 

procedure
 TForm1.CreateParams(var Params : TCreateParams); 

begin
 
inherited
 Createparams(Params); 
with
 Params do 
Style := (Style or
 WS_POPUP) and not WS_DLGFRAME; 
end
;

Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

Всё, что нам нужно, это HRGN и дескриптор (handle) элемента управления. SetWindowRgn имеет три параметра: дескриптор окна, которое будем менять, дескритор региона и булевый (boolean) параметр, который указывает - перерисовывать или нет после изменения. Как только у нас есть дескриптор и регион, то можно вызвать SetWindowRgn(Handle, Region, True) и вуаля!

Здесь приведён пример использования функции BitmapToRgn (описанной в примере Как создать регион(HRNG) по маске).

Заметьте, что Вы не должны освобождать регион при помощи DeleteObject, так как после вызова SetWindowRgn владельцем региона становится операционная система.

var
 
  MaskBmp: TBitmap; 
begin
 
  MaskBmp := TBitmap.Create; 
  try
 
    MaskBmp.LoadFromFile('FormShape.bmp'
); 
    Height := MaskBmp.Height; 
    Width := MaskBmp.Width; 
    // ОС владеет регионом, после вызова SetWindowRgn

    SetWindowRgn(Self.Handle, BitmapToRgn(MaskBmp), True); 
  finally
 
    MaskBmp.Free; 
  end

end
;

Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

Здесь приведён полный пример того, как создать круглую форму.
Не забудьте создать TButton, чтобы окно можно было закрыть.

unit
 Unit1; 

interface
 

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

type
 
  TForm1 = class
(TForm) 
    Button1: TButton; 
    procedure
 FormCreate(Sender: TObject); 
    procedure
 Button1Click(Sender: TObject); 
  private
 
    { Private-Deklarationen}
 
    procedure
 CreateParams(var Params: TCreateParams); override
  public
 
    { Public-Deklarationen}
 
  end
;       

var
 
  Form1: TForm1; 

implementation
 

{$R *.DFM}
 

{ TForm1 }
 

procedure
 TForm1.CreateParams(var Params: TCreateParams); 
begin
 
  inherited
 CreateParams(Params); 

  { удаляем заголовок и рамку }

  Params.Style := Params.Style or
 ws_popup xor ws_dlgframe; 
end


procedure
 TForm1.FormCreate(Sender: TObject); 
var
 
  FormRgn: hRgn; 
begin
 
  {clear form}
 
  Form1.Brush.Style := bsSolid; //bsclear; 

  { делаем круг формы }
 
  GetWindowRgn(Form1.Handle, FormRgn); 

  { удаляем старый объект }
 
  DeleteObject(FormRgn); 
  { делаем прямоугольник формы }

  Form1.Height := 500

  Form1.Width := Form1.Height; 
  { создаём круглую форму }
 
  FormRgn := CreateRoundRectRgn(1
1, Form1.Width - 1
             Form1.height - 1
, Form1.width, Form1.height); 

  { устанавливаем новое круглое окно }

  SetWindowRgn(Form1.Handle, FormRgn, TRUE); 
end


procedure
 TForm1.Button1Click(Sender: TObject); 
begin
 
  Form1.close; 
end


end
.

Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

procedure TForm1.Button4Click(Sender: TObject);
var

  HRegion1, Hreg2, Hreg3: THandle;
  Col: TColor;
begin

  ShowMessage ('Ready for a real crash?'
);
  Col := Color;
  Color := clRed;
  PlaySound ('boom.wav'
0, snd_sync);
  HRegion1 := CreatePolygonRgn (Pts,
    sizeof (Pts) div
 8,
    alternate);
  SetWindowRgn (
    Handle, HRegion1, True);
  ShowMessage ('Now, what have you done?'
);
  Color := Col;
  ShowMessage ('Вам лучше купить новый монитор'
);
end
;

Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

Автор: Fernando Silva

Пример показывает, как при инициализации формы происходит поиск нашего окна, а затем вычисление местоположения нужной нам кнопки в заголовке окна.


  procedure
 TForm1.FormCreate(Sender: TObject); 
  var
 
    hwndHandle: THANDLE; 
    hMenuHandle: HMENU; 
    iPos: Integer; 
   
  begin
 
    hwndHandle := FindWindow(nil
, PChar(Caption)); 
   
    if
 (hwndHandle <> 0then 
    begin
 
      hMenuHandle := GetSystemMenu(hwndHandle, FALSE); 
      if
 (hMenuHandle <> 0then 
      begin
 
        DeleteMenu(hMenuHandle, SC_CLOSE, MF_BYCOMMAND); 
        iPos := GetMenuItemCount(hMenuHandle); 
        Dec(iPos); 
        { Надо быть уверенным, что нет ошибки т.к. -1 указывает на ошибку }
 
        if
 iPos > -1 then 
          DeleteMenu(hMenuHandle, iPos, MF_BYPOSITION); 
      end

    end

  end
;

Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

Автор: Christian Cristofori

В примере показывается, как изменять заголовок окна (видимый в списке задач при переключении между приложениями) при минимизации окна в иконку.

Сперва необходимо определить сообщение поумолчанию:

Const
 
  DefMsgNorm = 'MyApp version 1.0'

  DefMsgIcon = 'MyApp. (Use F12 to turn of)'


И добавить две глобальных переменных:

Var 
  ActMsgNorm : String

  ActMsgIcon : String


Затем при открытии основной формы инициализируем переменные из констант.

Procedure TFormMain.FormCreate( Sender : TObject ); 
Begin
 
  ActMsgNorm := DefMsgNorm; 
  ActMsgIcon := DefMsgIcon; 
  Application.Title := ActMsgNorm; 
End


Затем достаточно в обработчик OnResize добавить следующий код:

Procedure TFormMain.FormResize( Sender : TObject ); 
Begin
 
  If
 ( FormMain.WindowState = wsMinimized ) Then 
    Application.Title := ActMsgIcon 
  Else
 
    Application.Title := ActMsgNorm; 
End



Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

Автор: Vimil Saju

Чтобы добавить дополнительную кнопку, нам прийдётся создать обработчики для следующих событий:
WM_NCPAINT;//вызывается, когда перерисовывается не клиентская область формы
WM_NCACTIVATE; вызывается, когда заголовок формы становится активныи
WM_NCLBUTTONDOWN; вызывается, когда кнопка мыши нажимается на не клиентской области
WM_NCMOUSEMOVE; вызывается, когда курсор мыши передвигается по не клиентской области
WM_MOUSEMOVE;вызывается, когда курсор мыши передвигается по клиентской области
WM_LBUTTONUP; вызывается, когда кнопка мыши отпушена в клиентской области
WM_NCLBUTTONUP; вызывается, когда кнопка мыши отпушена в не клиентской области
WM_NCLBUTTONDBLCLK; вызывается при двойном щелчке мышкой в не клиентской области

Приведённый ниже код модифицирован, чтобы избавиться от нежелательного мерцания кнопки
будем использовать следующие переменные:

h1(Thandle) : хэндл контекста устройства всего окна, включая не клиентскую область.
pressed(boolean): индикатор, показывающий, нажата кнопка или нет.
focuslost(boolean): индикатор, показывающий, находится ли фокус на кнопке или нет.
rec(Trect): размер кнопки.

type
 
  TForm1 = class
(TForm) 
    procedure
 FormPaint(Sender: TObject); 
    procedure
 FormResize(Sender: TObject); 
    procedure
 FormCreate(Sender: TObject); 
  private
 
    { Private declarations }
 
  public
 
    procedure
 WMNCPAINT(var msg:tmessage);message WM_NCPAINT; 
    procedure
 WMNCACTIVATE(var msg:tmessage);message WM_NCACTIVATE; 
    procedure
 WMNCMOUSEDOWN(var msg:tmessage);message WM_NCLBUTTONDOWN; 
    procedure
 WMNCMOUSEMOVE(var msg:tmessage);message WM_NCMOUSEMOVE; 
    procedure
 WMMOVE(var msg:tmessage);message WM_MOUSEMOVE; 
    procedure
 WMLBUTTONUP(var msg:tmessage);message WM_LBUTTONUP; 
    procedure
 WMNCMOUSEUP(var msg:tmessage);message WM_NCLBUTTONUP; 
    procedure
 WNCLBUTTONDBLCLICK(var msg:tmessage);message WM_NCLBUTTONDBLCLK; 
  end


var
 
  Form1: TForm1; 
  h1:thandle; 
  pressed:boolean; 
  focuslost:boolean; 
  rec:trect; 
implementation
 

{$R *.DFM}
 

procedure
 tform1.WMLBUTTONUP(var msg:tmessage); 
begin
 
pressed:=false; 
invalidaterect(form1.handle,@rec,true); 
inherited

end


procedure
 tform1.WMMOVE(var msg:tmessage); 
var
 
tmp:boolean 
begin
 
tmp:=focuslost; 
focuslost:=true; 
if
 tmp<>focuslost then 
  invalidaterect(form1.handle,@rec,true); 
inherited

end

procedure
 tform1.WMNCMOUSEMOVE(var msg:tmessage); 
var
 
pt1:tpoint; 
tmp:boolean; 
begin
 
tmp:=focuslost; 
pt1.x:=msg.LParamLo-form1.left; 
pt1.y:=msg.LParamHi-form1.top; 
if
 not(ptinrect(rec,pt1)) then 
  focuslost:=true 
else
 
  focuslost:=false; 
if
 tmp<>focuslost then 
  invalidaterect(form1.handle,@rec,true); 
end


procedure
 tform1.WNCLBUTTONDBLCLICK(var msg:tmessage); 
var
 
pt1:tpoint; 
begin
 
pt1.x:=msg.LParamLo-form1.left; 
pt1.y:=msg.LParamHi-form1.top; 
if
 not(ptinrect(rec,pt1)) then 
  inherited

end


procedure
 tform1.WMNCMOUSEUP(var msg:tmessage); 
var
 
pt1:tpoint; 
begin
 
pt1.x:=msg.LParamLo-form1.left; 
pt1.y:=msg.LParamHi-form1.top; 
if
 (ptinrect(rec,pt1)) and (focuslost=false) then 
  begin
 
   pressed:=false; 
   
     enter your code here when the button is clicked   
   }
 
   invalidaterect(form1.handle,@rec,true); 
  end
 
else
 
  begin
 
   pressed:=false; 
   focuslost:=true; 
   inherited

  end

end

procedure
 tform1.WMNCMOUSEDOWN(var msg:tmessage); 
var
 
pt1:tpoint; 
begin
 
pt1.x:=msg.LParamLo-form1.left; 
pt1.y:=msg.LParamHi-form1.top; 
if
 ptinrect(rec,pt1) then 
  begin
 
   pressed:=true; 
   invalidaterect(form1.handle,@rec,true); 
  end
 
else
 
  begin
 
   form1.paint; 
   inherited

  end

end


procedure
 tform1.WMNCACTIVATE(var msg:tmessage); 
begin
 
invalidaterect(form1.handle,@rec,true); 
inherited

end


procedure
 tform1.WMNCPAINT(var msg:tmessage); 

begin
 
invalidaterect(form1.handle,@rec,true); 
inherited

end



procedure
 TForm1.FormPaint(Sender: TObject); 
begin
 
h1:=getwindowdc(form1.handle); 
rec.left:=form1.width-75

rec.top:=6

rec.right:=form1.width-60

rec.bottom:=20

selectobject(h1,getstockobject(ltgray_BRUSH)); 
rectangle(h1,rec.left,rec.top,rec.right,rec.bottom); 
if
 (pressed=false) or (focuslost=true) then 
  drawedge(h1,rec,EDGE_RAISED,BF_RECT) 
else
 if (pressed=true) and (focuslost=false) then 
  drawedge(h1,rec,EDGE_SUNKEN,BF_RECT); 
releasedc(form1.handle,h1); 
end


procedure
 TForm1.FormResize(Sender: TObject); 
begin
 
form1.paint; 
end


procedure
 TForm1.FormCreate(Sender: TObject); 
begin
 
rec.left:=0

rec.top:=0

rec.bottom:=0

rec.right:=0

end


Комментарии специалистов:

Дата: 25 Августа 2000г.
Автор: NeNashev nashev@mail.ru

InvalidateRect на событие Resize ничего не даёт. Но даже без него
кнопка всё равно моргает при Resize формы... Надо ещё где-то убрать

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

Названия функций, констант и т.п лучше писать так, как они в описаниях
даются, а не подряд маленькими буквами. Особенно для публикации. Так
оно и читается по большей части лучше, и в С такая привычка Вам не
помешает...

Сравнивать логическое значение с логической константой чтоб получить
логическое значение глупо, так как логическое значение у Вас уже есть.
тоесь вместо
if (pressed=true) and (focuslost=false)
лучше писать
if Pressed and not FocusLost

Для конструирования прямоугольников и точек из координат есть две
простые функции Rect и Point.


В общем Ваша процедура FormPaint может выглядеть так:

procedure TMainForm.FormPaint(Sender: TObject);
var

h1:THandle;
begin

h1:=GetWindowDC(MainForm.Handle);
rec:=Rect(MainForm.Width-75
,6,MainForm.Width-60,20);
if
 Pressed and not FocusLost
then
 DrawFrameControl(h1, rec, DFC_BUTTON, DFCS_BUTTONPUSH or DFCS_PUSHED)
else
 DrawFrameControl(h1, rec, DFC_BUTTON, DFCS_BUTTONPUSH);
ReleaseDC(MainForm.Handle,h1);
end
;

Но вообще-то рисовать эту кнопку надо только при WM_NCPAINT, а не
всегда... И вычислять координаты по другому... Вдруг размер элементов
заголовка у юзера в системе не стандартный? А это просто настраивается...


Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

(перевод одноимённой статьи с delphi.about.com)

Что такое MDI?
MDI расшифровывается как multiple document interface (многодокументный интерфейс). В приложениях с MDI, в основном (родительском) окне можно окрыть более одного дочернего окна. Данная возможность обычно используется в электронных таблицах или текстовых редакторах.

Каждое MDI приложение имеет три основные составляющие:
Одну (и только одну) родительскую форму MDI, Одну и более (обычно больше) дочерних форм MDI, и основное меню MDI.

MDI "мать"
Как уже упоминалось, в проекте MDI приложения может присутствовать только один MDI контейнер (родительская форма) и он должен быть стартовой формой.
Для создания основного окна MDI приложения проделайте следующие шаги:

Запустите Delphi и выберите File | New Application... Delphi создаст новый проект с одной формой под названием form1 (по умолчанию).
В свойстве Name присвойте форме имя frMain.
Установите свойство FormStyle в fsMDIform.
Сохраните этот проект (имя проекта на Ваше усмотрение, например prMDIExample), вместе с uMain.pas в только что созданной директории.
Как Вы успели заметить, для создания основной формы MDI, мы установили свойство FormStyle в fsMDIform. В каждом приложении только одна форма может иметь свойство fsMDIform.

MDI "дети"
Каждое родительское окно MDI нуждается по крайней мере в одной дочерней форме. Дочерние формы MDI - это простые формы, за исключением того, что их видимая часть ограничена размерами родительского окна. Так же при минимизации такого окна, оно помещается не в панель задач, а остаётся внутри родительского окна ( на панель задач попадёт только родительское окно).

Теперь давайте создадим дополнительные формы, а точнее дочерние. Просто выберите File | New Form. Будет создан новый объект формы с именем form1 (по умолчанию). При помощи Object Inspector измените свойство Name в форме form1 на frChild, а свойство FormStyle на fsMDIChild. Сохраните эту форму с соответствующим ей файлом как uchild.pas. Обратите внимание, что при помощи данного свойства мы можем превратить любую существующую форму в дочернюю форму MDI.
Ваше приложение может включать множество дочерних MDI форм такого же или другого типа.

Так же хочется обратить Ваше внимание, что MDI приложение может включать в себя и самые обычные формы, но в отличие от дочерних, они будут отображаться как обычные модальные диалоговые окна (такие как about box, или файловый диалог).

Естевственно, что как на родительском так и на дочернем окнах можно располагать любые элементы управления, однако уже давно сложилась традиция, что на родительской форме располагается панель статуса (status bar) и панель инструментов (toolbar), в то время как на дочерних формах располагаются все остальные контролы, такие как гриды, картинки, поля вводи и т. д.

Автосодание -> Доступные
Теперь давайте произведём некоторые настройки нашего проекта. Выберите Project | Options, откроется диалог опций проекта (Project Options). В левой панели выберите frChild (Авто-создание форм ("Auto-create forms")), и переместите её в правую панель (Доступные формы (Available forms)). Список правой панели содержит те формы, которые используются Вашим приложением, но которые не созданы автоматически. В MDI приложении, по умолчанию, все дочерние формы создаются автоматически и отображаются в родительской форме.

Создание и отображение...
Как упомянуто выше, настройка не позволяет автоматически создавать дочерние окна, поэтому нам необходимо добавить некоторый код, который будет производить создание объекта формы frChild. Следующую функцию CreateChildForm необходимо поместить внутри основной формы (MDI родитель) (наряду с заголовком в interface's private):



uses
 uchild;
...
procedure
 TfrMain.CreateChildForm
         (const
 childName : string);
  var
 Child: TfrChild;
begin

  Child := TfrChild.Create(Application);
  Child.Caption := childName;
end
;



Данный код создаёт одну дочернюю форму с заголовком childName.
Не забудьте, что этот код находится разделе "uses uchild".

На закрытие не минимизировать!
Закрытие дочернего окна в MDI приложении всего навсего минимизирует его в клиентской области родительского окна. Поэтому мы должны обеспечить процедуру OnClose, и установить параметр Action в caFree:

procedure TfrChild.FormClose
      (Sender: TObject; var
 Action: TCloseAction);
begin

 Action := caFree;
end
;

Обратите внимание, что если форма является дочерней формой MDI, и её свойство BorderIcons установлено в biMinimize (по умолчанию), то опять же по умолчанию параметр Action установлен в caMinimize. Если же в дочерней форме MDI нет этих установок, то по умолчанию Action установлен как caNone, означающий, что при закрытии формы ничего не случится.

MDI родительское меню
Каждое MDI приложение должно иметь основное меню с (если больше ничего нет), опцией выравнивания окон. Поскольку мы предварительно переместили дочернюю форму из Авто-создаваемых (Auto-create) в Доступные (Available) формы, то нам нужен будет код, который (пункт меню) будет создавать дочерние формы.

Для создания дочерних окон в нашем приложении будет использоваться пункт меню "New child". Второе меню (Window) будет использоваться для выравнивания дочерних окошек внутри родительского окна-формы.

...Создать и отобразить
В заключении нам необходимо сделать обработчик для пункта меню "New child". При нажатии на пунк меню File | New Child нашего приложения, будет вызываться процедура NewChild1Click которая в свою очередь будет вызывать процедуру CreateChildForm (приведённую выше), для создания (следующего) экземпляра формы frChild.

procedure TfrMain.NewChild1Click(Sender: TObject);
begin

 CreateChildForm('Child '
+IntToStr(MDIChildCount+1));
end
;

Только что созданная дочерняя форма будет иметь заголовок в виде "Child x", где x представляет количество дочерних форм внутри MDI формы, как описано ниже.

Закрыть всё
При работе с приложением, имеющим многодокументный интерфейс, всегда необходимо иметь процедуру, закрывающую все дочерние окна.

procedure TfrMain.CloseAll1Click(Sender: TObject);
var
 i: integer;
begin

for
 i:= 0 to MdiChildCount - 1 do
  MDIChildren[i].Close;
end
;



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

Свойства MdiChildCount и MDIChildren
MdiChildCount свойство read only, содержащее в себе количество созданных дочерних окошек. Если не создано ни одно дочернее окно, то это свойство установлено в 0. Нам прийдётся частенько использовать MdiChildCount наряду с массивом MDIChildren. Массив MDIChildren содержит ссылки на объекты TForm всех дочерних окошек.

Обратите внимание, что MDIChildCount первого созданного дочернего окна равен 1.

Меню Window
Delphi обеспечивает большинство команд, которые можно поместить внутри пункта меню Window. Далее приведён пример вызова трёх основных методов для команд, которые мы поместили в наше приложение:

procedure TfrMain.Cascade1Click(Sender: TObject);
begin

 Cascade;
end
;

procedure
 TfrMain.Tile1Click(Sender: TObject);
begin

 Tile;
end
;

procedure
 TfrMain.ArrangeAll1Click(Sender: TObject);
begin

ArrangeIcons;
end
;


Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

Если в дочерней форме MDI установить BorderStyle в bsNone, то заголовок формы не исчезнет. (Об этом сказано в хелпе). А вот следующий пример решает эту проблему:

type
 
  ... = class
(TForm) 
{ other stuff above }
 
procedure
 CreateParams(var Params: TCreateParams); override
{ other stuff below }
 
  end


... 

Procedure
 tMdiChildForm.CreateParams( var Params : tCreateParams ) ; 
Begin
 
  Inherited
 CreateParams( Params ) ; 
  Params.Style := Params.Style and
 (not WS_CAPTION) ; 
End
;

Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

(...) 

Type
 
    TfrmMain = Class
( TForm ) 
        Private
 
            Procedure
 OnMove( Var Msg : TWMMove ); Message WM_MOVE; 
        End


(...) 

Procedure
 TfrmMain.OnMove( Var Msg : TWMMove ); 
Begin
 
    Inherited

    (...) 
End


(...)
Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

(Перевод одноимённой статьи с сайта delphi.about.com )

В Windows основной элемент пользовательского интерфейса - форма. В Delphi каждый проект имеет по крайней мере одно окно - главное окно приложения. Все окна в Delphi основаны на объекте TForm. В данной статье мы рассмотрим основные события учавствующие в "жизни формы".

Форма
Формы имеют свои свойства, события и методы, при помощи которых Вы можете управлять видом и поведением формы. Форма, это обычный компонент Delphi, но в отличие от других, её нет на панели компонентов. Обычно форма создаётся при создании нового проекта (File | New Application). Вновь созданная форма будет главной формой приложения.

Дополнительные формы в проекте создаются через File | New Form. Так же существуют и другие способы создания форм, но здесь мы не будем рассматривать их...

Как и любой другой компонент (объект) форма имеет свои методы и реагирует на события. Давайте рассмотрим некоторые из этих событий...

Рождение


OnCreate -> OnShow -> OnActivate-> OnPaint -> OnResize -> OnPaint ...


OnCreate
Событие OnCreate возникает при создании TForm и только один раз. При создании формы (у каторой свойство Visible установлено в True), события произойдут в следующем порядке: OnCreate, OnShow, OnActivate, OnPaint.
В обработчике события OnCreate можно сделать какие-либо инициализационные действия, однако, любые объекты созданные в OnCreate будут уничтожены в событии OnDestroy.

OnShow
Это событие генерируется, когда форма станет видимой. OnShow вызывается сразу перед тем, как форма станет видимой. Это событие случается, если установить свойство формы Visible в True, либо при вызове методов Show или ShowModal.

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

OnPaint, OnResize
Эти события вызываются каждый раз, когда форма изначально создаётся. При этом OnPaint вызывается каждый раз, когда какому-нибудь элементу формы необходимо перерисоваться (это событие можно использовать, если необходимо при этом рисовать на форме что-то особенное).

Жизнь
Когда форма создана и все её элементы ждут своих событий, чтобы обрабатывать их, жизнь формы продолжается до тех пор, пока кто-нибудь не нажмёт крестик в верхнем правом углу формы!

Уничтожение
При уничтожении формы, события генерируются в следующем порядке:



... OnCloseQuery -> OnClose-> OnDeactivate -> OnHide -> OnDestroy







OnCloseQuery
Если мы попытаемся закрыть форму при помощи метода Close либо другим доступным способом (Alt+F4 либо через системное меню), то сгенерируется событие OnCloseQuery. Таким образом, это событие можно использовать, чтобы предотвратить закрытие формы. Обычно, событие OnCloseQuery используется для того, чтобы спросить пользователя - уверен ли он (возможно в приложении остались несохранённые данные).


procedure TForm1.FormCloseQuery
(Sender: TObject; var
 CanClose: Boolean);
begin

if
 MessageDlg('Really close this window?',
 mtConfirmation, [mbOk, mbCancel], 0
) = mrCancel then
 CanClose := False;
end
;


Обработчик события OnCloseQuery содержит переменную CanClose, которая определяет, можно ли форме закрыться. Изначальное значение этой переменной True. Однако в обработчике OnCloseQuery можно установить возвращаемое значение CloseQuery в False, чтобы прервать выполнение метода Close.

OnClose
Если OnCloseQuery вернул CanClose=True (что указывает на то, что форма должна быть закрыта), то будет будет сгенерировано событие OnClose.
Событие OnClose даёт последний шанс, чтобы предотвратить закрытие формы. Обработчик OnClose имеет параметр Action со следующими четырьмя возможными значениями:
caNone. Форме не разрешено закрыться. Всё равно, что мы установим CanClose в False в OnCloseQuery.
caHide. Вместо закрытия, форма будет скрыта.
caFree. Форма будет закрыта, и занятые ей ресурсы будут освобождены.
caMinimize. Вместо закрытия, форма будет минимизирована. Это значение устанавливается поумолчанию у дочерних форм MDI.

Замечание: Когда пользователь шутдаунит Windows, то будет вызвано OnCloseQuery, а не OnClose. Если Вы не хотите, чтобы Windows завершила свою работу, то поместите свой код в обработчик события OnCloseQuery, хотя CanClose=False не сделает, того, что сделано здесь.

OnDestroy
После того, как метод OnClose будет обработан и форма будет закрыта, то будет вызвано событие OnDestroy. В OnCreate обычно делаются действия, противоположные тем, которые проделывались в OnCreate, то есть уничтожение созданных объектов и освобождение выделенной памяти.


Естевственно, что когда главная форма проекта будет закрыто, то приложение будет завершено.



Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

одноимённой статьи с сайта delphi.about.com

В статье рассматривается приём создания обработчиков сообщений, которые позволяют форме при перетаскивании "прилипать" к краям экранной области.

Конечно же в Win API такой возможности не предусмотрено, поэтому мы воспользуемся сообщениями Windows. Как нам извесно, Delphi обрабатывает сообщения через события, генерируя его в тот момент, когда Windows посылает сообщений приложению. Однако некоторые сообщения не доходят до нас. Например, при изменении размеров формы, генерируется событие OnResize, соотвествующее сообщению WM_SIZE, но при перетаскивании формы никакой реакции не происходит. Конечно же форма может получить это сообщение, но изначально никаких действий для данного сообщения не предусмотрено.

Итак, при перемещении, окну посылается сообщение WM_MOVING. Обрабатывая данной сообщение, приложение может отслеживать размер и расположение перетаскиваемого квадрата и, при необходимости, изменять их.

Так же существует сообщение WM_WINDOWPOSCHANGING, которое посылается окну, в случае, если его размер, расположение или место в Z порядке собираются измениться, как результат вызова функции SetWindowPos либо другой функции управления окном.

Чаще всего с сообщением передаются дополнительные параметры, которые сообщают нам необходимую информацию. Например, сообщение WM_MOVE, указывающее на то, что форма изменила своё местоположение, так же передаёт в параметре LPARAM новые координаты X и Y.

Сообщение WM_WINDOWPOSCHANGING передаёт нам ТОЛЬКО один параметр - указатель на структуру WindowPos, которая содержит информацию о новом размере и местоположении окна. Вот как выглядит структура WindowPos:



TWindowPos = packed
 record
  hwnd: HWND; {Identifies the window.}

  hwndInsertAfter: HWND; {Window above this one}

  x: Integer; {Left edge of the window}

  y: Integer; {Right edge of the window}

  cx: Integer; {Window width}

  cy: Integer; {Window height}

  flags: UINT; {Window-positioning options.}

end
;



Наша задача проста: нам необходима, чтобы форма прилипла к краю экрана, если она находится на определённом расстоянии от окна (допустим 20 пикселей).

Пример
К новой форме добавьте Label, один контрол Edit и четыре Check boxes. Измените имя контрола Edit на edStickAt. Измените имена чекбоксов на chkLeft, chkTop, и т.д... Для установки количества пикселей используем edStickAt, который будет использоваться для определения необходимого расстояния до края экрана достаточного для приклеивания формы.

Нас интересует только одно сообщение WM_WINDOWPOSCHANGING. Обработчик для данного сообщения будет объявлен в секции private. Ниже приведён полный код этого процедуры "прилипания" вместе с комментариями. Обратите внимание, что Вы можете предотвратить "прилипание" формы к определённому краю, путё снятия нужной галочки.

Для получения рабочей области декстопа (минус панель задач, панель Microsoft и т.д.), используем SystemParametersInfo, первый параметр которой SPI_GETWORKAREA.


...

  private

   procedure
 WMWINDOWPOSCHANGING
            (Var
 Msg: TWMWINDOWPOSCHANGING);
             message
 WM_WINDOWPOSCHANGING;

...

procedure
 TfrMain.WMWINDOWPOSCHANGING
          (var
 Msg: TWMWINDOWPOSCHANGING);
const

  Docked: Boolean = FALSE;
var

  rWorkArea: TRect;
  StickAt : Word;
begin

  StickAt := StrToInt(edStickAt.Text);
  
  SystemParametersInfo
     (SPI_GETWORKAREA, 0
, @rWorkArea, 0);

  with
 Msg.WindowPos^ do begin
    if
 chkLeft.Checked then
     if
 x <= rWorkArea.Left + StickAt then begin
      x := rWorkArea.Left;
      Docked := TRUE;
     end
;

    if
 chkRight.Checked then
     if
 x + cx >= rWorkArea.Right - StickAt then begin
      x := rWorkArea.Right - cx;
      Docked := TRUE;
     end
;

    if
 chkTop.Checked then
     if
 y <= rWorkArea.Top + StickAt then begin
      y := rWorkArea.Top;
      Docked := TRUE;
     end
;

    if
 chkBottom.Checked then
     if
 y + cy >= rWorkArea.Bottom - StickAt then begin
      y := rWorkArea.Bottom - cy;
      Docked := TRUE;
     end
;

    if
 Docked then begin
      with
 rWorkArea do begin
      // не должна вылезать за пределы экрана

      if
 x < Left then x := Left;
      if
 x + cx > Right then x := Right - cx;
      if
 y < Top then y := Top;
      if
 y + cy > Bottom then y := Bottom - cy;
      end
{ширина rWorkArea}
    end
{}
  end
{с Msg.WindowPos^}

  inherited
;
end
;
end
.



Теперь достаточно запустить проект и перетащить форму к любому краю экрана.

А также можно взять готовый пример (~6Kb)

Вот собственно и всё.


Комментарии:

Автор: Nashev

а так короче... И, ИМХО, лучше:

procedure TCustomGlueForm.WMWindowPosChanging1(var Msg: TWMWindowPosChanging);
var

WorkArea: TRect;
StickAt : Word;
begin

StickAt := 10
;
SystemParametersInfo(SPI_GETWORKAREA, 0
, @WorkArea, 0);
with
 WorkArea, Msg.WindowPos^ do begin
// Сдвигаем границы для сравнения с левой и верхней сторонами

Right:=Right-cx;
Bottom:=Bottom-cy;
if
 abs(Left - x) <= StickAt then x := Left;
if
 abs(Right - x) <= StickAt then x := Right;
if
 abs(Top - y) <= StickAt then y := Top;
if
 abs(Bottom - y) <= StickAt then y := Bottom;
end
;
inherited
;
end
;

Скачать демонстрационный проект с исходниками - 167Kb

В проекте осталось 2 глюка:

1) Если у формы, к которой прицепили другую форму за правую/нижнюю границы попробовать переместить эти границы, прицепленная форма останется на месте но все равно будет прикрепленной.

2) Иногда 3 формы прикрепляются друг к другу, и иначе, как воспользовавшись 1-ым глюком, их не расцепить.

Состав проекта:
сам проект, uCustomGlueForm - форма с добавленной липкостью 3 формы - пустышки, наследники TCustomGlueForm

Для использования сделанного в своих проектах надо добавить в проект, и свои формы создавать, наследуя от него, например, через мастер "File/New..."
В принципе, если липкость нужна без прилипания (а это уже работает без глюков) можно выкинуть все методы, кроме
procedure WMWindowPosChanging(var Msg: TWMWindowPosChanging);message WM_WINDOWPOSCHANGING;
и все переменные, а в самом WMWindowPosChanging удалить все упоминания этих переменных.


Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

Для начала необходимо установить свойство формы KeyPreview в True. А потом уже можно отлавливать "Esc":

procedure
 TForm1.FormCreate(Sender: TObject);
begin

  Form1.KeyPreview := True;
end
;

procedure
 TForm1.FormKeyPress
  (Sender: TObject; var
 Key: Char);
begin

  if
 key = #27 then Close;
end
;

Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

Автор: Lutfi Baran

Пример демонстрирует вывод теста случайным образом на форме под определённым углом. Добавляем в форму компонент TButton и в событие OnClick следующий код:

procedure
 TForm1.Button1Click(Sender: TObject); 
var
 
   logfont:TLogFont; 
   font: Thandle; 
   count: integer; 
begin
 
       LogFont.lfheight:=20

       logfont.lfwidth:=20

       logfont.lfweight:=750

       LogFont.lfEscapement:=-200

       logfont.lfcharset:=1

       logfont.lfoutprecision:=out
_tt_precis; 
       logfont.lfquality:=draft_quality; 
       logfont.lfpitchandfamily:=FF_Modern; 

       font:=createfontindirect(logfont); 

       Selectobject(Form1.canvas.handle,font); 

       SetTextColor(Form1.canvas.handle,rgb(0
,0,200)); 
       SetBKmode(Form1.canvas.handle,transparent); 

       for
 count:=1 to 100 do 
       begin
 
        canvas.textout(Random(form1.width),Random(form1.height),'Hello'
); 
        SetTextColor(form1.canvas.handle,rgb(Random(255
),Random(255),Random 
         (255
))); 
       end

     Deleteobject(font); 
end
;



Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

Необходимо объявить обработчик события для WM_GETMINMAXINFO:

... 
private
 
  procedure
 WMGetMinMaxInfo(var Message : TWMGetMinMaxInfo); 
  message
 WM_GETMINMAXINFO; 


А вот как выглядит сам обработчик:

procedure TForm1.WMGetMinMaxInfo(var Message : TWMGetMinMaxInfo); 
begin
 
  Message
.MinMaxInfo^.ptMinTrackSize := Point(Width, Height); 
  Message
.MinMaxInfo^.ptMaxTrackSize := Point(Width, Height); 
end


Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

Примечание от Vit:

Начиная с Дельфи 5 появилось удобное свойство Constrains - специально для ограничесния минимальных и максимальных размеров...

uses 
  Windows; 

procedure
 PlaceMyMouse(Sender: TForm; X, Y: word); 
var
 
  MyPoint: TPoint; 
begin
 
  MyPoint := Sender.ClientToScreen(Point(X, Y)); 
  SetCursorPos(MyPoint.X, MyPoint.Y); 
end
;

Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

Для этого можно воспользоваться API функцией GetCapture().

procedure
 TForm1.FormDeactivate(Sender: TObject);
begin

  ReleaseCapture;
end
;

procedure
 TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin

  If
 GetCapture = 0 then
    SetCapture(Form1.Handle);
  if
 PtInRect(Rect(Form1.Left,
                   Form1.Top,
                   Form1.Left + Form1.Width,
                   Form1.Top + Form1.Height),
                   ClientToScreen(Point(x, y))) then

  Form1.Caption := 'Мышка на форме'
 else
  Form1.Caption := 'Мышка за пределами формы'
;
end
;

Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

Для этого Вам понадобится переопределить процедуру CreateParams у желаемой формы. А в ней установить params.WndParent в дескриптор окна, к которому Вы хотите прикрепить форму.

... = class
(TForm) 
  ... 
  protected
 
    procedure
 CreateParams( var params: TCreateParams ); override
... 

procedure
 TForm2.Createparams(var params: TCreateParams); 
var
 
   aHWnd : HWND; 
begin
 
  inherited

{как-нибудь получаем существующий дескриптор}

  ahWnd := GetForegroundWindow; 
{а теперь:}

  params.WndParent := ahWnd; 
end





Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

Самый простой способ, это изменить цветовую схему в свойствах экрана...

А вот при помощи следующей команды можно разукрасить ProgressBar не изменяя системных настроек:

PostMessage(ProgressBar1.Handle, $0409
0, clGreen); 

Вуаля! Теперь Progress Bar зелёный. Это всего лишь простой пример чёрной магии ;)

Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

Статусбар, это стандартный элемент управления Windows и как все отображает шрифт, заданный в параметре clBtnText, который устанавливается через Панель управления. Поумолчанию этот цвет чёрный, но он может менятся в зависимоти пользовательской темы. StatusBar и связанные с ним панели имеют возможность самостоятельной перерисовки (owner-draw), позволяющей рисовать текст различными цветами. Для этого необходимо в TStatusBar.Panels установить свойство Style в OwnerDraw.

procedure
 TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; 
  Panel: TStatusPanel; const
 Rect: TRect); 
begin
 
  if
 Panel = StatusBar.Panels[0then begin 
    StatusBar.Canvas.Font.Color := clRed; 
    StatusBar.Canvas.TextOut(Rect.Left, Rect.Top, 'Panel - 0'

  end
 else begin 
    StatusBar.Canvas.Font.Color := clGreen; 
    StatusBar.Canvas.TextOut(Rect.Left, Rect.Top, 'Panel - 1'
); 
  end

end
;

Взято с Исходников.ru http://www.sources.ru/delphi_src1.shtml

Корректнее было бы самому канву рисовать, но можно и просто вставить - держи функцию для этого - применять вместо стандартного метода Create.

Function
 CreateProgressBar(StatusBar:TStatusBar; index:integer):TProgressBar;
var
 findleft:integer;
i:integer;
begin

result:=TProgressBar.create(Statusbar);
result.parent:=Statusbar;
result.visible:=true;
result.top:=2
;
findleft:=0
;
for
 i:=0 to index-1 do findleft:=findleft+Statusbar.Panels[i].width+1;
result.left:=findleft;
result.width:=Statusbar.Panels[index
].width-4;
result.height:=Statusbar.height-2
;
end
;

Автор ответа:
Vit
Взято с Vingrad.ru http://forum.vingrad.ru

Этот StatusBar позволит размещать на себе любые другие контролы.
Создаем новый компонент от StatusBar и првим код как внизу. Потом инсталлируем и все.

unit
 StatusBarExt;

interface


uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls;

type

TStatusBarExt = class
(TStatusBar)
public

constructor
 Create(AOwner: TComponent); override// добавить конструктор
end
;

procedure
 Register;

implementation


uses
 Consts; // не забыть

constructor
 TStatusBarExt.Create( AOwner : TComponent );
begin

inherited
 Create(AOwner);
ControlStyle := ControlStyle + [csAcceptsControls]; // собственно все!

end
;

procedure
 Register;
begin

RegisterComponents('Samples'
, [TStatusBarExt]);
end
;

end
.

Автор man2002ua
Взято с Vingrad.ru http://forum.vingrad.ru

В стандартном RichEdit нельзя, для RichEdit с картинками используйте RichEdit из RxLib или JVCL.


Автор ответа Vit
Взято с Vingrad.ru http://forum.vingrad.ru


1-50 51-94
Поиск

Наш Банер

Мы будем вам признательны, если вы разместите нашу кнопку у себя на сайте. Если вы хотите обменяться с нами баннерами, пишите в гостевую книгу:

Все для программиста

Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz


  • Copyright MyCorp © 2024Бесплатный хостинг uCoz