Архив рубрики: Программирование

Поиск с подсказками на jQuery + PHP

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

Как программно создать фильтр для dxDBGrid

При использовании замечательно компоненты ExpressQuantumGrid Suite удобно в шапке Grid’а устанавливать фильтры. Но если надо установить фильтр программно, то я столкнулся с таким нюансом. Если просто надо отфильтровать данные по какому-то значению, то это делается легко вызовом такой процедуры:

dxDBGrid1.Filter.Add(AColumn: TdxDBTreeListColumn; const AValue: Variant; const ADisplayValue: string);

где
AColumn — какую колонку фильтруем
AValue — по какому значению фильтруем
ADisplayValue — что отобразить в панели статуса фильтра

Вот мой пример использования:
Читать далее Как программно создать фильтр для dxDBGrid

Меняем программно папку установки в Inno Setup

При использовании замечательного установщика Inno setup понадобилось сделать проверку на существование папки для установки программы. Если такая папка есть, то переименовать ее по определенному алгоритму (в моем случае добавлять единичку в конце имени) и не озадачивать пользователя переименованием; и уж тем более не перезаписывать программу. Вот такая задача: дать возможность ставить одну программу несколько раз в разные папки.

В скрипте меняем параметр DefaultDirName вот так:

DefaultDirName={code:newTargetDir}

И в конце скрипта в секции code пишем объявленную функцию newTargetDir:

function newTargetDir(Param : string):string;
var
 entry: String;
 i: integer;
begin
  entry := ExpandConstant('{sd}') + '\MyProgram\';
  i := 1;
  if DirExists(entry) then
    repeat
      entry := ExpandConstant('{sd}') + '\MyProgram' + IntToStr(i) + '\'; 
      i := i + 1;
    until not dirExists(entry);
  result := entry;
end;

Здесь встроенная переменная {sd} означает системный диск.

Копирование в буфер обмена в Delphi

Обычное копирование в буфер обмена командой

Clipboard.AsText := str;

работает если копируется строка с английскими символами и/или цифрами.
Строка из русских букв будет скопирована в неверной кодировке.
Вот тут нашел простое решение:

type
    TMyClipboard = class(TClipboard);

  procedure StrToClipboard(const AStr :string);
  var
    vLangID :LANGID;
  begin
    with TMyClipboard(Clipboard) do begin
      Open;
      try
        AsText := AStr;
        vLangID := GetUserDefaultLangID;
        SetBuffer(CF_LOCALE, vLangID, SizeOf(vLangID));
      finally
        Close;
      end;
    end;
  end;

Как вводить только цифры в UITextField и ограничить длину строки ввода

Чтобы в UITextField вводить только цифры и не позволить вводить длинные строки, делаем следующее:

Объявим константы

#define NUMBERS_ONLY @"1234567890"
#define CHARACTER_LIMIT 4

И пишем в делегате UITexField

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS_ONLY] invertedSet];
    NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
    return (([string isEqualToString:filtered])&&(newLength <= CHARACTER_LIMIT));
}

Как из Delphi определить установлен ли Excel

Небольшая заметка-памятка. Перед работой с MS Excel желательно проверить установлен ли в системе MS Office.

Uses ActiveX;

if not IsOLEObjectInstalled('Excel.Application') then
  ShowMessage('MS Excel не установлен!')
else
  ShowMessage('MS Excel установлен!');

function IsOLEObjectInstalled(Name: String): boolean;
var
  ClassID: TCLSID;
begin
  Result := CLSIDFromProgID(PWideChar(WideString(Name)), ClassID) = S_OK;
end;

Delphi. Вызов процедуры по строке с её названием

Иногда бывает нужно вызвать процедуру, название которой не известно в момент выполнения программа. Ну, бывает такое 🙂 В скриптовых языках программирования с этим нет проблем, а вот в компилируемых языках, таких как Pascal/Delphi с этим не так просто.
Небольшая заметка как это реализовать на Delphi

Для начала в типах объявляем тип:

type
  myproc = procedure;stdcall;

Далее в implementation пишем пример процедуры, название которой будет неизвестно в момент выполнения.

procedure Proc1;
begin
  ShowMessage('Hello From Proc1');
end;

А вот код вызова для кнопки Button1 на форме Form1:

procedure TForm1.Button1Click(Sender: TObject);
var
  p:myproc;
  h:HWND;
begin
  h:=GetModuleHandle(nil);
  p:=GetProcAddress(h,'Proc1');
  ShowMessage(IntToStr(h));
  p; // вот он сам вызов процедуры
  p:=nil;
end;

Понятно, что вместо ‘Proc1’ может быть строковая переменная.
В конце модуля экспортируем процедуру:

exports Proc1;

Пожалуй вот и всё.