Можно ли обратиться к колонке или строке grid’а по заголовку


Содержание

Можно ли обратиться к колонке или строке grid’а по заголовку?

function GetGr >string ): integer ;
var
i: integer ;
begin
for i := 0 to Gr >1 do
if Gr >0 ].Strings[i] = ColName then
begin
Result := i;
exit ;
end ;
Result := — 1 ;
end ;

function GetGr >string ): integer ;
var
i: integer ;
begin
for i := 0 to Gr >1 do
if Gr >0 ].Strings[i] = RowName then
begin
Result := i;
exit ;
end ;
Result := — 1 ;
end ;

Заголовки полей грида

You must login or register to post a reply

Posts: 25

1 Topic by zoomix 2014-11-20 17:29:51

  • zoomix
  • Member
  • Offline
  • Registered: 2014-11-13
  • Posts: 325

Topic: Заголовки полей грида

В настройках грида есть возможность каждому полю присваивать свое приозвольное название. Это здорово, но вот выделить как-то этот заголовок — нельзя, он приписывается тем же фонтом и тем же цветом, что и весь выводимый в гриде текст и как-то сливается с данными, а заголовок должен, наоборот, выделяться. Можно как-то сделать надписи заголовков другим цветом и фонтом?

2 Reply by zoomix 2014-11-20 17:49:04

  • zoomix
  • Member
  • Offline
  • Registered: 2014-11-13
  • Posts: 325

Re: Заголовки полей грида

И еще вопрос, какие функции у группенбокса, для чего он предназначен?

3 Reply by DriveSoft 2014-11-20 18:00:44

  • DriveSoft
  • Administrator
  • Offline
  • Registered: 2014-02-14
  • Posts: 9,862

Re: Заголовки полей грида

Шрифт заголовка к сожалению сменить нельзя, но цвет их фона можно с помощью скриптов, сделал для вас пример

Grid Colored headers.zip 5.36 kb, 543 downloads since 2014-11-20

4 Reply by DriveSoft 2014-11-20 18:02:21

  • DriveSoft
  • Administrator
  • Offline

  • Registered: 2014-02-14
  • Posts: 9,862

Re: Заголовки полей грида

И еще вопрос, какие функции у группенбокса, для чего он предназначен?

просто декоративная, функционала нет у этого компонента.

5 Reply by zoomix 2014-11-20 18:30:22 (edited by zoomix 2014-11-20 18:32:21)

  • zoomix
  • Member
  • Offline
  • Registered: 2014-11-13
  • Posts: 325

Re: Заголовки полей грида

Спасибо за пример!

По группенбоксу понятно, что-то типа рамок с текстом.

Как отформатировать дату и время, чтобы сэкономить место в гриде:
Допустим вместо:
20.11.2014 — достаточно 20.11.14
и по времени:
14:20:59 — на 14:20

6 Reply by zoomix 2014-11-20 18:40:43 (edited by zoomix 2014-11-20 18:53:51)

  • zoomix
  • Member
  • Offline
  • Registered: 2014-11-13
  • Posts: 325

Re: Заголовки полей грида

И еще: в строке грида нельзя показывать фото из blob небольшой иконкой?

7 Reply by DriveSoft 2014-11-20 20:39:50

  • DriveSoft
  • Administrator
  • Offline
  • Registered: 2014-02-14
  • Posts: 9,862

Re: Заголовки полей грида

Как отформатировать дату и время, чтобы сэкономить место в гриде:
Допустим вместо:
20.11.2014 — достаточно 20.11.14
и по времени:
14:20:59 — на 14:20

Это можно сделать с помощью вычисляемого поля


где datetime — поле типа Дата/Время

8 Reply by DriveSoft 2014-11-20 20:40:10

  • DriveSoft
  • Administrator
  • Offline
  • Registered: 2014-02-14
  • Posts: 9,862

Re: Заголовки полей грида

И еще: в строке грида нельзя показывать фото из blob небольшой иконкой?

Можно ли обратиться к колонке или строке grid’а по заголовку?

Как разместить прозрачную надпись на TBitmap?

procedure TForm1.Button1Click(Sender: TObject); var OldBkMode : integer; begin Image1.Picture.Bitmap.Canvas.Font.Color := clBlue; OldBkMode := SetBkMode(Image1.Picture.Bitmap.Canvas.Handle,TRANSPARENT); Image1.Picture.Bitmap.Canvas.TextOut(10, 10, ‘Hello’); SetBkMode(Image1.Picture.Bitmap.Canvas.Handle,OldBkMode); end;

Вопрос:

Можно ли обратиться к колонке или строке grid’а по заголовку?

В следующем примере приведены две функции: GetGridColumnByName() и GetGridRowByName(), которые возвращают колонку или строку, имеющую заданный заголовок (caption).

procedure TForm1.FormCreate(Sender: TObject); begin StringGr + IntToStr(Row)); end;

Вопрос:

Как использовать клавишу-акселератор в TTabsheets? Я добавляю клавишу-акселератор в заголовок каждого Tabsheet моего PageControl, но при попытке переключать страницы этой клавишей программа пикает и ничего не происходит.

Можно перехватить сообщение CM_DIALOGCHAR.

Вопрос:

При использованиии компонента TRegistry под NT пользователь с права доступа ниже чем «администратор» не может получить доступа к информации реестра в ключе HKEY_LOCAL_MACHINE. Как это обойти?

Проблема вызвана тем, что TRegistry всегда открывает реестр с параметром KEY_ALL_ACCESS (полный доступ), даже если необходим доступ KEY_READ (только чтение). Избежать этого можно используя функции API для работы с реестром (RegOpenKey и т.п.), или создать новый класс из компонента TRegestry, и изменить его так чтобы можно было задавать режим открытия реестра.

Вопрос:

Можно ли изменить число колонок и их ширину в компоненте TFileListBox?

В приведенном примере FileListBox приводится к типу TDirectoryListBox — таким образом можно добавиь дополнительные колонки.

with TDirectoryListBox(FileListBox1) do begin Columns := 2; SendMessage(Handle, LB_SETCOLUMNWIDTH, Canvas.TextWidth(‘WWWWWWWW.WWW’),0); end;

Вопрос:

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

Пошлите в Memo сообщение EM_SETTABSTOPS. Например установим первую позицию табуляции на 20-й пиксел.

procedure TForm1.FormCreate(Sender: TObject); var DialogUnitsX : LongInt; PixelsX : LongInt; i : integer; TabArray : array[0..4] of integer; begin Memo1.WantTabs := true; DialogUnitsX := LoWord(GetDialogBaseUnits); PixelsX := 20; for i := 1 to 5 do begin TabArray[i — 1] :=((PixelsX * i ) * 4) div DialogUnitsX; end; SendMessage(Memo1.Handle, EM_SETTABSTOPS,5,LongInt(@TabArray)); Memo1.Refresh; end;

Вопрос:

Как перехватить нажатия функциональных клавиш и стрелок?

Проверяйте значение переменной key на равенство VK_RIGHT, VK_LEFT, VK_F1 и т.д. на событии KeyDown формы.

procedure TForm1.FormKeyDown( Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_RIGHT then Form1.Caption := ‘Right’; if Key = VK_F1 then Form1.Caption := ‘F1’; end;

Вопрос:

При обработке события DrawCell компонента DrawGr >

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

If (Row = 0) then begin DrawGr >

Вопрос:

При использовании BitBtn Caption(текст) и картинка(bitmap) из файла не видны одновременно. Почему?

Это может происходить если картинка слишком велика. Класс TBitBtn сначала рисует картинку, а затем выводит текст над, под, слева или справа от картинки (в завивимости от свойства Layout). Если размер картинки такой же как у всей кнопки для вывода текста просто не остается места. Если Вам нужно получить кнопку такого же размера как Ваша картинка и видеть при этом надпись на кнопке Вам придется выводить текст надписи непосредственно на канву картинки.

var bm : TBitmap; OldBkMode : integer; begin bm := TBitmap.Create; bm.W ); SetBkMode(bm.Canvas.Handle, OldBkMode); BitBtn1.Glyph.Assign(bm); end;

Вопрос:


Можно ли изменить вид текстового курсора (каретки) edit’а или другого элемента управления Windows?

Можно! В примере показано как создать два цветных «bitmap’а»: «улыбчивый» и «хмурый» и присвоить их курсору edit’а. Для этого нужно перехватить оконную процедуру edit’а. Чтобы сделать это заменим адрес оконной процедуры Edit’а нашим собственным, а старую оконную процедуру будем вызывать по необходимости. Пример показывает «улыбчивый» курсор при наборе текста и «хмурый» при забое клавишей backspace.

unit caret1; interface <$IFDEF WIN32>uses Windows, Messages, SysUtils, ); OldEditsWindowProc := Pointer(SetWindowLong(Edit1.Handle,GWL_WNDPROC, LongInt(@NewWindowProc))); end; procedure TForm1.FormDestroy(Sender: TObject); begin SetWindowLong(Edit1.Handle,GWL_WNDPROC, LongInt(OldEditsWindowProc)); CaretBm.Free; CaretBmBk.Free; end;

Вопрос:

При использовании модулей доступа к BDE (DbiTypes, DbiProcs, DbiErrs), любая попытка вызвать процедуру abort выдает ошибку при компиляции при вызове метода abort «Statement expected, but expression of type ‘Integer’ found». Я пытался найти DbiTypes.pas, DbiProcs.pas и DbiErrs.pas чтобы разобраться но не нашел этих файлов. Где расположены эти файлы и как обойти ошибку?

Модули DbiTypes, DbiProcs, DbiErrs это псевдонимы модуля «BDE», обьявлены в Projects->Options->Directories/Conditionals->Unit Aliases. Исходник модуля DBE находится в каталоге «doc» и называется «BDE.INT». В этом файле обьявленна константа ABORT со значением -2. Так как Вы хотите использовать процедуру Abort(), которая обьявлена в модуле SysUtils, Вам нужно добавить префикс SysUtils перед вызовом процедуры Abort.

Вопрос:

Почему при изменении цвета букв StatusBar’а ничего не происходит?

Status bar — стандартный элемент управления Windows, и соответственно цвет его букв — значение clBtnText которое изменяется с помощью настроек в Control Panel. Этот цвет черный по умолчанию и может изменяться в зависимости от выбранной цветовой схемы. Другие стандартные элемент управления Windows, например кнопки, также имеют цвет букв, настраиваемый из ControlPanel. 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;

Вопрос:

Как сделать многострочную надпись на TBitBtn?

Выводите текст надписи непосредственно на «glyph» TBitBtn’а. См. пример.

procedure TForm1.FormCreate(Sender: TObject); var R : TRect; N : Integer; Buff : array[0..255] of Char; begin with BitBtn1 do begin Caption := ‘A really really long caption’; Glyph.Canvas.Font := Self.Font; Glyph.W ; DrawText(Glyph.Canvas.Handle,Buff,StrLen(Buff),R, DT_CENTER or DT_WORDBREAK or DT_CALCRECT); OffsetRect(R,(Glyph.Width — R.Right) div 2, (Glyph.Height — R.Bottom) div 2); DrawText(Glyph.Canvas.Handle,Buff,StrLen(Buff),R, DT_CENTER or DT_WORDBREAK); end; end;

Вопрос:

Как изменить стиль шрифта RichEdit нажатиями соответствующих комбинаций клавиш? (например включить курсив по нажатию Ctrl + I)

В примере стили шрифта меняются по нажатию след. комбинаций клавиш Ctrl + B — вкл/выкл жирного шрифта Ctrl + I — вкл/выкл наклонного шрифта Ctrl + S — вкл/выкл зачеркнутого шрифта Ctrl + U — вкл/выкл подчеркнутого шрифта

const KEY_CTRL_B = 02; KEY_CTRL_I = 9; KEY_CTRL_S = 19; KEY_CTRL_U = 21; procedure TForm1.RichEdit1KeyPress(Sender: TObject; var Key: Char); begin case Ord(Key) of KEY_CTRL_B: begin Key := #0; if fsBold in (Sender as TRichEdit).SelAttributes.Style then (Sender as TRichEdit).SelAttributes.Style := (Sender as TRichEdit).SelAttributes.Style — [fsBold] else (Sender as TRichEdit).SelAttributes.Style := (Sender as TRichEdit).SelAttributes.Style + [fsBold]; end; KEY_CTRL_I: begin Key := #0; if fsItalic in (Sender as TRichEdit).SelAttributes.Style then (Sender as TRichEdit).SelAttributes.Style := (Sender as TRichEdit).SelAttributes.Style — [fsItalic] else (Sender as TRichEdit).SelAttributes.Style := (Sender as TRichEdit).SelAttributes.Style + [fsItalic]; end; KEY_CTRL_S: begin Key := #0; if fsStrikeout in (Sender as TRichEdit).SelAttributes.Style then (Sender as TRichEdit).SelAttributes.Style := (Sender as TRichEdit).SelAttributes.Style-[fsStrikeout] else (Sender as TRichEdit).SelAttributes.Style := (Sender as TRichEdit).SelAttributes.Style+[fsStrikeout]; end; KEY_CTRL_U: begin Key := #0; if fsUnderline in (Sender as TRichEdit).SelAttributes.Style then (Sender as TRichEdit).SelAttributes.Style := (Sender as TRichEdit).SelAttributes.Style-[fsUnderline] else (Sender as TRichEdit).SelAttributes.Style := (Sender as TRichEdit).SelAttributes.Style+[fsUnderline]; end; end; end;

Вопрос:

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

uses Registry; procedure TForm1.Button1Click(Sender: TObject); var WinIni : TRegIniFile; begin WinIni := TRegIniFile.Create(»); WinIni.RootKey := HKEY_LOCAL_MACHINE; WinIni.WriteString(‘Frank’,’Borland’,’Writes Fast Code!’); WinIni.Free; end;

Вопрос:

Можно ли динамически изменять свойство «owner» компонента во время выполнения программы?

Вы можете менять свойство «owner» и после создания компонента с помощью методов InsertComponent() и RemoveComponent().

Вопрос:

Как очистить содержимое Canvas’а?

Просто нарисуйте прямоугольник любого цвета.

Canvas.Brush.Color := ClWhite; Canvas.FillRect(Canvas.ClipRect);

Вопрос:

Можно ли динамически менять какая форма считается главной в приложении во время работы программы?

Можно, но только во время загрузки приложения. Чтобы сделать это выберите «View->Project Source» и измените код инициализации приложения, так что порядок создания форм зависил от какого-то условия.

Вам придется редактировать этот код, если Вы добавите в приложение новые формы.

begin Application.Initialize; if then begin Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); end else begin Application.CreateForm(TForm2, Form2); Application.CreateForm(TForm1, Form1); end; end. Application.Run;

Вопрос:

Как программно «щелкнуть» по компоненту speed button? Я пытался использовать SendMessage но у Speedbuttons нет «handle».

В примере используется метод Perform класса TControl для отправки сообщения.

procedure TForm1.SpeedButton1Click(Sender: TObject); begin ShowMessage(‘clicked’); end; procedure TForm1.Button1Click(Sender: TObject); begin SpeedButton1.Perform(WM_LBUTTONDOWN, 0, 0); SpeedButton1.Perform(WM_LBUTTONUP, 0, 0); end;

Вопрос:

Можно ли отключить определенный элемент в RadioGroup?

В примере показано как получить доступ к отдельным элементам компонента TRadioGroup.

procedure TForm1.Button1Click(Sender: TObject); begin TRadioButton(RadioGroup1.Controls[1]). Enabled := False; end;

Вопрос:

Почему методы рисования Delphi (например MoveTo и LineTo) рисуют на один пиксел короче?

Так работает большинство графических систем, включая Windows. Библиотека VCL просто передает вызовы в функции GDI. Если Вы хотите нарисовать линию с последним пикселом включительно просто добавте единицу к координатам.

Вопрос:

Как показать подсказки «hints» для элементов меню?

В примере создается обработчик события Application.Hint — подсказки меню изображаются на status panel.

type TForm1 = ; Application.OnHint := HintHandler; end; procedure TForm1.HintHandler(Sender: TObject); begin Panel1.Caption := Application.Hint; end; procedure TForm1.MenuItemCloseClick(Sender: TObject); begin Application.Terminate; end; procedure TForm1.MenuItemOpenClick(Sender: TObject); begin if OpenDialog1.Execute then Form1.Caption := OpenDialog1.FileName; end;


Вопрос:

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

Пошлите ComboBox сообщение CB_GETDROPPEDSTATE.

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

Вопрос:

Как удалить каталог вместе со всеми содержащимися в нем файлами?

В примере стираются все файлы в каталоге и сам каталог. Чтобы удалить файл, помечанные только для чтения (read only) и занятые другими программами в момент удаления — напишите дополнительную процедуру.

procedure TForm1.Button1Click(Sender: TObject); var DirInfo: TSearchRec; r: integer; begin r := FindFirst(‘C:\Download\*.*’, FaAnyfile, DirInfo); while r = 0 do begin if ((DirInfo.Attr and FaDirectory <> FaDirectory) and (DirInfo.Attr and FaVolumeId <> FaVolume ); end;

Вопрос:

Как отключить системное меню формы и кнопки Minimize, Maximize, and Close во время выполнения(Runtime)?

В приведенном примере показано как это сделать

procedure TForm1.Button1Click(Sender: TObject); begin Form1.BorderIcons := Form1.BorderIcons — [biSystemMenu, biMinimize, biMaximize]; end; procedure TForm1.Button2Click(Sender: TObject); begin Form1.BorderIcons := Form1.BorderIcons + [biSystemMenu, biMinimize, biMaximize]; end;

Вопрос:

Как извлечь Red, Green, и Blue компонент из определенного цвета?

Используйте функции Window API Get RValue(), GetGValue(), и GetBValue().

procedure TForm1.Button1Click(Sender: TObject); begin Form1.Canvas.Pen.Color := clRed; Memo1.Lines.Add(‘Red := ‘ + IntToStr(GetRValue(Form1.Canvas.Pen.Color))); Memo1.Lines.Add(‘Red := ‘ + IntToStr(GetGValue(Form1.Canvas.Pen.Color))); Memo1.Lines.Add(‘Blue:= ‘ + IntToStr(GetBValue(Form1.Canvas.Pen.Color))); end;

Вопрос:

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

Чтобы определить номер текущей строки любого объекта управления edit — пошлите ей сообщение EM_LINEFROMCHAR

procedure TForm1.Button1Click(Sender: TObject); var LineNumber : integer; begin LineNumber := SendMessage(Memo1.Handle, EM_LINEFROMCHAR, word(-1), 0); ShowMessage(IntToStr(LineNumber)); end;

Вопрос:

Как проигрываеть MPEG файл в Delphi-программе?

Если в системе Windows MMSystem установлен декодер MPEG — используя компонент TMediaPlayer

procedure TForm1.Button1Click(Sender: TObject); begin MediaPlayer1.Filename := ‘C:\DownLoad\rsgrow.mpg’; MediaPlayer1.Open; MediaPlayer1.Display := Panel1; MediaPlayer1.DisplayRect := Panel1.ClientRect; MediaPlayer1.Play; end;

Вопрос:

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

Во первых необходимо получит handle курсора, а затем определить его в массиве курсоров компонента TScreen. Индексы предопределенных курсоров системы отрицательны, пользователь может определить курсор, индекс которого положителен.

procedure TForm1.Button1Click(Sender: TObject); var h : THandle; begin h := LoadImage(0, ‘C:\TheWall\Magic.ani’, IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE); if h = 0 then ShowMessage(‘Cursor not loaded’) else begin Screen.Cursors[1] := h; Form1.Cursor := 1; end; end;

Вопрос:

Как узнать о нажатии «non-menu» клавиши в момент когда меню показано?

Создайте обработчик сообщения WM_MENUCHAR.

unit Unit1; interface uses Windows, Messages, SysUtils, ; m.Result := 1; end; end.

Вопрос:

Как определить наличие сопроцессора?

В отличие от общепринятого мнения не всее клоны 486/586/686/ и Pentium имеют сопроцессор для вычислений с плавающей запятой. В примере определяется наличие сопроцессора и под Win16 и под Win32.

<$IFDEF WIN32>uses Registry; <$ENDIF>function HasCoProcesser : bool; <$IFDEF WIN32>var TheKey : hKey; <$ENDIF>begin Result := true; <$IFNDEF WIN32>if GetWinFlags and Wf_80x87 = 0 then Result := false; <$ELSE>if RegOpenKeyEx(HKEY_LOCAL_MACHINE, ‘HARDWARE\DESCRIPTION\System\FloatingPointProcessor’,0, KEY_EXECUTE, TheKey) <> ERROR_SUCCESS then result := false; RegCloseKey(TheKey); <$ENDIF>end; procedure TForm1.Button1Click(Sender: TObject); begin if HasCoProcesser then ShowMessage(‘Has CoProcessor’) else ShowMessage(‘No CoProcessor — Windows Emulation Mode’); end;

Вопрос:

Как узнать серийный номер аудио CD?

CD может иметь или не иметь серийный номер и/или универсальный код продукта (Universal Product Code). MCI-расширение Windows предоставляет эту информации с помощью комманды MCI_INFO_MEDIA_IDENTITY command. Эта команда возвращает уникальную ID-строку.

uses MMSystem, MPlayer; procedure TForm1.Button1Click(Sender: TObject); var mp : TMediaPlayer; msp : TMCI_INFO_PARMS; MediaString : array[0..255] of char; ret : longint; begin mp := TMediaPlayer.Create(nil); mp.Visible := false; mp.Parent := Application.MainForm; mp.Shareable := true; mp.DeviceType := dtCDAudio; mp.FileName := ‘D:’; mp.Open; Application.ProcessMessages; FillChar(MediaString, sizeof(MediaString), #0); FillChar(msp, sizeof(msp), #0); msp.lpstrReturn := @MediaString; msp.dwRetSize := 255; ret := mciSendCommand(Mp.DeviceId, MCI_INFO, MCI_INFO_MEDIA_IDENTITY, longint(@msp)); if Ret <> 0 then begin MciGetErrorString(ret, @MediaString, sizeof(MediaString)); Memo1.Lines.Add(StrPas(MediaString)); end else Memo1.Lines.Add(StrPas(MediaString)); mp.Close; Application.ProcessMessages; mp.free; end; end.

Вопрос:

Как вывести на элемент управления (Window control) текст, содержащий амперсанд — & ?

Используя два амперсанда подряд. Windows интерпритирует одиночный амперсанд как указание на то, что следующий символ — горячая клавиша (и поддчеркивает следующий символ вместо излбражения аперсанда).

Вопрос:

Как поместить bitmap в Metafile?

procedure TForm1.Button1Click(Sender: TObject); var m : TmetaFile; mc : TmetaFileCanvas; b : tbitmap; begin m := TMetaFile.Create; b := TBitmap.create; b.LoadFromFile(‘C:\SomePath\SomeBitmap.BMP’); m.Height := b.Height; m.W ); end;

Вопрос:


Как узнать, что курсор мыши над моей формой?

Можно использовать функцию GetCapture() из Windows API.

Cм. документацию Windows для информации об ограничениях функции 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.W ; end;

Вопрос:

Как программно определить, что приложение работает под Windows NT?

function IsNT : bool; var osv : TOSVERSIONINFO; begin result := true; GetVersionEx(osv); if osv.dwPlatform ); end;

Вопрос:

Как создать bitmap из пиктогрммы (icon)?

Используя Bitmap.Canvas.Draw нарисуйте пиктограмму на Bitmap’е.

procedure TForm1.Button1Click(Sender: TObject); var TheIcon : TIcon; TheBitmap : TBitmap; begin TheIcon := TIcon.Create; TheIcon.LoadFromFile(‘C:\Program Files\Borland\IcoCur32\EARTH.ICO’); TheBitmap := TBitmap.Create; TheBitmap.Height := TheIcon.Height; TheBitmap.W >

Вопрос:

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

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

type TForm1 = ; StringGr > r) or(Col <> c)) then begin Row := r; Col := c; Application.CancelHint; StringGr >

Вопрос:

Как внести изменения в код VCL?

Примечание: внесение изменений в VCL не поддерживается Borland или Borland Developer Support.
-Но если Вы решили сделать это.
Изменеия в код VCL никогда не должны вносится в секцию «interface» модуля — только в секцию «implimentation». Наиболее безопасный способ внести изменения в VCL — создать новый каталог названный «исправленный VCL». Скопируйте файл VCL который Вы хотите изменить в этот каталог. Внесите изменения (лучше прокомментировать их) в этот файл. Затем добавьте путь к Вашему каталогу «исправленный VCL» в самое начало «library path». Перезапустите Delphi/C++ Builder и перекомпилируйте Ваш проект. «library path» можно изменить в меню:
Delphi 1 : Options | Environment | Library
Delphi 2 : Tools | Options | Library
Delphi 3 : Tools | Environment Options | Library
Delphi 4 : Tools | Environment Options | Library
C++ Builder : Options | Environment | Library

Вопрос:

Как в Delphi реализовать функцию — эквивалент TwipsPerPixel из Visual Basic?

Функции TwipsPerPixelX и TwipsPerPixelY, приведенные в примере реализуют ту же функциональность в Delphi.

Правильно используем CSS Gr > 08.05.2020

Правильно используем CSS Grid

В этой статье вы узнаете о том, как использовать нэйминг в CSS Gr >fr и почему не надо практиковать систему сеток с CSS Grid, звучит странно, да? Давайте посмотрим почему.

Правильно используем CSS Grid

CSS Grid это надежный, гибкий и освежающий сдвиг парадигмы от других подходов вёрстки на CSS. И пока у гридов есть свои фишки, они же и усложняют процесс понимания этих самых гридов.

Изучение CSS Gr >рабочего понимания многих новых свойств, которые не просто описывают один аспект отрисовки или поведения на странице, а влияют на всю систему разметки. Эта система включает в себя около 18 свойств, которые используют парадигмы и синтаксис, редко использующиеся (или вообще нет) в каких либо других CSS спеках.

Это говорит о том, что у CSS Gr >высокий порог входа — разработчику приходится учить и усваивать кучу новой информации для того, чтобы она была эффективна. После прохождения этого порога гриды становятся потрясающим товарищем в верстке шаблонов. Если ваши знания ниже этого порога, то гриды это просто бремя, которое будет только мешать. И сейчас вы удивляетесь почему вообще вы пытаетесь его использовать, это же сколько надо учить и проделывать дополнительной работы, чтобы получить совершенно небольшой профит.

В этой статье, я хочу помочь вам в преодолении этого порога вхождения, показав самые эффективные способы применения гридов. Я не рассказываю тут про всю спеку гридов — для этого вы можете посмотреть этот пост с CSS Tricks или тут Вёрстка на Grid в CSS. Полное руководство и справочник. То, о чем я рассказываю тут, по-моему мнению полезные аспекты работы с этой системой верстки.

Используйте имена, а не числа

Колонки и строки в гридах, в своей основе, определяются числами. Для примера, этот CSS делает грид с двумя колонками и размещает основной контент страницы во второй колонке:

Это работает, но тут упускается очень клевая фича в CSS Gr > вы можете давать вашим строкам и колонкам свои имена. Вам нужно пользоваться этим преимуществом, где это только возможно. Вот тот-же CSS, только с использованием имён:

Даже в таких простых случаях, как этот, именование грид-областей будет вам удобно.

Почитайте больше про grid-area в этой статье Поразительный CSS Grid Area

Преимущества

Раздача имен в гриде даёт несколько больших преимуществ.

Читабельность — тут всё понятно, ваш код проще понять.

Третья строка кода теперь описывает всё, что находится внутри Grid-контейнера. Вы не просто перечисляете колонки; вы указываете для чего предназначена каждая колонка.

На 7-й строке всё так-же становится довольно описательным. До этого, мы только знали то, что .content находился во второй колонке, что не о многом то и говорило без дополнительного контекста — колонка 2 из 3 или 2 из 200? Указание имени колонки указывает на то, что элемент был учтён внутри системы побольше. Так же, нэйминг упрощает поиск исходного объявления колонки, если нам это будет нужно.

Задел на будущее — добавление имён делает ваш CSS более гибким. В частности, вы можете перебирать элемент в .container без нужды в редактировании .content .

Хотите поменять визуальный порядок между контентом и сайдбраром? Легко!

Хотите добавить ещё одну колонку? Без проблем.

Без именования колонок, вам бы пришлось обновлять номер колонки в 7-ой строке, чтобы соответствовать изменениям, сделанным в 3-ей строке. Проименованные колонки дают .content согласованное поведение, которое не зависит от порядка столбцов и их количества.

Используйте fr, как единицу гибкости

В CSS Gr >fr может казаться заметкой в спеке на CSS Grid, но на самом деле она незаменима.

Единица fr отличается от % и vw , так как эти единицы указываются по частям от 100, а fr ’ы указываются по месту, которое ещё не используется. В общем, они разделяют свободное место между собой.

Вот тут, колонка content в два раза шире, чем колонка sidebar.


Так как тут нет единиц не-fr и в сумме тут три fr ’а, то 1fr =

33% от ширины грида.

Преимущества

У fr есть несколько особенностей, которых недостает другим “гибким” единицам измерения.

Читабельность и ясное описание — использование fr , в отличие от применения процентов, даёт нам возможность придерживаться чисел, которые формируют размер относительно друг друга, а не относительно всей страницы или контейнера. Это позволяет поведению быть ясным и понятным. Для примера, третья строка прямо говорит о том, что контент в два раза шире, чем сайдбар.

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

Меньше математики — самое большое преимущество fr в том, что она берёт на себя арифметические вычисления разработчика и переедет их на совесть движка браузера. Для примера, вот CodePen, показывающий два способа сделать один и тот же шаблон на гридах.

Вот в чем суть этих демок:

Код на 7 строке нелегко написать, тяжело читать и он нестабилен. Любое изменение в grid-column-gap или в количестве колонок, просто сломает шаблон, пока мы вручную не обновим ширину колонок для нужного нам соответствия.

Строка 11 может игнорировать размер gap’а и не будет требовать каких-либо новых математических вычислений, если мы обновим количество колонок. Это просто легко читать и это хороший задел под будущие правки, с которыми не будет проблем.

Не используйте систему сеток

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

Разметка зачастую воспринимается как элементы выстроенные вдоль системы сетки.

Не используйте систему сеток

Обычно разработчики стремятся к точному соответствию с дизайном. Если дизайн основан на 14-ти колоночной сетке, то разработчик сделает схожую 14-ти колоночную сетку в коде и напишет вспомогательные классы, чтобы элементы охватывали 1, 2, 3, 6 и т.п. колонки. Большинство фронт-энд фреймворков, таких, как Bootstrap работают схожим способом.

В примере выше, у нас есть 14-ти колоночная сетка, со следующими элементами, которым нам надо выдать размер и разместить:

Header, который начинается с колонки 2 и охватывает 12 колонок.

Sidebar, который начинается со второй колонки и охватывает 4.

Основной контент, который начинается на 6-й колонке и охватывает 8.

В CSS Grid, очень легко настроить систему сеток так, чтобы она соответствовала дизайну.

Но действительно ли это хороший план? Наша попытка создания точной копии имеет два недостатка.

Во-первых, это рушит все наши планы по неймингу колонок. Более того, из наших 14 колонок, мы “ используем” только колонки 2, 5, 6 и 13. Технически это работает, но подразумевает плохой показатель отношения сигнал/шум ( Отношение чистого аудиосигнала к шуму, создаваемому самим устройством. Это образное сравнения автора).

Обе эти проблемы можно решить, если мы немного отступимся от изначального дизайна:

Теперь вместо 14 колонок, у нас есть только 4, но они всё равно делят пространство в шаблоне на 14 частей. У нас такой же визуальный эффект, как и в первой итерации, но наш код не такой шумный и напрямую показывает что он, делает.

Мы можем продолжить использование этой парадигмы в нашем шаблоне. Скажем, к примеру, что внутри элемента .content нам нужно место для дополнительной информации (био автора, аннотация и тп), рядом с основной статьёй.

Если бы мы придерживались 14 колоночной сетки, то нам бы пришлось сделать как-то вот так:

Что будет довольно мутно, так как в CSS Gr >.info ничего не знает о построении гридов в .main , то есть о своём прародителе.

Если мы избавимся от 14-ти колоночной сетки, то мы сможем заметить, что .article и .info не нужно вообще брать в расчёт гриды, которые стоят на порядок выше — они сами по себе являются частью нового грида внутри .content .

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

Преимущества

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

Не так важно, что .article начинается на 7-й колонке, а .info на 11-ой. Важно то, что .article в два раза шире, чем .info . Пропорциональное отношение к элементам и мысли о том, как они взаимодействуют друг с другом, помогают нам рассматривать шаблоны, как динамические системы.

Заметки на полях: вложенная разметка

Возможно, что вы уже подметили в примерах кода выше, то что мы использовали left-gutter и right-gutter колонки. Под таким CSS подразумевается самое ровное использование HTML, которое только возможно.

Если нам хочется вставить div -обертку в разметку, то мы можем написать более точный CSS с меньшим количеством колонок на элемент.

По сути, второй подход кажется лучше, так как вычисления там проще — вы тут же забываете о числах, которые в сумме дают 14 и просто концентрируетесь на соотношении 1:2. Это уже в духе CSS Grid.

Но, а вот то, что совсем не в духе CSS Gr >div ’а .wrapper . Разметка на гридах усердно старается, чтобы помочь нам разделить представление от контента, то есть, нам не нужно добавлять дополнительные элементы, чтобы работала стилизация или она “ вела себя нормально”. Поэтому, по крайней мере сейчас, я советую вам не добавлять новые элементы и/или изменять разметку только для того, чтобы у вас была более чистая(и сомнительно понятная) стилизация на CSS Grid.

Расположение элементов по грид-линиям с помощью CSS Grid

На этой странице

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

Собственно, начать квест по гридам со знакомства с пронумерованными линиями — логично, потому что в ситуации, когда Вы работаете с гридами, пронумерованные линии у Вас есть всегда. Линии нумеруются и для колонок, и для строк, отсчет начинается с 1. Нужно заметить, что грид индексируется в соответствии с режимом написания (writing mode) документа. В языках с написанием слева направо, таких как русский, например, линия 1 — самая левая линия грида. Если написание справа налево, то линия 1 будет, соответственно, самой правой линией в гриде. По ходу изучения недр мы детально узнаем, как гриды взаимодействуют с режимами написания, поэтому не исчезайте, впереди много интересного.

Базовый пример

В качестве крайне простого примера давайте возьмем грид с тремя треками-колонками и тремя треками-строками. Такой грид дает нам по 4 линии для каждого направления.

Внутри нашего грид-контейнера у нас есть четыре дочерних элемента. Если мы не размещаем их явным образом, эти элементы будут расположены в гриде в соответствии с правилами авторазмещения, то есть, по одному элементу — в каждой из четырех первых ячеек. Если Вы воспользуетесь Firefox Grid Highlighter , то увидете, как грид инициирует колонки и строки.

Позиционирование элементов по номерам линий

Мы можем воспользоваться размещением по линиям (line-based placement), чтобы расположить элементы на гриде. Например, нам нужно, чтобы первый элемент начинался от левого края и занимал один трек-колонку. Пусть он также начинается с первой строчной линии, то есть, от верхнего края грида, и занимает пространство до четвертой строчной линии.

Если Вы явно позиционируете одни элементы, другие элементы грида по-прежнему размещаются в соответствии с правилами авторазмещения. Дальше мы детально рассмотрим, как это происходит, а пока Вы и сами могли заметить, что по мере размещения одних элементов, оставшиеся элементы занимают пустые ячейки грида.

Задавая адреса для каждого элемента по отдельности, мы можем разместить все наши четыре элемента по колонкам и строкам. Заметьте, что при желании можно оставить ячейки пустыми. Одна из самых приятных вещей при работе с Grid Layout — возможность создавать негативное пространство (пустые области в макете) без кувырков через голову и прочих хаков.


Сокращения grid-column и grid-row

Мы написали много кода, чтобы разместить каждый элемент. Неудивительно, что существуют сокращенные свойства shorthand. grid-column-start и grid-column-end могут быть объединены в одном grid-column , а grid-row-start и grid-row-end — в grid-row .

Расположение элемента по умолчанию

В примерах выше мы задавали конечную линию для строки и колонки, чтобы продемонстрировать работу свойств, однако, если элемент занимает только один трек, Вы можете опустить значение grid-column-end или grid-row-end . Грид по умолчанию размещает элемент таким образом, чтобы он занимал всего один трек. Это значит, что длинная запись свойств в нашем первоначальном примере может выглядеть вот так:

Поэтому, если мы хотим, чтобы элементы занимали только один трек, наша сокращенная запись будет выглядеть вот так, без слэша и без второго значения:

Свойство grid-area

Порядок значений для grid-area может показаться немного странным, он противоположен тому порядку, в котором мы, например, записываем значения для сокращенных свойств margin и padding. Но сделано это потому, что грид работает с направлениями относительно потока, определенными в спецификации CSS Writing Modes. В дальнейшем мы рассмотрим, как гриды взаимодействуют с режимами написания (writing modes), но пока давайте примем за данность, что мы имеем дело с концепцией четырех направлений относительно потока:

  • block-start (начало блока)
  • block-end (конец блока)
  • inline-start (начало строки)
  • inline-end (конец строки)

Мы работаем с русским, языком с написанием слева направо. Начало нашего блока (block-start) — верхняя строчная линия грид-контейнера, конец блока (block-end) — последняя строчная линия контейнера. Начало строки (inline-start) — самая левая колоночная линия, поскольку начало строки — это всегда точка, с которой начинается написание текста в заданном режиме написания. Конец строки (inline-end) — последняя колоночная линия грида.

Когда мы задаем нашу грид-область с помощью свойства grid-area , мы сначала определяем обе начальные линии block-start и inline-start , а затем обе конечные линии block-end и inline-end . Поскольку мы давно работаем с физическими свойствами top, right, bottom и left, поначалу это кажется непривычным, но вполне осмысленно, если осознать, что относительно режима написания вебсайты — многонаправленные структуры.

Считая с конца

Мы также можем отсчитывать грид-линии с конца, то есть с последней (для русского языка — самой правой) колоночной и последней (самой нижней) строчной линий. Индекс этих линий будет -1 , а линий непосредственно перед ними -2, и так далее. Нужно помнить, что под последней линией понимается последняя линия явного грида (explicit grid), то есть грида, определенного с помощью grid-template-columns и grid-template-rows. Любые линии строк и колонок, добавленные неявным гридом (implicit grid) не считаются.

В примере ниже мы «перевернули» определение нашего грида, при размещении элементов задавая линии с конца, то есть, от правого и нижнего краев.

Как растянуть элемент на длину всего грида?

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

Зазоры (Gutters) или аллеи (Alleys)

Спецификация CSS Grid включает возможность добавлять промежутки (зазоры) между треками-колонками и треками-строками с помощью свойств grid-column-gap и grid-row-gap . Эти свойства задают промежутки, которые во многом действуют точно так же, как свойство column-gap в многоколоночных макетах.

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

Сокращенная запись для грид-зазоров

Оба свойства также можно записать с помощью свойства-сокращения grid-gap . Если задать только одно значение, то оно определит размер зазоров и между колонками, и между строками. Если мы задаем два значения, то первое используется для grid-row-gap , а второе — для grid-column-gap .

В терминах расположения элементов по грид-линиям (line-based positioning) зазоры ведут себя так, как если бы самой линии была добавлена толщина. Все, что должно было начинаться от линии, начинается от нее на расстоянии зазора, и Вы не можете адресовать зазор напрямую или поместить в него что-нибудь. Если Вам нужны зазоры, которые ведут себя, как обыкновенные треки, что же — определите трек, а не зазор.

Использование ключевого слова span

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

Ключево слово span также можно использовать в качестве значения grid-row-start / grid-row-end и grid-column-start/grid-column-end . Два примера ниже создают одну и ту же грид-область. В первом примере мы задаем начальную строчную линию, а после говорим свойству, отвечающему за конечную линию: эй, мы хотим занять под этот элемент три линии. В итоге, грид-область начинается с первой линии и занимает пространство до 4-ой.

Во втором примере поступим наоборот: зададим конечную строчную линию, а в значении свойства, отвечающего за начальную линию, напишем span 3 . Это значит, что элемент должен занять три трека до заданной конечной линии. Грид-область начинается с линии 4 и занимает три трека до линии 1.

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

Также помните, что элементы на гриде могут перекрывать друг друга, если Вы намеренно разместили их так, чтобы они друг друга перекрывали. Подобное поведение позволяет получить интересные эффекты, но, если Вы некорректно задали начальные и конечные линии, результат может неприятно Вас удивить. Firefox Grid Highlighter будет крайне полезен в процессе обучения, особенно, когда Вы строите сложные гриды.

Grid в CSS

CSS Grid Layout — это новое многообещающее явление в мире верстки. Используя Grid, можно построить макеты, которые ранее невозможно было построить в CSS. С ним возможности чуть ли не безграничны. Grid претендует на звание «лучшей системы для вёрстки макетов HTML». В этой статье я попробую разобраться какой он, этот Grid, на вкус и доступно поделиться знаниями с вами.

Grid поддерживается уже почти всеми браузерами, поэтому изучать уже пора!

Grid — это сетка с элементами на ней. Расставлять элементы можно как угодно. Представьте себе шахматную доску и фигуры, Grid контейнер это доска, элементы это фигуры. А дальше ставь как нравится.

Grid — это набор горизонтальных и вертикальных «линий», которые пересекаются между собой и создают сетку из рядов и колонок. Элементы могут быть помещены в сетку, опираясь на номер линии или номер ряда/колонки.

Чтобы разобраться с Грид-сеткой нужно понять из чего конкретно состоит эта сетка. Для этого хорошенько изучите схему ниже и описание к ней.

Схема Grid сетки.

Описание Грид сетки

Контейнер — содержит Grid сетку, в которой находятся элементы.

Элементы — HTML элементы внутри сетки. Ими станут HTML элементы первого уровня (прямые дети контейнера). Чтобы элемент появился в сетке, в нем (внутри) элемента должно быть хоть что-то (текст, другие HTML теги). Пустой элемент — это всего лишь ячейка для расположения в нем чего-либо.

Линии — это образные линии (на самом деле никаких линий нет), разделяющие сетку на колонки и ряды, они создают структуру сетки. Линии автоматически нумеруются. Также линиям можно указывать имена, чтобы потом прикреплять к ним элементы по номеру или по имени линии. По сути линия — это номер или имя колонки/ряда. Расстояние между линиями (колонками/рядами) можно указать через grid-gap: , grid-row-gap: , grid-column-gap: .

Ряд/колонка (row/column, track) — все что находится между соседними линиями, т.е. линии разделяют сетку на ряды и колонки.

Ячейка (cell) — место куда будет расположен элемент. Ячейка это пересечение колонки и ряда.

Область (area, поле) — объединение одной или нескольких ячеек в общую ячейку (поле). Это такая большая ячейка также ограниченная линиями. Области можно задать имя, чтобы удобно было помещать туда элементы.

  • Разрыв (gap) — расстояние между рядами и колонками. Разрывает линию на две. Так между линиями, а как следствие и колонками/рядами, ячейками появляется пустое место. Это своего рода margin , border-spacing между ячейками. По умолчанию линия между ячейками всего одна (ячейки слеплены), но если указать разрыв, то мы разорвем линию, и появится расстояние между колонками/рядами, при этом номер или имя линии (колонки/ряда) остается одно.
  • Для включения Grid, любому HTML элементу достаточно присвоить css свойство display:grid; или display:inline-grid; .


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

    Пример создания грид-блока с двумя колками и тремя рядами разных размеров:

    Особенности Grid

    Элементы Grid сетки можно расставлять сразу на несколько полей сетки. Можно менять направление или расположения элементов в сетке. Колонкам и рядам можно давать имена. Можно создавать шаблон сетки и расставлять элементы по шаблону.

    Размеры колонок/рядов. Сетку можно создавать с точными или гибкими размерами колонок/рядов (шириной/высотой). Точные это px , em , % , а гибкие новая единица измерения в grid fr (фракция — свободное место в сетке).

    Расположение элемента. Элементы можно размещать в указанном месте сетки, указав номер колонки/ряда или их имя (если оно есть). Или путем привязки элемента к области Grid (область нужно создать). Если не указать конкретное расположение элемента в сетке, то элемент размещается по умолчанию в первую свободную ячейку: как во flex: по горизонтали (→) или по вертикали (↓). Поведение по умолчанию можно изменить через свойство grid-auto-flow: .

    Выравнивание элементов. Элементы внутри ячейки можно выравнивать по горизонтали/вертикали. Выравнивается вложенный в ячейку элемент, а не сама ячейка. Например, в контейнере есть вложенный элемент первого уровня (это ячейка), внутри него есть «текст» или какой-то «div» (текст или div — это реальный элемент) выравнивание элемента выровняет вложенный в ячейку элемент внутри ячейки (размеры ячейки при этом не изменятся).

    Несколько элементов в одной ячейке. В одной ячейке или области можно разместить несколько элементов. Чтобы указать кто «выше» (важнее) и кто «ниже» (неважный), нужно использовать css свойство z-index: .

  • Расширение сетки. Сколько колонок/рядов имеет сетка обычно указывается сразу, но если разместить элемент за пределами сетки (указать ему номер ряда/ячейки, который выходит за пределы сетки), тогда сетка автоматически расширяется и создаются дополнительные линии (колонки/ряды).
  • меню

    CSS свойства Gr >

    Включает grid свойство для элемента. Под это свойство попадает сам элемент и вложенные в него элементы: затрагиваются только потомки первого уровня — они станут элементами grid контейнера.

    • grid — элемент растягивается на всю ширину и имеет свое полное пространство среди окружающих блоков. Происходит перенос строк в начале и в конце блока.
    • inline-grid — элемент обтекается другими элементами. При этом его внутренняя часть форматируется как блочный элемент, а сам элемент — как встроенный.

    grid и inline-grid отличаются тем что по-разному взаимодействуют с окружающими элементами, подобно display:block и display:inline-block .

    Указывают из скольки рядов (строк) и скольки колонок состоит сетка и какие у них размеры. Т.е. указывается сразу два понятия: сколько и какой размер.

    В значении через пробелы указываются размеры: высота ряда (rows) или ширина колонки (columns). Сколько раз будет указан размер, столько будет рядов/колонок.

    размер — это высота ряда или ширина колонки, может быть:

    px, em, %, vh, vw — размер абсолютный (px, pt), относительный (em, vw, vh) или в % от ширины/высоты контейнера.

    fr (фракция — свободное место в сетке) — специальная единица измерения в grid. Свободное место в контейнере делится на фракции, так если одной колонке указать 1fr , а другой 2fr , то вторая будет больше первой в 2 раза и обе они заполнят все свободное пространство. Аналог flex-grow: у флексов. Тут можно также указывать дробные значения: 0.5fr, 2.3fr .

    min-content — наименьший размер контента. Для текста это ширина самого длинного слова или неразрывного фрагмента.

    max-content — наибольший размер контента. Для текста это длина самой большой строки без переносов.

    auto — размер ряда/колонки подстраивается под размеры элементов, так, чтобы уместился самый большой из них. Не дает сжиматься меньше min-width или min-height самого широкого или высокого элемента соответственно. Не дает растягиваться больше, чем max-content . Если в контейнере есть свободное место, то размер может растянуться до конца контейнера.

    fit-content( max ) — функция которой передается макс. размер. Если контент меньше этого размера, ведет себя как auto , если больше, то ограничивает размер ряда/колонки до указанного в параметре max.

    line-name (имя линии) — перед размером можно указать (создать) имя для линии (ряда/колонки). Имя указывается в квадратных скобках [имя] 100px . Также можно указать сразу несколько имен через пробел внутри квадратных скобок: [имя еще_имя] 100px . Символы в имени можно использовать любые, в том числе кириллицу.

  • last-name (последнее имя) — указанное имя станет именем начальной линии ряда/колонки, но ряд/колонка состоит из двух линий (они ведь имеют размер). Так имя линии является именем начала одной колонки (ряда) и именем конца предыдущей колонки (ряда). И так вот заполняется сетка, но в конце остается ряд/колонка и указанное для неё имя это имя только начальной линии этого ряда/колонки, а у конечной линии имени нет. Такое имя последней линии можно указать в конце. Т.е. получается так: [имя] 100px [имя2] 100px [последнее-имя] .
  • У двух этих свойств есть сокращенные записи:

    Примеры:

    Создадим сетку (контейнер) с тремя колонками и тремя рядами последняя колонка и ряд будут иметь одинаковое имя ‘main’

    Если не указать имя, то ряд/колонка автоматом получает два порядковых числовых имени: положительное и отрицательное:

    Укажем конкретные имена (обратите внимание как указывается имя для последней линии):

    Меню может иметь не одно, а несколько имен, этот пример добавляет два имени row1-end и row2-start :

    Если в перечисление размеров колонок есть повторяющиеся части, то можно использовать функцию repeat() :

    Если несколько строк имеют одно и то же имя, на них можно ссылаться по имени и порядковому числу:

    fr позволяет указать размер относительный оставшегося свободного места в контейнере. В этом примере свободное место в контейнере делится на число указанных фракций (у нас 3) и для каждой определяется ширина. Так если ширина контейнера 90px то каждая колонка будет шириной по 30px.

    Свободное пространство высчитывается после того как посчитаны жесткие размеры (включая разрывы). В этом примере размер свободно пространства высчитывается как ширина контейнера минус 50px.

    Позволяет создать визуальный шаблон сетки. В этом свойстве задаются имена ячейкам, а затем элементы привязываются к этим именам через свойство grid-area: указываемое для отдельного элемента.

    Синтаксис шикарен, потому что визуально показывает как выглядит сетка:

    «имя имя2 имя3» — в значении внутри кавычек нужно через пробелы указывать имена. Каждые кавычки с именами будут представлять собой ряд сетки, а имена внутри кавычек задают имена ячейкам внутри этого ряда.

    «имя имя имя2» — если указать одно и тоже имя несколько раз подряд, то имя объединит ячейки и мы получим область (большую ячейку). Объединять ячейки таким способом можно не только внутри ряда, но и между рядами.

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


  • none — область не определена
    • Символы в имени можно использовать любые, в том числе кириллицу.

    Каждый ряд должен иметь одинаковое количество ячеек.

    При использовании этого метода линии (включая последнюю линию) получают имена автоматически. Например, если область называется bar , то имя начальной линии ряда и колонки у этой области будет bar-start , а имя последней bar-end . Это значит, что некоторые линии будут иметь много имен. Например крайняя левая линия из примера ниже (шаблон страницы) будет иметь сразу три имени: header-start , main-start и footer-start .

    Такая же логика работает и наоборот, если линиям указать имена дом-start и дом-end , то все что находится межу этими линиями превращается в область (ячейку) с именем дом .

    grid-template-areas: также можно указывать в первом значении свойств:

    Примеры:

    Шаблон страницы. Создадим сетку с четырьмя колонками и тремя рядами. Весь верхний ряд будет шапкой (header), средний ряд будет контентом (main) и сайдбаром (sidebar), между которыми оставим место (.). И последний рад будет подвалом (footer).

    Размеры и области можно указывать одновременно:

    Позволяет разом указать три свойства: grid-template-rows , grid-template-columns и grid-template-areas .

    Примеры:

    В первом параметре (в рядах) можно указать шаблон (области). 25px — это высота ряда.

    Также можно указывать имена для линий ряда:

    Можно ли обратиться к колонке или строке grid’а по заголовку?

    Заимел проблемку при сабже :-(

    Есть DbGridEh1 через DataSet1 связан с Query1. В запросе возвращаются в том числе 3 поля с данными по месяцам квартала и поле с номером квартала. В зависимости от номера квартала в шапке грида столбцы должны озаглавливаться соответствующими наименованиями месяцев, т.е. если 1 квартал то январь, февраль, март, если 3 квартал — июль, август, сентябрь и т.д.

    Поставил замену заголовков (через dbgrdh1.Columns[4].Title.Caption:=’название месяца’) в DataSet1.OnDataChange. Когда просматриваю значение dbgrdh1.Columns[4].Title.Caption через Watches в отладчике, то вижу что все норм меняется, но в самом гриде когда перемещаюсь по записям с помощью клавиш управления курсором ничего не меняется. Когда перемещаюсь с помощью PgUp/PgDown или скроллинга мышью меняется. Пробывал после изменения заголовка делать refresh, paint, application.processmessage, добавлял предварительно delay(1). Толку нуль :-(

    ЗЫ: EhLib 5.2.05, может какой-то баг в DBGridEh был в этой версии? Если у кого-нидь есть History/Changelog более новой версии можете посмотреть?

    One more step

    Please complete the security check to access codepen.io

    Why do I have to complete a CAPTCHA?

    Completing the CAPTCHA proves you are a human and gives you temporary access to the web property.

    What can I do to prevent this in the future?

    If you are on a personal connection, like at home, you can run an anti-virus scan on your device to make sure it is not infected with malware.

    If you are at an office or shared network, you can ask the network administrator to run a scan across the network looking for misconfigured or infected devices.

    Another way to prevent getting this page in the future is to use Privacy Pass. You may need to download version 2.0 now from the Chrome Web Store.

    Cloudflare Ray ID: 534a555618979087 • Your IP : 188.64.174.135 • Performance & security by Cloudflare

    Grid сортировка по колонке

    Для автоматической фильтрации/сортировки данных в dataset’е требуется добавить один из модулей EhLibXXX (EhLibADO, EhLibBDE, EhLibCDS . в зависимости от dataset’а, подключенного к grid’) в раздел ‘uses’ любого модуля вашего проекта. Эти EhLibXXX модули содержат код для регистрации класса который наследуется от TDatasetFeaturesEh (специальный объект) и осуществляет фильтрацию/сортировку в DataSet’е. Настройка сетки для сортировки данных: TDBGridEh позволяет отображать специальные sortmarking bitmaps (маленькие треугольники) в правой части заголовков столбцов. Для отображения sortmarking bitmaps добавьте dghAutoSortMarking в свойство OptionsEh. Добавьте также dghMultiSortMarking в OptionsEh для обеспечения одновременной пометки сортировки по нескольким столбцам. Установите Column.Title.TitleButton в True для заголовков, у которых вы хотите изменять sortmarkers в run-time. Вы можете установить свойство сетки ColumnDefValues.Title.TitleButton чтобы позволить метки сортировки для всех столбцов, у которых не менялось свойство Column.Title.TitleButton. В run-time клик на заголовке изменяет порядок сортировки. При нажатом Ctrl можно отметить насколько столбцов одновременно.

    Скандербег, вы не поняли, у меня есть своя процедура сортировки, в БД

    Можно ли обратиться к колонке или строке grid’а по заголовку?

    var r,rep: Variant;

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

    Как разместить прозрачную надпись на TBitmap?

    procedure TForm1.Button1Click(Sender: TObject);

    Image1.Picture.Bitmap.Canvas.TextOut(10, 10, ‘Hello’);

    Можно ли обратиться к колонке или строке grid’а по заголовку?

    В следующем примере приведены две функции: GetGridColumnByName() и GetGridRowByName(), которые возвращают колонку или строку, имеющую заданный заголовок (caption).

    procedure TForm1.FormCreate(Sender: TObject);

    function GetGridColumnByName(Grid : TStringGrid; ColName : string): integer;

    for i := 0 to Grid.ColCount — 1 do if Gr > begin

    function GetGridRowByName(Grid : TStringGrid; RowName : string): integer;

    for i := 0 to Grid.RowCount — 1 do if Gr > begin

    procedure TForm1.Button1Click(Sender: TObject);

    Column := GetGridColumnByName(StringGrid1, ‘This Column’);

    if Column = -1 then ShowMessage(‘Column not found’)

    else ShowMessage(‘Column found at ‘ + IntToStr(Column));

    Row := GetGridRowByName(StringGrid1, ‘This Row’);

    if Row = -1 then ShowMessage(‘Row not found’)

    else ShowMessage(‘Row found at ‘ + IntToStr(Row));

    Как использовать клавишу-акселератор в TTabsheets? Я добавляю клавишу-акселератор в заголовок каждого Tabsheet моего PageControl, но при попытке переключать страницы этой клавишей программа пикает и ничего не происходит.

    Ответ: Можно перехватить сообщение CM_DIALOGCHAR.

    type TForm1 = class(TForm)

    procedure CMDialogChar(var Msg:TCMDialogChar); message CM_DIALOGCHAR;

    procedure TForm1.CMDialogChar(var Msg:TCMDialogChar);

    with PageControl1 do begin

    if Enabled then for i := 0 to PageControl1.PageCount — 1 do if ((IsAccel(Msg.CharCode, Pages[i].Caption)) and (Pages[i].TabVisible)) then begin

    При использованиии компонента TRegistry под NT пользователь с права доступа ниже чем «администратор» не может получить доступа к информации реестра в ключе HKEY_LOCAL_MACHINE. Как это обойти?

    Проблема вызвана тем, что TRegistry всегда открывает реестр с параметром KEY_ALL_ACCESS (полный доступ), даже если необходим доступ KEY_READ (только чтение). Избежать этого можно используя функции API для работы с реестром (RegOpenKey и т.п.), или создать новый класс из компонента TRegestry, и изменить его так чтобы можно было задавать режим открытия реестра.

    Можно ли изменить число колонок и их ширину в компоненте TFileListBox?

    В приведенном примере FileListBox приводится к типу TDirectoryListBox — таким образом можно добавиь дополнительные колонки.

    with TDirectoryListBox(FileListBox1) do begin

    SendMessage(Handle, LB_SETCOLUMNWIDTH, Canvas.TextWidth(‘WWWWWWWW.WWW’),0);

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

    Пошлите в Memo сообщение EM_SETTABSTOPS. Например установим первую позицию табуляции на 20-й пиксел.

    procedure TForm1.FormCreate(Sender: TObject);

    TabArray : array[0..4] of integer;

    for i := 1 to 5 do begin

    TabArray[i — 1] :=((PixelsX * i ) * 4) div DialogUnitsX;

    Как перехватить нажатия функциональных клавиш и стрелок?

    Проверяйте значение переменной key на равенство VK_RIGHT, VK_LEFT, VK_F1 и т.д. на событии KeyDown формы.

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

    if Key = VK_RIGHT then Form1.Caption := ‘Right’;

    if Key = VK_F1 then Form1.Caption := ‘F1’;

    При обработке события DrawCell компонента DrawGr >

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

    If (Row = 0) then begin

    При использовании BitBtn Caption(текст) и картинка(bitmap) из файла не видны одновременно. Почему?

    Это может происходить если картинка слишком велика. Класс TBitBtn сначала рисует картинку, а затем выводит текст над, под, слева или справа от картинки (в завивимости от свойства Layout). Если размер картинки такой же как у всей кнопки для вывода текста просто не остается места. Если Вам нужно получить кнопку такого же размера как Ваша картинка и видеть при этом надпись на кнопке Вам придется выводить текст надписи непосредственно на канву картинки.

    bm.Canvas.Draw(0, 0, BitBtn1.Glyph);

    OldBkMode := SetBkMode(bm.Canvas.Handle, Transparent);

    bm.Canvas.TextOut(0, 0, ‘The Caption’);

    Можно ли изменить вид текстового курсора (каретки) edit’а или другого элемента управления Windows?

    Можно! В примере показано как создать два цветных «bitmap’а»: «улыбчивый» и «хмурый» и присвоить их курсору edit’а. Для этого нужно перехватить оконную процедуру edit’а. Чтобы сделать это заменим адрес оконной процедуры Edit’а нашим собственным, а старую оконную процедуру будем вызывать по необходимости. Пример показывает «улыбчивый» курсор при наборе текста и «хмурый» при забое клавишей backspace.

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

    uses WinTypes, WinProcs, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

    type TForm1 = class(TForm)

    procedure FormCreate(Sender: TObject);

    procedure FormDestroy(Sender: TObject);

    var Form1: TForm1;

    function NewWindowProc(WindowHandle : hWnd; TheMessage : WParameter; ParamW : WParameter; ParamL : LParameter) : LongInt

    NewWindowProc := CallWindowProc(Form1.OldEditsWindowProc, WindowHandle, TheMessage, ParamW, ParamL);

    if TheMessage = WM_SETFOCUS then begin

    CreateCaret(WindowHandle, Form1.CaretBm.Handle, 0, 0);

    if TheMessage = WM_KILLFOCUS then begin

    if TheMessage = WM_KEYDOWN then begin

    if ParamW = VK_BACK then CreateCaret(WindowHandle, Form1.CaretBmBk.Handle, 0, 0)

    else CreateCaret(WindowHandle, Form1.CaretBm.Handle, 0, 0);

    procedure TForm1.FormCreate(Sender: TObject);

    Статьи 1
    Советы по Delphi 1
    Советы по работе с системой 1
    Советы для написания программ-инсталляторов 1
    Регистрация программ в меню «Пуск» Windows 95 1
    Как программно создать ярлык? 1
    Затенить кнопку «Закрыть» в заголовке формы 1
    Копирование файлов 1
    Как скопировать все файлы вместе с подкаталогами 1
    Удаление каталога со всем содержимым 1
    Определение системной информации 1
    Как проинсталлировать свои шрифты? 2
    Вставить какую-нибудь программу внутрь EXE файла 2
    Как написать маленький инсталлятор? 2
    Рисую две иконки 32х32 и 16х16, но под NT 32х32 не показывается! 2
    Работа с принтером. 2
    Система 2
    Внешние модули (DLL), нити 6
    Советы по работе с реестром. 7
    Использование некоторых ключей реестра 7
    Работа с реестром в Delphi 1 7
    Объект INIFILES — работа с INI файлами. 7
    Советы по работе с графикой 8
    Разное 9
    Глюки 14
    Создание редактора карт в стратегиях типа WarCraft 14
    Шпаргалка по ресурсам Windows-32 (для Delphi) 18
    Стандартная технология доступа к ресурсам 18
    Внутренний формат ресурсов Windows 18
    Описание формата ресурсов в MS PE COFF. 19
    Дамп памяти (взят из PE.TXT) 19
    API 20
    Программирование на основе Win32 API в Delphi 20
    1. Введение 20
    2. Существующие решения 20
    3. Принципы построения API-библиотеки 20
    4. Библиотека WinLite 21
    5. Пример программы на основе библиотеки WinLite 23
    KOL 23
    Состояние проекта KOL 23
    FAQ 24
    Часто задаваемые вопросы по Borland Delphi 24
    Общие вопросы по Delphi и данному FAQ (часть 1) 24
    Введение 24
    Вопросы общего характера 24
    Совместимость 26
    Базы данных — Interbase и локальные данные 27
    Базы данных — прочие SQL сервера 28
    Общие вопросы по Delphi и данному FAQ (часть 2) 29
    Базы данных — компоненты и VCL. 29
    Компоненты и VCL 31
    Общие вопросы по Delphi и данному FAQ (часть 3) 34
    Object Pascal и Windows API 34
    Разное 37
    Полезные хитрости 38
    Вопросы по Delphi 1.0 38
    Вопросы общего характера 38
    Delphi и Visual Basic 39
    Базы данных 40
    Object Pascal и Windows API 40
    Компоненты и VCL 41
    Разное 41
    Вопросы по Delphi 2.0 41
    Что нового в Delphi 2.0 по сравнения с Delphi 1.0? 41
    Вопросы общего характера 41
    Базы данных 44
    Object Pascal и Windows API 44
    Разное 44
    Вопросы по Delphi 3.0 45
    Вопросы общего характера 45
    Object Pascal и Windows API 45
    Delphi, С++ Builder и базы данных: вопросы и ответы 46
    Delphi VCL FAQ 48

    Лучшие электронные книги в формате fb2
    Наш портал – это библиотека интересных электронных книг разнообразных жанров. Здесь вы найдете произведения как российских, так и зарубежных писателей. Все электронные книги, представленные на нашем сайте, можно скачать бесплатно. Наша библиотека содержит только лучшие бесплатные электронные книги, ведь каждую электронную книгу мы тщательно изучаем перед добавлением в базу. Мы выбираем интереснейшие произведения в удобном формате fb2, все они достойны вашего внимания. Чтение электронных книг наверняка принесет вам удовольствие. Всё что, что вам нужно сделать, — найти и скачать книгу, которая понравится вам по заголовку и описанию.
    Библиотека fb2-электронных книг – полезнейшее изобретение человечества. Для того чтобы, читать книгу, вам нужно просто загрузить ее с нашего сайта. Вы можете наслаждаться чтением, не совершая лишние траты. Электронная книга, в отличие от бумажной, обладает множеством преимуществ. Вы экономите время и силы, не совершая утомительные походы по магазинам. Вам также не нужно обременять себя ношением тяжеловесной макулатуры. Скачать и читать электронную книгу легко и просто . Мы позаботились о том, чтобы вам всегда было что почитать. Электронная книга fb2 принесет вам море положительных эмоций: она способна поделиться с вами мудростью, поднять настроение или просто скрасить досуг.

    Илон Маск рекомендует:  Функции bios int 1dh указатель видеопараметров
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL