Новости | Win API | VCL | Прочее | Железо |
Как в таблице 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; |
procedure TForm1.FormCreate(Sender:
TObject); |
При создании формы (OnCreate) напиши
<Название формы>.Brush.Style := bsClear;
Только при перемещени формы её потребуестся
обновлять
или
// автор - Dmitry V. Koreyba , // взято из взято из "Советов по Дельфи" Валентина Озерова var FullRgn, ClientRgn, CtlRgn :
THandle; |
RichEdit1.Perform(EM_LIMITTEXT, нужный размер , 0);
Перед каждым открытием файла это действие
необходимо повторять
В каком порядке происходят события при создании и показе окна? |
OnCreate, OnShow, OnPaint, OnActivate, OnResize и снова OnPaint.
Как в TMemo определить номер строки, в которой находится курсор и его местоположение в строке? |
var X,Y: LongInt; |
component.BeginUpdate |
// Можно, посылая
сообщение 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; { Возвращаемое значение есть порядковый номер символа от начала текста ближайший к указанным координатам (местоположение курсора), если координаты внутри строки, а иначе номер последнего символа строки. } |
// помещаем на
форме 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 вставить // автор алгоритма Michael
Vincze |
Как эмулировать нажатие
клавиши PageUp,PageDown,Down,Up, |
// PageUp //
PageDawn // Другие
возможные параметры: //
Для прокрутки по горизонтали использовать -
WM_HSCROLL, |
// Используйте
функцию 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 и его
панели имеют свойство "owner-draw", // позволяющее Вам использовать любой цвет букв. procedure
TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; |
if SendMessage(ComboBox1.Handle,
CB_GETDROPPEDSTATE,0,0) = 1 then {список ComboBox выпал}; |
Как создать отдельную подсказку (hint) для каждой ячейки StringGrid? |
// В приведенном примере
отслеживается движение курсора мыши // при перемещении между ячейками StringGrid'а // появляется окно подсказки(hint), показываеющее номер текущей // строки и колонки. type |
Как вставить содержимое файла в текущую позицию курсора в компонете 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; |
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; |
{Модуль graphics.pas
содержит функцию ColorToString() которое преобразует
допустимое значение TColor в его строковое
представление используя либо константу-название
цвета (по возможности) либо шестнадцатиричную
строку. Обратная функция - StringToColor() } procedure
TForm1.Button1Click(Sender: TObject); |
{Элементы
управления Windows TEdit и TMemo не имеют режима замены.
Однако этот режим можно эмулировать установив
свойство SelLength edit'а или memo в 1 при обработке
события KeyPress. Это заставит его перезаписывать
символ в текущей позиции курсора. В примере этот
способ используется для TMemo. Режим вставка/замена
переключается клавишей "Insert". } type |
Как сделать, чтобы 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; |
Установите свойтсво ScrollBar.TabStop в False.
Как поместить курсор в определенную позицию edit'а и подобных ему элементов управления? |
procedure TForm1.Button1Click(Sender: TObject);
begin Edit1.SetFocus; {переводим курсор во вторую позицию} Edit1.SelStart := 2; {не выделяем никакого текста} Edit1.SelLength := 0; end; |
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. |
// Во всех потомках
TCustomEdit (точнее, во всех окнах класса // EDIT) - см. HideCaret и ShowCaret в API. HideCaret(HWND: hWnd):boolean;
// дескриптор окна |
// Для этого нужно
заместить метод CreateParams и присвоить // расширенный стиль WS_Ex_Transparent |
// Нужно
отрисовывать ее в обработчике 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; |
// Невизуальные
компоненты без иконоки удобны для
субкомпонентов, // связанных с какими-то другими компонентами. Создайте компонент как // обычно, но используйте RegisterNoIcon вместо RegisterComponent. |
// Перепреоделить
функцию 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. |