Здравствуйте! Хочу показать работу (обработка базы данных предприятий) ,в которой не знаю как запрограммировать две кнопки: "Удалить" предприятие и "Изменить" данные о предприятии. Помогите, пожалуйста. Кнопку "Удалить" попробовал обработать, но получается какая-то ахинея.
Я бы написал универсальную функцию, которая (в зависимости от переданных параметров) выполняет либо добавление к базе, либо изменение. А чтоб код не дублировать... Ну, в общем, смотри:
// Сюда будем передавать: // 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;