Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Objekt-typ übergeben (https://www.delphipraxis.net/162329-objekt-typ-uebergeben.html)

MechMac666 17. Aug 2011 18:57

Objekt-typ übergeben
 
Hallo,

momentan nutze ich folgendes Konstrukt:

var button:tbutton;
typ:string;

button:=tbutton.create(Form1);
typ:='button';
.
.


.
.
if typ='button' then
tbutton(form1.findcomponent('wasweißich')).caption ='Hallo';


Ich würde nun gern auf die Abfrage unten verzichten und direkt mit "typ" arbeiten.
Quasi so:
typ(form1.findcomponent('......

"Typ" kann im Prinzip auch gern etwas anderes als String sein. Ich habe das in einem Record definiert und wäre da also frei.
Ist das möglich?
Es gibt natürlich noch andere Elemente als Buttons, die in der Liste aufgenommen werden, daher kann ich "typ" nicht als tbutton definieren.

Letztendlich habe ich ein array, in dem als Datensatz der Name eines Objektes und sein "Typ" als string gespeichert ist.

Wenn ich damit nun arbeiten möchte muss ich momentan halt erstmal jeden Typ abfragen, bevor ich mit FindComponent loslegen kann.
Und ich hätte es gern so, das ich mit dem "Typ" direkt arbeiten kann.

Gruß, Andreas

FredlFesl 17. Aug 2011 19:00

AW: Objekt-typ übergeben
 
Schau dir mal die Eigenschaft 'MyObject.ClassName' an...

mkinzler 17. Aug 2011 19:33

AW: Objekt-typ übergeben
 
oder mit is
Delphi-Quellcode:
button: TButton;
obj: TObject;
...

obj := button;
...

if obj is TButton then ...

MechMac666 17. Aug 2011 19:42

AW: Objekt-typ übergeben
 
@mkinzler

Dann hätte ich aber wieder eine Abfrage.

Das was ich vorhabe klappt ja auch nur, sofern die Objekte die Eigenschaften auch besitzen.

Angenommen ich habe in dem Array Buttons und Labels, könnte ich bei beiden auf x.left x.top etc. zugreifen.
Mit x.text würde es wohl ne exception geben, da das Label das nicht kennt.

himitsu 17. Aug 2011 19:45

AW: Objekt-typ übergeben
 
Zitat:

Zitat von FredlFesl (Beitrag 1117634)
Schau dir mal die Eigenschaft 'MyObject.ClassName' an...

Und warum nicht MyObject.ClassType oder gleich
Delphi-Quellcode:
IS
?



Und ja, man kann dennoch auf eigenschaften zugreifen.

Mit
Delphi-Quellcode:
IS
prüfen und wenn man den Typ weiß, dann direkt oder via
Delphi-Quellcode:
AS
casten.


Delphi-Quellcode:
if obj is TEdit then
  TEdit(obj).Text := ...;


if obj is TEdit then
  (obj as TEdit).Text := ...;
Man kann auch auf Vorfahren prüfen/casten

Delphi-Quellcode:
if obj is TWinControl then // reagiert auf TEdit, TMemo, TLabel uvm.
  TWinControl(obj).Left := ...;

MechMac666 17. Aug 2011 19:58

AW: Objekt-typ übergeben
 
Delphi-Quellcode:
  type elemente =record
   name:string;
   typ:twincontrol;
  end;

  var elem: array[0..10] of elemente;


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var test:tbutton;
begin

test:=tbutton.Create(form1);
test.Left:=10;
test.Top:=10;
test.caption:='huhu';
test.Width:=80;
test.Height:=22;
test.Name:='uggi';

elem[1].name:='uggi';
elem[1].typ:=test;

elem[1].typ(form1.FindComponent(elem[1].name)).left:=20;

end;

end.

So geht es natürlich nicht. Ich möchte mit der folgenden Zeile verschiedene Objekte ansprechen.
elem[1].typ(form1.FindComponent(elem[1].name)).left:=20;

Labels, buttons, etc.
Es ist sichergestellt das nur Eigenschaften abgefragt werden, die die alle haben.

elem[1].typ soll quasi für die Standard-Controlls stehen, bzw. kann ich bei der OnCreate Procedure ja auch etwas zuweisen à la elem[1].typ:=test;
Nur ich weiß nicht was das für ein Datentyp sein muss.

himitsu 17. Aug 2011 20:05

AW: Objekt-typ übergeben
 
Delphi-Quellcode:
var elem: array[0..10] of TWinControl;

elem[...] := TEdit.Create(...);

elem[...].Width := 123;
Wenn alle Typen eh die gleichen gbenötigten Eigenschaften besitzen, dann nimm statt TWinControl einen Typen, welchen alle als gemeinsamen Vorfahren haben und fertig.

MechMac666 17. Aug 2011 20:14

AW: Objekt-typ übergeben
 
Habs gerade hinbekommen.

Delphi-Quellcode:
    var elem: array[0..10] of string;


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var test:tbutton;
    test2:tedit;
begin

test:=tbutton.Create(form1);
test.Parent:=(form1);
test.Left:=20;
test.Top:=20;
test.caption:='huhu';
test.Width:=80;
test.Height:=22;
test.Name:='uggi';
elem[1]:='uggi';

test2:=tedit.Create(form1);
test2.Parent:=(form1);
test2.Left:=20;
test2.Top:=40;
test2.text:='huhu';
test2.Width:=80;
test2.Height:=22;
test2.Name:='uggi2';
elem[2]:='uggi2';

end;

procedure TForm1.Button2Click(Sender: TObject);
var
  I: Integer;
begin
for I := 1 to high(elem) do
if elem[i]<>'' then
twincontrol(form1.FindComponent(elem[i])).left:=100;
end;


EDIT:
Ich sehe gerade, jetzt kann ich mir den Typ auch schenken *lol*
.
.
So, aktueller Stand.

himitsu 17. Aug 2011 21:05

AW: Objekt-typ übergeben
 
Nochmals:
Wozu erst die Elemente suchen wenn man direkt drauf zugreifen kann?

auf
Delphi-Quellcode:
elem
greist du über einen Index zu und genau den selben Index kann man auch direkt nutzen ... siehe einen Post weiter vorne.

MechMac666 17. Aug 2011 21:11

AW: Objekt-typ übergeben
 
@himitsu

Ok, jetzt hab ich`s verstanden. Thx.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:02 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz