-
TMainForm = class(TForm)
public
Arr: array of TMyObj;
1)ShowMessage(IntToStr(Length(MainForm.Arr)));
2)ShowMessage(IntToStr(Length(Arr)));
Объясните пожалуйста почему при обращении к полю через родительскую форму, как в случае 1) , длинна массива всегда = "0".
-
Должно быть, Self и MainForm — это две разные формы.
-
> Должно быть, Self
А если я хочу узнать длину Arr из другого модуля?
> это две разные формы.
Вот этого не понимаю, как-то не логично
-
> Объясните пожалуйста почему при обращении к полю через родительскую
> форму, как в случае 1) , длинна массива всегда = "0".
Поясните пожалуйста что значит всегда = "0"?
-
> Объясните пожалуйста почему
потому же почему у тани всегда третий, а у лены - всегда второй.
-
Вот этого не понимаю, как-то не логично
человек - класс (один)
а людей 6 миллиардов.
логично точно так же как и с классом TForm1
класс один, экземпляров - сколько хочешь
-
> Поясните пожалуйста что значит всегда = "0"?
Ну немного не правильно поставил вопрос.
Давайте так: почему некорректно значение длинны массива при обращении к нему функцией Length через экземпляр класса формы? Как в случае ниже:
TMainForm = class(TForm)
public
Arr: array of TMyObj;
................................................
ShowMessage(IntToStr(Length(MainForm.Arr)));
-
почему некорректно значение длинны массива
Оно всегда корректно.
Процессор умеет считать целые числа не хуже чем это делаешь ты.
Даже лучше.
-
> Ну немного не правильно поставил вопрос.
вообще не поставил, он у тебя в ауте валяется.
> Давайте так: почему некорректно значение длинны массива при обращении к нему функцией Length через экземпляр класса формы? Как в случае ниже:
это такая уличная магия
https://www.youtube.com/watch?v=eU37agSGRkoзависит от места и времени вызова.
> Как в случае ниже:
в случае ниже ничего нет, ни места ни времени.
-
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
public
Arr: array of TMyObj;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
SetLength(Arr, 10);
end;
program Project1;
uses
Forms,
Dialogs,
SysUtils,
Unit1 in 'Unit1.pas' ;
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
ShowMessage(IntToStr(Length(Form1.Arr)));
Application.Run;
end.
-
Как же тогда корректно? Пока в легком замешательстве, подскажите где подчерпнуть информацию по этому делу?
-
Видать где-то начудил
в OnActivare возвращаю ссылку MainForm := Self и все нормально работает.
Но как она потерялась так и не понял.
-
Зачем вам вообще MainForm?
Вас уговаривали показать код - где и когда вы читаете длинну массива.
А вы про замешательство ...
-
> kashey © (18.02.19 22:34) [11]
>
> Видать где-то начудил
>
> в OnActivare возвращаю ссылку MainForm := Self и все нормально
> работает.
Модуль проекта *.dpr покажи. Наверняка там и "начудил".
Переменной MainForm присваивается значение (ссылка на экземпляр формы) при первом вызове в файле проекта процедуры CreateForm. И именно ссылка на ту форму, которая при этом вызове создаётся.
-
> Модуль проекта *.dpr покажи. Наверняка там и "начудил".
Да два раза
Application.CreateForm(TMainForm, MainForm);
Но только как так получилось непонятно, вспомнил только, что удалял из uses не нужный модуль. И видать среда сама вписала дубль два. У меня там форм до черта, так что сразу не заметил. И полезли разные "чудеса".
спасибо за подсказку
-
> kashey © (19.02.19 02:59) [14]
Да не за что. Помните только то, что файл проекта никогда не рассматривался как "редактируемый ручками". И любые изменения в нём должны быть сделаны либо IDE, либо квалифицированным специалистом.
-
Длинна массива - это вам не ширинна, и тем более не высотта.