Архив рубрики: Delphi

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

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

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

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

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

Копирование в буфер обмена в 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;

Как из 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;

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