Wskaźnik do komponentu?

0

W pewnej klasie chcę używać właściwości/metod pewnego komponentu.
Komponent chcę przekazywać jako parametr konstruktora.
Jak powinienem to rozwiązać?
Czy przez FindComponent w klasie? Trochę wydaje mi się to nieporęczne, za każdym razem szukać komponentu, gdy chcę go użyć!
Czy mogę w jakiś sposób stworzyć wskaźnik do konkretnego komponentu?
Może jakiś inny sposób.

Pozdrawiam
Doc

0

może jaśniej bo ja nic z tego nie rozumiem :(

0

Przy zapisie:

var Panel1:TPanel;
begin
Panel1:=TPanel.Create(self);
end;

Panel1 jest właśnie wskażnikiem na komponent. Jak chcesz użyć FindComponent to też możesz, ale na ogół wystarczy 1 raz. Jak na formie postawisz Button1, to obiekt Button1 jest właściwie wskaźnikiem na obszar danych obiektu Button1.

0

O coś takiego ci chodzi?

type
  TKomponent = class(TCos_tam);
    X : Integer;
    procedure Procka;
    // ...
  end;
  
  TKlasa = class(...);
    P : Pointer; // wskaźnik na komponent
    procedure Proc;
    constructor Create(Komponent : TObiect);
  end;

  // ...

constructor TKlasa.Create(Komponent : TObiect);
begin
  P := Komponent; 
end;

procedure TKlasa.Proc;
begin
  TCos_tam(P).X := 13;
  TCos_tam(P).Procka;
  // ...  
end;

  // ...

var
  Klasa : TKlasa;
  K : TKomponent; 

procedure JakiasProcedura;
begin
  K := TKomponent.Create;
  Klasa := Klasa.Create(K);
end;

  // ...

procedure NaZakonczenieProgramu;
begin
  K.Free;
  Klasa.Free;
end;
0

O coś takiego tylko...

constructor TKlasa.Create(Komponent : TObiect);
begin
  P := Komponent;
end;

W konstruktorze podczas przypisania mam komunikat błędu "Access violation..."

Ponadto jak (zakładając, że mam ten wskaźnik) mogę się odwoływać do właściwości/metod komponentu na który on wskazuje?
Czym jest TCos_tam?

procedure TKlasa.Proc;
begin
  TCos_tam(P).X := 13;
  TCos_tam(P).Procka;
  // ... 
end;
0

"P" jak i "TCos_tam" jest tego typu co przekazany komponent.

0
Deti napisał(a)

"P" jak i "TCos_tam" jest tego typu co przekazany komponent.

Chyba nie tego samego typu, bo P jest tylko wskaźnikiem ...

TKlasa = class(...);
    P : Pointer; // wskaźnik na komponent
    procedure Proc;
    constructor Create(Komponent : TObiect);
  end;

... ale rozumiem ideę.

Wobec tego problem pozostał mi tylko z 'Access violation ...'
Czyli w miejscu:

constructor TKlasa.Create(Komponent : TObiect);
begin
  P := Komponent; // tu jest błąd
end;
0

a tak swoją drogą to co to jest TObiect? Słyszałem tylko o TObject.

0

doctorek: Mógłbyś powiedzieć z czego dziedziczysz i jak dokładnie wywołujesz konstruktor?
Tak na marginesie to bym bardziej polecał coś w tym stylu:

interface
type TInnaKlasa = class
     public
     procedure Proc;
     end;

type TKlasa = class(TCustomControl)
     private
     P: TInnaKlasa;
     public
     constructor Create(AOwner:TComponent; Komponent:TInnaKlasa); reintroduce;
     procedure Wywolaj;
     end;

implementation

constructor TKlasa.Create(AOwner:TComponent; Komponent:TInnaKlasa);
begin
inherited Create(AOwner);
P:=Komponent;
end;

procedure TKlasa.Wywolaj;
begin
P.Proc;
end;

// TInnaKlasa

procedure TInnaKlasa.Proc;
begin
showmessage('BLE!');
end;

// Przyklad użycia
procedure TForm1.Button1Click(Sender: TObject);
var k:TKlasa;
    ik:TInnaKlasa;
begin
ik:=TInnaKlasa.Create;
k:=TKlasa.Create(self, ik);
k.Wywolaj;
k.Free; // Zwalniam najpierw obiekt k, aby mieć pewność, że nie będzie się on odwoływał do nieistniejącego ik (choć przy tym kodzie nie powinno się nigdy zdarzyć). Ewentualnie wrzuć to w destruktor i nie zwalniaj tutaj (wprowadza zamieszanie).
ik.Free;
end;

Ten kod pozwala na rozróżnienie Owner'a klasy od Twojego komponentu przekazywanego przez parametr (Oczywiście parametry zależą od tego z czego dziedziczysz).

ŁF napisał(a)

a tak swoją drogą to co to jest TObiect? Słyszałem tylko o TObject.

Tak właśnie mi coś nie pasowało, tylko nie widziałem co :)

0

Do Doktorek: Ten Access violation spowodowany jest, na pewno złym wykorzystaniem mojego przykladu, u mnie wszystko działa.

Do ŁF: No pewnie że TObject. Literówka po prostu... sorry

Do Bula: Zgodze sie że twój sposób też jest dobry (i nawet wygodniejszy), ale nie zawsze można go wykorzystać, a poza tym chciałem pokazać przykład z Pointer.

0
volgar napisał(a)

Do Doktorek: Ten Access violation spowodowany jest, na pewno złym wykorzystaniem mojego przykladu, u mnie wszystko działa.

Pewnie coś namieszałem. Oto mój przykład:

unit Unit2;

interface

uses
  StdCtrls, Forms, Controls, Classes, t1;

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

var
  Form2: TForm2;
  test: TKlasa;
implementation

{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
  test.Create(Edit1);
end;

end.
unit t1;

interface

type
  TKlasa = class
    P: Pointer;

    constructor Create( parKomponent: TObject);
  end;

implementation

    constructor TKlasa.Create;
    begin
      P := parKomponent;
    end;

end.
0

test jest wskaźnikiem, a nie klasą. Musisz najpierw go zainicjować wywołując konstruktor klasy.

var test:TKlasa;

procedure TForm1.Button1Click({cos tam});
begin
test:=TKlasa.Create({Co tam chcesz});
end;
0

Więc tu robiłem błąd. Myślałem, żetest.Create;
też jest wywołaniem klasy.

Dziękuję wszystkim za pomoc

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