Новости Win API VCL Прочее Железо
  1. Как в таблице StringGrid или DrawGrid раскрасить отдельные поля ?
  2. Как встроить ProgressBar в StatusBar ?
  3. Как создать прозрачное окно ?
  4. Как увеличить в RichEdit размер редактируемого файла?
  5. В каком порядке происходят события при создании и показе окна?
  6. Как в TMemo определить номер строки, в которой находится курсор и его местоположение в строке?
  7. Как устранить мерцание при добавлении строк в TListbox / TCombobox / TMemo / TRichEdit ?
  8. Как получить порядковый номер символа от начала текста в RichEdit, который находится под указателем мыши?
  9. Как сделать инкреминтальный поиск в ListBox  ?
    (При вводе очередного символа он позиционирует вас к первой ячейке, начало значения которой совпадает с введенным пользователем текстом)
  10. Как сделать градиентую заливку, н-р формы ?
  11. Как эмулировать нажатие клавиш PageUp,PageDown,Dawn,Up,Left, Rigth, Home, End  в компоненте типа tMemo,tRichEdit... ?
    (управление скролингом компонентов, содержащих ScrollBar)
  12. Как сделать прозрачным фон текста? 
  13. Как изменить цвет текста в StatusBar?
  14. Как опеделить состояние списка ComboBox, выпал/скрыт?
  15. Как создать отдельную подсказку (hint) для каждой ячейки StringGrid?
  16. Как вставить содержимое файла в текущую позицию курсора в компонете TMemo?
  17. Как запрограммировать undo (отмену) в мемо ?
  18. Как узнать во время выполнения имеет ли обьект заданное свойство?
  19. Как преобразовать цвета в строку - название цвета VCL?
  20. Как использовать в TMemo и TEdit режиме замены?
  21. Как сделать, чтобы TStringGrid автоматически изменял ширину колонок, чтобы вместить самую длинную строчку в колонке?
  22. Как отключить мигание ползунка  TScrollBar?
  23. Как поместить курсор в определенную позицию edit'а и подобных ему элементов управления?
  24. Как TMainMenu к TCoolBar'у прикрутить?
  25. Как обратиться к свойству компонента по имени свойства?
  26. Как "отловить" выход курсора мыши за пределы компонента?
  27. Как сделать курсор невидимым в Edit, Memo, RichEdit и т.п.?
  28. Как сделать прозрачный TMemo?
  29. Как сделать фоновую картинку в TMemo?
  30. Как создать компонент во время выполнения?
  31. Как создать компонент, который объединяет несколько компонентов?
  32. Как создать невизуальный компонент без иконоки, которая изображается в палитре компонентов в "design-time" (вроде TField)?
  33. Как создать у одного приложения 2 или более окон, которые бы отображались на панели задач как отдельные приложения?
  34. Можно ли как-то уменьшить мерцание при перерисовке компонента?
  35. От кого лучше наследоваться при создании компонентов?
  36. Получение позиции курсора для TabControl: над какой закладкой находится курсор?
  37. Процедуры управления потоком исполнения (exit,break,continue)



Как в таблице StringGrid или DrawGrid раскрасить
отдельные поля ?

Надо поставить обработчик на событие OnDrawCell:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin

  // если столбец и строка равны тому-то, тому-то
  // или любой другой признак в соответсвии с которым вы
  //хотите раскрасить вашу таблицу :-))

  if (Acol=1) and (ARow=1) then
      // если есть в этой ячейке курсор
       If gdFocused in State then
      // то выкрасим в красный
            // для других таблиц-компонентов надо будет поменять тип компонента
            //                            \/

           with (Sender as TstringGrid).Canvas do
               begin
                 Brush.Color := clRed;
                 FillRect(Rect);
              end
       else
         // иначе в зеленый
         with (Sender as TstringGrid).Canvas do
            begin
              Brush.Color := clgreen;
              FillRect(Rect);
           end;

end;

- назад -

Как встроить ProgressBar в StatusBar ?

procedure TForm1.FormCreate(Sender: TObject);
begin

  // pb - прогрессбар, sb - статусбар
   pb.Parent:=sb;
  with pb do
      begin
       Top := 2;
       Left := 0;
       Height := SB.Height - Top;
      Width := SB.Width - Left;
  end;

end;

- назад -

 

Как создать прозрачное окно ?

При создании формы (OnCreate) напиши <Название формы>.Brush.Style := bsClear;
Только при перемещени формы её потребуестся обновлять

или

// автор - Dmitry V. Koreyba ,
// взято из взято из "Советов по Дельфи" Валентина Озерова

var   FullRgn, ClientRgn, CtlRgn : THandle;

procedure TForm1.DoInvisible;
var
AControl : TControl;
A, Margin, X, Y, CtlX, CtlY : Integer;
begin
Margin := ( Width - ClientWidth ) div 2;
FullRgn := CreateRectRgn(0, 0, Width, Height);
X := Margin;
Y := Height - ClientHeight - Margin;
ClientRgn := CreateRectRgn( X, Y, X + ClientWidth, Y +
                              ClientHeight );
CombineRgn( FullRgn, FullRgn, ClientRgn, RGN_DIFF );
for A := 0 to ControlCount - 1 do
    begin
     AControl := Controls[A];
     if ( AControl is TWinControl ) or ( AControl is
                  TGraphicControl )
       then with AControl do
         begin
         if
Visible then
            begin

             CtlX := X + Left;
             CtlY := Y + Top;
             CtlRgn := CreateRectRgn( CtlX, CtlY,
                        CtlX + Width,CtlY + Height );
             CombineRgn( FullRgn, FullRgn, CtlRgn, RGN_OR );
            end;
        end;
     end;
SetWindowRgn(Handle, FullRgn, TRUE);
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteObject(ClientRgn);
DeleteObject(FullRgn);
DeleteObject(CtlRgn);
end;

procedure TForm1.DoVisible;
begin
FullRgn := CreateRectRgn(0, 0, Width, Height);
CombineRgn(FullRgn, FullRgn, FullRgn, RGN_COPY);
SetWindowRgn(Handle, FullRgn, TRUE);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
DoInvisible;
end;

- назад -

Как увеличить в RichEdit размер редактируемого файла?

RichEdit1.Perform(EM_LIMITTEXT, нужный размер , 0);
Перед каждым открытием файла это действие необходимо повторять

- назад -

В каком порядке происходят события при создании и показе окна?

OnCreate, OnShow, OnPaint, OnActivate, OnResize и снова OnPaint.

- назад -

Как в TMemo определить номер строки, в которой находится курсор и его местоположение в строке?

var X,Y: LongInt;
.........
Y:=Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart, 0);
X:=Memo1.Parform(EM_LINEINDEX, Y, 0);
inc(Y);
X:=Memo1.SelStart-X+1;

- назад -

Как устранить мерцание при добавлении строк ?

component.BeginUpdate
.....
// добавляем строки
.....
component.EndUpdate

- назад -

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

// Можно, посылая сообщение EM_CHARFROMPOS в RichEdit:
procedure TForm1.RichEdit1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
var
p:TPoint;
begin
     p:=Point(x,y);
    StatusBar1.SimpleText:=inttostr(RichEdit1.Perform
                             (EM_CHARFROMPOS,0,LongInt(@p)));
end;
{ Возвращаемое значение есть порядковый номер символа от начала текста ближайший к указанным  координатам (местоположение курсора), если координаты внутри строки, а иначе номер последнего символа строки. }

- назад -

Как сделать инкреминтальный поиск в ListBox  ?

// помещаем на форме label  и listbox
// св-ву KeyPreview формы присваиваем True
// объявляем глобальную переменную

...
var

     FPrefix: array[0..255] of char;
....
// ставим  обработчик события OnEnter
procedure TForm1.ListBox1Enter(Sender: TObject);
begin
  FPrefix[0] := #0;
  Label1.Caption := StrPas(FPrefix);
end;

// и обработчик события OnKeyPress

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
{ Помните о том, что свойство KeyPreview
должно быть установлено в True }
var
  curKey: array[0..1] of char;
  ndx: integer;
begin
if ActiveControl = ListBox1 then
       begin
         // Backspace (??????? ????????)
         if key = #8 then
             begin
               if FPrefix[0] <> #0 then  FPrefix[StrLen(FPrefix) - 1] := #0;
            end
            else begin
                   curKey[0] := Key;
                   curKey[1] := #0;
                   StrCat(FPrefix, curKey);
                   ndx := SendMessage(ListBox1.Handle, LB_FINDSTRING,
                                                                -1, longint(@FPrefix));
                   if ndx <> LB_ERR then ListBox1.ItemIndex := ndx;
                  end;
         Label1.Caption := StrPas(FPrefix);
         Key := #0;
     end;
end;

автор - Ralph Friedman , взято из "Советов по Дельфи" Валентина Озерова

- назад -

Как сделать градиентую  заливку, н-р формы ?

// процедураделает градиентную заливку (сверху в низ)
// параметры - цвета - от и до и объект Canvas, поверхность которого и будет закрашена
procedure GradientRect (FromRGB, ToRGB: TColor;Canvas:tcanvas);
var

    RGBFrom : array[0..2] of Byte; { from RGB values }
    RGBDiff : array[0..2] of integer; { difference of from/to RGB values }
    ColorBand : TRect; { color band rectangular coordinates }
     I : Integer; { color band index }
     R : Byte; { a color band's R value }
     G : Byte; { a color band's G value }
     B : Byte; { a color band's B value }
begin
  { extract from RGB values}
  RGBFrom[0] := GetRValue (ColorToRGB (FromRGB));
  RGBFrom[1] := GetGValue (ColorToRGB (FromRGB));
  RGBFrom[2] := GetBValue (ColorToRGB (FromRGB));
  { calculate difference of from and to RGB values}
  RGBDiff[0] := GetRValue (ColorToRGB (ToRGB)) - RGBFrom[0];
  RGBDiff[1] := GetGValue (ColorToRGB (ToRGB)) - RGBFrom[1];
  RGBDiff[2] := GetBValue (ColorToRGB (ToRGB)) - RGBFrom[2];

  { set pen sytle and mode}
  Canvas.Pen.Style := psSolid;
  Canvas.Pen.Mode := pmCopy;

  { set color band's left and right coordinates}
  ColorBand.Left := 0;
  СolorBand.Right := canvas.ClipRect.Right-Canvas.ClipRect.Left;

   for I := 0 to $ff do
     begin
      { calculate color band's top and bottom coordinates}
      ColorBand.Top := MulDiv (I , canvas.ClipRect.Bottom-Canvas.ClipRect.Top, $100);
      ColorBand.Bottom := MulDiv (I + 1,canvas.ClipRect.Bottom-Canvas.ClipRect.Top, $100);
      { calculate color band color}
       R := RGBFrom[0] + MulDiv (I, RGBDiff[0], $ff);
       G := RGBFrom[1] + MulDiv (I, RGBDiff[1], $ff);
       B := RGBFrom[2] + MulDiv (I, RGBDiff[2], $ff);
       { select brush and paint color band}
       Canvas.Brush.Color := RGB (R, G, B);
       Canvas.FillRect (ColorBand);
     end;
end;

/// а для закраски формы в обработчик формы OnPaint вставить
procedure TForm1.FormPaint(Sender: TObject);
begin
GradientRect (clBlue, clBlack,Canvas);
end;
// а для большего эффекта выставить св-ва
// BorderIcons.biSystemMenu := False;
// BorderIcons.Minimize := False;
// BorderIcons.biMaximize := False;
// BorderStyle := bsNone;

// автор алгоритма Michael Vincze

- назад -

Как эмулировать нажатие клавиши PageUp,PageDown,Down,Up,
Home, End в компоненте типа tMemo,tRichEdit... ?

// PageUp
SendMessage(Memo1.Handle, { HWND of the Memo Control }
                       WM_VSCROLL, { Windows Message }
                       SB_PAGEUP, { Scroll Command }
                        0); { Not Used }

// PageDawn
SendMessage(Memo1.Handle, { HWND of the Memo Control }
                      WM_VSCROLL, { Windows Message }
                      SB_PAGEDOWN, { Scroll Command }
                      0) { Not Used }

// Другие возможные параметры:
// SB_BOTTOM        Прокрутка в самый низ.
// SB_LINEDOWN   Прокрутка на линию вниз.
// SB_LINEUP            Прокрутка на линию вверх.
// SB_PAGEDOWN  Прокрутка на страницу вниз.
// SB_PAGEUP          Прокрутка на страницу вверх
// SB_TOP                  Прокрутка в самый вверх.

// Для прокрутки по горизонтали использовать - WM_HSCROLL,
// вместо WM_VSCROLL
// Возможные параметры

// SB_BOTTOM        Прокрутка в   правый конец.
// SB_LINELEFT       Прокрутка на единицу влево
// SB_LINERIGHT    Прокрутка на единицу вправо
// SB_PAGELEFT      Прокрутка на страницу в лево
// SB_PAGERIGHT   Прокрутка на страницу вправо
// SB_TOP                  Прокрутка в левый конец.

- назад -

Как сделать прозрачным фон текста?

// Используйте функцию SetBkMode().
// Пример:

procedure TForm1.Button1Click(Sender: TObject);
var
   OldBkMode : integer;
begin
  with Form1.Canvas do
         begin
            Brush.Color := clRed;
            FillRect(Rect(0, 0, 100, 100));
            Brush.Color := clBlue;
            TextOut(10, 20, 'Not Transparent!');
            OldBkMode := SetBkMode(Handle, TRANSPARENT);
            TextOut(10, 50, 'Transparent!');
            SetBkMode(Handle, OldBkMode);
         end;
end;

- назад -

Как изменить цвет текста в StatusBar ?

// StatusBar и его панели имеют свойство "owner-draw",
// позволяющее Вам использовать любой цвет букв.

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
begin
  if Panel = StatusBar.Panels[0] then
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;

- назад -

Как опеделить состояние списка ComboBox, выпал/скрыт?

if SendMessage(ComboBox1.Handle, CB_GETDROPPEDSTATE,0,0) = 1
                 then {список ComboBox выпал};

- назад -

Как создать отдельную подсказку (hint) для каждой ячейки StringGrid?

// В приведенном примере отслеживается движение курсора мыши
// при перемещении между ячейками StringGrid'а
// появляется окно подсказки(hint), показываеющее номер текущей
// строки и колонки.

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
procedure StringGrid1MouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
private
{Private declarations}
Col : integer;
Row : integer;
public
{Public declarations}
   end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.Hint := '0 0';
StringGrid1.ShowHint := True;
end;

procedure TForm1.StringGrid1MouseMove
      (Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
r : integer;
c : integer;
begin
StringGrid1.MouseToCell(X, Y, C, R);
with StringGrid1 do
begin
if ((Row <> r) or(Col <> c)) then
begin
Row := r;
Col := c;
Application.CancelHint;
StringGrid1.Hint :=IntToStr(r)+#32+IntToStr(c);
end;
end;
end;

- назад -

Как вставить содержимое файла в текущую позицию курсора в компонете TMemo?

var
TheMStream : TMemoryStream;
Zero : char;
begin
    TheMStream := TMemoryStream.Create;
    TheMStream.LoadFromFile('C:\AUTOEXEC.BAT');
    TheMStream.Seek(0, soFromEnd);
   //Null terminate the buffer!
  
Zero := #0; TheMStream.Write(Zero, 1);
    TheMStream.Seek(0, soFromBeginning);
    Memo1.SetSelTextBuf(TheMStream.Memory);
   TheMStream.Free;
end;

- назад -

Как запрограммировать undo (отмену) в мемо ?

Memo1.Perform(EM_UNDO, 0, 0);

// Если Вы хотите узнать, возможно ли выполнить
// операцию "Undo", проверьте "Undo status":


If Memo1.Perform(EM_CANUNDO, 0, 0) <> 0 then
      begin
    {Отмена возможна}
end;
//  Для выполнения "Redo" выполните "Undo" еще раз

- назад -

Как узнать во время выполнения имеет ли обьект заданное свойство?

function HasProperty(Obj : TObject; Prop : string) : PPropInfo;
begin
  Result := GetPropInfo(Obj.ClassInfo, Prop);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   p : pointer;
begin

p := HasProperty(Button1, 'Color');
if p <> nil then SetOrdProp(Button1, p, clRed)
         else ShowMessage('Button has no color property');

p := HasProperty(Label1, 'Color');
if p <> nil then SetOrdProp(Label1, p, clRed) else
          ShowMessage('Label has no color property');

p := HasProperty(Label1.Font, 'Color');
if p <> nil then SetOrdProp(Label1.Font.Color, p, clBlue) else
          ShowMessage('Label.Font has no color property');
end;

- назад -

Как преобразовать цвета в строку - название цвета VCL?

{Модуль graphics.pas содержит функцию ColorToString() которое преобразует допустимое значение TColor в его строковое представление используя либо константу-название цвета (по возможности) либо шестнадцатиричную строку. Обратная функция - StringToColor() }

procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Add(ColorToString(clRed));
Memo1.Lines.Add(IntToStr(StringToColor('clRed')));
end;

- назад -

Как использовать в TMemo и TEdit режиме замены?

{Элементы управления Windows TEdit и TMemo не имеют режима замены. Однако этот режим можно эмулировать установив свойство SelLength edit'а или memo в 1 при обработке события KeyPress. Это заставит его перезаписывать символ в текущей позиции курсора. В примере этот способ используется для TMemo. Режим вставка/замена переключается клавишей "Insert". }

type
TForm1 = class(TForm)
Memo1: TMemo;
procedure Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure Memo1KeyPress(Sender: TObject; var Key: Char);
private
{Private declarations}
InsertOn : bool;
public
{Public declarations}
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (Key = VK_INSERT) and (Shift = []) then
InsertOn := not InsertOn;
end;

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
if ((Memo1.SelLength = 0) and (not InsertOn)) then
Memo1.SelLength := 1;
end;

- назад -

Как сделать, чтобы TStringGrid автоматически изменял ширину колонок, чтобы вместить самую длинную строчку в колонке?

Как сделать, чтобы TStringGrid автоматически изменял ширину колонок, чтобы вместить самую длинную строчку в колонке?

procedure AutoSizeGridColumn(Grid : TStringGrid; column : integer);
var
      i : integer;
      temp : integer;
      max : integer;
begin
max := 0;
for i := 0 to (Grid.RowCount - 1) do
       begin
         temp := Grid.Canvas.TextWidth(grid.cells[column, i]);
         if temp > max then max := temp;
        end;
  Grid.ColWidths[column] := Max + Grid.GridLineWidth + 3;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
     AutoSizeGridColumn(StringGrid1, 1);
end;

- назад -

 

Как отключить мигание ползунка  TScrollBar?

Установите свойтсво ScrollBar.TabStop в False.

- назад -

Как поместить курсор в определенную позицию edit'а и подобных ему элементов управления?

procedure TForm1.Button1Click(Sender: TObject);
begin
    Edit1.SetFocus;
   {переводим курсор во вторую позицию}
    Edit1.SelStart := 2;
   {не выделяем никакого текста}
   Edit1.SelLength := 0;
end;

- назад -

Как TMainMenu к TCoolBar'у прикрутить?

Hа TCoolBar, ложишь TToolBar, задаешь ему следующие паpаметpы:
AutoSize = True EdgeBorders = [] Flat = True ShowCaption = True
Hа фоpму ложишь TMainMenu, но убиpаешь свойство фоpмы - MainMenu.
Затем в тулбаpе добавляешь кнопки с паpаметpами: AutoSize =

True Caption = Hаименованию веpхнего пункта меню
MenuItem = Name TMenuItem пункта меню  Grouped = True

- назад -

Как обратиться к свойству компонента по имени свойства?

// функция GetStrProp(Instance: TObject; const PropName: string): string
// получает значение строкового свойства PropName объекта Instance.
// GetOrdProp(Instance: TObject; const PropName: string): LongInt -
// аналогично для числовых полей.
// Следующие процедуры устанавливают значения свойств
// SetStrProp(Instance: TObject; const PropName: string; const Value:string)
// SetOrdProp(Instance: TObject; const PropName: string; Value:LongInt)

// Полный список процедур и функций для работы со свойствами можно
// найти в DELPHI\Source\Vcl\TypInfo.pas

// Эти процедуры работают только с published свойствами компонентов.
// Пример:


var CompName, PropName1, PropName2: string;
w: LongInt;
begin
  CompName:='Button1';
  PropName1:='Caption';
  PropName2:='Width';
  w:=GetOrdProp(FindComponent(CompName), PropName2);
  SetStrProp(FindComponent(CompName), PropName1, 'Пример');
  SetOrdProp(FindComponent(CompName), PropName2, w*2);
end;

// Автор: Полуянов Юрий

- назад -

Как "отловить" выход курсора мыши за пределы компонента?

// Все потомки TComponent могут посылать сообщения
// CM_MOUSEENTER и CM_MOUSELEAVE во время
// вхождения и покидания курсора мыши области
// компонента. Если вам необходимо, чтобы ваши
// компоненты обладали реакцией на эти события,
//  необходио написать для них соответствующие
// обработчики. Пример:


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

type
MyLabel = class(TLabel)
   private
     FOnMouseLeave: TNotifyEvent;
     FOnMouseEnter: TNotifyEvent;
   procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
   procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  published
   property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
   property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
end;

procedure Register;

implementation

procedure TBS_Label.CMMouseEnter(var Message: TMessage);
begin
  if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
end;

procedure TBS_Label.CMMouseLeave(var Message: TMessage);
begin
  if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
end;

end.

- назад -

Как сделать курсор невидимым в Edit, Memo, RichEdit и т.п.?

// Во всех потомках TCustomEdit (точнее, во всех окнах класса
// EDIT) - см. HideCaret и ShowCaret в API.

HideCaret(HWND: hWnd):boolean;      // дескриптор окна
ShowCaret(HWND: hWnd):boolean;    // дескриптор окна

- назад -

Как сделать прозрачный TMemo?

// Для этого нужно заместить метод CreateParams и присвоить
// расширенный стиль WS_Ex_Transparent

- назад -

Как сделать фоновую картинку в TMemo?

// Нужно отрисовывать ее в обработчике WM_EraseBkgnd после
// inherited.

- назад -

Как создать компонент во время выполнения?

var
  MyPanel: TPanel;
begin
  // MyForm теперь отвечает за уничтожение MyPanel
  MyPanel := TTPanel.Create(MyForm);
  with MyPanel do begin
    // Выбираем родителей. MyForm отвечает теперь за перерисовку MyButton
    Parent := MyForm;
    Height := 50;
    Width := 100;
    Caption := 'Создали!';
    Left := (MyForm.ClientWidth - width) div 2;
    Top := (MyForm.ClientHeight - height) div 2;
  end;
end;

- назад -

Как создать компонент, который объединяет несколько компонентов?

// Ниже приведен пример компонента, который состоит из двух
// компонентов - TEdit и TButton. При нажатиии на кнопку строка ввода
// принимает текущую дату.
// Пример:

unit MyDateEdit;

interface

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


type
TMyDateEdit = class(TEdit)
   private
    FButton: TButton;
   protected
    procedure ButtonClick(Sender: TObject);
  public
   constructor Create( AOwner: TComponent ); override;
   destructor Destroy;override;
  published
end;

procedure Register;

implementation

procedure TMyDateEdit.ButtonClick(Sender: TObject);
begin
   Text := DateToStr(Now);
end;

constructor TMyDateEdit.Create( AOwner: TComponent );
begin
  inherited Create(AOwner);
  Text := DateToStr(Now);
  FButton := TButton.Create( self );
  FButton.Visible := true;
  FButton.Parent := self;
  FButton.Height := Height-2;
  FButton.Width := Height-2;
  FButton.Left := Width - Height - 2;
  FButton.top := top;
  FButton.OnClick := ButtonClick;
end;

destructor TMyDateEdit.destroy;
begin
  FButton.free;
  inherited destroy;
end;

procedure Register;
begin
  RegisterComponents('Standard', [TMyDateEdit]);
end;

end.

- назад -

Как создать невизуальный компонент без иконоки, которая изображается в палитре компонентов в "design-time" (вроде TField)?

// Невизуальные компоненты без иконоки удобны для субкомпонентов,
// связанных с какими-то другими компонентами. Создайте компонент как
// обычно, но используйте RegisterNoIcon вместо RegisterComponent.

- назад -

Как создать у одного приложения 2 или более окон, которые бы отображались на панели задач как отдельные приложения?

// Перепреоделить функцию CreateParams
// Пример:


type
  TForm1 = class(TForm)
   .....
   private
    procedure CreateParams(var Params:TCreateParams);override;
   .....
  end;


procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle:=(Params.ExStyle or WS_EX_APPWINDOW);
end;

- назад -

Можно ли как-то уменьшить мерцание при перерисовке компонента?

// Если добавить флаг csOpaque (непрозрачный) к свойству
// ControlStyle компонента - то фон компонента перерисовываться не
// будет.   Пример:


constructor TMyControl.Create;
begin
inherited;
ControlStyle := ControlStyle + [csOpaque];
end;

- назад -

От кого лучше наследоваться при создании компонентов?

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

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

TGraphicControl - Хорошая отправная точка для компонентов, которым
не нужен дескриптор окна. Данный класс имеет метод Paint, который должен
быть перекрыт, но не имеет холста.

TCustomControl - Наиболее удачная отправная точка для визуальных
компонентов. Данный класс имеет дескриптор окна, общий набор событий и
свойств и, что
наиболее важно, холст и метод Paint().

- назад -

Получение позиции курсора для TabControl: над какой закладкой находится курсор?

{Функция возвращает номер закладки. На входе -
TabControl.Handle и текущая позиция курсора, которую можно получить
с помощью GetCursorPos
Пример: }

function Form1.ItemAtPos(TabControlHandle: HWND; X, Y: Integer): Integer;
var
  HitTestInfo : TTCHitTestInfo;
  HitIndex : Integer;
begin
  HitTestInfo.pt.x := X;
  HitTestInfo.pt.y := Y;
  HitTestInfo.flags := 0;
  HitIndex := SendMessage(TabControlHandle, TCM_HITTEST, 0,
                           Longint(@HitTestInfo));
  Result := HitIndex;
end;

- назад -

Процедуры управления потоком исполнения

В модуле system содержится три полезных прецедуры управления потоком :
exit - прерывает исполнение текущей процедуры и передает контроль в точку вызова процедуры
break - прерывает исполнение циклов for, while или repeat и передает управление на следующий за циклом оператор
continue - вызывает следующую итерацию циклов for, while или repeat.

- назад -