вторник, 24 января 2012 г.

Delphi и дескрипшены к полям MS Access

Задача: Получить коментарии (описания) полей в MS Access и сделать их хинтами к контролам.


Итак что нужно сделать
  1. Получить комментарии к полям
  2. Список Таблица.Поле=Коментарий
  3. Обновить хинты контролов.
Первое.
В DataModule делаю 


private
  FFieldsComments: TStrings;
  ...

  procedure UpdateFieldsComments;
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\
Может я что-то сделал не канонично. Но по крайней мере работает.

вторник, 29 ноября 2011 г.

Archlinux & VirtualBox перекомпиляция модуля ядра

На данный момент пользую на хосте ArchLinux, а для работы пользую виртуалки под VirtualBox. Но иногда обновляю систему на хосте и когда обновляется ядро, VirtualBox отказывается работать и проси пересобрать ядро такой командой
/etc/rc.d/vboxdrv setup
Она то и сбивала меня с толку. Дело в том, что в Арче не команды /etc/rc.d/vboxdrv. А так как это обнаруживалось во время рабочего дня - искать каноничных решений времени обычно небыло. Просто переставлял VirtualBox.

Но вот нашлось время более внимательнее посмотреть на проблему и вот что оказалось нужно было запускать
/etc/rc.d/rc.vboxdrv setup

пятница, 21 октября 2011 г.

Samba 3.6.0: В windows не работают симлинки

Т.к. я в основном работю в сетях с машинами на которых стоит Windows, то часто бывает нужно дать кому-то что-то переписать.

Но все данные (аудио, видео, книги...) у меня лежат посортированные по папочкам (мечтаю сеть и до конца все посортировать :)). А открывать доступ на кучу папок не есть Ъ. Поэтому в линуксе я открываю одну папочку для людей, а туда кидаю симлинки на нужную мне информацию.

Получается что открывать ничего не надо. А что бы дать доступ нужно только проверить права на сам файл\папку (должны иметь право чтения для группы самбы или для всех) и кинуть туда симлинк.

Так вот. Давно никому ничего не надо было открывать. Система переставилась. Теперь у меня Archlinux. Обновился пару раз. И тут оказалось что из под винды нельзя ходить по симлинкам.

Погуглив нашел решение: в /etc/samba/smb.conf дописать

[global] 
follow symlinks = yes 
wide links = yes 
unix extensions = no

пятница, 17 июня 2011 г.

Virtualbox, Could not load the Host USB Proxy Service (VERR_FILE_NOT_FOUND)

Could not load the Host USB Proxy Service (VERR_FILE_NOT_FOUND).The service might be not installed on the host computer.

Код ошибки: 0x80004005
Компонент: Host Интерфейс: IHost {81729c26-1aec-46f5-b7c0-cc7364738fdb} Вызванный объект: IMachine {0332de0e-ce75-461f-8c6f-0fa42616404a} 

Решение:
Добавить в /etc/fstab следующую строку
none /proc/bus/usb usbfs devgid=46,devmode=664 0 0 
И перемонтировать
mount -a 
Подробнее тут
Взято здесь

вторник, 17 мая 2011 г.

KDE не выключает комп

Некоторое время назад мой KDE4 перестал выключать комп. Я ему выключить, а он вырубает графику и переходит в консоль. В конце концов надоело каждый раз заходить и писать sudo poweroff. Погуглив тему, увидел, что не только у меня такая проблема. И сразу выискалось решение
kdesu systemsettings -> Вход в систему -> Выключение -> Команды завершения работы, "Выключение:"
У меня там было
/sbin/shutdown -p now 
Я поменял на
/sbin/poweroff 
И всё заработало.
 

суббота, 14 мая 2011 г.

Nepomukservises - пожиратель процессорного времени

Если у вас KDE4 и комп что-то тормозит гляньте список процессов. Возможно и у вас злобствует сабж.
Список процессов можно посмотреть в консоли командой top или в KDE4 по хоткею Ctrl+Esc 
Это оказалась поисковая система типа GoogleDesctop. Когда-то я сталкивался уже с этим поделием, но разобравшись с проблемой не записал её сюда. Поэтому пришлось искать решение ещё раз.
Пакета с именем Nepomuk в моём текущем дистрибутиве (Archlinux x64) не нашлось. Поэтому если не удалить, то, погуглив, нашёл хоть как отключить сабж.
Оказалось проще простого.
1. Открываем Параметры системы

2. Открываем поиск по меткам и содержимому

 3. Отключаем этот Nepomuk


Ну и убить уже запущенный процесс. Для этого нам нужно получить PID запущенного процесса. Его можно узнать в списке запущенных процессов (см. выше) а потом просто
kill -9 ПолученныйPID
-9 это убить без суда и следствия.

суббота, 23 апреля 2011 г.

Nmap: Сканирование сети

Надо было выключить свой нотик, который остался в офисе за был за шлюзом. Помнил свой IP который получал серваком в офсисе, так что думал что проблем нет. Зашел на сервак через ssh. Но тут оказалось что именно в этот раз нотик я не подключал через eth, а через wlan. IP wlan я конечно не знал. Как найти свой нотик среди других компов? Оказалось очень просто:
nmap 192.168.1.1-255
И по списку открытых постов уже легко определил, свой нотик, т.к. я знаю что у меня там запущено и какие порты открыты.
nmap очень полезный инструмент. Стоит почитать про него подробнее. Возможно когда-то напишу более развернуто про него

понедельник, 4 апреля 2011 г.

Создание дерева каталогов

Периодически появляется потребность создавать дерево каталогов. Например нужно создать /tmp/dir1/subdir1/subdir2/subdir3. Обычно для этого я писал:

mkdir /tmp/dir1
mkdir /tmp/dir1/subdir1
mkdir /tmp/dir1/subdir1/subdir2
mkdir /tmp/dir1/subdir1/subdir2/subdir3

Немного покопавшись нашёл как это делать одной командой:

mkdir -p /tmp/dir1/subdir1/subdir2/subdir3

Так. Это была создана линейная структура каталогов, если её можно так назвать. А часто на практике нужна разветвлённая. У каждого программиста есть своя структура каталогов для проектов. И всякий раз создавать вручную каждый каталог не очень интересно. Например нужно создать следующую структуру каталогов:

Poject1
Poject1\bin
Poject1\bin\x64
Poject1\bin\x32
Poject1\lib
Poject1\src
Poject1\doc
Poject1\doc\html
Poject1\doc\pdf
Poject1\doc\man
Poject1\doc\info

В данном случае нам поможет таже команда mkdir. Это можно записать так:

mkdir -p Poject1/{bin/{x64,x32},lib,src,doc/{html,pdf,man,info}}

Разобраться с этой командой думаю не составит труда.

вторник, 7 сентября 2010 г.

bash: Кто самый большой у нас в каталоге?

Проблема: пришло к концу место на разделе /home.
Задача: Найти замый жирный каталог

Решение:
du -m --max-depth=1 | sort -n

,где du - Disk Usage - утилита для определения занимаемого места файлом или каталогом.
параметры: 
-m выдавать информацию в мегабайтах, а то по умолчанию оно выдаем в понятном для человека виде - цифра и символ килобайт, мегабайт или гигабайт. Но так как сортировать будем не мы, а утилитка sort, то эти символы будут только мешать. В данном примере я указал в мегабайтах, т.к. размер раздела в гигабайтах, но можно указать и в килобайтах -k, и в байтах -b. В битах почемуто не хочет показывать :)
--max-depth=1  показывать файлы и каталоги только текущего уровня, не выдавая нагора все их внутренности

| перенаправляет результат работы du команде sort

sort сортирует данные полученные от du по первой колонке по убыванию по умолчанию.
параметры: 
-n указываем, что воспринимать первую колонку как цифры, а не как строки

Вот и все. Остальные параметры смотрите в манах

понедельник, 6 сентября 2010 г.

Установка и настройка Subversion на базе ALTLinux 5.1

Недавно была мной мне поставлена задача установить и настроить такую систему контроля версий как Subversion. Оказалось что всё не так очевидно и сразу поднимаемо. Вот и решил сделать заметочку на память.

Итак есть машина под ALTLinux 5.1. На ней и будем экспериментировать.

Установка и настройка сервера.

Первым делом скачиваем и устанавливаем сам сервер subversion.
В линуксе это легко и просто сделать через утилиту synaptic или в консоли с помощью apt-get
apt-get install subversion-server-common subversion-server-standalone

эти пакеты я доставил, т.к. кое-какие уже были установлены с разными IDE.
Все репозитарии должны находиться в папке /var/lib/subversion или хотя бы линк туда кинуть надо.
У меня раздел для хранения файлов находится в home. Поэтому под рутом создаем каталог для всех репозитариев SVNa.
mkdir /home/svn 

Создаём сам репозитарий с причудливым именем test02
svnadmin create /home/svn/test02

Эта комманда создаст всю структуру репозитария с базой, конфигами и прочей необходимой всячиной. Сделаем первое вливание. Како-нить файлик
svn import /var/www/apache2/html/ file:///home/cvsroot/ -m "initial import"

Теперь настроим сам репозитарий. Для этого нам нужен каталог /home/svn/test02/conf. В нем содержаться 3 файла
svnserve.conf - общие настройки репозитария
passwd   - пользователи репозиратия 
authz  - тут назначение доступа к каталогам в самом репозитарии

ВНИМАНИЕ! Все параметры в этих файлах не должны начинаться с пробелов. А то когда я просто раскоментировал то, что мне нужно, оно не заработало - ругалось на стороне клиента, что в такой-то строке svnserve.conf нехватает чего-то.

svnserve.conf 
Тут все настройки уже есть, их нужно только раскоментировать и по необходимости изменить. Нас интересует только секция general. В конце концов приведите ее к виду:
[general]
# Запрещаем доступ анонимным пользователям
anon-access = none
#Авторизированным разрешаем запись
auth-access = write

#Здесь указываем где хранится список пользователей и паролей. passwd - это имя файла
password-db = passwd

#Если вам нужно разделить доступ к каталогам внутри репозитария для пользователей, то нам нужна следующая опция. authz  - это имя файла.
authz-db = authz


#Здесь задаем имя репозитария. Это и будет идентификатором репозитария.
realm = test02

Не разкоментируйте authz-db = authz, если не собираетесь сразу менять назначать права на определённые каталоги разным пользователям в файле authz.  А то получаеться указали читать права из файла  authz, а в нем все ничего не назначено. Результат - Access denied для всех, даром, и пусть никто не уйдёт обиженным!

passwd
Тут определяем пользователей и пароли к ним. Пароли хранятся тут в открытом виде, но при грамотном администрировании это не проблема. Итак секция users.
[users]
boss = b0sP@ssw0rD
user01 = useR01P@ssw0rD
user02 = userR2P@ssw0rD


authz
Если вам нужно разделить права доступа к разным каталогам внутри репозитария, то поправьте этот файл. Зачем это нужно? Ну например, есть группа программстов они имеют право писать в девелопмент ветку, а релиз имеют право только читать. В нее иммеет право вносить изменения только бос. Ну и может быть, если это комерческая разработка, то наверняка тут будет еще и чать репозитария, к исходникам которой, никто не должен иметь доступа, кроме боса. Ну вот примерно так.
[groups]
# В этой секции определяем группы пользователей
developers = user01,user02
admins = bos

[test02:/]
# Название этой секции означает корень репозитария test02.
# В ней мы указываем, что все пользователи имеют достутп на чтение в корне. 
# Без этого у меня не давало доступа вообще ни к чему.
* = r

[test02:/branch]
# На папочку branch даем доступ на чтение и запись разработчикам и админам.
@developers = rw
@admins = rw

[test02:/trunk]
# На папочку trunk даем доступ на чтение разработчикам на запись админам.
@developers = r
@admins = rw

[test02:/secret]
# На папочку secret даем доступ на чтение только user01, на запись только bos. А все остальные не имеют права просматривать эту папку.
bos = rw
user01 = r
* =


Так как мы все эти действия делали от пользователя root, то и все правана папку /home/svn/test02 имеет только он. А репозитарий работает от пользователя subversion. Если вы ставили Subversion альтовый, то у вас уже есть  этот пользоватетль. Просто установите его владельцем папки /home/svn и всего её содержимого и дать права чтение/записть только ему, а всем остальным убрать даже чтение.(Вспомните незашифрованные пароли в /home/svn/test02/conf/passwd)
chown -R subversion /home/svn
chmod u=rwX  /home/svn
chmod oa-rwX  /home/svn

Теперь нужно запустить сервер subversion. В ALTLinux это делается простой коммандой
service svnserve start

И укажите ему стартовать при запуске системы
chkconfig svnserve on

Вроде всё. Если что забыл пишите.

суббота, 28 августа 2010 г.

Обустройство FireFox: Смена поисковика по умолчанию

Я как-то привык использовать Google поисковиком по умолчанию. А вот с некоторого времени Firefox пошла мода у всяких посисковых систем ставить себя по умолчанию. Это меня раздражало очень сильно. И наконец вот достало. Добрые люди подсказали как исправить ситуацию.

Шаг 1.Запускаем ФФ и в адресной строке пишем about:config
Жмем ентер и соглашаемся с тем, что если мы что-то поломаем, то это наши проблемы.

Шаг 2. Ищем ключ keyword.URL. Он содержит запрос к поисковому серверу
Шаг 3. Кликаем на нем и в открывшемся диалоговом окне заменяем строку поискового заспроса. См. в таблице 1
шаг 4. Жмем Ок и наслаждаемся


Таблица 1. Поисковые запросы
Googlehttp://www.google.com.ua/search?q=
Yandexhttp://yandex.ru/yandsearch?stype=first&clid=46511&text=
Mail.ruhttp://go.mail.ru/search?utf8in=1&fr=fftbUFix&q=

Все это выглядит так
Вот и всё.

пятница, 7 мая 2010 г.

Flash Player для linux x64

На данный момент официального релиза флеш плеера для 64 битных линуксов от  Adobe нет.
Есть какие то решения, но  они нормально не работают. Одни флешки играют другие нет.

Но погуглив тему нашел что релиза действительно нет. Но есть бета.
Ее скачать можно отсюда. Этот архив содержит только один файл libflashplayer.so
Теперь нужно подключить этот плагин к веб браузерам

Mozilla Firefox
  1. Распаковываем архив
  2. Создаем папку ~/.mozilla/plugins
  3. Копируем в ~/.mozilla/plugins плагин libflashplayer.so
  4. Перегружаем Firefox
Google Chrome
  1. Распаковываем архив
  2. Создаем папку /opt/google/chrome/plugins
  3. Копируем в /opt/google/chrome/plugins плагин libflashplayer.so
  4. Создаем символическую ссылку в папке /opt/google/chrome на плагин libflashplayer.so потому что в некоторых случаях пункт 3 не сработает
  5. Перегружаем Chrome
Для остальных браузеров пока не нужно было. 

суббота, 17 апреля 2010 г.

Шаблоны Гнома

Наверное каждый пользователь хоть раз в жизни пользовался контектным меню "Создать ..." для создания папки или какого либо документа. Я довольно часто и просто привык к этому. И у меня сложилось такое впечатление что это неотъемлемая часть графического рабочего стола.

Но когда я впервые начал серьезно пользоваться Гномом, то оказалось что в нем пунктик пустой. Нет там ничего. И это не в каком нибудь новом развивающемся дистрибутиве, у которого времени не хватает на разные мелочи. Это в Убунте!!

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

  1. Создать папку для шаблонов. Я сделал ~/.templates (точка вначале имени означает, что папка будет скрытая) 
  2. Прописать папку шаблонов в фале ~/.config/user-dirs.dirs в строке XDG_TEMPLATES_DIR="$HOME/.templates"
  3. Создать в папке ~/.templates необходимые шаблоны. Например, создаем в OpenOffice Writer новый пустой документ и сохраняем в нашу папку шаблонов с тем именем, которе хотите видеть в меню. И так для каждого нужного вам шаблона.


Всё довольно просто.

А теперь для тех, кто не совсем понимает что там за закорлючки в названии папок и файлов.

~ - сокращение, означает домашний каталог пользователя. Системой разворачивается  в строку /home/имяпользователя

.templates - точка в начале имени файла или папки означает, что это скрытый файл или скрытая папка. Поэтому если вы не нашли в своем каталоге папку ~/.config просто включите в меню Вид показывать скрытые файлы или нажмите Ctrl+H

Вот и всё

воскресенье, 4 апреля 2010 г.

Включение\выключение демонов

Чтобы не лазить ручками в /etc/init.d люди придумали более менее удобные утилиты для управления автоматическим стартом\остановкой демонов.
Я уже знаю целыйх две такие утилиты

chkconfig Это простая консольная програмулька, которая работает только с командной строкой. (ALTLinux)

sysv-rc-conf Это тоже консольная программа, но в ней уже есть довольно интуитивный интерфейс.  (Ubuntu)

Если найду еще какие. Буду сюда писать.

среда, 31 марта 2010 г.

Горячие клавиши Delphi


Человек, который не знает свой инструмент, что мартышка с гранатой.





ШоткатОписаниеВерсия IDE
EscapeНажате Escape во время перемещения контрола делает объектом перемещения родителя контролаDelphi 2 и выше
Shift + ClickAfter selecting control in form designer, click on it with Shift again to select top most parent FormDelphi 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Вызов SyncEditBorland Developer Studio 2006
Ctrl + Shift + VАвтоматически объявить переменную в позиции курсораBorland Developer Studio 2006
Ctrl + Shift + YУдалить до конца строкиDelphi 5  и выше
Alt + [Соответствующая скобка впередDelphi 5  и выше
Alt + ]Соответствующая скобка назадDelphi 5  и выше
Alt + RightArrowBrowse forward (hotlink history)Delphi 6  и выше
Alt + LeftArrowBrowse backward (hotlink history)Delphi 6  и выше
Alt + UpArrowBrowse 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 - F8Run until returnDelphi 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 + LBorland Developer Studio 2006
Ctrl + Alt + UpArrowПереход к предыдущей реализации метода в лексикографическом порядке в текущем модуле, либо в классе, который был ограничен Ctrl + Q + LBorland Developer Studio 2006
Ctrl + Alt + DownArrowПереход к следующей реализации метода в лексикографическом порядке в текущем модуле, либо в классе, который был ограничен Ctrl + Q + LBorland Developer Studio 2006
Ctrl + Alt + HomeПереход к лексически первой реализации метода в текущем модуле, либо в классе, который был ограничен Ctrl + Q + LBorland Developer Studio 2006
Ctrl + Alt + EndПереход к лексически последней реализации метода в текущем модуле, либо в классе, который был ограничен Ctrl + Q + LBorland Developer Studio 2006
Ctrl + Alt + PАктивировать палитру компонентов в режиме фильтра (наберите название и нажмите Enter чтобы бросить на форму)Delphi 2005 и выше
Ctrl + Alt + AВставить текущюю дату в позицию курсораsince BCB 4.0
Ctrl + /Закоментировать\раскоментировать, Ctrl + # для нордических (и возможно для других интернациональных) клавиатурDelphi 2005 и выше
Ctrl + Shift + TДобавить в список TodoDelphi 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Окно FPUDelphi 2005(removed from Delphi 2006)
Ctrl + Alt + CОкно CPUDelphi 5 и выше
Ctrl + Alt + VОкно событий (Event)Delphi 5 и выше
Ctrl + Alt + MОкно модулейDelphi 2005 и выше
Shift + F12Окно формDelphi 5 и выше
Ctrl + Shift + AInvoke 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/UnitDelphi 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 + CCopies selected text at the end of the selectionDelphi 5 и выше
Ctrl + K + TВыелить слово в позиции курсораDelphi 5 и выше
Ctrl + O + LВыделить текущую  строкуDelphi 5 и выше
Ctrl + Q + LToggles between limiting the Ctrl+Alt navigation shortcuts to the current class, or limiting it to the current unitBorland Developer Studio 2006
Ctrl + Q + WПерейти на следующий елемен в окне сообщенийDelphi 5 и выше
Ctrl + F6Переключиться между исходником (.cpp) и заголовком (.h)BDS 2006 и выше, C++ Builder personality
Оригинал тут

Тестировал на Delphi 2007. Некоторые вещи не работали. Некотрые не понял так и оставил в английском варианте. Если вы найдете ошибки, неточности и т.п. пишите. 
Доделаем до конца.