Quantcast
Viewing all 74 articles
Browse latest View live

Изменить размер кнопок у cxSpinEdit

У компоненты TcxSpinEdit нет возможности простым путём менять размеры кнопок.
Благодаря подсказке из этой темы на форуме sql.ruудалось решить проблему.

Вот как можно увеличить (изменить) размер кнопок у компоненты TcxSpinEdit
Добавляем в проект новый модуль, вот его код.

unit uSpinEditHack;interfaceuses
  cxEdit, cxSpinEdit, cxGraphics, Windows, Classes;// этот модуль должен быть последним в верхнем списке USEStype
  TMySpinEditViewData = class(TcxSpinEditViewData)protectedprocedure CalculateButtonsBounds(ACanvas: TcxCanvas; AViewInfo: TcxCustomEditViewInfo; var ButtonsRect: TRect); override;end;

  TMySpinEditProperties = class(TcxSpinEditProperties)publicclassfunction GetViewDataClass: TcxCustomEditViewDataClass; override;end;

  TMySpinEdit = class(TcxSpinEdit)publicclassfunction GetPropertiesClass: TcxCustomEditPropertiesClass; override;end;

  TcxSpinEdit = class(TMySpinEdit);implementationuses
  uShares;{ TMySpinEdit }classfunction TMySpinEdit.GetPropertiesClass: TcxCustomEditPropertiesClass;begin
  Result := TMySpinEditProperties;end;{ TMySpinEditProperties }classfunction TMySpinEditProperties.GetViewDataClass: TcxCustomEditViewDataClass;begin
  Result := TMySpinEditViewData;end;{ TMycxSpinEditViewData }procedure TMySpinEditViewData.CalculateButtonsBounds(ACanvas: TcxCanvas;
  AViewInfo: TcxCustomEditViewInfo; var ButtonsRect: TRect);beginwith AViewInfo.ButtonsInfo[cxSpinForwardButtonIndex] dobegin
    Bounds := Rect(ButtonsRect.Right - uShares.iSpinEditButtonSize , ButtonsRect.Top, ButtonsRect.Right, ButtonsRect.Bottom);
    ButtonsRect.Right := Bounds.Left + 200;end;with AViewInfo.ButtonsInfo[cxSpinBackwardButtonIndex] dobegin
    Bounds := Rect(ButtonsRect.Left, ButtonsRect.Top, ButtonsRect.Left + uShares.iSpinEditButtonSize, ButtonsRect.Bottom);
    ButtonsRect.Left := Bounds.Right - 200;end;end;end.{iSpinEditButtonSize - это глобальная переменная, а где-то в другой форме меняем размер кнопок и присваиваем его этой переменной}


Теперь достаточно включить в USES (верхний, в тот, что в секции interface) этот модуль и размеры кнопок можно менять. только этот модуль (uSpinEditHack) должен быть последним в списке.

Ссылка на источник
https://www.devexpress.com/Support/Center/Question/Details/Q580764



Если без хака, то работают такие странные условия.
Если менять значение всех четырёх кнопок, то изменение размера кнопок работает работает
 cxSpinEdit1.Properties.Buttons[0].Width := 42;
 cxSpinEdit1.Properties.Buttons[1].Width := 42;

если только двух, то не работает.

Есть зависимость размера кнопок от размера самой компоненты cxSpinEdit. Т.е. больше какого-то определённого значения размер кнопок не установить. Т.е. нужно отключить AutoSize, сделать высоту компоненты огромной и только тогда можно делать размеры кнопок побольше.

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);

CodeSite deployment

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

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

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

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

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

Как проверить наличие файла на фтп-сервере с помощью 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('Искомый файл есть');


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

cxGrid: CellAutoHeight vs DataRowSizing

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

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

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

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

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

S := TcxLookupComboBoxProperties(cxEditorRow1.Properties.EditProperties).GetDisplayText(cxEditorRow1.Properties.Value);

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.

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

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


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

Memory Leaks

Программно открыть или закрыть 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) thenbegin
    AEdit := TcxPopupEdit(vg.InplaceEditor);
    AEdit.DroppedDown := False;end;end;


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

cxGrid - Data row fixing

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

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

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


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


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

  cxGrid1DBTableView1.BeginUpdate;
  tryfor iCurRow := 0 to Pred(cxGrid1DBTableView1.DataController.RowCount) dobegin
      ARowInfo := cxGrid1DBTableView1.DataController.GetRowInfo(iCurRow);if ARowInfo.Level < cxGrid1DBTableView1.DataController.Groups.GroupingItemCount then
        Continueelsebegin//если есть нужное значение, закрепляем строкуif cxGrid1DBTableView1.DataController.Values[ARowInfo.RecordIndex, colName.Index] = 'my value 123'then
           cxGrid1DBTableView1.DataController.RowFixedState[iCurRow] := rfsFixedToTop;end;end;// forfinally
    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

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

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

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

вернёт true

Winsoft OCR EngineMode := emTesseractOnly

В свойствах TOcr есть EngineMode, где можно указать "emTesseractOnly".

Ocr1.EngineMode := emTesseractOnly;

При этом возникает исключение
exception
Project raised exception class EOcrError with message 'Cannot initialize Tesseract library'


Это связано с тем, что используете emTesseractOnly, т.е. при использовании устаревшего движка Tesseract вам необходимо загрузить и использовать данные языка Tesseract из репозитория tessdata:
https://github.com/tesseract-ocr/tessdata

Репозиторий Tessdata также поддерживает механизм LSTM. При использовании только LSTM нейронной сети, вы можете использовать данные языка из tessdata_fast или tessdata_best
https://github.com/tesseract-ocr/tessdata_fast
https://github.com/tesseract-ocr/tessdata_best

Планировщик JOB заданий. Управление.

Чалышев Максим Михайлович

SQL. 5 дней которые изменят твою жизнь.
моя книга , изучаем Oracle SQL, бесплатно
Oracle SQL. 100 шагов от новичка до профессионала. 20 дней новых знаний и практикиили платная печатная версия

Введение
В Oracle есть специальный механизм запланировать выполнение определённой программы, на заданное время, это может быть оператор SQL, программа на языке PLSQL, либо даже внешняя программа. Этот механизм называется механизмом заданий Job

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

Теория и практика

Для управления заданиями в Oracle существует специальные пакет DBMS_JOB:
Создание заданий
Можно использовать механизм dbms_job
Или механизм dbms_scheduler – более современный способ
DBMS_JOB.SUBMIT(
 JOB OUT BINARY_INTEGER,
 WHAT IN VARCHAR2,
 NEXT_DATE INDATEDEFAULTSYSDATE,INTERVALIN VARCHAR2 DEFAULTNULL,
 NO_PARSE IN BOOLEAN DEFAULT FALSE,
 INSTANCE IN BINARY_INTEGER DEFAULT any_instance,FORCEIN BOOLEAN DEFAULT FALSE
);


Здесь:
JOB – Входной параметр уникальный идентификатор задания. Идентификатор генерируется специальной системной последовательностью.
WHAT - анонимный PL/SQL блок, в данном блоке указывается последовательность команд которая будет выполнена в процессе работы задания.
В же в этом параметре можно также писать команды вставки удаления редактирования (inser update delete), а так же команды для создания создания индексов таблиц, создания индексов, ограничений.
NEXT_DATE – дата время следующего выполнения задания.
Если будет указана дата меньше чем текущую дата, то выполнение задания будет начато немедленно.
INTERVAL – Вычисляемая дата следующего выполнения задания в столбце NEXT_DATE. Примеры интервала задания:
NULL
Задание выполнится однократно и удалится.
читать дальше...

Контекст сеанса

Чалышев Максим Михайлович
SQL. 5 дней которые изменят твою жизнь.

Введение
В каждой сессии есть возможность использовать специальные структуры данных, именуемые контекст.
Контексты - это набор данных вида - параметр значение. Контекст предоставляет дополнительные возможности для приложений, использующих СУБД Oracle.
Теория и практика
Контекст - это предопределённый набор параметров и значений создаваемый в рамках определенной сессии. Несколько таких наборов параметр значение, объединяется с помощью структуры называемой контекстом.

Задается значение контекста с помощью процедуры DBMS_SESSION.SET_CONTEXT

Функция SYS_CONTEXT позволяет получить значение заданного контекста в раках сессии.
Для создания контекста специальная команда CREATE CONTEXT.
Сначала следует создать специальною процедуру для управления контекстом.

CREATEORREPLACEPROCEDURE set_mycontext_value ( par IN VARCHAR2, val IN VARCHAR2 ) ASBEGIN  DBMS_SESSION.SET_CONTEXT ( 'myctx', par, val ); END;CREATEORREPLACECONTEXT myctx USING set_mycontext_value;

читать дальше...

SERIALIZABLE режим

Чалышев Максим Михайлович

Моя книга, электронная версия бесплатно
Oracle SQL. 100 шагов от новичка до профессионала. 20 дней новых знаний и практикиили платная печатная версия

SQL. 5 дней которые изменят вашу жизнь.

В СУБД ORACLE есть возможность, чтобы пользователь всегда видел только те данные в таблицах, которые были доступны с начала его сессии
Такой режим (уровень изоляции) называется SERIALIZABLE. Для того чтобы включить этот режим используется команда

Alter session set isolation_level=serializable;

Следующий пример показывает отличие режима SERIALIZABLE от стандартного режима эксплуатации СУБД. Уровня изоляции READ COMMITTED
Откроем в двух разных окнах программу SQL Developer (или создадим новый Worksheet) подключимся к схеме SYS как администратор.
создадим таблицу man5
Createtable Man5(prt number, name varchar2(50));



INSERTINTO man5 VALUES(20, 'Олег');INSERTINTO man5 VALUES(21, 'Влад');INSERTINTO man5 VALUES(22, 'Саша');Commit;


читать дальше...

SQL Server 2019: Действительный план запроса

При анализе проблем производительности запроса план запроса часто является ключевым элементом. Планы запросов бывают оценочными и действительными, получать и те и другие можно разными способами.

В данной заметке мы рассмотрим способы получения планов запросов, а также новую возможность SQL Server 2019 CTP 2.4 – получить последний действительный план.

Далее...

USE HINT и ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS

В этой публикации мне бы хотелось вернуться к подсказкам USE HINT, представленным впервые в SQL Server 2016 SP1. Часть из них мы уже рассмотрели в предыдущих статьях, в этой статье мы рассмотрим очередную подсказку – ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS, которая влияет на алгоритм оценки числа строк в соединениях.

В статье мы немного поговорим о теории оценки соединений и рассмотрим пример использования хинта. Далее, при помощи недокументированных флагов трассировки и несложной арифметики, мы посмотрим, чем отличается оценка в случае использования и не использования хинта, а также проверим вычисления на конкретном примере.

Далее...

Приостановка всех пользовательских процессов, запрет входа новых пользователей и многое другое

Недавно возникла интересная задача: 21847083.

Итак, необходимо перезапустить СУБД.
Для запуска команды из самой СУБД можно воспользоваться функцией $zf(-100) - новым, безопасным аналогом функций $zf(-1)/$zf(-2), например:

cmd "ccontrol"
args(1) = "stopstart"
args(2) = $p($zu(86),"*",2) ; имя экземпляра
args(3) = "quietly"
d $ZF(-100,"/ASYNC",cmd,.args)

Но при ближайшем рассмотрении топика обнаружилось, что..
Viewing all 74 articles
Browse latest View live