Delphi динамическое управление массивами форм и массивов данных - PullRequest
0 голосов
/ 16 марта 2012

Я должен решить следующую проблему:

Form23:

public
 { Public declarations }
 FormsArray : array of TForm24;
end;


Procedure Create_form;
begin
 SetLength(FormsArray, Length(FormsArray)+1);
 FormsArray[Length(FormsArray)-1] := TForm24.Create(Self);
end;

Form24:

public
end;

var
 UniqueValue : Array of ShortString;

Procedure Fill_Unique;
var
 tmp1 : Longint;
begin
 SetLength(UniqueValue, 256);
 for tmp1 := 0 to Length(UniqueValue)-1 do
 begin
  UniqueValue[tmp1] := IntToStr(tmp1);
 end;
end;

Procedure OnButtonClick(Sender);
begin
 Fill_Unique;
end;

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

Когда у меня есть две формы Form24 (FormsArray [0] и FormsArray [1]), и я меняю UniqueValue в одной форме, тогда я получаю эти значения в двух формах.

т.е.

Я создаю FormsArray [0] и FormsArray [1]

Когда я нажимаю кнопку на FormsArray [0]:

FormsArray [0] - UniqueValue [...] = '1,2,3,4,5,6,7,8,9 ...';

FormsArray [1] - UniqueValue [...] = '1,2,3,4,5,6,7,8,9 ...';

Когда я нажимаю кнопку на FormsArray [1]:

FormsArray [0] - UniqueValue [...] = '1,2,3,4,5,6,7,8,9 ...';

FormsArray [1] - UniqueValue [...] = '1,2,3,4,5,6,7,8,9 ...';

Когда я меняю код на:

Form24:

public
 UniqueValue : Array of ShortString;
end;

и я нажимаю кнопку на FormsArray [1], тогда у меня есть:

FormsArray [0] - UniqueValue [...] = '';

FormsArray [1] - UniqueValue [...] = '';

UniqueValue пусто.

Мне нужно иметь независимые массивы в каждой созданной мной форме Form24 (различное UniqueValue в каждой создаваемой мной форме).

Как это сделать? Что я делаю не так?

Спасибо за любую помощь.

решено!

Я получил -1 для решения, что я пишу здесь. Тогда не будет никакого решения. Ищите себя.

Ответы [ 2 ]

3 голосов
/ 16 марта 2012

Похоже, вы уже решили это. Сделайте UniqueValue членом класса формы . Поместите его в раздел public объявления класса, например.

type
  TForm24 = class(TForm)
  public
    UniqueValue: array of string;
  end;

Первый код, который вы показали, имеет массив в виде глобальной переменной , которая, конечно, является общей для всех экземпляров вашего класса формы, а также для всего остального в вашей программе. Вы, вероятно, смущены, думая, что все, что объявлено в том же файле, что и класс формы, каким-то образом «принадлежит» этому классу, но если вы так думаете, вы ошибаетесь. Чтобы сделать что-то принадлежащим классу, оно должно быть объявлено внутри этого класса, а не просто где-то в том же файле модуля.

Похоже, вы, вероятно, захотите, чтобы Fill_Unique и OnButtonClick также были членами класса формы. В показанном вами коде они являются автономными процедурами, поэтому они не имеют ссылки на какую-либо форму, над которой они должны работать. Это означает, что они не могут ссылаться на UniqueValue, потому что они не будут знать, с каким полем TForm24 экземпляра нужно работать.

2 голосов
/ 16 марта 2012

Ваш массив UniqueValue объявлен глобально, поэтому несколько экземпляров форм получат доступ к одному и тому же массиву в памяти.Перемещение массива в раздел public вашего класса Form позволяет каждому экземпляру этой формы иметь свой собственный массив, который не зависит от других экземпляров Form.Просто убедитесь, что вы удалили глобальный массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...