IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

> Выдача ошибки при компиляции, Не пойму в чем не прав
Искатель
сообщение 10.05.2011 21:26
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 44
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Здравствуйте! Хочу показать работу (обработка базы данных предприятий) ,в которой не знаю как запрограммировать две кнопки: "Удалить" предприятие и "Изменить" данные о предприятии. Помогите, пожалуйста.
Кнопку "Удалить" попробовал обработать, но получается какая-то ахинея.

Сообщение отредактировано: Искатель - 10.05.2011 21:42


Прикрепленные файлы
Прикрепленный файл  ______.rar ( 261.72 килобайт ) Кол-во скачиваний: 166
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
IUnknown
сообщение 11.05.2011 11:13
Сообщение #2


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Цитата
как это лучше организовать?
Я бы написал универсальную функцию, которая (в зависимости от переданных параметров) выполняет либо добавление к базе, либо изменение. А чтоб код не дублировать... Ну, в общем, смотри:

// Сюда будем передавать:
// Append = true, если надо добавить новую запись иначе - False
// Index = Col, если надо добавить запись, и lb1.ItemIndex + 1 если править...
function MakeAction(Append : boolean; Index : Integer) : Integer;
var
T : TMyRec;
res, curr : Integer;
begin
// Так. Надо новую запись? Значит, поля очистить, и поставить в заголовок
// формы и кнопку соотв. текст, чтоб пользователь знал, что делается.
if Append then
begin
for curr := 1 to 7 do
(Form2.FindComponent('Edit' + IntToStr(curr)) as TEdit).Clear;
form2.sb1.Caption := 'Добавить предприятие';
Form2.Caption := 'Новое предприятие';
end
else // Значит, будем править... Сообщаем пользователю
begin
T := records[Index];
for curr := 1 to 7 do
(Form2.FindComponent('Edit' + IntToStr(curr)) as TEdit).Text := T.Arr[curr];
form2.sb1.Caption := 'Изменить данные';
Form2.Caption := 'Изменение данных';
end;

// Это делается в любом случае
form2.sb1.Enabled := true;

// А теперь - внимание: не надо привязываться к состоянию компонентов.
// Для того, чтобы узнать результат выполнения модальной формы достаточно
// посмотреть на ее ModalResult. Если форма закрыта крестиком - то там будет
// mrCancel, если кнопкой - будет то, что присвоено по нажатию кнопки...
res := form2.ShowModal; //показываем вторую форму и получаем её результат
if res = mrOk then
begin
// Если нажата кнопка подтверждения - переносим поля из формы в структуру
for curr := 1 to 7 do
T.Arr[curr] := (Form2.FindComponent('Edit' + IntToStr(curr)) as TEdit).Text;

if Append then
inc(index); //увеличили кол-во предприятий в базе на 1

records[index] := T; //добавляем эту новую запись на нужное место
savedb;//сохраняем новую базу
loaddb;//открываем файл базы заново, чтобы увидеть результат операции
end;
result := Index; // Вернем новое значение Index-а. Это важно при добавлении...
end;

// Тогда реализация нажатия кнопок "Добавить" и "Изменить" будет элементарной:
procedure TForm1.SpeedButton1Click(Sender: TObject); // Добавить
begin
Col := MakeAction(true, Col);
end;

procedure TForm1.SpeedButton2Click(Sender: TObject); // Изменить
begin
MakeAction(false, lb1.ItemIndex + 1);
end;

Чувствуешь разницу?

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

Теперь еще кое-что. Заметил, что я обращаюсь в цикле к полям записи? Для того, чтоб это стало возможно - я чуть - чуть поменял ее описание - из обычной записи сделал вариантную:
type
Str255 = string[255];
TMyRec =
record //тип-запись с 7ю полями
case boolean of
False :
(Enterprise : Str255;
Form : Str255;
Information : Str255;
Products : Str255;
Partners : Str255;
Competitors : Str255;
Industry : Str255;
);
True :
(Arr : array[1 .. 7] of Str255);
end;
Теперь и отдельные 7 полей и массив находятся физически в одном месте памяти, и обращение к Arr[1] аналогично обращению к Enterprise, и т.д. Этот фокус проходит только тогда, когда все поля имеют одинаковый тип. Не пытайся сделать такой финт, если хотя бы одно поле либо короче других, либо вообще не строковое - получишь глюки...

Ну, и, наконец, что надо изменить во второй форме:
procedure TForm2.sb1Click(Sender: TObject); // Подтверждение
begin
ModalResult := mrOk;
end;

procedure TForm2.sb2Click(Sender: TObject); // Отмена
begin
ModalResult := mrCancel;
end;
, теперь кнопки будут выдавать нужный результат.

Сообщение отредактировано: IUnknown - 11.05.2011 13:39
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Искатель   Выдача ошибки при компиляции   10.05.2011 21:26
IUnknown   Во-первых, не надо удалять ничего из StringGrid-а,...   10.05.2011 22:42
Искатель   Здравствуйте. Спасибо за подсказку. А вот здесь si...   11.05.2011 7:53
IUnknown   Как что? Размер твоего массива: Задал бы его имено...   11.05.2011 8:37
Искатель   вызывай savedb.. Т.е. мне нужно создать новую кноп...   11.05.2011 8:47
IUnknown   Зачем? Есть событие OnClose основной формы. В него...   11.05.2011 8:56
Искатель   Владимир. А я уже успел нафантазировать. Создал кн...   11.05.2011 9:01
IUnknown   Работает, говоришь? А пользователь возьмет и закро...   11.05.2011 9:34
Искатель   Да! Век живи - век учись! Спасибо! Сей...   11.05.2011 9:46
IUnknown   Я бы написал универсальную функцию, которая (в зав...   11.05.2011 11:13
Искатель   Извините, мне необходимо было на некоторое время о...   11.05.2011 12:27
Искатель   Изо всех сил пытался понять принцип работы вашего ...   11.05.2011 15:46
IUnknown   MakeAction - это обычная функция, не метод класса ...   11.05.2011 16:20
Искатель   Очень благодарен вам за очень хорошее объяснение. ...   11.05.2011 16:31
Искатель   Программа работает безупречно! Благодаря вам...   11.05.2011 19:26
Искатель   Поспешил я немного с безупречностью. Программа нем...   12.05.2011 17:50
IUnknown   Причина: Col должно изменяться ДО записи в базу, а...   12.05.2011 19:15
Искатель   Спасибочки! А можно перевести это и фокус в Ли...   12.05.2011 19:30
IUnknown   Имеется в виду, как себя ведет программа в работе....   12.05.2011 20:11
Искатель   Благодарю вас. Надеюсь, что в ближайшее время вас ...   12.05.2011 21:01


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 30.07.2025 11:19
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"