Блог


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


Теги

Информация

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


Регистронезависимый Contains в Delphi

В справке по System.SysUtils.TStringHelper.Contains написано, что Contains - This function is case-sensitive.

А как сделать Contains case-insensitive?
Можно воспользоваться другими функциями, например, ToUpper.
Итого:
'Test'.ToUpper.Contains('s'.ToUpper)

вернёт true
добавлено: 06 авг 18 просмотры: 165, комментарии: 0



cxGrid - Data row fixing

В версии 2017.2.2 появилась возможность закреплять вверху или внизу сетки несколько записей, как программно, так и пользователю с помощью мышки.

За это отвечают несколько свойств:
1. Нужно включить GridView.OptionsCustomize.DataRowFixing, чтобы включить этот функционал.

2. Определить, как будет выглядеть в таблице значок, который будет видеть пользователь GridView.FixedDataRows.PinVisibility (rpvAlways, rpvHotTrack or rpvRowHotTrack), если программист собирается дать пользователю управлять закреплёнными строками:
Картинка с другого сайта.

Чтобы программно управлять закреплёнными строками (row), воспользуйтесь свойством DataController.RowFixedState:
cxGrid1DBTableView1.DataController.RowFixedState[0] := rfsFixedToTop; 


Пример цикла:
procedure TForm1.FixRows2;
Var
 colName: TcxGridDBColumn;
 iCurRow: integer;
 ARowInfo:  TcxRowInfo;
begin
  colName := cxGrid1DBTableView1.GetColumnByFieldName(constMyColNAME);
  if not Assigned(colName) then exit;

  cxGrid1DBTableView1.BeginUpdate;
  try

    for iCurRow := 0 to Pred(cxGrid1DBTableView1.DataController.RowCount) do
    begin
      ARowInfo := cxGrid1DBTableView1.DataController.GetRowInfo(iCurRow);

      if ARowInfo.Level < cxGrid1DBTableView1.DataController.Groups.GroupingItemCount then
        Continue
     else
       begin
         //если есть нужное значение, закрепляем строку
         if cxGrid1DBTableView1.DataController.Values[ARowInfo.RecordIndex, colName.Index] = 'my value 123'
         then
           cxGrid1DBTableView1.DataController.RowFixedState[iCurRow] := rfsFixedToTop;


       end;
    end;// for

  finally
    cxGrid1DBTableView1.EndUpdate;
  end;
end;


Ист:
https://www.devexpress.com/Support/Center/Question/Details/K18187/how-to-fix-a-row
http://www.sql.ru/forum/1296597/cxgrid-fixed-data-rows
добавлено: 25 июн 18 просмотры: 717, комментарии: 0



Программно открыть или закрыть 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 просмотры: 1856, комментарии: 0





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

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


var
  I, d: Integer;
begin
  for I := 0 to pred(dbTree.SelectionCount) do
    d := TcxDBTreeListNode(dbTree.Selections[i]).KeyValue;


procedure TForm1.Button1Click(Sender: TObject);
var
  ANode: TcxTreeListNode;
begin
  cxTreeList1.BeginUpdate;
  ANode := cxTreeList1.Root.getFirstChild;
  while ANode <> nil do
  begin
    if ANode.Values[cxTreeList1Column1.ItemIndex] = 'Value 2' then
      ANode.Values[cxTreeList1Column2.ItemIndex] := 'Value 5';

    ANode := ANode.GetNext;
  end;
  cxTreeList1.EndUpdate;
end;
добавлено: 07 май 15 просмотры: 1537, комментарии: 1



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 просмотры: 5803, комментарии: 2



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

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

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



cxGrid: CellAutoHeight vs DataRowSizing

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

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

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