Блог


Последние записи


Теги

Информация

Delphi, DevExpress, примеры, решения


Программно открыть или закрыть TcxPopupEdit в TcxVerticalGrid

В cxVerticalGrid может быть строка, где Properties.EditProperties := PopupEdit
Как можно закрыть или открыть программно выпадающее окно.


procedure VerticalGridDropDownRow(vg: TcxVerticalGrid; aRow: TcxEditorRow; aDropedDown: boolean);
Var
  AEdit: TcxPopupEdit;
begin
  vg.SetFocus;
  vg.FocusedRow := aRow;
  vg.ShowEdit;
  if (vg.InplaceEditor <> nil) and (vg.InplaceEditor is TcxPopupEdit) then
  begin
    AEdit := TcxPopupEdit(vg.InplaceEditor);
    AEdit.DroppedDown := False;
  end;
end;


У TcxPopupEditProperties отсутствует метод или свойство, позволяющее открыть/закрыть Popup control.
Popup подразумевает работу только с ним. Нельзя открывать несколько Popup`ов одновременно. При потере фокуса Popup должен закрыться.
добавлено: 25 окт 16 просмотры: 1438, комментарии: 0





TcxTreeList - цикл по выделенным узлам

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


var
  I, d: Integer;
begin
  for I := 0 to pred(dbTree.SelectionCount) do
    d := TcxDBTreeListNode(dbTree.Selections[i]).KeyValue;
добавлено: 07 май 15 просмотры: 1271, комментарии: 0



WebDAV Диск.Яндекс + Delphi (InDy TidWebDAV)

Стоит задача опубликовать файл, который находится в папке Яндекс-Диска.
Т.е. файл там уже есть, нужно только дать команду опубликовать и получить в ответ ссылку на скачивание файла.

На форму кидаем кнопку, компоненту TidWebDAV, TIdSSLIOHandlerSocketOpenSSL TIdLogFile и связываем их, добавляем ещё на форму компоненту TMemo, в которую будет выводить результат.
В папку проекта копируем 2 файла: ssleay32.dll и libeay32.dll т.к. общение будет проходить по протоколу https.
Будем использовать OAuth авторизацию, для которой не нужны логин и пароль.
В корне Яндекс-Диска есть папка tst, в которой лежит файл readme.txt. Его и будем публиковать и получать ссылку на скачивание. Чтобы опубликовать файл или папку, следует передать XML файл с набором команд. В ответ тоже получим XML со ссылкой на опубликованный файл.

Для получения OAuth токена следует прочитать это: https://tech.yandex.ru/oauth/
Принцип такой.
Каждый пользователь программы должен получить свой OAuth для своей учётной записи Яндекса.
Авторизуемся на сайте oauth https://oauth.yandex.ru/ и создаёт новое Приложение, даём ему название и выбираем, какие сервисы Яндекса будут доступны этому Приложению ( http://f6.s.qip.ru/14a5VJj7F.png ). Приложение - это условно набор яндекс-сервисов.

Когда получили ID (client_id) только что созданного приложения, то уже можем получить oauth token по такой ссылке:
https://oauth.yandex.ru/authorize?response_type=token&client_id=c953e33d6ec14895aa736f33143e73n7
Это всё есть в документации. См ссылки ниже.

procedure TForm2.Button1Click(Sender: TObject);
Var
 s, r: TStringStream;
 u: UTF8String;
begin
  u := '<propertyupdate xmlns="DAV:">' + sLineBreak +
  '<set>'  + sLineBreak +
    '<prop>'  + sLineBreak +
      '<public_url xmlns="urn:yandex:disk:meta">true</public_url>'  + sLineBreak +
    '</prop>'  + sLineBreak +
  '</set>'  + sLineBreak +
'</propertyupdate>';

  s := TStringStream.Create(u);

  s.Seek(0, 0);

  r := TStringStream.Create('');
  try
    IdWebDAV1.Request.Clear;
    IdWebDAV1.Request.CharSet := 'UTF-8';
    IdWebDAV1.Request.BasicAuthentication := False;
    IdWebDAV1.Request.Host := 'webdav.yandex.ru';
    IdWebDAV1.Request.CustomHeaders.Add('Authorization: OAuth 6e1ec970696e432093c4e09df9582972');
    IdLogFile1.Active := True;
    IdWebDAV1.DAVPut DAVPropPatch('https://webdav.yandex.ru/tst/readme.txt', s, r);
    r.Position := 0;
    Memo1.Lines.Text := UTF8Decode(r.DataString);
  finally
    s.Free;
    r.Free;
  end;
end;


Delphi 2007, Indy 10_4885.

Ссылки:
Описание WebDav API Диска: https://tech.yandex.ru/disk/webdav/
Публикация файлов и папок: https://tech.yandex.ru/disk/doc/dg/reference/publish-docpage/
Об OAuth http://www.webdelphi.ru/tag/oauth/


Дополнительно.
У Яндекса есть Полигон для тестирования REST API https://tech.yandex.ru/disk/poligon/ , но это не относится к WebDAV.
добавлено: 27 ноя 14 просмотры: 4796, комментарии: 2



Как получить видимое значение в строке типа LookupComboBox в TcxVerticalGrid?

Есть cxVerticalGrid со строкой (Properties.EditProperties) типа LookupComboBox. Как получить не значение ключевого поля, а именно то, значение, которое видит пользователь?

S := TcxLookupComboBoxProperties(cxEditorRow1.Properties.EditProperties).GetDisplayText(cxEditorRow1.Properties.Value);
добавлено: 14 ноя 14 просмотры: 2055, комментарии: 0



cxGrid: CellAutoHeight vs DataRowSizing

Есть 2 замечательных свойства: OptionsView.CellAutoHeight и OptionsCustomize.DataRowSizing.
Включены оба параметра, .т.е. = True.

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

Это связано ещё с одним свойством - OptionsView.DataRowHeight. По умолчанию = 0.
Если это свойство больше 0, то свойство CellAutoHeight никак не влияет на высоту строк. Таким образом, чтобы автовысота строк работала "как надо", свойство DataRowHeight должно быть рано 0.
добавлено: 09 апр 14 просмотры: 1882, комментарии: 0



Как проверить наличие файла на фтп-сервере с помощью IdFTP?

Как проверить наличие файла на FTP с помощью TIdFTP (InDy)?

Можно скачать список файлов и проверить список.
function TfmMain.FTPFileExists(const RemoteFile: String): Boolean;
begin
  IdFTP1.List (nil, '-la ' + RemoteFile, False);
  Result:=IdFTP1.DirectoryListing.Count > 0;
end;




А можно получить размер файла. И если он ненулевой, то файл присутствует.

 if IdFTP1.Size('upload/директория/директория/искомый файл.расширение') > 0 then
   ShowMessage('Искомый файл есть');


Но в этом способе могут быть небольшие грабельки. Файл может присутствовать, но быть нулевого размера.
добавлено: 21 мар 14 просмотры: 3620, комментарии: 0



TcxComboboxProperties ItemIndex

Если TcxCombobox встроен, например, в строку (row) вертикальной сетки (TcxVerticalGrid), то есть проблемы с установкой значения, т.к. свойство ItemIndex в этом случае ReadOnly.

Можно попробовать установить значение через свойство Properties.Value, но это ничего не даст, в Combobox`е не будет выбрано нужное значение.

Есть простой выход - использовать ImageCombobox. Т.е. у строки в свойстве EditProperties нужно выбрать ImageComboBox. Тогда значение списка можно устанавливать через Properties.Value.

Начало проблемы здесь >> http://www.sql.ru/forum/1060510/cxcomboboxproperties-i-perechislyaemoe-svoystvo
добавлено: 21 ноя 13 просмотры: 2282, комментарии: 0



CodeSite deployment

В Delphi встроена довольно мощная система логирования.
Но, по умолчанию, она работает только там, где установлена среда, а вернее там, где установлена сама система CodeSite. Можно даже выполнять удалённое логирование.

На стороне клиента логирование не выполняется (CodeSite не создает логи), при чем, и ошибок тоже нет, просто не создаются log-файлы.

Если нужно банальное сохранение логов в файл на ПК пользователя, то будет достаточно того, чтобы в папку с приложением скопировать файл CSDispatcher.exe, который можно взять здесь: %Program Files%\Raize\CS5\Bin\

Ну и не забывайте, что в инсталляторе есть файл Deploy.txt, в котором, почему-то не описан этот маленький шаг.
добавлено: 20 ноя 13 просмотры: 1828, комментарии: 0



DevExpress - получить список скинов программно

Как получить список скинов (DevExpress skins) и загрузить их (скины) в Combobox


uses LookAndFeelPainters;
...

procedure GetSkins(comboSkins: TcxCombobox);
Var
 PaintersManager : TcxCustomLookAndFeelPainter;
 i: integer;
begin
  //загружаем список скинов
  comboSkins.Properties.Items.Clear;
  comboSkins.Properties.Items.Add('');//пустую строку тоже нужно добавить, чтобы пользоватtль мог отменять выбор скина

  for i := 0 to Pred(cxLookAndFeelPaintersManager.Count) do
    comboSkins.Properties.Items.Add(cxLookAndFeelPaintersManager.Items[i].LookAndFeelName);

end;



Как получить список скинов (DevExpress skins) и загрузить их (скины) в TcxComboboxProperties
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=542538&msg=12170122



uses LookAndFeelPainters;
...

Var
 PaintersManager : TcxCustomLookAndFeelPainter;
 i: integer;
begin
  //загружаем список скинов
  TcxComboBoxProperties(comboSkins.Properties).Items.Clear;
  TcxComboBoxProperties(comboSkins.Properties).Items.Add('');//пустую строку тоже нужно добавить, чтобы пользоватtль мог отменять выбор скина

  for i := 0 to Pred( cxLookAndFeelPaintersManager.Count ) do
    TcxComboBoxProperties(comboSkins.Properties).Items.Add(cxLookAndFeelPaintersManager.Items[i].LookAndFeelName);
добавлено: 01 ноя 13 просмотры: 2355, комментарии: 5