Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Методы компонента 2 страница




procedure Assign(Source: TPersistent); override; Копирует данные из одного компонента в другой, при этом должны быть корректно определены свойства DataType и Size. Параметр Source определяет поле — источник данных. Свойство DataSize источника должно иметь значение не больше 255.
procedure AssignValue(const Value: 'TVarRec); Устанавливает значение поля в соответствие с параметром метода Value, используя для преобразования данных свойства AsBoolean, Aslnteger, AsFloat, AsString, в зависимости от типа данных.
procedure Clear; virtual; Обнуляет набор значений поля.
procedure FocusControl; Устанавливает фокус формы на первый связанный с TField компонент отображения данных.
function GetData(Buffer:Pointer): Boolean Помещает в буфер данные поля без преобразований. Для определения размера буфера можно использовать свойство DataSize. Возвращает False в случае отсутствия данных.
function IsValidChar(InputChar: Char): Boolean; virtual Используется для определения корректности символа, введенного в поле, результат зависит от типа данных поля. Применяется компонентами отображения данных.
procedure SetData(Buffer: Pointer); Записывает в поле данные из буфера без преобразования. Размер буфера определяется свойством DataSize.

Класс TField представляет поле (столбец) базы данных. Через этот класс вы можете установить атрибуты поля. К атрибутам поля относятся тип данных (строковый, целый, с плавающей точкой и т. д.), размер поля, индекс, используется ли это поле в вычислениях и т. п. Вы можете получить или установить значение поля через свойства AsString, AsVariant И AsInteger.

TField является базовым классом для специализированных классов полей. К потомкам TField относятся TStringField, TIntegerField, TSmallIn-tField, TWordField, TFloatField, TCurrencyField, TBCDField, TBooleanFi-eld, TDateTimeField, TDateField, TBIobField, TBytesField, TVarBytesFi-eld, TMemoField и TGraphicField. Эти производные классы расширяют базовый класс, добавляя новые функциональные возможности. Например, классы числовых полей имеют свойство DisplayFormat, которое определяет способ отображения чисел, а также свойство EditFormat, которое определяет вид чисел во время редактирования. Каждый потомок TField соответствует определенному типу поля базы данных. Класс TIntegerField используется для полей целого типа, класс TTimeField — для полей, содержащих дату или время (или дату/время), класс TBIobField — для полей, содержащих большие двоичные объекты, и т. д.

Во время проектирования приложения вы можете обращаться к свойствам TField через редактор полей. После добавления полей достаточно щелкнуть на поле, и в инспекторе объектов будут отображены его свойства. На рис. 16.5 показаны редактор полей и инспектор объектов во время редактирования полей.

Свойства и методы TField настолько многочисленны, что я не буду перечислять их все. Вместо этого я покажу вам, каким образом чаще всего используются TField и его производные классы.

Доступ к полям

Чтобы получить или установить значение поля, необходимо иметь к нему доступ. Это можно сделать по крайней мере тремя способами:

q По имени указателя

q Через свойство Fields класса TDataSet

q Через метод FieldByName класса TDataSet

Доступ к полю по имени указателя используется, по-видимому, реже всего. Он работает только в том случае, если вы предварительно добавили поля к проекту с помощью редактора полей. Когда вы добавляете поля через редактор полей, Delphi создает для каждого поля указатель, имя которого составляется из имени таблицы и имени поля. Если у вас есть таблица Table! и строковое поле FirstName, указатель на объект TStringField получит имя TablelFirstName. Вы можете использовать этот указатель для доступа к полю:

 

Table1.FirstName.Value:= 'Per';

 

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

Свойство Fields предлагает другой способ доступа к полю — по его положению в таблице. Если вы знаете, что поле LastName стоит в таблице первым, можно сделать примерно следующее:

 

Edit1.Text:= Table1.Fields[0].Value;

 

В данном случае проблема, очевидно, состоит в том, что вы должны знать точный порядок полей.

Из трех способов доступа к полям наиболее распространенным и надежным является использование метода FieldByName. Для доступа к полю через FieldByName вы должны знать только имя этого поля:

 

Table1.FieldByName('LastName').AsString:= Edit1.Text;

 

FieldByName возвращает указатель на TField. Для большей ясности я разделю предыдущую строку кода:

 

var

Field: TField;

begin

Field:= Table1.FieldByName('LastName');

Field.AsString:= Edit1.Text;

end;

 

В большинстве случаев FieldByName представляет собой именно то, что нужно. Да, остался еще один вопрос — какая запись будет модифицирована в результате выполнения предыдущего кода. Все рассмотренные способы возвращают поле из текущей записи.

Извлечение и установка значений полей

После получения указателя на конкретное поле вы можете изменять его значение с помощью свойства value или любого из свойств As. Под свойствами As Я имею В виду AsString, Aslnteger, AsDateTime, AsBoolean и т. д. Эти свойства выполняют преобразования между разными типами данных. Естественно, преобразование возможно не во всех случаях. Например, если вы попытаетесь преобразовать строковое поле со значением Smith к целому типу, будет возбуждено исключение.

Установка значения поля очень проста, если вы знаете секрет FieldByName:

 

Table1.Edit;

Table1.FieldByName('LastName').AsString:= Edit1.Text;

Table1.Post;

 

Сначала вызывается метод Edit, который переводит таблицу в режим редактирования. Если вы не вызовете Edit, то получите исключение при попытке изменения значения поля. После того, как таблица переведена в режим редактирования, устанавливается новое значение поля. В данном случае я использую AsString вместо свойства Value. Для строкового поля это в любом случае одно и то же. В завершение вызывается метод Post, который отправляет изменения в базу данных (или кэш изменений, если включено свойство СасhedUpdates). Вот и все. Извлечение значения поля выполняется еще проще:

 

int AcctNo:= Tablel.FieldByName('ACCT NBR').Value;

 

События TField

К событиям TField, заслуживающим внимания, относятся OnChange и OnValidate. Событие OnChange генерируется при каждом изменении значения поля, после того, как данные были отправлены в базу данных. Вы можете использовать это событие для уведомления об изменениях.

Событие OnValidate, с другой стороны, происходит непосредственно перед отправкой данных. Если у вас на форме имеется компонент отображения, связанный с полем, то он обычно будет сам проверять допустимость вводимых значений. Однако если вы устанавливаете значение поля программным путем, может потребоваться отдельная проверка в обработчике события OnValidate. Это событие немного странное, в том смысле, что оно не передает вам параметра, который мог бы использоваться для отмены изменений. Вместо этого вам нужно возбудить исключение, если результат проверки отрицательный:

 

procedure TForm1.TablelACCT_NBRValidate(Sender: TField);

begin

if (Sender.Aslnteger < 3000) then

raise EDBEditError.Create('Bad Account Number.');

end;

 

Когда вы возбуждаете исключение, отправка изменений в базу данных отменяется.

Для создания обработчика события на этапе проектирования вы должны добавить поля в набор данных с помощью редактора полей. После этого вы можете выбрать поле в редакторе полей и, как обычно, дважды щелкнуть рядом с именем события в инспекторе объектов.

 


41 Создание в Delphi подчиненных таблиц.

Связанные таблицы

В рамках одного проекта таблицы БД можно связывать отношениями "один- ко- многим" и "многие- ко- многим", при этом отношения обязательно устанавливаются между индексированными полями двух таблиц.

При создании отношений в качестве главной таблицы можно использовать любой компонент, инкапсулирующий набор данных. Для задания подчиненной таблицы можно использовать только табличные компоненты (см. гл. 12).

 


42 Создание вычисляемых полей в Delphi.

8. Редактор DataSet 9. Редактор DataSet может быть вызван с помощью объектов TTable или TQuery. Чтобы начать работать с ним, положите объект TQuery на форму, установите псевдоним DBDEMOS, введите SQL запрос "select * from customer" и активизируйте его (установив св-во Active в True). Откройте комбобокс “Object Selector” вверху Инспектора Объектов - в настоящее время там имеется два компонента: TForm и TQuery. Нажмите правую кнопку мыши на объекте TQuery и в контекстном меню выберите пункт “Fields Editor”. Нажмите кнопку Add - появиться диалог Add Fields, как показано на рис.1 Рис.1: Диалог Add Fields Редактора DataSet. По-умолчанию, все поля в диалоге выбраны. Нажмите на кнопку OK, чтобы выбрать все поля, и закройте редактор. Снова загляните в “Object Selector”, теперь здесь появилось несколько новых объектов, (см. рис.2) Рис.2: Object Selector показывает в списке все объекты созданные в Редакторе DataSet. Вы можете также найти этот список в определении класса TForm1. Эти новые объекты будут использоваться для визуального представления таблицы CUSTOMER пользователю. Вот полный список объектов, которые только что созданы: Query1CustNo: TFloatField; Query1Company: TStringField; Query1Addr1: TStringField; Query1Addr2: TStringField; Query1City: TStringField; Query1State: TStringField; Query1Zip: TStringField; Query1Country: TStringField; Query1Phone: TStringField; Query1FAX: TStringField; Query1TaxRate: TFloatField; Query1Contact: TStringField; Query1LastInvoiceDate: TDateTimeField; Я вырезал и вставил этот список из определения класса TForm1, которое можно найти в окне Редактора исходного текста. Происхождение имен показанных здесь, должно быть достаточно очевидно. Часть "Query1" берется по-умолчанию от имени объекта TQuery, а вторая половина от имени поля в таблице Customer. Если бы мы сейчас переименовали объект Query1 в Customer, то получили бы такие имена: CustomerCustNo CustomerCompany Это соглашение может быть очень полезно, когда Вы работаете с несколькими таблицами, и сразу хотите знать, на поле какой таблицы ссылается данная переменная. Любой объект, созданный в редакторе DataSet является наследником класса TField. Точный тип потомка зависит от типа данных в конкретном поле. Например, поле CustNo имеет тип TFloatField, а поле Query1City имеет тип TStringField. Это два типа полей, которые Вы будете встречать наиболее часто. Другие типы включают тип TDateTimeField, который представлен полем Query1LastInvoiceDate, и TIntegerField, который не встречается в этой таблице. Чтобы понять, что можно делать с потомками TField, откройте Browser, выключите просмотр полей Private и Protected, и просмотрите свойства и методы Public и Published соответствующих классов. Наиболее важное свойство называется Value. Вы можете получить доступ к нему так: procedure TForm1.Button1Click(Sender: TObject); var d: Double; S: string; begin d:= Query1CustNo.Value; S:= Query1Company.Value; d:=d+1; S:= 'Zoo'; Query1CustNo.Value:= d; Query1Company.Value:= S; end; В коде, показанном здесь, сначала присваиваются значения переменным d и S. Следующие две строки изменяют эти значения, а последний две присваивают новые значения объектам. Не имеет большого смысла писать код, подобный этому, в программе, но этот код служит лишь для того, чтобы продемонстрировать синтаксис, используемый с потомками TField. Свойство Value всегда соответствует типу поля, к которому оно относится. Например у TStringFields - string, TCurrencyFields - double. Однако, если вы отображаете поле типа TCurrencyField с помощью компонент, “чувствительных к данным” (data-aware: TDBEdit, TDBGrid etc.), то оно будет представлена строкой типа: "$5.00". Это могло бы заставить вас думать, что у Delphi внезапно отключился строгий контроль типов. Ведь TCurrencyField.Value объявлена как Double, и если Вы пробуете присвоить ему строку, Вы получите ошибку “type mismatch” (несоответствие типа). Вышеупомянутый пример демонстрирует на самом деле свойства объектов визуализации данных, а не ослабление проверки типов. (Однако, есть возможность получить значение поля уже преобразованное к другому типу. Для этого у TField и его потомков имеется набор методов типа AsString или AsFloat. Конечно, преобразование происходит только тогда, когда имеет смысл.) Если нужно получить имена полей в текущем DataSet, то для этого используется свойство FieldName одним из двух способов, показанных ниже: S:= Query1.Fields[0].FieldName; S:= Query1CustNo.FieldName; Если вы хотите получить имя объекта, связанного с полем, то вы должны использовать свойство Name: S:= Query1.Fields[0].Name; S:= Query1CustNo.Name; Для таблицы CUSTOMER, первый пример вернет строку "CustNo", а любая из строк второго примера строку "Query1CustNo". 10. Вычисляемые Поля Создание вычисляемых полей - одно из наиболее ценных свойств Редактора DataSet. Вы можете использовать эти поля для различных целей, но два случая выделяются особо:
  • выполнение вычислений по двум или более полям в DataSet, и отображение результата вычислений в третьем поле.
  • имитация соединения двух таблиц с возможностью редактировать результат соединения.
Программа CALC_SUM.DPR из примеров к данному уроку иллюстрирует первый случай использования вычисляемых полей.   Эта программа связывает три таблицы в отношении один ко многим. В частности, ORDERS и ITEMS связаны по полю OrderNo, а ITEMS и PARTS связаны по полю PartNo. (В таблице ORDERS хранятся все заказы; в таблице ITEMS - предметы, указанные в заказах; PARTS - справочник предметов). В программе можно перемещаться по таблице ORDERS и видеть связанный с текущим заказом список включенных в него предметов. Программа CALC_SUM достаточно сложная, но хорошо иллюстрирует мощность вычисляемых полей. Последовательность создания проекта CALC_SUM:
  • Создайте новый проект (File|New Project) и удалите из него форму (в Менеджере Проекта View|Project Manager)
  • Выберите эксперта форм БД из меню Help.
  • На первом экране, выберите "Create a master/detail form" и "Create a form using TQuery Objects".
  • Нажмите кнопку Next и выберите таблицу ORDERS.DB из псевдонима БД DBDEMOS.
  • Нажмите Next и выберите поля OrderNo, CustNo, SaleDate, ShipDate и ItemsTotal из таблицы ORDERS.DB.
  • Нажмите Next и выберите "Horizontal" из расстановки компонентов dbEdit на форме.
  • Нажмите Next и выберите таблицу ITEMS.DB.
  • В двух следующих экранах выберите все поля из таблицы и поместите их в grid.
  • Нажмите Next и выберите поле OrderNo из Master и Detail ListBoxes, и Нажмите кнопку Add.
  • Нажмите Next и сгенерируйте форму.
Требуется много слов для того, чтобы описать процесс показанный выше, но, фактически, выполнение команд в Эксперте форм БД легко и интуитивно. Выделите первый из двух объектов TQuery и установят свойство Active в True. Для Query2 в свойстве SQL напишите текст запроса: select * from Items I, Parts P where (I.OrderNo =:OrderNo) and (I.PartNo=P.PartNo) Активизируйте объект Query2 (Active установите в True) и вызовите редактор DataSet (Fields Editor) для него. Вызовите диалог Add Fields и добавьте поля OrderNo, PartNo, Qty и ListPrice. Нажмите Define и ведите слово Total в поле FieldName. Установите Field Type в CurrencyField. Проверьте что Calculated CheckBox отмечен. Нажмите Ok и закройте редактор DataSet. Простой процесс описанный в предыдущем абзаце, показывает как создать вычисляемое поле. Если посмотреть в DBGrid, то можно видеть, что там теперь есть еще одно пустое поле. Для того, чтобы поместить значение в это поле, откройте в Инспекторе Объектов страницу событий для объекта Query2 и сделайте двойной щелчок на OnCalcFields. Заполните созданный метод так: procedure TForm2.Query2CalcFields(DataSet: TDataSet); begin Query2NewTotalInvoice.Value:= 23.0; end; После запуска программы поле Total будет содержит строку $23.00. Это показывает, насколько просто создать вычисляемое поле, которое показывает правильно сформатированные данные. На самом деле это поле должно показывать нечто другое - произведение полей Qty (количество) и ListPrice (цена). Для этого вышеприведенный код для события OnCalcFields нужно изменить следующим образом: procedure TForm1.Query2CalcFields(DataSet: TDataset); begin Query2Total.Value:=Query2Qty.Value*Query2ListPrice.Value; end;   Если теперь запустить программу, то поле Total будет содержать требуемое значение. В обработчике события OnCalcFields можно выполнять и более сложные вычисления (это будет показано позже), однако следует помнить, что это вызывает соответствующее замедление скорости работы программы. Теперь давайте добавим вычисляемое поле для первой таблицы (Query1, ORDERS), которое будет отображать сумму значений из поля Total второй таблицы (Query2) для данного заказа. Вызовите редактор DataSet для объекта Query1 и добавьте вычисляемое поле NewItemsTotal типа CurrencyField. В обработчике события OnCalcFields для Query1 нужно подсчитать сумму и присвоить ее полю NewItemsTotal: procedure TForm1.Query1CalcFields(DataSet: TDataset); var R: Double; begin R:=0; with Query2 do begin DisableControls; Close; Open; repeat R:=R+Query2Total.Value; Next; until EOF; First; EnableControls; end; Query1NewItemsTotal.Value:=R; end; В данном примере сумма подсчитывается с помощью простого перебора записей, это не самый оптимальный вариант - можно, например, для подсчета суммы использовать дополнительный объект типа TQuery. Метод DisableControls вызывается для того, чтобы отменить перерисовку DBGrid при сканировании таблицы. Запрос Query2 переоткрывается для уверенности в том, что его текущий набор записей соответствует текущему заказу. Поместите на форму еще один элемент DBEdit и привяжите его к Query1, полю NewItemsTotal. Запустите программу, ее примерный вид показан на рис.3 Рис.3: Программа CALC_SUM Как видно из программы, наличие поля ItemsTotal в таблице ORDERS для данного примера необязательно и его можно было бы удалить (однако, оно необходимо в других случаях).   1. 1. 1. 2. Управление TDBGrid во время выполнения Объект DBGrid может быть полностью реконфигурирован во время выполнения программы. Вы можете прятать и показывать колонки, изменять порядок показа колонок и их ширину. Вы можете использовать свойство Options объекта DBGrid, чтобы изменить ее представление. Свойство Options может принимать следующие возможные значения:
DgEditing Установлен по-умолчанию в true, позволяет пользователю редактировать grid. Вы можете также установить свойство ReadOnly grid в True или False.
DgTitles Будут ли видны названия колонок.
DgIndicator Будут ли видны небольшие иконки слева.
DgColumnResize Может ли пользователь менять размер колонки.
dgColLines Показывать ли линии между колонками.
dgRowLines Показывать ли линии между строками.
dgTabs Может ли пользователь использовать tab и shift-tab для переключения между колонками.

Как объявлено в этой структуре:

TDBGridOption = (dgEditing, gdAlwaysShowEditor, dgTitles,

dgIndicator, dgColumnResize, dgColLines,

dgRowLines, dgTabs);

Например Вы можете установить опции в Runtime написав такой код:

DBGrid1.Options:= [dgTitles, dgIndicator];

Если Вы хотите включать и выключать опции, это можно сделать с помощью логических операций. Например, следующий код будет добавлять dgTitles к текущему набору параметров:

DBGrid1.Options:= DBGrid1.Options + [dgTitles];

Пусть есть переменная ShowTitles типа Boolean, тогда следующий код позволяют включать и выключать параметр одной кнопкой:

procedure TForm1.Button3Click(Sender: TObject);

begin

if ShowTitles then

DBGrid1.Options:= DBGrid1.Options + [dgTitles]

else

DBGrid1.Options:= DBGrid1.Options - [dgTitles];

ShowTitles:= not ShowTitles;

end;

 

Если Вы хотите скрыть поле в run-time, то можете установить свойство visible в false:

Query1.FieldByName(‘CustNo’).Visible:= False;

Query1CustNo.Visible:= False;

Обе строки кода выполняют идентичную задачу. Чтобы показать поле снова, установите видимый в true:

Query1.FieldByName(‘CustNo’).Visible:= True;

Query1CustNo.Visible:= True;

Если Вы хотите изменить положение колонки в Runtime, можете просто изменить индекс, (первое поле в записи имеет индекс нуль):

Query1.FieldByName(‘CustNo’).Index:= 1;

Query1CustNo.Index:= 2;

По-умолчанию, поле CustNo в таблице Customer является первым. Код в первой строке перемещает это поле во вторую позицию, а следующая строка перемещает его в третью позицию. Помните, что нумерация полей начинается с нуля, так присвоение свойству Index 1 делает поле вторым в записи. Первое поле имеет Index 0.

Когда Вы изменяете индекс поля, индексы других полей в записи изменяются автоматически.

Если Вы хотите изменить ширину колонки в Runtime, только измените свойство DisplayWidth соответствующего TField.

Query1.FieldByName(‘CustNo’).DisplayWidth:= 12;

Query1CustNo.DisplayWidth:= 12;

Величина 12 относится к числу символов, которые могут быть показаны в видимом элементе.

Программа DBGR_RT показывает как работать с DBGrid в Runtime. Программа достаточно проста, кроме двух небольших частей, которые описаны ниже. Первая часть показывает, как создать check box в Runtime, а вторая показывает, как изменить порядок пунктов в listbox в Runtime.

При создании формы (событие OnCreate) ListBox заполняется именами полей, далее создается массив объектов CheckBox, соответствующий полям в таблице. Сперва все CheckBox’ы выбраны и все поля в таблице видимы. Программа узнает через TTable1 имена полей и присваивает их свойству Caption соответствующего CheckBox. Кроме того, обработчику события OnClick всех CheckBox’ов присваивается процедура ChBClick, которая и включает/выключает поля в DBGrid.

procedure TForm1.FormCreate(Sender: TObject);

var

i: Word;

R: Array[0..49] of TCheckBox;

begin

{Fill ListBox}

ListBox1.Clear;

for i:=0 to Table1.FieldCount-1 do

ListBox1.Items.Add(Table1.Fields[i].FieldName);

{Make CheckBoxes}

for i:=0 to Table1.FieldCount-1 do begin

R[I]:= TCheckBox.Create(Self);

R[I].Parent:= ScrollBox1;

R[I].Caption:= Table1.Fields[i].FieldName;

R[I].Left:= 10;

R[I].Top:= I * CheckBox1.Height + 5;

R[I].Width:= 200;

R[I].Checked:= True;

R[I].OnClick:= ChBClick;

end;

end;

Большая часть кода в этом примере выполняет относительно простые задачи, типа назначения имен и положений check boxes. Вот две ключевых строки:

R[I]:= TCheckBox.Create(Self);

R[I].Parent:= ScrollBox1;

Первая строки создает CheckBox с заданным Owner (Владельцем). Вторая строки назначает Parent (Родителя) для CheckBox. Чтобы понять различия между Родителем и Владельцем, посмотрите соответствующие свойства в online-help.

Программа содержит ListBox, который показывает текущий порядок полей в DataSet. Для изменения порядка полей в DataSet (а, следовательно, в DBGrid) используются две кнопки. При нажатии на одну из кнопок, выбранное в ListBox’е поле перемещается на одну позицию вверх или вниз. Синхронно с этим меняется и порядок полей в DBGrid. Код, показанный ниже, изменяет Index поля для Table1, изменяя, таким образом, позицию поля в DBGrid. Эти изменения касаются только визуального представления DataSet. Физически данные на диске не изменяются.

procedure TForm1.downButtonClick(Sender: TObject);

var

i: Integer;

begin

with ListBox1 do

if (ItemIndex<Items.Count-1)and(ItemIndex<>-1) then begin

i:= ItemIndex;

{move ListBox item}

Items.Move(i, i+1);

ItemIndex:= i+1;

{move Field}

Table1.Fields[i].Index:=i+1;

end;

end;

Последняя строка в примере как раз та, которая фактически изменяет индекс колонки, которую пользователь хочет переместить. Две строки кода непосредственно перед ней перемещают текущую строку в ListBox на новую позицию.

Внешний вид программы DBGR_RT показан на рис.4

Рис.4: Программа DBGR_RT




Поделиться с друзьями:


Дата добавления: 2015-05-09; Просмотров: 475; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.093 сек.