Программирование баз данных в Delphi 7: Создадим справочник товаров. Часть 1 (ImageIndex, TActionList, Action).
Продолжим писать программу складского учета. Для начала добавим в меню новые пункты. Помните, как это делается? Если забыли, напомню, щелкаем по размещенному на форме компонентуTMainMenu, у нас он называется mmMainMenu*.
У нас откроется редактирование меню, куда мы и вставим нужные нам пункты*:
Пункту меню "Справочники" мы присвоим имя ListsItem, а "Товары" - WaresListItem.
Теперь на панель инструментов добавим новую кнопочку. Щелкнем по ней правой кнопкой мыши и выберем пункт меню "New Button"*:
Свойству MenuItem добавленной кнопки присвоим значение WaresListItem. Саму кнопку назовем tblWares. Что бы отделить ее от других, добавим сепаратор*:
а затем перетащим его в нужное место*:
Теперь пришло время соединить кнопочку с пунктом меню. Для этого щелкнем по компоненту TActionList*:
У нас откроется окно, в котором мы добавим новое действие*:
Присвоим ему имя acWraesList, а свойство Caption - "Товары". А затем свяжем это действие с кнопкой и пунктом меню "Товары" через свойство action.
Теперь сделаем там, что бы кнопка была с картинкой. Для этого картинку добавим в ImageList*:
Щелкнем на него, что бы открыть диалог управления списком картинок*.
И, наконец, через свойство ImageIndex свяжем добавленную картинку с действитем (TActionList)*:
А теперь пишем обработчик события OnExecute действия acWaresList:
procedure TfrmStoreForm.acWaresListExecute(Sender: TObject);
var SessionParams:TStringList; i:integer;
begin
SessionParams:=TStringList.Create;
sSession.GetAliasParams('StorePrj',SessionParams);
for i:=0 to SessionParams.Count-1 do
if Pos('PATH',SessionParams[i])>0 then
begin
CreateMDIChild(copy(SessionParams[i],6,Length(SessionParams[i])-5)+'/wares.db');
break;
end;
end;
|
И так создаем новый модуль*:
сохраняем его под именем StoreTypes.
В этом модуле мы разместим объявления структур, в которых будут храниться описание полей (их перевод на русский язык), а так же функция поиска соответствия английского и русского наименования поля. Вот полный текст модуля:
unit StoreTypes;
interface
type
TFieldString=string[20];
TFieldInfo=record
Name:TFieldString;
Caption:TFieldString;
end;
TFieldsArray=array of TFieldInfo;
function glFindFieldAsName(AFields:TFieldsArray; AName:TFieldString):TFieldString;
implementation
function glFindFieldAsName(AFields:TFieldsArray; AName:TFieldString):TFieldString;
var i:integer;
begin
Result:='???';
for i:=Low(AFields) to High(AFields) do if AFields[i].Name=AName then
begin
Result:=AFields[i].Caption;
exit;
end;
end;
end.
|
TFieldInfo - это у нас структура, где хранятся соответствия русский и английских наименований полей. Английской наименование (идентификатор) - это у нас переменная Name - структуры TFieldInfo , а Caption - то, как название поля должно отобразиться на экране. TFieldsArray - это динамический массив, который мы заполним далее структурами TFieldInfo. Функция glFindFieldAsName у нас ищет в массиве по заданному идентификатору русскоязычное соответствие. Поиск происходит путем тупого перебора. Если не находит, отображает "???".
Теперь пойдем дальше. И так, открываем форму через команду View Form*:
В списке формы выберем frmTableView*:
Теперь перепишем метод OpenTable класса TfrmTableView. Во первых, теперь у нас измениться его определение, добавиться новый параметр:
procedure OpenTable(ATableName:string; AFields:TFieldsArray); |
Во вторых, нам еще надо добавить в раздел uses имя созданного нами модуля (выделено красным):
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, DBTables, ExtCtrls, DBCtrls, StoreTypes; |
И, наконец, перейдем непосредственно к коду метода OpenTable :
procedure TfrmTableView.OpenTable(ATableName:string; AFields:TFieldsArray);
var i,cn:integer;
begin
tbView.Active:=false;
tbView.TableName:=ATableName;
cn:=tbView.FieldDefs.Count-1;
tbView.Active:=true;
for i:=0 to cn do dbgView.Columns[i].Title.Caption:=glFindFieldAsName(AFields, dbgView.Columns[i].FieldName);
Show;
end;
|
В данной процедуре, мы, кроме того, что переоткрываем таблицу и открываем форму для просмотра, еще и меняем заголовку столбцов в компоненте TDBGrid. Делаем мы это так же в цикле, перебирая все столбцы.
А вот дальше мы будем дорабатывать основной модуль программы. Для того, что бы добраться до него, открываем форму frmStoreForm и переключаемся на ее модуль, нажав "Toggle form / Unit"*
Во первых, в секцию private класса TfrmStoreForm добавим определение:
WaresFields:TFieldsArray;
Во вторых, следует помнить о том, что если мы используем типы, переменные, процедуры, функции или что либо другое из созданного ранее модуля, то нужно добавить его имя в секцию uses. В данном случае нам надо добавить StoreTypes.
Во первых, нам надо слегка доработать процедуру CreateMDIChild, вот как она будет выглядеть теперь:
procedure TfrmStoreForm.CreateMDIChild(const Name: string; AFields:TFieldsArray);
var
Child: TfrmTableView;
begin
{ create a new MDI child window }
Child := TfrmTableView.Create(Application);
Child.Caption := Name;
if FileExists(Name) then Child.OpenTable(Name, AFields);
end; |
В содержимое процедуры FileNew1Execute закомментим или удалим:
procedure TfrmStoreForm.FileNew1Execute(Sender: TObject);
begin
//CreateMDIChild('NONAME' + IntToStr(MDIChildCount + 1));
end; |
аналогичные действия совершим с процедурой acFileOpenExecute.
И, наконец, создадим обработчик события FormCreate нашей формы, в которой мы создадим массив соответствий русскийх и латинских наименований:
procedure TfrmStoreForm.FormCreate(Sender: TObject);
begin
SetLength(WaresFields, 3);
WaresFields[0].Name:='Id';
WaresFields[0].Caption:='Код';
WaresFields[1].Name:='Name';
WaresFields[1].Caption:='Товар';
WaresFields[2].Name:='Price';
WaresFields[2].Caption:='Цена';
end; |
Вот такую картинку мы увидим, когда запустим программу:
|