Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Zugriff auf generische Objekte


masteroffinalfantasy - Mi 02.07.08 11:31
Titel: Zugriff auf generische Objekte
Servus,

ich habe derzeit ein paar Probleme mit zur Laufzeit erzeugten Objekten.

Ich erzeuge in meinem Programm ein Array mit TImages:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
                                   
bilder[length(bilder)-1]:=TImage.Create(Form1);
with bilder[length(bilder)-1] do
begin
  parent:=Form1;
  Visible:=true;
  Width:=11;
  Height:=11;
  Transparent:=true;
  Left:=0;
  Top:=0;
  OnMouseDown:=form1.bilderMouseDown;
  OnMouseUp:=form1.bilderMouseUp;
  Name:='bild'+inttostr(length(bilder)-1);
end;


Keine Probleme soweit. Jetzt würde ich gerne in den Prozeduren bilderMouseDown und bilderMouseUp die Namen wieder bekommen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure tform1.bilderMouseDown(Sender: Tobject; Button: TMouseButton; Shift: TShiftState; X,
      Y: Integer);
var a, b : integer;c:string;
begin
  c:=TComponent(Sender).Name;
  a := strtoint(Copy(c,5,length(c)));
[..]
end;


Da erwarte ich eigentlich, dass in a die Nummer des Bildes steht.. leider war das anscheinden bisschen naiv.

Wenn jemand einen Ausweg aus der Misere weiß, wäre ich dankbar, wenn er hier postet ;)


Narses - Mi 02.07.08 12:00
Titel: Re: Zugriff auf generische Objekte
Moin!


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
bilder[length(bilder)-1]:=TImage.Create(Form1);
with bilder[length(bilder)-1] do
begin
  //...
  Name:='bild'+inttostr(length(bilder)-1);
  Tag := Length(bilder)-1; // High(bilder) = Length(bilder)-1 :idea: ;)
end;

procedure tform1.bilderMouseDown(Sender: Tobject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ShowMessage(IntToStr(TComponent(Sender).Tag));
end;
cu
Narses


Hidden - Mi 02.07.08 12:28
Titel: Re: Zugriff auf generische Objekte
Hi,

user profile iconmasteroffinalfantasy hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  parent:=Form1;
  Visible:=true;
  Width:=11;
  Height:=11;
  Transparent:=true;
  Left:=0;
  Top:=0;
  OnMouseDown:=form1.bilderMouseDown;
  OnMouseUp:=form1.bilderMouseUp;
  Name:='bild'+inttostr(length(bilder)-1);


Je nachdem, wo du deinen Code platzierst, kann es dir auch passieren, dass die einzelnen Eigenschaften auf das falsche Objekt bezogen werden:

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.DoSomething;
begin
  //hier könnte der Code z.B. stehen
end;

TForm1 hat nämlich auch eine Eigenschaft namens 'Left'. Durch das with-Statement ist nun nichtmehr klar, auf welches Objekt sich alles bezieht. Bei Klassenmethoden wird nämlich praktisch der gesammte Prozedurtext in ein with-Statement gesetzt(du kannst ja auch z.B. außerhalb deines with-Statements 'Left' setzen :arrow: alles steht in einem 'with self do').

Somit hast du hier praktisch zwei with-Statements ineinander.

Das with-Statement kann zwar viel Tipparbeit ersparen, gilt jedoch aus gutem Grund als unsauber: Es kann zu nur sehr schwer auffindbaren Fehlern und damit nächtelangen Debugging-Sitzungen führen.

mfG,


masteroffinalfantasy - Mi 02.07.08 12:35

@Narzes Dickes Dankeschön an dich für die schnelle Antwort! Es klappt :)
@Hidden Danke für den Hinweis, ich werde das umschreiben :)