Delphi - Objekte variabel ansprechen

Diskutiere Delphi - Objekte variabel ansprechen im Developer Network Forum im Bereich Hardware & Software Forum; Hallo, wenn man z.b. 10 edit-felder auf einem formular hat und möchte z.b. den feldern 1-5 die farbe rot geben, dann kann man in vb sagen...
  • Delphi - Objekte variabel ansprechen Beitrag #1
O

ollik

Bekanntes Mitglied
Dabei seit
19.10.2001
Beiträge
72
Reaktionspunkte
0
Hallo,

wenn man z.b. 10 edit-felder auf einem formular hat und möchte z.b. den feldern 1-5 die farbe rot geben, dann kann man in vb sagen

edit(X).irgendwas

und hat dann automatisch mit der variabel X ein feld angesprochen.

gibt es so eine funktion auch in delphi? oder kann man sowas einfach auf einem anderen wege simulieren?

danke.

Olli.K
 
  • Delphi - Objekte variabel ansprechen Beitrag #2
O

O Love

Bekanntes Mitglied
Dabei seit
08.04.1999
Beiträge
2.286
Reaktionspunkte
0
Du kannst die ganzen Edits in ein Array einordnen, welches Du dann in einer Schleife durchgehst.

Oder Du benennst die Edits in einer bestimmten, gleichen Weise und suchst sie via
Code:
FindComponent ('edit' + IntToStr (I))
im Formular.

O Love
 
  • Delphi - Objekte variabel ansprechen Beitrag #3
H

HbJ

Bekanntes Mitglied
Dabei seit
03.04.1999
Beiträge
141
Reaktionspunkte
0
Ort
Borg-Cubus, Sektor 001
Das müsste so funktionieren:

TForm organisiert im Array Components alle Komponenten des Forms.
Möchtest Du jetzt Deine Editfelder (oder sonstiges) sprechend benennen (z.B. EName, EPostleitzahl etc.), so bleibt Dir folgender Ausweg:
Du turnst alle Elemente des Arrays ab, suchtst nach Edit-Feldern und setzt die ersten fünf, letzten zwei usw. entsprechend Deinen Vorstellungen.
Die Einträge in der Tabelle sind nach dem Motto organisiert: Wer zuerst kommt, malt zuerst und steht vorne.


procedure TForm1.FormCreate(Sender: TObject);
var
i, EditCount : LongInt;
EFeld : TEdit;

begin

EditCount := 0;

for i := 0 to Form1.ComponentCount-1 do begin;
if (EditCount < 5) and (Components IS TEdit) then begin;
EFeld := TEdit(Components);
EFeld.Text := 'Hallo';
INC(EditCount);
end; { if Components IS TEdit }
end; { for i := 0 to Form1.ComponentCount-1 }

end; { proc FormCreate }
 
  • Delphi - Objekte variabel ansprechen Beitrag #4
O

ollik

Bekanntes Mitglied
Dabei seit
19.10.2001
Beiträge
72
Reaktionspunkte
0
ok, danke. hat mir alles super geholfen.

nur noch ein kleinen anderes problem. wenn man z.b. auf edit5 clickt, gibts dann die möglichkeit irgendwie X=5 zu haben .. und das gleiche mit edit6,edit7 ... usw .. ohne jedesmal den ganzen source in jedes ereigniss zu pöllen ?

thx.

Olli.K
 
  • Delphi - Objekte variabel ansprechen Beitrag #5
H

HbJ

Bekanntes Mitglied
Dabei seit
03.04.1999
Beiträge
141
Reaktionspunkte
0
Ort
Borg-Cubus, Sektor 001
Das geht über die sogenannten Tags.

Die Property Tag enthält eine 32-bit-Zahl, in der Du weitere Informationen codieren kannst. Beispielsweise könntest Du definieren:
100 - 199 für Edit
200 - 299 für Checkboxen
etc.

und dann den Index folgendermaßen ermitteln:

if (TComponent(Sender.Tag) DIV 100) = 1 then Index := TComponent(Sender.Tag) MOD 100;
// falls Du einfach nur die Component übergeben bekommst und den Typ nicht weisst...

Natürlich musst Du die Tags eigenständig vergeben, wobei Du einfach in Form.Create über Components läufst:

const
KIEditBeginn = 100;
KIChkBoxBeginn = 200;

procedure TForm1.FormCreate(Sender: TObject);
var
i, EditIndex, CheckboxIndex : LongInt;
Comp : TComponent;

begin

EditIndex := KIEditBeginn;
CheckboxIndex := KIChkBoxBeginn;

for i := 0 to Form1.ComponentCount-1 do begin;

Comp := TComponent(Components);

if (Components IS TEdit) then begin;
Comp.Tag := EditIndex;
INC(EditIndex);
end else { if Components IS TEdit }

if (Components IS TCheckbox) then begin;
Comp.Tag := CheckboxIndex;
INC(CheckboxIndex);
end; { if Components IS TEdit }

ShowMessage('Control '+Comp.Name+' hat Nummer '+IntToStr(Comp.Tag));

end; { for i := 0 to Form1.ComponentCount-1 }

end; { proc FormCreate }


Anschließend baust Du Dir einen Eventhandler für jede Komponente, wobei ich statt "OnClick" eher "OnEnter" wählen würde.
Du markierst im Form eine Komponente (z.B. ein Editfeld), gehst in den Objektinspektor und klickst doppelt auf das Ereignis "OnEnter".
Daraufhin erstellt Delphi einen leeren Eventhandler, den Du z.B. in "AllEditEnter" umbenennst und folgendermaßen mit Leben füllst:

procedure TForm1.AllEditEnter(Sender: TObject);
var
Index : LongInt;

begin

if (TComponent(Sender).Tag DIV KIEditBeginn) = 1 then begin;
// Abfrage nur aus Sicherheitsgründen, um sicherzustellen, dass Tag richtig
// gesetzt wurde.
Index := TComponent(Sender).Tag MOD KIEditBeginn;
ShowMessage('Komponente ist ein TEdit mit dem Namen '+TComponent(Sender).Name+
' und dem Index '+IntToStr(Index));
end; { if (TComponent(Sender).Tag DIV KIEditBeginn) = 1 }

end; { proc AllEditEnter }


Diese Prozedur definierst Du als Eventhandler für alle Editfelder des Forms, wofür Du einfach jedes Editfeld markierst, in den Objektinspektor wechselst und aus der Dropdownliste "AllEditEnter" auswählst.

Für die anderen Controls gilt das Gleiche.
 
  • Delphi - Objekte variabel ansprechen Beitrag #6
O

ollik

Bekanntes Mitglied
Dabei seit
19.10.2001
Beiträge
72
Reaktionspunkte
0
ok, danke erstmal für deine super ausführliche antwort!

aber das heisst ja immer noch, dass ich bei z.b. 200 objekten 200 mal die procedure bei "onEnter" eintragen muss ?!


thx.

Olli.K
 
  • Delphi - Objekte variabel ansprechen Beitrag #7
H

HbJ

Bekanntes Mitglied
Dabei seit
03.04.1999
Beiträge
141
Reaktionspunkte
0
Ort
Borg-Cubus, Sektor 001
Nicht wirklich... in Gruppen markieren macht die Sache erträglicher.

Hätte aber nicht gedacht, dass Du wirklich so viele Objekte bearbeiten willst ;)

Darüber hinaus gibt es einen Trick:

Du erstellt _ein_ Control mit den gewünschten Eigenschaften (Eventhandler etc.), kopierst es und fügst es wieder auf das Form ein.
So ersparst Du Dir die Einstellerei.
 
  • Delphi - Objekte variabel ansprechen Beitrag #8
O

ollik

Bekanntes Mitglied
Dabei seit
19.10.2001
Beiträge
72
Reaktionspunkte
0
stimmt, das is ne gute idee ;)

thx.

Olli.K
 
  • Delphi - Objekte variabel ansprechen Beitrag #9
N

Nastarowje

Bekanntes Mitglied
Dabei seit
19.04.1999
Beiträge
378
Reaktionspunkte
0
Ort
Erfurt / Thüringen
Hi

Jedes Editfeld hat Ereignisse, die du auslösen möchtes. (Z.B. OnKeyPressed etc.)

Du nimmst dir das erste Edit Feld vor und klickst doppelt auf das Ereignis. Wenn du dir nun die Prozedure anschaust, die erstellt wurde stellst du fest, das im Prozedurkopf die Variable Sender deklariert ist.

In diesen steht die Komponente, die das Ereigniss ausgelöst hat.

folglich kannst du so vorgehen
vergebe jeden Edit einen einheitlichen Namen z.B. Edit1, Edit2 wobei der Name fortlaufend nummeriert wurde. Anschließend gibst du in jedem Editfeld in der Eigenschaft "Tag " die gleiche Nummer wie du sie an den Namen gehangen hast.

procedure Edit1.OnKeyPressed(Sender : TObject);

Begin


Form1.(FindComponent("edit" + inttoStr(Zahl des gesuchten Edit))as tEdit).eigenschaft) := Wert;

// oder z.B.

for i = 1 to AnzahlEdit do

Form1.(FindComponent("edit" + inttoStr(i))as tEdit).eigenschaft) = WertDerEigenschaft;

end;


Anschließend setzt du jede Edit Eigenschaft OnKeyPressed auf diese eine Prozedur. So hast du mit der Variable Sender alle Edits auf einmal abgedeckt und mit findcomponent und der Eigenschaft "tag" die volle Kontrolle über alle Editkomponenten.
Wenn du also 200x Edit hast, sparst du dir so bis zu 199 x OnKeyPressed.



PS : Habe es leider nur aus dem Kopf machen können. Syntaxfehler sind also möglich


Hoffe aber, das hilft erst mal weiter
 
Thema:

Delphi - Objekte variabel ansprechen

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.181
Beiträge
1.579.175
Mitglieder
55.880
Neuestes Mitglied
Hahn
Oben