Wczytywanie nazwy komponentu do zmiennej

0

Witam!

Tworzę prosty program graficzny, mam mały problem z pobieraniem nazwy komponentu do zmiennej, przyznam jestem początkującym "programistą", jeżeli mogę siebie tak nazwać. Pojawia mi się komunikat przy próbie kompilacji i wywala błąd w miejscu "a" przy zdarzeniu OnMouseMove:

pas(931): Incompatible types: 'TPanel' and 'String';
var
  Form1: TForm1;
  a: TPanel;
procedure TForm1.g2MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
nazwa:=(Format('%s.%s',[self.Name,TPanel(Sender).Name]));
end;
procedure TForm1.g2Click(Sender: TObject);
begin
nazwa.color :=clblack;
end;

Proszę o pomoc, bądź wskazówki! : )

0

To może jeszcze pokaż deklarację zmiennej nazwa...

Jeśli nazwa zawiera identyfikator komponentu, to jedyne co możesz z tą zmienną zrobić, to na jej podstawie znaleźć komponent i dopiero wtedy coś zmienić:

var
  Nazwa: String;

{...}

Nazwa := 'pnlFoo';
TPanel(FindComponent(Nazwa)).Color := clBlack;

// lub

(FindComponent(Nazwa) as TPanel).Color := clBlack;

Inaczej nie dasz rady dojść do komponentu jedynie na podstawie jego nazwy; Tylko pamiętaj, że łańcuch ze zmiennej musi być prawidłowy - bez nazwy formularza; Czyli błędna nazwa to Form1.pnlFoo, zaś prawidłowa to po prostu pnlFoo;

Jeśli Twój panel znajduje się na innym formularzu - użyj metody FindComponent właściwego formularza.

0

Deklaracja nazwy to:

nazwa: TPanel;

nazwa nie zawiera identyfikator komponentu...

Kompiluje, jednak program wysypuje przy obu sposobach jakie podałeś.
"Project.exe raised exception class EAccesViolation with message 'Access violation at address 0042EAE0 in module 'Projekt1.exe'. Read of address '00...70' Process stopeed..."

0

No to logiczne, pewnie Nazwa zwraca nil. Upewnij się, że szukasz prawidłowej nazwy. A i wcześniej sprawdzaj czy to co zwrócono <> nil.

1

Coś pitolisz @DawidOnStartDock...

Aż niedowierzałem, że podane sposoby nie działają (w końcu sam je wykorzystywałem wielokrotnie) i wykonałem szybki test:

procedure TForm1.Button1Click(Sender: TObject);
var
  strPanelName: AnsiString;
begin
  strPanelName := 'pnlFoo';
  TPanel(FindComponent(strPanelName)).Caption := 'it''s working!';

  //TPanel(FindComponent('pnlFoo')).Caption := 'it''s working!';
  //(FindComponent(strPanelName)).Caption := 'it''s working!';
  //(FindComponent('pnlFoo') as TPanel).Caption := 'it''s working!';
end;

i wszystkie wymienione wywołania (te zakomentowane także) po pierwsze działają, a po drugie - jeśli walniesz się w nazwie, nie zostanie wywołany wyjątek Access Violation (przynajmniej w Delphi7);

Twój kod będzie działać prawidłowo, jeśli zawartość zmiennej Nazwa ustalisz w poniższy sposób:

procedure TForm1.g2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  nazwa := TPanel(Sender);
end;

Bo nie możesz do obiektu typu TPanel przypisać łańcucha - stąd wcześniej wspomniany przez Ciebie błąd kompilacji z niezgodnością typów, dlatego że funkcja Format zwraca łańcuch, nie instancję TPanel.

0

Dziękuję za pomoc furious programming, wszystko pięknie działa!

Pozdrawiam!

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