Dlaczego FieldAddress zwraca nil ???

0

Witam

Najpierw proste pytanie, wczoraj robiłem to samo i działało (ale nie zapisałem) a dzisiaj !!??!!

Dwie formy (Form1 i Form2):

// Unit1.pas

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
If Form2.FieldAddress('A') <> nil then
	ShowMessage('uhm');
end;

end.

// i druga Unit2.pas

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TForm2 = class(TForm)
  private
    { Private declarations }
    fA : Integer;
  public
    { Public declarations }
  published
  	property A : Integer read fA write fA;
  end;

var
  Form2: TForm2;

implementation

{$R *.DFM}

end.

No i jak klikne buttona to nic ! Co jest grane ?

A tak ogólnie chciałbym się was poradzić w pewnej materii. Mam pewną aplikację i chciałbym pójść na łatwiznę z zapisywaniem ustawień na kilku formach. Każda z tych form będzie miała tablicę np o nazie Tablica : array of TMojTyp, dodatkowo każda formatka będzie miała właściwość typu integer, zwracającą ilość elementów w tablicy (chociaż wolałbym użyć Length(Tablica) ale o tym zaraz), i teraz dla każdej z tych form chcę dać w OnClose: Opcje.Zapisz(Self). Procedura Zapisz do której przekażę wskaźnik zamykanej formy, sprawdzi metodą FieldAddress czy formatka ma tablicę 'Tablica', jeśli ma to muszę się do niej dobrać i zapisać jej zawartość do ini. Wszystko jest jasne tylko z tym dobraniem mi nie idzie : (

W przykładzie powyżej było by to pewnie coś takiego:

var P : ^Integer;
begin
P := FieldAddress('A');
If P <> nil then
ShowMessage(IntToStr(P^));
end;

No i podejrzewam że dla tablicy będzie jakoś podobnie, lecz na razie nie mogę w ogóle się uporać z tym fieldaddress : ( so help me !!!

Chce to zrobić w taki sposób żeby to było uniwersalne. Najchętniej to bym chciał żeby Tablica była tablicą dynamiczną, ale z tym też jest problem bo property nie może być pointerem - i klapa. Macie jakieś pomysły ? Może by to zrealizować w jakiś inny sposób, zależy mi na skalowalności, więc nie chce dla każdej formy pisać osobnej procedury zapisu do ini. Można by przekazywać nie wskaźnik do formy lecz od razu do tablicy, ale chciałem też aby w ini nazwy sekcji odpowiadały nazwie formy (można by przekazać i wskaźnik do tablicy i nazwę formy - hmm). However dlaczego FieldAddress nie działa ?

// dopisane

Jak zmienię publikowaną właściwość na jakąś klasę to działa, ale ja bym nie chciał klasy. W helpie pisze:

Published properties are restricted to certain data types. Ordinal, string, class, interface, and method-pointer types can be published. So can set types, provided the upper and lower bounds of the base type have ordinal values between 0 and 31. (In other words, the set must fit in a byte, word, or double word.) Any real type except Real48 can be published. Array properties cannot be published.

No to jak Ordinal to czemu nie może być Integer ? Tablice nie mogą być, uhm no ale musi się jakoś dać to obejść żeby np opublikować pointer do tej tablicy. There must be some way out ... Może ja to źle tłumacze na nasze ... no nie wiem.

0

a moze form2 = nil??
robisz gdzies create tej formy ?

0
guzial napisał(a)

a moze form2 = nil??
robisz gdzies create tej formy ?

Form2 jest tworzony automatycznie, zresztą próbowałem go też usuwać z autocreate forms, i tworzyć ręcznie From2 := TForm2.Create(Self), ale na nic to.

Jak przerobie to na klasy to działa, chodź dziwi mnie czemu nie działa przy zwykłych zmiennych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1