Конференция "Начинающим" » Длинна массива [D7]
 
  • kashey © (18.02.19 00:11) [0]
    TMainForm = class(TForm)
     public
       Arr: array of TMyObj;

    1)ShowMessage(IntToStr(Length(MainForm.Arr)));
    2)ShowMessage(IntToStr(Length(Arr)));

    Объясните пожалуйста почему при обращении к полю через родительскую форму, как в случае 1) , длинна массива всегда = "0".
  • RWolf © (18.02.19 01:34) [1]
    Должно быть, Self и MainForm — это две разные формы.
  • kashey © (18.02.19 01:39) [2]

    > Должно быть, Self

    А если я хочу узнать длину Arr из другого модуля?

    > это две разные формы.

    Вот этого не понимаю, как-то не логично
  • Германн © (18.02.19 02:16) [3]

    > Объясните пожалуйста почему при обращении к полю через родительскую
    > форму, как в случае 1) , длинна массива всегда = "0".

    Поясните пожалуйста что значит всегда  = "0"?
  • потому (18.02.19 08:37) [4]
    > Объясните пожалуйста почему

    потому же почему у тани всегда третий, а у лены - всегда второй.
  • потому (18.02.19 08:39) [5]
    Вот этого не понимаю, как-то не логично

    человек - класс (один)
    а людей 6 миллиардов.

    логично точно так же как и с классом TForm1
    класс один, экземпляров - сколько хочешь
  • kashey © (18.02.19 09:08) [6]

    > Поясните пожалуйста что значит всегда  = "0"?

    Ну немного не правильно поставил вопрос.
    Давайте так: почему некорректно значение длинны массива при обращении к нему функцией Length через экземпляр класса формы? Как в случае ниже:

    TMainForm = class(TForm)
    public
      Arr: array of TMyObj;
     
      ................................................
      ShowMessage(IntToStr(Length(MainForm.Arr)));

  • потому (18.02.19 09:23) [7]
    почему некорректно значение длинны массива

    Оно всегда корректно.

    Процессор умеет считать целые числа не хуже чем это делаешь ты.
    Даже лучше.
  • sniknik © (18.02.19 10:28) [8]
    > Ну немного не правильно поставил вопрос.
    вообще не поставил, он у тебя в ауте валяется.

    > Давайте так: почему некорректно значение длинны массива при обращении к нему функцией Length через экземпляр класса формы? Как в случае ниже:
    это такая уличная магия
    https://www.youtube.com/watch?v=eU37agSGRko

    зависит от места и времени вызова.

    > Как в случае ниже:
    в случае ниже ничего нет, ни места ни времени.
  • sniknik © (18.02.19 10:33) [9]
    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' {Form1};

    {$R *.res}

    begin
     Application.Initialize;
     Application.CreateForm(TForm1, Form1);
     ShowMessage(IntToStr(Length(Form1.Arr))); //!!! после события FormCreate! и = 10, не 0.
     Application.Run;
    end.

  • kashey © (18.02.19 21:38) [10]
    Как же тогда корректно? Пока в легком замешательстве, подскажите где подчерпнуть информацию по этому делу?
  • kashey © (18.02.19 22:34) [11]
    Видать где-то начудил

    в OnActivare возвращаю ссылку MainForm := Self и все нормально работает.
    Но как она потерялась так и не понял.
  • ухты © (19.02.19 01:07) [12]
    Зачем вам вообще MainForm?
    Вас уговаривали показать код - где и когда вы читаете длинну массива.
    А вы про замешательство ...
  • Германн © (19.02.19 02:24) [13]

    > kashey ©   (18.02.19 22:34) [11]
    >
    > Видать где-то начудил
    >
    > в OnActivare возвращаю ссылку MainForm := Self и все нормально
    > работает.

    Модуль проекта *.dpr покажи. Наверняка там и "начудил".
    Переменной MainForm присваивается значение (ссылка на экземпляр формы) при первом вызове в файле проекта процедуры CreateForm. И именно ссылка на ту форму, которая при этом вызове создаётся.
  • kashey © (19.02.19 02:59) [14]

    > Модуль проекта *.dpr покажи. Наверняка там и "начудил".

    Да два раза
     Application.CreateForm(TMainForm, MainForm);

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

    спасибо за подсказку
  • Германн © (19.02.19 03:14) [15]

    > kashey ©   (19.02.19 02:59) [14]

    Да не за что. Помните только то, что файл проекта никогда не рассматривался как "редактируемый ручками". И любые изменения в нём должны быть сделаны либо IDE, либо квалифицированным специалистом.
  • Внук © (23.02.19 17:48) [16]
    Длинна массива - это вам не ширинна, и тем более не высотта.
 
Конференция "Начинающим" » Длинна массива [D7]
Есть новые Нет новых   [118665   +33][b:0][p:0.001]