Четвер, 21.11.2024, 16:33
Гость

Мішатронік

Мобільна версія | Додати у вибране  | Мій профіль | Вихід | RSS |
Меню сайту
Наше опитування
Чи знайома вам така технологія, як Flutter?
Всього відповідей: 0
Статистика

Онлайн всього: 1
Гостей: 1
Користувачів: 0


Программирование баз данных в Delphi 7: Создадим справочник товаров. Часть 1 (ImageIndex, TActionList, Action).

Продолжим писать программу складского учета. Для начала добавим в меню новые пункты. Помните, как это делается? Если забыли, напомню, щелкаем по размещенному на форме компонентуTMainMenu, у нас он называется mmMainMenu*.

Delphi 7: ImageIndex, TActionList, Action

У нас откроется редактирование меню, куда мы и вставим нужные нам пункты*:

Delphi 7: ImageIndex, TActionList, Action

Пункту меню "Справочники" мы присвоим имя ListsItem, а "Товары" - WaresListItem.

Теперь на панель инструментов добавим новую кнопочку. Щелкнем по ней правой кнопкой мыши и выберем пункт меню "New Button"*:

Delphi 7: ImageIndex, TActionList, Action

Свойству MenuIteдобавленной кнопки присвоим значение WaresListItem. Саму кнопку назовем tblWares. Что бы отделить ее от других, добавим сепаратор*:

Delphi 7: ImageIndex, TActionList, Action

а затем перетащим его в нужное место*:

Delphi 7: ImageIndex, TActionList, Action

Теперь пришло время соединить кнопочку с пунктом меню. Для этого щелкнем по компоненту TActionList*:

Delphi 7: ImageIndex, TActionList, Action

У нас откроется окно, в котором мы добавим новое действие*:

Delphi 7: ImageIndex, TActionList, Action

 

Присвоим ему имя acWraesList, а свойство Caption - "Товары". А затем свяжем это действие с кнопкой и пунктом меню "Товары" через свойство action.

Теперь сделаем там, что бы кнопка была с картинкой. Для этого картинку добавим в ImageList*:

Delphi 7: ImageIndex, TActionList, Action

Щелкнем на него, что бы открыть диалог управления списком картинок*.

Delphi 7: ImageIndex, TActionList, Action

И, наконец, через свойство ImageIndex свяжем добавленную картинку с действитем (TActionList)*:

Delphi 7: ImageIndex, TActionList, Action

А теперь пишем обработчик события 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;

И так создаем новый модуль*:

Русские заголовки (TTable, FieldDefs)

 

сохраняем его под именем 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*:

Русские заголовки (TTable, FieldDefs)

В списке формы выберем frmTableView*:

Русские заголовки (TTable, FieldDefs)

Теперь перепишем метод 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"*

Русские заголовки (TTable, FieldDefs)

Во первых, в секцию 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;

Вот такую картинку мы увидим, когда запустим программу:

Русские заголовки (TTable, FieldDefs)

 

Форма входа
Пошук
Друзі сайту
Календар
«  Листопад 2024  »
ПнВтСрЧтПтСбНд
    123
45678910
11121314151617
18192021222324
252627282930

Єдина Країна! Единая Страна!