2014-02-11 3 views
2

У меня есть несколько коробок TEdit на моей форме. Данные привязаны к оборудованию, которое имеет одинаковые минимальные и максимальные значения для каждого диапазона, но несколько диапазонов. Если пользователь обновляет максимальное значение для любого диапазона, введя в поле TEdit, я хочу обновить соответствующий поле min, а также поле TEdit, которое содержит произведение максимального времени другого значения и т. Д. Так как все поля TEdit имеют аналогичные имена, я хотел бы знать, могу ли я передать только отличительную строку в общую процедуру и построить имя конкретных полей TEdit для ее изменения. Во время выполнения я получаю «Нарушение доступа по адресу 0074CB11 в модуле« MyProject.exe ». Читайте адрес 8BD88B77». Любой совет будет принят во внимание.Использовать TEdit как переменную?

procedure TForm1.R1IMaxEditChange(Sender: TObject); 
//User types a new Range 1 Maximum I value 
begin 
    UpdateIMin_Power('R1') 
end; 


procedure TForm1.UpdateIMin_Power(Range: string); 
var 
    R_IMax, R_IMin, R_Power, R_Volts: TEdit; 
begin 
    //Assign variable names to TEdit boxes already on form. 
    R_IMax.Name := Range + 'IMaxEdit'; //'R1IMaxEdit' when called by R1IMaxEditChange 
    R_Volts.Name := Range + 'VoltsEdit'; 
    R_IMin.Name := Range + 'IMinEdit'; 
    R_IPower.Name := Range + 'IPowerEdit'; 

    //IMax already manually entered by user in R1IMaxEdit; Volts already on form 
    R_IMin.Text := R_IMax.Text; //Let IMin = IMax 
    R_Power.Text := FloatToStr(StrToFloat(R_IMax.Text) * StrToFloat(R_Volts.Text)); //Power = Imax * Voltage 
end; 

ответ

1

У вас есть четыре переменные R_IMax, R_IMin, R_Power, R_Volts. Вы не инициализируете эти переменные, но затем пытаетесь использовать их методы и свойства. Это ошибка.

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

R_IMax := GetEditReferenceFromSomewhere(Range + 'IMaxEdit'); 

Очевидно, что вам нужна реализация GetEditReferenceFromSomewhere. Лично я хотел бы передать четыре элемента управления редактирования в качестве параметров метода:

procedure TForm1.UpdateIMin_Power(R_IMax, R_IMin, R_Power, R_Volts: TEdit); 
begin 
    //IMax already manually entered by user in R1IMaxEdit; Volts already on form 
    R_IMin.Text := R_IMax.Text; //Let IMin = IMax 
    R_Power.Text := FloatToStr(StrToFloat(R_IMax.Text) * StrToFloat(R_Volts.Text)); //Power = Imax * Voltage 
end; 

Если вы хотите, чтобы рассматривать эти элементы как группа, а затем создать тип записи, чтобы держать их:

type 
    TEditControlGroup = record 
    R_IMax: TEdit; 
    R_IMin: TEdit; 
    R_Power: TEdit; 
    R_Volts: TEdit; 
    end; 

Declare и заполнить кучу этих записей, когда создается ваша форма, и передать их в метод, который в настоящее время выглядит следующим образом:

procedure TForm1.UpdateIMin_Power(const Controls: TEditControlGroup); 
begin 
    //IMax already manually entered by user in R1IMaxEdit; Volts already on form 
    Controls.R_IMin.Text := Controls.R_IMax.Text; //Let IMin = IMax 
    Controls.R_Power.Text := FloatToStr(StrToFloat(Controls.R_IMax.Text) * StrToFloat(Controls.R_Volts.Text)); //Power = Imax * Voltage 
end; 

Если вы просто отчаянно использовать имена управления, то вы совместно uld использовать FindComponent, но я просто ненавижу рекомендовать это.

procedure TForm1.UpdateIMin_Power(const Range: string); 
var 
    R_IMax, R_IMin, R_Power, R_Volts: TEdit; 
begin 
    //Assign variable names to TEdit boxes already on form. 
    R_IMax := FindComponent(Range + 'IMaxEdit'); //'R1IMaxEdit' when called by R1IMaxEditChange 
    R_Volts := FindComponent(Range + 'VoltsEdit'); 
    R_IMin := FindComponent(Range + 'IMinEdit'); 
    R_IPower := FindComponent(Range + 'IPowerEdit'); 

    //IMax already manually entered by user in R1IMaxEdit; Volts already on form 
    R_IMin.Text := R_IMax.Text; //Let IMin = IMax 
    R_Power.Text := FloatToStr(StrToFloat(R_IMax.Text) * StrToFloat(R_Volts.Text)); //Power = Imax * Voltage 
end; 
+0

Поскольку переменные относятся к коробкам TEdit со значениями в форме, я думал, что они были инициализированы. Раньше я пытался передавать элементы управления редактирования вместо строки в аналогичную процедуру, и это работало нормально. Я просто пытался понять, есть ли другой способ сделать это. Благодарю. – user3298739

+0

Или используйте функцию «FindComponent». – hvd

+0

@hvd О, продолжай! На самом деле я знал, что есть что-то, что делало повторение, но я забыл его имя. Я никогда не использовал такие вещи. Anathema. –

Смежные вопросы