Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - komponente laufzeit zugreifen


ololo - Fr 21.12.07 16:07
Titel: komponente laufzeit zugreifen
hi

ich habe mich genau an diese anleitung gehalten:
http://www.delphi-library.de/topic_Komponenten+dynamisch+im+Array+verwalten_43052.html

wenn ich es, wie ich es will, auf nen shape, abänder funzt es nicht, und so wie es beschrieben is mit nem edit funzt es auch nich, ich bekomme immer die meldung:
[Fehler] Unit1.pas(73): Undefinierter Bezeichner: 'editEvent'

das kommt im diesem abschnittt vor:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
 //...
      parent := self;
      left := 10;
      top := i * 25;
      name := 'edit'+IntToStr(i);
      text := '';
      OnExit := editEvent;

(also im letzten teil der erklärung)

ich hoffe ihr könnt mir sagen was ich falsch mache...ich habe bei diesem teil:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
type
  TForm1 = class(TForm)
  public
    //...
    procedure editEvent(sender : TObject);
  private
  end;

auch schon probiert, es bei "private" und direkt in die "class", also zu den anderen proceduren, hinzutun, es funzt aber nirgends :(

das erstellen funktioniert, nur halt nich mit dem event...
das event dierekt brauch ich nich, nur halt den zugriff, da ich meinen shape mit nem timer verschieben will...

pls help...

greetz


mkinzler - Fr 21.12.07 16:09

Wird die Komponente in einer Methode for, TForm1 erzeugt?


ololo - Fr 21.12.07 16:24

hier mein qt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Shape10: TShape;
    Button1: TButton;
    Button2: TButton;
    Timer1: TTimer;
    Button3: TButton;
    Timer2: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure shapeEvent(sender : TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.shapeEvent(sender : TObject);
begin
  if sender is TShape then
    ShowMessage(TShape(sender).Name);
end;

procedure erstellen;
var i : Integer;
    geg : array[0..9of TShape;
    self : TComponent;

begin
   self := Form1;

  for i := 0 to 9 do
  begin
    geg[i] := TShape.Create(self);
    with geg[i] do
    begin
    Parent := Form1;  // <- Vielleicht braucht mans, vielleicht nicht...
    Left := 50+2*i;
    Top := 216;
    Width := 50;
    Height := 50;
    Name := 'Shape' + inttostr(i);
    Shape := stCircle;
    end;
    //geg[i].OnMouseMove := shapeEvent;    //wenn ich das hier drinnen lasse, bekomme ich den fehler:
                                           //[Fehler] Unit1.pas(61): Undefinierter Bezeichner: 'shapeEvent'
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   erstellen;
end;

procedure TForm1.Button2Click(Sender: TObject);
var geg : array[0..9of TShape;   //wenn ich das hier weglasse, bekomme ich ne fehlermeldung beim compilieren
                                   //aber wenns drinnen is und ich auf button2 klicke, bekomme ich die fehlermeldung:
                                   // "zugriffsverletzung bei adresse 0044e4ff in modul 'project1.exe'. lesen von  
                                   // adresse 00000065
begin
   geg[1].Left := geg[1].Left +10
end;

end.


hab den qt zum erstellen in ne eingene procedure getan, weils n paarmal gemacht werden muss...

greetz


Zorro - Fr 21.12.07 18:31

Zum einen ist "erstellen" keine Methode, sondern eine "freifliegende" Proc.
Zum zweiten definierst du dein Shape-Array in beiden Routinen (also der Klick-<b>Methode</b> und der ersetllen-<b>Prozedur</b> udn zum dritten hängst du in das (auskommentierte) MouseMove-Ereignis eine Proc ohne "of object" (der Senderparameter allein reicht nicht).

Greetz
Zorro


Sinspin - Fr 21.12.07 19:28

wenn du das so machst müsste es gehen

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Shape10: TShape;
    Button1: TButton;
    Button2: TButton;
    Timer1: TTimer;
    Button3: TButton;
    Timer2: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
    geg : array[0..9of TShape; // <-----------
    procedure erstellen; // <---------------
  public
    { Public-Deklarationen }
    procedure shapeEvent(sender : TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.shapeEvent(sender : TObject);
begin
  if sender is TShape then
    ShowMessage(TShape(sender).Name);
end;

procedure TForm1.erstellen; // <-------------
var i : Integer;
    self : TComponent;

begin
   self := Form1;

  for i := 0 to 9 do
  begin
    geg[i] := TShape.Create(self);
    with geg[i] do
    begin
    Parent := Form1;  // <- Vielleicht braucht mans, vielleicht nicht...
    Left := 50+2*i;
    Top := 216;
    Width := 50;
    Height := 50;
    Name := 'Shape' + inttostr(i);
    Shape := stCircle;
    end;
    geg[i].OnMouseMove := shapeEvent; // <-------------
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   erstellen;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   geg[1].Left := geg[1].Left +10;
end;

end.


ololo - Di 25.12.07 01:56

danke so funzt es :D