Итак, создадим новый пустой рабочий проект ExtPascal Application, как здесь:

Итак, для реализации примера, нам потребуется таблица и панель. За кадром остались DataStore - одно из ключевых понятий ExtJS и Template - шаблон. Объявим их:
- Код: Выделить всё
{$M+}
Type
{ TExtWindow1 }
TExtWindow1 = Class(TExtWindow)
Private
bButtonSwitch: TExtButton;
bDataRecordMain: TExtDataRecord;
bDataStoreMain: TExtDataStore;
bPanelDetail: TExtPanel;
bGridMain: TExtGridGridPanel;
bTemplateMain: TExtTemplate;
FunctionJS: TExtFunction; // Здесь будем хранить JS обработку выделения
Procedure FillDataStore;
Procedure ButtonSwitchToggle(Sender: TExtButton; Pressed: Boolean);
Public
Property GridMain: TExtGridGridPanel Read bGridMain;
Property PanelDetail: TExtPanel Read bPanelDetail;
Property ButtonSwitch: TExtButton Read bButtonSwitch; // кнопка для переключением между Ajax и JS
Property TemplateMain: TExtTemplate Read bTemplateMain; // Шаблон
Property DataStoreMain: TExtDataStore Read bDataStoreMain;
Property DataRecordMain: TExtDataRecord Read bDataRecordMain; // Эта переменная требуется только для
Constructor Create; .// заполнения DataStore
Procedure Show;
Published
Procedure GridMainRowSelect; // Здесь буде обрабатывать выделение через AJAX
End;
{$M-}
Создадим наши контролы:
- Код: Выделить всё
Constructor TExtWindow1.Create;
Var
i: Integer;
aData: TExtObjectList;
Begin
Inherited;
{$IFDEF UseRuntime}
{$I unit1.inc}
{$ENDIF}
Layout := lyBorder;
// Шаблон - удобная штука, но, кажется, применима только для JS
bTemplateMain := TExtTemplate.Create('Полный путь: {fullname}<br />' +
'Имя файла: {file}<br />Размер: {size}<br />Расширение: {ext}<br />');
// сюда будем выводить информацию об файле
bPanelDetail := TExtPanel.AddTo(Items);
PanelDetail.Region := rgSouth;
PanelDetail.Split := TRUE;
PanelDetail.Height := 100;
//JS функция, выводящая шаблон на PanelDetail в соответствии с данными в
// TExtDataRecord.
FunctionJS := JSFunction('sm, rowIdx, r', TemplateMain.JSName + '.overwrite('+
PanelDetail.JSName + '.body, r.data);');
// Собственно, таблица
bGridMain := TExtGridGridPanel.AddTo(Items);
GridMain.Region := rgCenter;
// Таблица может иметь несколько различных моделей выделения.
// В ExtJS это реализовано разными классами, что вводит
// некоторое неудобство из-за приведений типов
GridMain.SelModel := TExtGridRowSelectionModel.Create;
With TExtGridRowSelectionModel(GridMain.SelModel) Do
Begin
SingleSelect := TRUE;
On('rowselect', FunctionJS); // назначение Listener'a на событие rowselect.
End;
aData := TExtObjectList.Create;
// Этот жуткий цикл нужен, чтобы создать столбцы в таблице
// и объявить количество полей у DataRecordMain.
For i := 0 To 2 Do
Begin
With TExtDataField.AddTo(aData) Do
Begin
Name := 'с' + IntToStr(i);
TypeJS := 'string';
End;
With TExtGridColumn.AddTo(GridMain.Columns) Do
Begin
ID := 'c' + IntToStr(i);
Width := 90;
Case i Of
0:
Begin
// DataIndex должен соответствовать полю записи в DataStore
DataIndex := 'file';
Header := 'Файл';
End;
1:
Begin
DataIndex := 'ext';
Header := 'Расширение';
End;
2:
Begin
DataIndex := 'size';
Header := 'Размер';
End;
End;
End;
End;
With TExtDataField.AddTo(aData) Do
Begin
Name := 'с3';
TypeJS := 'string';
End;
bDataRecordMain := TExtDataRecord.Create(aData);
// Об этом чуть ниже
bDataStoreMain := TExtDataStore.Create;
FillDataStore;
GridMain.Store := DataStoreMain;
GridMain.AutoExpandColumn := 'c0';
bButtonSwitch := TExtButton.AddTo(TbarArray);
ButtonSwitch.Text := 'Ajax';
ButtonSwitch.EnableToggle := TRUE;
ButtonSwitch.AllowDepress := TRUE;
ButtonSwitch.OnToggle := ButtonSwitchToggle; // Delphi-style назначения обработчика события
End;
DataStore - это, как не сложно догадаться, хранилище данных, которые могут быть представлены пользователю в виде ComboBox'a или, в нашем случае, таблицы. В своей реализации заимствованного примера оно (DataStore) будет заполнено информацией о файлах нашего проекта:
- Код: Выделить всё
// Заполним содержимое таблицы файлами проекта. Поле Fullname хранится в
// DataStore, но не будет отображено в таблице
Procedure TExtWindow1.FillDataStore;
Var
aPath: String;
aSearch: TSearchRec;
Begin
aPath := ExtractFileDir(ParamStr(0));
If FindFirst(ExtractFileDir(ParamStr(0)) + '/*', faAnyFile, aSearch) = 0 Then
Repeat
bDataStoreMain.Insert(0, JSArray('new ' + DataRecordMain.JSName + '({' +
'file:' + StrToJS(ExtractFileName(aSearch.Name)) + ',ext:' +
StrToJS(ExtractFileExt(aSearch.Name)) + ',size:' +
IntToStr(aSearch.Size) + ',fullname:' + StrToJS(aPath +
aSearch.Name) + '})'));
Until Not(FindNext(aSearch) = 0);
FindClose(aSearch);
End;
Теперь реализуем переключение между Ajax и JS:
- Код: Выделить всё
Procedure TExtWindow1.ButtonSwitchToggle(Sender: TExtButton; Pressed: Boolean);
Begin
With TExtGridRowSelectionModel(GridMain.SelModel) Do
Begin
PurgeListeners;
If Pressed Then
On('rowselect', Ajax(GridMainRowSelect, ['file', ExtData.
TExtDataRecord(GetSelected).Get('file')]))
Else
On('rowselect', FunctionJS);
End;
End;
И реализуем показ той же информации через Ajax:
- Код: Выделить всё
Procedure TExtWindow1.GridMainRowSelect;
Var
aPath: String;
aSearch: TSearchRec;
Begin
aPath := ExtractFileDir(ParamStr(0)) + '/';
If FindFirst(aPath + CurrentThread.Query['file'], faAnyFile, aSearch) = 0 Then
Begin
ExtMessageBox.Alert('Информация', 'Полный путь: ' + StrToJS(aPath +
aSearch.Name) + '<br />Имя файл: ' + StrToJS(aSearch.Name) + '<br />' +
'Размер: ' + IntToStr(aSearch.Size) + '<br />Расширение: ' +
StrToJS(ExtractFileExt(aSearch.Name)) + '<br />');
End;
End;
Итак, то, ради чего я сжёг свой ужин:
- Код: Выделить всё
Unit Unit1;
Interface
Uses
SysUtils, Classes,
{$DEFINE UseRuntime}
{$IFDEF UseRuntime}
Ext, ExtPascal, ExtPascalUtils, ExtForm,
ExtData, ExtGrid, ExtUtil, ExtAir, ExtDd,
ExtLayout, ExtMenu, ExtDirect, ExtState, ExtTree,
ExtUxForm;
Type
{$M+}
TExtPanel_Tab = TExtPanel;
TExtFormTextField_Grid = TExtFormTextField;
TExtFormNumberField_Grid = TExtFormNumberField;
TExtFormDateField_Grid = TExtFormDateField;
TExtFormTimeField_Grid = TExtFormTimeField;
TExtFormCheckbox_Grid = TExtFormCheckbox;
TExtFormComboBox_Grid = TExtFormComboBox;
{$M-}
{$ELSE}
ExtP_Design_Ctrls;
{$ENDIF}
{$M+}
Type
{ TExtWindow1 }
TExtWindow1 = Class(TExtWindow)
Private
bButtonSwitch: TExtButton;
bDataRecordMain: TExtDataRecord;
bDataStoreMain: TExtDataStore;
bPanelDetail: TExtPanel;
bGridMain: TExtGridGridPanel;
bTemplateMain: TExtTemplate;
FunctionJS: TExtFunction; // Здесь будем хранить JS обработку выделения
Procedure FillDataStore;
Procedure ButtonSwitchToggle(Sender: TExtButton; Pressed: Boolean);
Public
Property GridMain: TExtGridGridPanel Read bGridMain;
Property PanelDetail: TExtPanel Read bPanelDetail;
Property ButtonSwitch: TExtButton Read bButtonSwitch;
Property TemplateMain: TExtTemplate Read bTemplateMain;
Property DataStoreMain: TExtDataStore Read bDataStoreMain;
Property DataRecordMain: TExtDataRecord Read bDataRecordMain;
Constructor Create;
Procedure Show;
Published
Procedure GridMainRowSelect; // Здесь буде обрабатывать выделение через AJAX
End;
{$M-}
Implementation
Uses
AppThread;
// Заполним содержимое таблицы файлами проекта. Fullname хранится только в
// DataStore, но не в таблице
Procedure TExtWindow1.FillDataStore;
Var
aPath: String;
aSearch: TSearchRec;
Begin
aPath := ExtractFileDir(ParamStr(0));
If FindFirst(ExtractFileDir(ParamStr(0)) + '/*', faAnyFile, aSearch) = 0 Then
Repeat
bDataStoreMain.Insert(0, JSArray('new ' + DataRecordMain.JSName + '({' +
'file:' + StrToJS(ExtractFileName(aSearch.Name)) + ',ext:' +
StrToJS(ExtractFileExt(aSearch.Name)) + ',size:' +
IntToStr(aSearch.Size) + ',fullname:' + StrToJS(aPath +
aSearch.Name) + '})'));
Until Not(FindNext(aSearch) = 0);
FindClose(aSearch);
End;
Constructor TExtWindow1.Create;
Var
i: Integer;
aData: TExtObjectList;
Begin
Inherited;
{$IFDEF UseRuntime}
{$I unit1.inc}
{$ENDIF}
Layout := lyBorder;
// Шаблон - удобен для "убирания" лишнего текста
bTemplateMain := TExtTemplate.Create('Полный путь: {fullname}<br />' +
'Имя файла: {file}<br />Размер: {size}<br />Расширение: {ext}<br />');
// сюда будем выводить информацию об файле
bPanelDetail := TExtPanel.AddTo(Items);
PanelDetail.Region := rgSouth;
PanelDetail.Split := TRUE;
PanelDetail.Height := 100;
bGridMain := TExtGridGridPanel.AddTo(Items);
GridMain.Region := rgCenter;
GridMain.SelModel := TExtGridRowSelectionModel.Create;
FunctionJS := JSFunction('sm, rowIdx, r', TemplateMain.JSName + '.overwrite('+
PanelDetail.JSName + '.body, r.data);');
With TExtGridRowSelectionModel(GridMain.SelModel) Do
Begin
SingleSelect := TRUE;
On('rowselect', FunctionJS);
End;
aData := TExtObjectList.Create;
For i := 0 To 2 Do
Begin
With TExtDataField.AddTo(aData) Do
Begin
Name := 'с' + IntToStr(i);
TypeJS := 'string';
End;
With TExtGridColumn.AddTo(GridMain.Columns) Do
Begin
ID := 'c' + IntToStr(i);
Width := 90;
Case i Of
0:
Begin
DataIndex := 'file';
Header := 'Файл';
End;
1:
Begin
DataIndex := 'ext';
Header := 'Расширение';
End;
2:
Begin
DataIndex := 'size';
Header := 'Размер';
End;
End;
End;
End;
With TExtDataField.AddTo(aData) Do
Begin
Name := 'с3';
TypeJS := 'string';
End;
bDataRecordMain := TExtDataRecord.Create(aData);
bDataStoreMain := TExtDataStore.Create;
FillDataStore;
GridMain.Store := DataStoreMain;
GridMain.AutoExpandColumn := 'c0';
bButtonSwitch := TExtButton.AddTo(TbarArray);
ButtonSwitch.Text := 'Ajax';
ButtonSwitch.EnableToggle := TRUE;
ButtonSwitch.AllowDepress := TRUE;
ButtonSwitch.ToggleGroup := 'switch';
ButtonSwitch.OnToggle := ButtonSwitchToggle;
End;
Procedure TExtWindow1.Show;
Begin
Inherited Show;
End;
Procedure TExtWindow1.GridMainRowSelect;
Var
aPath: String;
aSearch: TSearchRec;
Begin
aPath := ExtractFileDir(ParamStr(0)) + '/';
If FindFirst(aPath + CurrentThread.Query['file'], faAnyFile, aSearch) = 0 Then
Begin
ExtMessageBox.Alert('Информация', 'Полный путь: ' + StrToJS(aPath +
aSearch.Name) + '<br />Имя файл: ' + StrToJS(aSearch.Name) + '<br />' +
'Размер: ' + IntToStr(aSearch.Size) + '<br />Расширение: ' +
StrToJS(ExtractFileExt(aSearch.Name)) + '<br />');
End;
End;
Procedure TExtWindow1.ButtonSwitchToggle(Sender: TExtButton; Pressed: Boolean);
Begin
With TExtGridRowSelectionModel(GridMain.SelModel) Do
If Pressed Then
Begin
PurgeListeners;
On('rowselect', Ajax(GridMainRowSelect, ['file', ExtData.
TExtDataRecord(GetSelected).Get('file')]));
End
Else
Begin
PurgeListeners;
On('rowselect', FunctionJS);
End;
End;
End.