Показ дописів із міткою Разработка. Показати всі дописи
Показ дописів із міткою Разработка. Показати всі дописи
середа, 22 травня 2024 р.
четвер, 18 червня 2020 р.
Как словить событие формы OnMove в Delphi
Я не нашел такого события OnMove для формы в Delphi XE8. Как дела обстоят в более старших версиях не знаю. Но вот как это решается для моего случая - просто добавляем обработчик сообщения WM_MOVE в форму:
procedure OnMove(var Msg: TWMMove); message WM_MOVE;Сообщение WM_MOVE приходить когда пользователь схватил форму, перетащил и отпустил. Если вам нужно ловить событие во время самого движение добавьте обработчик WM_MOVING.
....
procedure TMyForm.OnMove(var Msg: TWMMove);
begin
DoSomething;
end;
субота, 18 лютого 2012 р.
Как убрать закладки у PageControl?
Уже много раз нужно было убрать у TPageControl эти закладки. Не TabSheet, а именно сам заголовок. Мне нужно было для визарда, для формы настроек, где слева дерево, а справа страница с контролами.
Как сделать это с TPageControl сразу не понятно и поэтому как я только не изголялся - использовал и TFrame, и TNoteBook. Всё неудобно. Но как это сделать с TPageControl я долго не искал, потомучто нужно было делать срочно.
И вот настал момент, когда сказали переделать существующий PageControl, у которого около 20 страниц, на каждой из которых может быть до 20 контролов. Переделывать все это заново как-то не хотелось.
Правду люди говорят:
Вот и все
Как сделать это с TPageControl сразу не понятно и поэтому как я только не изголялся - использовал и TFrame, и TNoteBook. Всё неудобно. Но как это сделать с TPageControl я долго не искал, потомучто нужно было делать срочно.
И вот настал момент, когда сказали переделать существующий PageControl, у которого около 20 страниц, на каждой из которых может быть до 20 контролов. Переделывать все это заново как-то не хотелось.
Правду люди говорят:
"Лень - двигатель прогресса"Нашел как это сделать. И все оказалось очень просто. И так.
- Кидаем на форму TPageControl.
- Устанавливаем TPageControl.Style := tsButtons.
- Заполняем его TTabSheet-ами
- У каждого табшита устанавливаем TabVisible := False;
- Потом присваиваем TPageControl.ActivePage := TabSheet1;
В моем случае я сделал при создании формы
pcMain.Style := tsButtons;
for I := 0 to pcMain.PageCount-1 do
pcMain.Pages[I].TabVisible := False;
pcMain.ActivePage := tsBasic;
Заполнил TreeView нодами с заданными значениями SelectedIndex. Потом в TTreeView.OnChange
procedure TfrmMain.PropTreeChange(Sender: TObject; Node: TTreeNode);
begin
case Node.SelectedIndex of
10 : pcMain.ActivePage := tsBasic;
20 : pcMain.ActivePage := tsDocs;
30,
31 : pcMain.ActivePage := tsTextsOffer;
32 : pcMain.ActivePage := tsTextsInfo;
...
где tsBasic и тому подобные - это TTabSheet
Вот и все
пʼятниця, 17 лютого 2012 р.
Проблемы с наследниками TFrame
Добавил в проект фрейм TCustomTextFrame = class (TFrame). Визуальных контролов на него не ложил. Просто добавил нужные свойства, методы, объявил абстракные...
Добавить наследника TCustomTextFrame через File/Add New/Other/Inherited не получилось.
Добавил простой фрейм и вручную в коде поменял ему предка с TFrame на TCustomTextFrame
TframeTextsOffer = class(TCustomTextFrame)
Всё нормально подхватилось и заработало.
Самое интересно началось на следующий день - при открытии в дизайнтайме TframeTextsOffer вылетала ошибка, что нет такого свойства как ClientHeight. Компилялось молча, но при запуске приложения тоже ругалось на ClientHeight.
Оказалось что делфи почемуто добавляет внуку, так сказать, фрейма в *.dfm свойства ClientHeigh, ClientWidth и ещё кучу всякого. Но у фрейма такого нет. Вот и ругается.
Но простое удаление не дает результатов - делфи при открытии TframeTextsOffer в дизайнтайме упорно добавляет эти свойства, на которые потом сама же и ругается.
Помогло только изменение вручную в *.dfm object frameTextsOffer: TframeTextsOffer на inherited frameTextsOffer: TframeTextsOffer.
Не знаю насколько это правильно, но пока работает.
Добавить наследника TCustomTextFrame через File/Add New/Other/Inherited не получилось.
Добавил простой фрейм и вручную в коде поменял ему предка с TFrame на TCustomTextFrame
TframeTextsOffer = class(TCustomTextFrame)
Всё нормально подхватилось и заработало.
Самое интересно началось на следующий день - при открытии в дизайнтайме TframeTextsOffer вылетала ошибка, что нет такого свойства как ClientHeight. Компилялось молча, но при запуске приложения тоже ругалось на ClientHeight.
Оказалось что делфи почемуто добавляет внуку, так сказать, фрейма в *.dfm свойства ClientHeigh, ClientWidth и ещё кучу всякого. Но у фрейма такого нет. Вот и ругается.
Но простое удаление не дает результатов - делфи при открытии TframeTextsOffer в дизайнтайме упорно добавляет эти свойства, на которые потом сама же и ругается.
Помогло только изменение вручную в *.dfm object frameTextsOffer: TframeTextsOffer на inherited frameTextsOffer: TframeTextsOffer.
Не знаю насколько это правильно, но пока работает.
вівторок, 24 січня 2012 р.
Delphi и дескрипшены к полям MS Access
Задача: Получить коментарии (описания) полей в MS Access и сделать их хинтами к контролам.
Итак что нужно сделать
private
FFieldsComments: TStrings;
...
Итак что нужно сделать
- Получить комментарии к полям
- Список Таблица.Поле=Коментарий
- Обновить хинты контролов.
В DataModule делаю
FFieldsComments: TStrings;
...
procedure UpdateFieldsComments;
published
property FieldsComments: TStrings read FFieldsComments;
procedure TdmMain.UpdateFieldsComments;
var
ADODataSet: TADODataSet;
begin
if Assigned(FFieldsComments) and ADOConnection1.Connected then
begin
FFieldsComments.Clear;
ADODataSet := TADODataSet.Create(Self);
try
ADOConnection1.OpenSchema(siColumns, VarArrayOf([Unassigned, Unassigned, tblDeviceCharacteristics.TableName]), EmptyParam, ADODataSet);
ADODataSet.Open;
ADODataSet.First;
while not ADODataSet.Eof do
begin
if ADODataSet.FieldByName('DESCRIPTION').AsWideString <> '' then
FFieldsComments.Append(ADODataSet.FieldByName('TABLE_NAME').AsWideString + '.' +ADODataSet.FieldByName('COLUMN_NAME').AsWideString + '=' +ADODataSet.FieldByName('DESCRIPTION').AsWideString);
ADODataSet.Next;
end;
finally
FreeAndNil(ADODataSet)
end;
end;
end;
published
property FieldsComments: TStrings read FFieldsComments;
FFieldsComments создается в DataModuleCreate и разрушается в DataModuleDestroy.
procedure TdmMain.UpdateFieldsComments;
var
ADODataSet: TADODataSet;
begin
if Assigned(FFieldsComments) and ADOConnection1.Connected then
begin
FFieldsComments.Clear;
ADODataSet := TADODataSet.Create(Self);
try
ADOConnection1.OpenSchema(siColumns, VarArrayOf([Unassigned, Unassigned, tblDeviceCharacteristics.TableName]), EmptyParam, ADODataSet);
ADODataSet.Open;
ADODataSet.First;
while not ADODataSet.Eof do
begin
if ADODataSet.FieldByName('DESCRIPTION').AsWideString <> '' then
FFieldsComments.Append(ADODataSet.FieldByName('TABLE_NAME').AsWideString + '.' +ADODataSet.FieldByName('COLUMN_NAME').AsWideString + '=' +ADODataSet.FieldByName('DESCRIPTION').AsWideString);
ADODataSet.Next;
end;
finally
FreeAndNil(ADODataSet)
end;
end;
end;
Всё делается методом OpenSchema.Самый мне непонятный параметр это второй. Туда передаю VarArrayOf(...), но я пока не нашел описания что есть что в этом масиве. Я просто подставил то что нашёл в инете и получил, что хотел. Может, если найду описание дополню статью.
Процедуру UpdateFieldsComments вызываю в ADOConnection.OnAfterConnect.
Теперь в форме нужно обновить хинты.
procedure TfrmMain.UpdateHitnsFromDB;
var
i: integer;
procedure UpdateDBEditHint( AControl: TDBEdit);
begin
if AControl.DataSource.DataSet is TADOTable then
AControl.Hint := dmMain.FieldsComments.Values[TADOTable(AControl.DataSource.DataSet).TableName + '.' + AControl.DataField];
end;
procedure UpdateDBLinkEditHint( AControl: TDBLinkEdit);
begin
if AControl.DataSource.DataSet is TADOTable then
AControl.Hint := dmMain.FieldsComments.Values[TADOTable(AControl.DataSource.DataSet).TableName + '.' + AControl.DataField];
end;
procedure UpdateDBLookupComboBoxHint( AControl: TDBLookupComboBox);
begin
if AControl.DataSource.DataSet is TADOTable then
AControl.Hint := dmMain.FieldsComments.Values[TADOTable(AControl.DataSource.DataSet).TableName + '.' + AControl.DataField];
end;
begin
for I := 0 to ComponentCount-1 do
if Components[I] is TDBEdit then
UpdateDBEditHint(Components[I] as TDBEdit)
else if Components[I] is TDBLinkEdit then
UpdateDBLinkEditHint(Components[I] as TDBLinkEdit)
else if Components[I] is TDBLookupComboBox then
UpdateDBLookupComboBoxHint(Components[I] as TDBLookupComboBox)
end;
UpdateHitnsFromDB вызываю в actConnectExecute
Вот и все.
середа, 18 січня 2012 р.
Delphi и Диалог выбора папки
Сколько себя помню у Delphi никогда не было своего компонента выбора папки типа TOpenDialog и каждый раз когда нужно было выбирать именно папку искал как это делается.Вот теперь решил записать то что я нашел и немного переделал для себя.
Это пока функция, возможно когда-то сделаю компонент типа TOpenFolder.
И так всё эавязано на функции ShBrowseForFolder из модуля ShlObj или по новому Winapi.ShlObj.
Но множество примеров, которые я видел были без кнопки Create New Folder и без возможности установки пути по умолчанию.
И так код:
...
function SelectFolder(hWnd: HWND; const Caption: WideString; var Folder: WideString): boolean;
...
implementation
uses ShlObj, ActiveX, Forms;
var
DefaultPath: widestring = '';
...
//Эта функция нужна для установки пути по умолчанию
function BrowseCallbackProc(hwnd: HWND; uMsg: UINT; lParam: LPARAM; lpData: LPARAM): integer; stdcall;
begin
Result := 0;
if uMsg = BFFM_INITIALIZED then
SendMessage(hwnd, BFFM_SETSELECTION, 1, LongInt(PWideChar(DefaultPath)));
end;
function SelectFolder(hWnd: HWND; const Caption: WideString; var Folder: WideString): boolean;
var
WindowList: Pointer;
BrowseInfo : TBrowseInfo;
Buffer: PChar;
RootItemIDList, ItemIDList: PItemIDList;
ShellMalloc: IMalloc;
IDesktopFolder: IShellFolder;
Eaten, Flags: LongWord;
begin
FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
begin
Buffer := ShellMalloc.Alloc(MAX_PATH);
try
DefaultPath := Folder;
RootItemIDList := nil;
with BrowseInfo do
begin
hwndOwner := hWnd;
pidlRoot := RootItemIDList;
pszDisplayName := Buffer;
lpfn := @BrowseCallbackProc;
lpszTitle := PWideChar(Caption);
ulFlags := BIF_RETURNONLYFSDIRS or $0040 or BIF_EDITBOX or BIF_STATUSTEXT;
end;
WindowList := DisableTaskWindows(0);
try
ItemIDList := ShBrowseForFolder(BrowseInfo);
finally
EnableTaskWindows(WindowList);
end;
Result := ItemIDList <> nil;
if Result then
begin
ShGetPathFromIDList(ItemIDList, Buffer);
ShellMalloc.Free(ItemIDList);
Folder := Buffer
end;
finally
ShellMalloc.Free(Buffer);
DefaultPath := '';
end;
end;
end;
Теперь пример использования:
procedure TframeGeneralSettings.Button1Click(Sender: TObject);
var
Value: WideString;
begin
Value := edtImagesFolder.Text;
if SelectFolder(Handle, 'Select ' + lblImagesFolder.Caption, Value) and (Value <> edtImagesFolder.Text) then
edtImagesFolder.Text := Value;
end;
пʼятниця, 9 грудня 2011 р.
Delphi не загружает мои компоненты
Появилась необходимость написать свой компонет потомок TCustomLabel. Написал. Может в будущем сделаю заметочку, что и как писал
Так вот. Создал пакет, создал компонент и с дефотными настройками собрал и поставил. Стало без проблем. Заменил в основном проекте все лабелы на свои.
Всё работает отлично. Настроение хорошее...
Пока делфу не перегрузил. Тут оказалось, что оно не видит мой пакетик, мою бэпээлочку. Разбираюсь. Оказалось если не указать, куда ставить пакет, то оно его ставит в
С:\Documents and Settings\All Users\Documents\RAD Studio\5.0\Bpl\И при загрузке от туда не поднимает. Т.к. я буду отдавать этот компонент людям, что бы они дальше с ним работали, то я не надаюсь, что каждый додумается добавить эти папки в пути поиска.
С:\Documents and Settings\All Users\Documents\RAD Studio\5.0\Dcp\
Полез в настройки делфы и подсмотрел как она обзывает папку с собой и в настройках пакета прописал пути Output directory и DCP output directory

Теперь пакет ставится в
С:\Program Files\CodeGear\RAD Studio\5.0\bin\Может я что-то сделал не канонично. Но по крайней мере работает.
С:\Program Files\CodeGear\RAD Studio\5.0\lib\
середа, 31 березня 2010 р.
Горячие клавиши Delphi
Человек, который не знает свой инструмент, что мартышка с гранатой.
| Шоткат | Описание | Версия IDE |
|---|---|---|
| Escape | Нажате Escape во время перемещения контрола делает объектом перемещения родителя контрола | Delphi 2 и выше |
| Shift + Click | After selecting control in form designer, click on it with Shift again to select top most parent Form | Delphi 5 и выше |
| Tab | На форме перемещает фокус по контролам. В Инспекторе Объектов переключает испектор в режим инктрементного поиска по названиям совйств | Delphi 5 и выше |
| Ctrl + J | Открывает список шаблонов кода | Delphi 5 и выше |
| Ctrl + T | Удаляет текст с позиции курсора до конца слова | Delphi 5 и выше |
| Ctrl + E | Инкрементный поиск | Delphi 5 и выше |
| Ctrl + Y | Удаляет текущую строку | Delphi 5 и выше |
| Ctrl + B | В редакторе вызывает окно буфера. The buffer window shows a list of all different tabs. | Delphi 2007 и выше |
| Ctrl + Shift + G | Генерирует новый GUID в позиции курсора | Delphi 5 и выше |
| Ctrl + Shift + I | Сдвиг выделенного блока вправо | Delphi 5 и выше |
| Ctrl + Shift + U | Сдвиг выделенного блока влево | Delphi 5 и выше |
| Ctrl + K + I | Сдвиг выделенного блока вправо | Delphi 5 и выше |
| Ctrl + K + U | Сдвиг выделенного блока влево | Delphi 5 и выше |
| Ctrl + Shift + J | Вызов SyncEdit | Borland Developer Studio 2006 |
| Ctrl + Shift + V | Автоматически объявить переменную в позиции курсора | Borland Developer Studio 2006 |
| Ctrl + Shift + Y | Удалить до конца строки | Delphi 5 и выше |
| Alt + [ | Соответствующая скобка вперед | Delphi 5 и выше |
| Alt + ] | Соответствующая скобка назад | Delphi 5 и выше |
| Alt + RightArrow | Browse forward (hotlink history) | Delphi 6 и выше |
| Alt + LeftArrow | Browse backward (hotlink history) | Delphi 6 и выше |
| Alt + UpArrow | Browse to symbol under editor cursor (invoke a hotlink and add it to the hotlink history) | Borland Developer Studio 2006 |
| F4 | Запустить программу до остановки в позиции курсора | Delphi 2 и выше |
| F5 | Пставить/удалить точку останова | Delphi 2 и выше |
| F7 | Трассировка с входом в вызываемые процедуры и функции | Delphi 2 и выше |
| Shift - F7 | Трассировка заходя в каждую процедуру и перескакивание в каждое возникающее событие | Delphi 5 и выше |
| F8 | Трассировка без входа в вызываемые процедуры и функции | Delphi 2 и выше |
| Shift - F8 | Run until return | Delphi 5 и выше |
| F9 | Запустить программу в режиме отладки | Delphi 2 и выше |
| Ctrl + F2 | Прервать выполнение программы | Delphi 5 и выше |
| Ctrl + F7 | Просмотр значений переменных и их изменение | Delphi 2005 и выше |
| Ctrl + F5 | Добавить в список переменных для просмотра | Delphi 5 и выше |
| Ctrl + F12 | Список модулей | Delphi 2 и выше |
| Alt + G | Перейти к строке по номеру | Delphi 2 и выше |
| Ctrl + O + G | Перейти к строке по номеру | Delphi 5 и выше |
| Ctrl + Shift + R | Старт\стоп записи макро | Delphi 2 и выше |
| Ctrl + Shift + P | Запустить макро | Delphi 2 и выше |
| Ctrl + Spacebar | Показать список методов, свойств объекта (после точки) | Delphi 5 и выше |
| Ctrl + Shift + Spacebar | Показать список параметров функции | Delphi 5 и выше |
| Ctrl + Enter | Открыть файл с именем слова на котором курсор стоит | Delphi 2 и выше |
| Ctrl + Shift + Enter | Найти все ссылки | Delphi 2005 и выше |
| Ctrl + Shift + C | Закончить метод (если он описан – создать шаблон для реализации,если есть реализация – объявить метод) | Delphi 5 и выше |
| Ctrl + Shift + UpArrow | Переход от объявления процедуры к ее реализации | Delphi 5 и выше |
| Ctrl + Shift + DownArrow | Переход от объявления процедуры к ее реализации | Delphi 5 и выше |
| Ctrl + Shift + 1 - 9 | Поставить\снять закладку | Delphi 2006 и выше |
| Ctrl + 1 - 9 | Перйти к закладке | Delphi 2006 и выше |
| Ctrl + Alt + F12 | Открыть список открытых файлов в правом верхнем углу | Borland Developer Studio 2006 |
| Ctrl + Alt + Mouse Wheel | Переход к предыдущей или следующей реализации метода в лексикографическом порядке в текущем модуле, либо в классе, который был ограничен Ctrl + Q + L | Borland Developer Studio 2006 |
| Ctrl + Alt + UpArrow | Переход к предыдущей реализации метода в лексикографическом порядке в текущем модуле, либо в классе, который был ограничен Ctrl + Q + L | Borland Developer Studio 2006 |
| Ctrl + Alt + DownArrow | Переход к следующей реализации метода в лексикографическом порядке в текущем модуле, либо в классе, который был ограничен Ctrl + Q + L | Borland Developer Studio 2006 |
| Ctrl + Alt + Home | Переход к лексически первой реализации метода в текущем модуле, либо в классе, который был ограничен Ctrl + Q + L | Borland Developer Studio 2006 |
| Ctrl + Alt + End | Переход к лексически последней реализации метода в текущем модуле, либо в классе, который был ограничен Ctrl + Q + L | Borland Developer Studio 2006 |
| Ctrl + Alt + P | Активировать палитру компонентов в режиме фильтра (наберите название и нажмите Enter чтобы бросить на форму) | Delphi 2005 и выше |
| Ctrl + Alt + A | Вставить текущюю дату в позицию курсора | since BCB 4.0 |
| Ctrl + / | Закоментировать\раскоментировать, Ctrl + # для нордических (и возможно для других интернациональных) клавиатур | Delphi 2005 и выше |
| Ctrl + Shift + T | Добавить в список Todo | Delphi 2005 и выше |
| Alt + F12 | Переключение отображения формы между тектовым и дезигн режимами | Delphi 5 и выше |
| Alt + F11 | Диалог модулей | Delphi 5 и выше |
| Ctrl + F11 | Диалог открытия проекта | Delphi 2005 и выше |
| Ctrl + Alt + F11 | Окно управления проектом | Delphi 2005 и выше |
| F11 | Инспектор объектов | Delphi 5 и выше |
| F12 | Переключение между редактором и дизайнером | Delphi 5 и выше |
| Alt + 0 | Список окон | Delphi 2005 и выше |
| Shift + Alt + F11 | Окно структуры | Delphi 2005 и выше |
| Ctrl + Shift + B | Вызывает непонятное окно с название "Buffer list" | Delphi 5 |
| Ctrl + Alt + B | Окно точек останова | Delphi 5 и выше |
| Ctrl + Alt + S | Окно стека вызовов | Delphi 5 и выше |
| Ctrl + Alt + W | Окно просмотра трассируемых переменных | Delphi 5 и выше |
| Ctrl + Alt + L | Окно локальных переменны | Delphi 5 и выше |
| Ctrl + Alt + T | Окно нитей (Threads) | Delphi 7 и выше |
| Ctrl + Alt + F | Окно FPU | Delphi 2005(removed from Delphi 2006) |
| Ctrl + Alt + C | Окно CPU | Delphi 5 и выше |
| Ctrl + Alt + V | Окно событий (Event) | Delphi 5 и выше |
| Ctrl + Alt + M | Окно модулей | Delphi 2005 и выше |
| Shift + F12 | Окно форм | Delphi 5 и выше |
| Ctrl + Shift + A | Invoke Add to uses clause(Find unit in Delphi 2006) window (Refactoring) | Delphi 2005 и выше |
| Ctrl + Shift + F11 | Окно настроек проекта | Delphi 2005 и выше |
| Ctrl + F9 | Компилировать проект | Delphi 5 и выше |
| Shift + F9 | Собрать проект | Delphi 5 и выше |
| Shift + F11 | Окно добавления в проект | Delphi 5 и выше |
| Shift + Ctrl + F9 | Запустить без отладки | Delphi 2005 и выше |
| Ctrl + F | Поиск | Delphi 3 и выше |
| Shift + Ctrl + F | Поиск в файлах | Delphi 3 и выше |
| Alt + F7/F8 | Предыдущий/следующий результат (для поиска в файлах и ошибок сборки) | Delphi 7 и выше |
| Ctrl+K+E | Привести выделенный текст к нижнему регистру и убрать выделение | Delphi 5 и выше |
| Ctrl+K+F | Привести выделенный текст к верхнему регистру и убрать выделение | Delphi 5 и выше |
| Ctrl+K+O | Привести выделенный текст к нижнему регистру | Delphi 5 и выше |
| Ctrl+K+N | Привести выделенный текст к верхнему регистру | Delphi 5 и выше |
| Ctrl+O+U | Переключить регистр | Delphi 5 и выше |
| Ctrl+Shift+K+O | Включить\выключить сворачивание кода | Delphi 2006 и выше |
| Ctrl+Shift+K+A | Сворачивание кода: Развернуть все блоки кода | Delphi 2006 и выше |
| Ctrl+Shift+K+E | Сворачивание кода: Свернуть все блоки кода | Delphi 2006 и выше |
| Ctrl+Shift+K+U | Сворачивание кода: Развернуть текущий блок кода | Delphi 2006 и выше |
| Ctrl+Shift+K+T | Сворачивание кода: Переключить текущий блок (expand & collapse) | |
| Ctrl+Shift+K+R | Сворачивание кода: Свернуть все регионы {$region 'comment'}..{$endregion} | Delphi 2006 и выше |
| Ctrl+Shift+K+P | Сворачивание кода: Свернуть вложенные процедуры | |
| Ctrl+Shift+K+M | Сворачивание кода: Свернуть все методы | |
| Ctrl+Shift+K+C | Сворачивание кода: Свернуть все классы | |
| Ctrl+Shift+K+G | Сворачивание кода: Свернуть до главных групп [Interface/Implementation] | Delphi 2006 и выше |
| Ctrl+Shift+K+N | Сворачивание кода: Свернуть Namespace/Unit | Delphi 2006 и выше |
| Ctrl+Tab | Переключиться на следующий открытый файл в редакторе | Delphi 2006 и выше |
| Ctrl+Shift+Tab | Переключиться на передыдущий открытый файл в редакторе | Delphi 2006 и выше |
| Ctrl + K + P | Диалог печати выделенного | Delphi 5 и выше |
| Ctrl + K + W | Записать блок в файл (выделенный текст) | Delphi 5 и выше |
| Ctrl + K + R | Прочитать блок из файла и вставить текст в позици курсора | Delphi 5 и выше |
| Ctrl + K + C | Copies selected text at the end of the selection | Delphi 5 и выше |
| Ctrl + K + T | Выелить слово в позиции курсора | Delphi 5 и выше |
| Ctrl + O + L | Выделить текущую строку | Delphi 5 и выше |
| Ctrl + Q + L | Toggles between limiting the Ctrl+Alt navigation shortcuts to the current class, or limiting it to the current unit | Borland Developer Studio 2006 |
| Ctrl + Q + W | Перейти на следующий елемен в окне сообщений | Delphi 5 и выше |
| Ctrl + F6 | Переключиться между исходником (.cpp) и заголовком (.h) | BDS 2006 и выше, C++ Builder personality |
Оригинал тут
Тестировал на Delphi 2007. Некоторые вещи не работали. Некотрые не понял так и оставил в английском варианте. Если вы найдете ошибки, неточности и т.п. пишите.
Доделаем до конца.
Доделаем до конца.
четвер, 4 березня 2010 р.
MessageBox в Qt
Подготовка к работе
За работу с всплывающими
сообщениями в Qt отвечает модуль
QMessageBox, поэтому необходимо подключить
его в исходнике:
#include<QMessageBox>
Простой Message Box без обработки вариантов ответа
Создание простого
Message Box без обработки вариантов ответа
(по сути это просто всплывающее окно,
убирается по нажатию на центр джойстика).
#include<QtGui/QApplication>
#include<QMessageBox>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QMessageBox msgBox;
msgBox.setText("Hello Here");
msgBox.exec();
app.quit();
return 1;
}
#include<QMessageBox>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QMessageBox msgBox;
msgBox.setText("Hello Here");
msgBox.exec();
app.quit();
return 1;
}
"Умный" Message Box с обработкой вариантов ответа
Для интереса добавим
появление этого бокса по нажатию на
кнопку: Создаем на форме кнопку, жмем
на ней правой кнопкой мыши - Перейти к
слоту. Выбираем clicked() и вставляем туда
следующий код:
QMessageBox msgBox;
// Заголовок сообщения
msgBox.setText("Testing..");
// Тип иконки сообщения
msgBox.setIcon(QMessageBox::Information);
// Основное сообщение Message Box
msgBox.setInformativeText("Just show infornation.");
// Добавление реагирования на софт клавиши
msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
// На какой кнопке фокусироваться по умолчанию
msgBox.setDefaultButton(QMessageBox::Ok);
/* Запускаем QMessageBox. После выполнения, в ret будет лежать значение кнопки, на которую нажали - это необходимо для дальнейшей обработки событий*/
int ret = msgBox.exec();
// Собственно вот этот case и отвечает за обработку событий
switch (ret) {
case QMessageBox::Save:
// Сюда пишем обработку события Cancel
break;
case QMessageBox::Ok:
// Сюда пишем обработку события Ok
break;
default:
// Сюда пишем обработку события по умолчанию
break;
}
// Заголовок сообщения
msgBox.setText("Testing..");
// Тип иконки сообщения
msgBox.setIcon(QMessageBox::Information);
// Основное сообщение Message Box
msgBox.setInformativeText("Just show infornation.");
// Добавление реагирования на софт клавиши
msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
// На какой кнопке фокусироваться по умолчанию
msgBox.setDefaultButton(QMessageBox::Ok);
/* Запускаем QMessageBox. После выполнения, в ret будет лежать значение кнопки, на которую нажали - это необходимо для дальнейшей обработки событий*/
int ret = msgBox.exec();
// Собственно вот этот case и отвечает за обработку событий
switch (ret) {
case QMessageBox::Save:
// Сюда пишем обработку события Cancel
break;
case QMessageBox::Ok:
// Сюда пишем обработку события Ok
break;
default:
// Сюда пишем обработку события по умолчанию
break;
}
Несколько "быстрых" вариантов создания MessageBox
QMessageBox::warning(0,"Warning", "Warning message text");
QMessageBox::information(0, "Information", "Information message text");
QMessageBox::critical(0, "Critical", "Critical message text");
QMessageBox::information(0, "Information", "Information message text");
QMessageBox::critical(0, "Critical", "Critical message text");
понеділок, 1 березня 2010 р.
Надоело __history в Delphi?
Пишу проект на Delphi 2007. Через некоторое время заметил что папка с проектом начала ненормально раздуваться.
Присмотревшись нашел там новую папку __history, содержимое которой напомнило мне некое подобие системы управления версиями. Но я уже привык пользоваться subversion и этот новый прибамбас просто раздражает. Поначалу я просто ее грохал. Потом мне это надоело и решил найти где это отключается.
Покопавшись нашел
Tools->Options->Editor Options->Create backup files
Снимаем галочку и радуемся.
вівторок, 16 лютого 2010 р.
GExperts: Отладка на другой машине
В нем есть отличная функция SendDebug, с помощью которой вы сможете выводить отладочную информацию в отдельное окно,
которое имеет свою иконку в SystemTray. Для этого в коде не нужно придумывать никаких конструкций - GExperts все делает сам. Он добавляет в список модулей модуль DebugIntf а в код вставляет такую конструкцию
{IFOPTD+} SendDebug(''); {ENDIF}
Так
что, когда отладили просто выключаем
опцию D и просто
перекомпилируйте и все.
Однако
у меня возникла ситуация, когда у себя
все отладил - вроде работает. Отдал
заказчику, а у него что-то не работает.
Если просто перекомпилировать программу
с опцией D и
отдать заказчику, то она не заработает,
а будет выкидывать всевозможные ошибки.
Поэтому
немного покопавшись решил эту проблему
следующим способом.
Поместил
папку к моей программе следующие файлы:
C:\Program Files\GExperts for Delphi 2007\GExpertsDebugWindow.exe *
C:\Windows\rtl100.bpl **
C:\Windows\vcl100.bpl **
C:\Windows\vclx100.bpl **
* Путь
может отличатся если вы указали его
вручную или у вас другая версия Delphi и
соответственно GExperts.
** Номер
в имени файла это версия Delphi. Так что
если у вас не Delphi 2007, то у вас другой
номер. Просто поищите в папке Windows файлы
rtl*.bpl, vcl*.bpl и vclx*.bpl
Заархивировал
папку и отправил клиенту.
Вот
и всё
Підписатися на:
Коментарі (Atom)