Diesel Pascal

Проектирование и разработка идеального средства программирования.

Модератор: Модераторы

Re: Diesel Pascal

Сообщение user89 » 15.07.2015 18:28:18

Здравствуйте! Сейчас скачал Дизель Паскаль, очень понравилось. Скажите, пожалуйста, а можно в нём делать Web-приложения, хотя бы простые?
Аналогично ISAPI-модулям, или в идеале как на PHP (исправил Pascal-скрипт на сервере, сохранил, компиляция не нужна)
user89
незнакомец
 
Сообщения: 4
Зарегистрирован: 15.07.2015 18:04:52

Re: Diesel Pascal

Сообщение *Rik* » 15.07.2015 20:29:41

Нет, Web никак. В далеких планах есть желание с FastCGI скрестить, но руки не доходят, работы пока завал...
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 451
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: Diesel Pascal

Сообщение *Rik* » 17.08.2015 23:04:33

В дизайнере CrossDesigner значительно улучшен редактор свойств SQL. В этот редактор добавлен подсказчик, упрощающий написание SQL запросов. Парсер подсказчика распознает имена таблиц, объявленные переменные, входные и выходные параметры для EXECUTE BLOCK, позволяет обращаться к полям таблиц и вьюшек через их имена или псевдонимы. Парсер ориентирован на диалект SQL сервера FireBird.
Если кому интересно как работает, можете посмотреть исходный код в проекте CrossDesigner, модули sqleditor.pas и sqlparser.pas.

Видео на ютюбе:
http://youtu.be/rjqx6tc3y84
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 451
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: Diesel Pascal

Сообщение user89 » 15.09.2015 17:00:58

На скринах Дизель-Паскаля (тот, что в Линуксе) очень красивый заголовок формы. Там буквы обведены контуром. Тема оформления ClearLooks вроде подходит, но в заголовке окна, буквы контуром не обводятся. Облазил все настройки шрифтов, не нашел... Хочу сделать, как на картинке ниже.

Изображение
user89
незнакомец
 
Сообщения: 4
Зарегистрирован: 15.07.2015 18:04:52

Re: Diesel Pascal

Сообщение *Rik* » 15.09.2015 17:23:21

user89 писал(а):На скринах Дизель-Паскаля (тот, что в Линуксе) очень красивый заголовок формы. Там буквы обведены контуром. Тема оформления ClearLooks вроде подходит, но в заголовке окна, буквы контуром не обводятся. Облазил все настройки шрифтов, не нашел... Хочу сделать, как на картинке ниже.

Изображение

Тема Clearlooks-Phenix, в ALT Simply Linux она по умолчанию.
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 451
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: Diesel Pascal

Сообщение ViTality » 15.09.2015 17:33:11

видно только Изображение
ViTality
постоялец
 
Сообщения: 308
Зарегистрирован: 05.10.2007 15:12:02

Re: Diesel Pascal

Сообщение *Rik* » 15.09.2015 17:47:23

ViTality писал(а):видно только

Ничего не понял..
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 451
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: Diesel Pascal

Сообщение user89 » 15.09.2015 18:11:25

*Rik*,
установил себе 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>
user89
незнакомец
 
Сообщения: 4
Зарегистрирован: 15.07.2015 18:04:52

Re: Diesel Pascal

Сообщение Kemet » 23.09.2015 16:12:38

с текущей версией fpspreadsheet CrossMachine не собирается.
Юра, можешь добавить в проект tvplanit из lazarus ccr?
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория

Re: Diesel Pascal

Сообщение *Rik* » 23.09.2015 18:06:22

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;

мне из-за этого косяка на работе весь мозг вынесли..
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 451
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: Diesel Pascal

Сообщение Kemet » 24.09.2015 18:32:02

*Rik* писал(а):tvplanit надо смотреть, потребуется время. У меня в на линуксе c XFCE он поставился, но не все компоненты работают, некоторые падают. Скажи какие компоненты необходимы, я попробую начать с них, если получится, будет доступно опционально при сборке из исходного кода..

Увы, каюсь, я не посмотрел, работает ли лазарусовский порт - а он не работает. Мы эти компоненты под Дельфи используем, очень нужная штука, видимо придемся сначала покопаться в исходниках на предмет полного портирования.
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория

Re: Diesel Pascal

Сообщение ogorodov » 19.10.2015 12:17:39

Привет Rik а есть где нибудь пример использования TxDBGrid ... что он вообще из себя представляет
ogorodov
новенький
 
Сообщения: 37
Зарегистрирован: 22.10.2009 11:32:07

Re: Diesel Pascal

Сообщение *Rik* » 19.10.2015 13:15:41

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 13:34:32, всего редактировалось 2 раз(а).
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 451
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: Diesel Pascal

Сообщение ogorodov » 19.10.2015 13:30:10

Спасибо ... теперь понятно

Добавлено спустя 2 часа 14 секунд:
Попробовал ... все хорошо только при вызове процедуры ConfirmDrawColumnCell ... в параметре Rect всегда выдается область для двойной строки и для FieldName и для xFieldName ... немного неудобно приходиться вычислять положение для своего отображения

Добавлено спустя 5 минут 22 секунды:
... похоже понял ... скорей всего отрисовка FieldName и xFieldName происходит за один раз ... я прав
ogorodov
новенький
 
Сообщения: 37
Зарегистрирован: 22.10.2009 11:32:07

Re: Diesel Pascal

Сообщение *Rik* » 19.10.2015 15:40:01

ogorodov писал(а):Спасибо ... теперь понятно

Добавлено спустя 2 часа 14 секунд:
Попробовал ... все хорошо только при вызове процедуры ConfirmDrawColumnCell ... в параметре Rect всегда выдается область для двойной строки и для FieldName и для xFieldName ... немного неудобно приходиться вычислять положение для своего отображения


Ещё может пригодиться в некоторых случаях:
TxDBGRid.CellCursorPos: TCellCursorPos = (ccpTop, ccpBottom);
CellCursorPos - текущее положение курсора в ячейке при использовании 2х этажного режима, если ccpTop - курсор в верхнем поле (FieldName), если ccpBottom - курсор в нижнем поле (xFieldName).

Добавлено спустя 37 секунд:
ogorodov писал(а):... похоже понял ... скорей всего отрисовка FieldName и xFieldName происходит за один раз ... я прав
Да. Сетка сделана на основе кода стандартного грида, поэтому механизмы работы остались прежними. Даже если в столбце используется 2 поля, для сетки ни чего не поменялось, для неё все равно нужно отрисовать только одну ячейку, а уж сколько там полей, сетке без разницы, для неё как была одна ячейка, так одна и осталась..
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 451
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Пред.След.

Вернуться в Компилятор / язык программирования

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru