Diesel Pascal
Модератор: Модераторы
Здравствуйте! Сейчас скачал Дизель Паскаль, очень понравилось. Скажите, пожалуйста, а можно в нём делать Web-приложения, хотя бы простые?
Аналогично ISAPI-модулям, или в идеале как на PHP (исправил Pascal-скрипт на сервере, сохранил, компиляция не нужна)
Аналогично ISAPI-модулям, или в идеале как на PHP (исправил Pascal-скрипт на сервере, сохранил, компиляция не нужна)
- *Rik*
- постоялец
- Сообщения: 453
- Зарегистрирован: 19.04.2011 12:18:51
- Откуда: Урал
- Контактная информация:
В дизайнере CrossDesigner значительно улучшен редактор свойств SQL. В этот редактор добавлен подсказчик, упрощающий написание SQL запросов. Парсер подсказчика распознает имена таблиц, объявленные переменные, входные и выходные параметры для EXECUTE BLOCK, позволяет обращаться к полям таблиц и вьюшек через их имена или псевдонимы. Парсер ориентирован на диалект SQL сервера FireBird.
Если кому интересно как работает, можете посмотреть исходный код в проекте CrossDesigner, модули sqleditor.pas и sqlparser.pas.
Видео на ютюбе:
http://youtu.be/rjqx6tc3y84
Если кому интересно как работает, можете посмотреть исходный код в проекте CrossDesigner, модули sqleditor.pas и sqlparser.pas.
Видео на ютюбе:
http://youtu.be/rjqx6tc3y84
На скринах Дизель-Паскаля (тот, что в Линуксе) очень красивый заголовок формы. Там буквы обведены контуром. Тема оформления ClearLooks вроде подходит, но в заголовке окна, буквы контуром не обводятся. Облазил все настройки шрифтов, не нашел... Хочу сделать, как на картинке ниже.

- *Rik*
- постоялец
- Сообщения: 453
- Зарегистрирован: 19.04.2011 12:18:51
- Откуда: Урал
- Контактная информация:
user89 писал(а):На скринах Дизель-Паскаля (тот, что в Линуксе) очень красивый заголовок формы. Там буквы обведены контуром. Тема оформления ClearLooks вроде подходит, но в заголовке окна, буквы контуром не обводятся. Облазил все настройки шрифтов, не нашел... Хочу сделать, как на картинке ниже.
Тема Clearlooks-Phenix, в ALT Simply Linux она по умолчанию.
видно только 

*Rik*,
установил себе Clearlooks-Phenix. Спасибо!
З.Ы. кому интересно, решение на HTML/CSS
установил себе Clearlooks-Phenix. Спасибо!
З.Ы. кому интересно, решение на HTML/CSS
Код: Выделить всё
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<style>
.header {
margin:20px; width:450px; padding:4px;
text-align:center; color:#fff;
border:1px solid #4E76A8;
border-radius:3px;
font:700 12px verdana;
background: linear-gradient(#B2CCED 0%,#8CB0DC 50%,#86ABD9 51%,#7AA1D1 100%);
text-shadow: #4E76A8 1px 0 0px, #4E76A8 0 1px 0px, #4E76A8 -1px 0 0px, #4E76A8 0 -1px 0px, #4E76A8 0 0 1px;
}
</style>
<body>
<div class="header">Предприниматель УСН-6</div>
<div class="header">Редактировать запись</div>
</body>
</html>- *Rik*
- постоялец
- Сообщения: 453
- Зарегистрирован: 19.04.2011 12:18:51
- Откуда: Урал
- Контактная информация:
Kemet писал(а):с текущей версией fpspreadsheet CrossMachine не собирается.
Юра, можешь добавить в проект tvplanit из lazarus ccr?
Прикрепил файл dpi_fpspreadsheet.pas, этим файлом заменить тот, что в папке CrossDesigner (потом включу его в сборку). Папку lib в CrossDesigner удалить. Попробовать собрать. У меня собралось, то что есть с экспортом из Excel завелось...
http://visual-t.ru/files/dpi_fpspreadsheet.pas
tvplanit надо смотреть, потребуется время. У меня в на линуксе c XFCE он поставился, но не все компоненты работают, некоторые падают. Скажи какие компоненты необходимы, я попробую начать с них, если получится, будет доступно опционально при сборке из исходного кода..
ps:
В самом лазарусе в lcl/maskedit.pas процедуру RestoreMask привести к виду:
Код: Выделить всё
function TCustomMaskEdit.RestoreMask(const NewText: String): Boolean;
begin
if FMaskIsPushed and (not IsMasked) then
begin
FMaskIsPushed := False;
SetCharCase(ecNormal);
ClearInternalMask(FMask, FMaskLength);
System.Move(FSavedMask[1], FMask[1], SizeOf(TInternalMask));
FMaskLength := FSavedMaskLength;
ClearInternalMask(FSavedMask, FSavedMaskLength);
SetMaxLength(FMaskLength);
FTextOnEnter := inherited RealGetText;
Result := True;
end
else
begin
Result := False;
end;
// if NewText = old Text the next statement will do nothing,
// and NO mask will appear, so Clear first ...
if IsMasked then Clear;
Text := NewText;
end;
мне из-за этого косяка на работе весь мозг вынесли..
-
Kemet
- постоялец
- Сообщения: 241
- Зарегистрирован: 10.02.2010 18:28:32
- Откуда: Временно оккупированная территория
- Контактная информация:
*Rik* писал(а):tvplanit надо смотреть, потребуется время. У меня в на линуксе c XFCE он поставился, но не все компоненты работают, некоторые падают. Скажи какие компоненты необходимы, я попробую начать с них, если получится, будет доступно опционально при сборке из исходного кода..
Увы, каюсь, я не посмотрел, работает ли лазарусовский порт - а он не работает. Мы эти компоненты под Дельфи используем, очень нужная штука, видимо придемся сначала покопаться в исходниках на предмет полного портирования.
Привет Rik а есть где нибудь пример использования TxDBGrid ... что он вообще из себя представляет
- *Rik*
- постоялец
- Сообщения: 453
- Зарегистрирован: 19.04.2011 12:18:51
- Откуда: Урал
- Контактная информация:
ogorodov писал(а):Привет Rik а есть где нибудь пример использования TxDBGrid ... что он вообще из себя представляет
Сетка используется как и стандартная, но имеет немного расширенные функции.
1. Отрисовка 2 полей в одном столбце. Смысл - впихать как можно больше информации в экран, чтобы как можно больше доступной информации было перед глазами и чтобы соответственно не прокручивать сетку влево вправо. Каждый столбец имеет свойства TxColumn.FieldName и TxColumn.xFieldName (соответственно есть TxColumn.Caption и TxColumn.xCaption)
2. Измененное оформление (можно отключить, свойство TxDBGrid.xStyle)
3. Автоматическое изменение ширины колонок при изменении ширины сетки. Для этого свойство TxDBGrid.Options.AutoSizeColumns = True, в столбцах сетки TxColumn.PrcWidth - ширина столбца в процентном отношении к общей ширине сетки. Сумма PrcWidth всех столбцов не должна превышать 100.
3. Отрисовка иконок в ячейках, в зависимости от значения поля. Для этого назначить на сетке в свойстве ImageList библиотеку изображений. В столбце, в котором собираемся выводить изображение, задаем в свойстве TxColumn.DrawImage = True, в свойстве ImageIndexes задаем какую иконку рисовать в зависимости от значения поля.
Пример:

На скриншоте редактор свойства ImageIndexes, для поля с типом Boolean задано рисовать: для значения True иконку из библиотеки изображений с индексом 13, для значения False - изображение с индексом 6.
Чтобы задать какую иконку рисовать, в редакторе свойства добавляем строку, затем в столбец Key вписываем значение поля, какое нас интересует, после этого щелкаем на изображении нужной иконки в списке справа, индекс изображения подставится в столбец Name.
4. Автоперенос текста в ячейках. Свойства TxColumn.WordWrap и TxColumn.xWordWrap.
5. Можно задать приращение к высоте строки в поле TxDBGrid.IncRowHeight - Можно растянуть высоту строк так, чтобы влазили длинные значения строковых полей (само собой если задан перенос в столбцах TxColumn.WordWrap и TxColumn.xWordWrap).
6. В свойствах сетки можно назначить TAction для: TxDBGRid.InsertAction - срабатывает при нажатии в сетке <Ins>, TxDBGrid.EditAction срабатывает при нажатии в сетке <F4>, TxDBGrid.DeleteAction - срабатывает при нажатии в сетке <Ctrl>+<Del>, TxDBGRid.SelectAction срабатывает при нажатии в сетке <Enter> (при этом TxDBGrid.Option.RowSelect должна быть True, иначе не работает).
7. Есть функции автосортировки и автофильтра, но для них нужно писать дополнительные обработчики, в зависимости от используемых компонент доступа к данным.
Автосортировка работает если щелкнуть на заголовок столбца, данные выстроятся по этому полю (TxDBGRid.Option.AutoSortIcon поставить в True, будет отрисована стрелка в заголовке сортированного поля). Автофильтр работает при нажатии <Ctrl>+<F>, автофильтр работает по полю в котором стоит курсор.
Пример, в модуле XDBGRid есть переменные процедурного типа GetDataSortField и AutoSortDataSet, им нужно назначить обработчики перед использованием сетки в одном месте программы, можно например в конструкторе главной формы или секции initialization:
Код: Выделить всё
XDBGrids.GetDataSortField := @GetDBSortingField;
XDBGrids.AutoSortDataSet:= @OnAutoSortDataset;Пример обработчиков из CrossMashine, он задает использование этих функций для IBX, ZEOS, xDBF, после этого в сетке для всех наборов данных IBX, ZEOS, xDBF будет работать автосортировка и автофильтр:
Код: Выделить всё
procedure GetDBSortingField(DataSet: TDataSet; var SortedFieldName: string; var Desc: Boolean);
var
S: string;
I, L: Integer;
xDBF: TxDbf;
begin
SortedFieldName := '';
Desc:= False;
{$IFDEF IBX}
if DataSet is TIBDataSet then
begin
S := UTF8UpperCase(TIBDataSet(DataSet).OrderFields);
if S <> '' then
begin
I := Pos(',', S);
if I > 0 then
begin
L := Length(S);
Delete(S, I, L - I + 1);
end;
I := Pos(' DESC', S);
if I > 0 then
begin
Desc := True;
Delete(S, I, 5);
end;
end;
SortedFieldName := Trim(S);
end
else
{$EndIf}
{$IfDef ZEOS}
if DataSet is TZAbstractRODataset then
begin
S := UTF8UpperCase(TZAbstractRODataset(DataSet).SortedFields);
if S <> '' then
begin
I := Pos(',', S);
if I > 0 then
begin
L := Length(S);
Delete(S, I, L - I + 1);
end;
Desc := TZAbstractRODataset(DataSet).SortType = stDescending;
end
else
if DataSet is TZQuery then;
begin
S := UTF8UpperCase(TZQuery(DataSet).IndexFieldNames);
if S <> '' then
begin
I := Pos(',', S);
if I > 0 then
begin
L := Length(S);
Delete(S, I, L - I + 1);
end;
Desc := False;
end
end;
SortedFieldName := Trim(S);
end
else
{$ENDIF}
if DataSet is TxDbf then
begin
xDBF := TxDbf(DataSet);
S := xDBF.IndexName;
if S <> '' then
begin
for I := 0 to xDBF.Indexes.Count - 1 do
begin
if xDbf.Indexes.Items[I].IndexFile = S then
begin
SortedFieldName := xDbf.Indexes.Items[I].SortField;
Desc := ixDescending in xDbf.Indexes.Items[I].Options;
Break;
end;
end;
end;
end;
end;
procedure OnAutoSortDataset(DataSet: TDataSet; Column: TxColumn; CellCursorPos: TCellCursorPos);
var
DIDef: TDbfIndexDef;
begin
{$IFDEF IBX}
if DataSet is TIBCustomDataSet then
begin
if CellCursorPos = ccpTop then
begin
if Column.Sorted = soxAscending then
begin
TIBCustomDataSet(DataSet).OrderFields := Column.FieldName + ' DESC';
Column.Sorted := soxDescending;
end
else
begin
TIBCustomDataSet(DataSet).OrderFields := Column.FieldName;
Column.Sorted := soxAscending;
end;
end
else
begin
if Column.xSorted = soxAscending then
begin
TIBCustomDataSet(DataSet).OrderFields := Column.xFieldName + ' DESC';
Column.xSorted:= soxDescending;
end
else
begin
TIBCustomDataSet(DataSet).OrderFields := Column.xFieldName;
Column.xSorted:= soxAscending;
end;
end;
end
else
{$ENDIF}
{$IFDEF ZEOS}
if DataSet is TZQuery then
begin
if CellCursorPos = ccpTop then
begin
if Column.Sorted = soxAscending then
begin
TZQuery(DataSet).IndexFieldNames := Column.FieldName + ' DESC';
Column.Sorted:= soxDescending;
end
else
begin
TZQuery(DataSet).IndexFieldNames := Column.FieldName;
Column.Sorted:= soxAscending;
end;
end
else
begin
if Column.xSorted = soxAscending then
begin
TZQuery(DataSet).IndexFieldNames := Column.xFieldName + ' DESC';
Column.xSorted:= soxDescending;
end
else
begin
TZQuery(DataSet).IndexFieldNames := Column.xFieldName;
Column.xSorted:= soxAscending;
end;
end;
end
else
{$EndIf}
if DataSet is TCustomBufDataset then
begin
if CellCursorPos = ccpTop then
begin
TCustomBufDataset(DataSet).IndexFieldNames := Column.FieldName;
Column.Sorted:= soxAscending;
end
else
begin
TCustomBufDataset(DataSet).IndexFieldNames := Column.xFieldName;
Column.xSorted:= soxAscending;
end;
end
else
if DataSet is TxDbf then
begin
if CellCursorPos = ccpTop then
begin
DIDef := TxDbf(DataSet).Indexes.GetIndexByField(Column.FieldName);
if DIDef = nil then
TxDbf(DataSet).AddIndex(Column.FieldName, Column.FieldName, [ixCaseInsensitive]);
TxDbf(DataSet).IndexFieldNames := Column.FieldName;
if TxDbf(DataSet).IndexName <> '' then
Column.Sorted:= soxAscending;
end
else
begin
TxDbf(DataSet).IndexName := Column.xFieldName;
Column.xSorted:= soxAscending;
end;
end;
end;
ps. Когда задаете в каком либо столбце второе поле (TxColumn.xFieldName) у сетки автоматически устанавливается TxDBGrid.DoubleRowHeight = True, если вы уберете все TxColumn.xFieldName, то чтобы привести сетку в "одноэтажное состояние", нужно установить TxDBGrid.DoubleRowHeight = False.
Возможно видео полезным будет:
http://youtu.be/EES8aXxwAoI
Последний раз редактировалось *Rik* 19.10.2015 12:34:32, всего редактировалось 2 раза.
Спасибо ... теперь понятно
Добавлено спустя 2 часа 14 секунд:
Попробовал ... все хорошо только при вызове процедуры ConfirmDrawColumnCell ... в параметре Rect всегда выдается область для двойной строки и для FieldName и для xFieldName ... немного неудобно приходиться вычислять положение для своего отображения
Добавлено спустя 5 минут 22 секунды:
... похоже понял ... скорей всего отрисовка FieldName и xFieldName происходит за один раз ... я прав
Добавлено спустя 2 часа 14 секунд:
Попробовал ... все хорошо только при вызове процедуры ConfirmDrawColumnCell ... в параметре Rect всегда выдается область для двойной строки и для FieldName и для xFieldName ... немного неудобно приходиться вычислять положение для своего отображения
Добавлено спустя 5 минут 22 секунды:
... похоже понял ... скорей всего отрисовка FieldName и xFieldName происходит за один раз ... я прав
- *Rik*
- постоялец
- Сообщения: 453
- Зарегистрирован: 19.04.2011 12:18:51
- Откуда: Урал
- Контактная информация:
ogorodov писал(а):Спасибо ... теперь понятно
Добавлено спустя 2 часа 14 секунд:
Попробовал ... все хорошо только при вызове процедуры ConfirmDrawColumnCell ... в параметре Rect всегда выдается область для двойной строки и для FieldName и для xFieldName ... немного неудобно приходиться вычислять положение для своего отображения
Ещё может пригодиться в некоторых случаях:
TxDBGRid.CellCursorPos: TCellCursorPos = (ccpTop, ccpBottom);
CellCursorPos - текущее положение курсора в ячейке при использовании 2х этажного режима, если ccpTop - курсор в верхнем поле (FieldName), если ccpBottom - курсор в нижнем поле (xFieldName).
Добавлено спустя 37 секунд:
Да. Сетка сделана на основе кода стандартного грида, поэтому механизмы работы остались прежними. Даже если в столбце используется 2 поля, для сетки ни чего не поменялось, для неё все равно нужно отрисовать только одну ячейку, а уж сколько там полей, сетке без разницы, для неё как была одна ячейка, так одна и осталась..ogorodov писал(а):... похоже понял ... скорей всего отрисовка FieldName и xFieldName происходит за один раз ... я прав
