Autor Beitrag
MasterHiggins
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Fr 14.02.03 09:13 
Ist es (wie bei anderen Programmiersprachen) möglich ein Object mit einem String zu kombinieren?

Soll heißen ich würde qausi gerne sagen:
ausblenden Quelltext
1:
2:
3:
FOR i:=1 TO anzahlbuttons DO BEGIN
   Button(i).Caption:=i;
END;

Geht sowas irgendwie???

Moderiert von user profile iconTino: Code-Tags hinzugefügt.
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Fr 14.02.03 09:21 
Dein Code würde nur funktionieren, wenn Button ein array of TButton ist, dann kannste so darauf zugreifen, anzahlbuttons bekommste dann mit Length(button). Der Nachteil ist, dass Du jeden einzelnen Button selber bestimmen musst, also Ausmaße, Position, Parent, Ereignisbehandlungsprozeduren usw. Anders gehts mit FindComponent
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Fr 14.02.03 09:28 
UGrohne hat folgendes geschrieben:
Dein Code würde nur funktionieren, wenn Button ein array of TButton ist

Wohl eher eine Funktion, die einen TButton zurückliefert. (Man beachte die Runden Klammern nach Button).

_________________
Ist Zeit wirklich Geld?
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 14.02.03 09:30 
Das was du vor hast geht mit FindComponent. Beispiele gibt es hier im Forum.
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Fr 14.02.03 09:33 
@AndyB: Stimmt, hab irgendwie [i] gelesen. Aber wie auch Luckie und ich schon sagten: FindComponent ist Dein Stichwort

Gruß
MasterHiggins Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Fr 14.02.03 10:23 
Aber für FondComponent müssen die Buttons doch erst existieren oder?

Ich erzeuge die Buttons erst zur Laufzeit, bzw. will sie mit dem Array/FindComponent erst erzeugen.

Bin gerade dabei mein Quelltext so umzustricken, dass es ein Array of TBitBtn ist. Bis jetzt geht das auch echt supergut, ist genau das was ich wollte.

Jetzt muß ich nur noch wissen, wie ich ebutton[i].click genauso verallgemeinere, ich probiers gerade mit ebutton[i].Action (oder so), ist das der richtige Weg??

Zum Verständnis nochmal:

Ich will darauf, dass ich vorher nicht weiß wieviele Buttons es im Endeffekt gibt, also auch nicht weiß wieviele onclick-Ereignisse es geben wird. Das OnClick-Ereigniss besteht immer nur im Aufrufen eines externen Programms (habe ich bis jetzt mit WinExec gemacht).

Bis dahin Danke:

MasterH
MasterHiggins Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Fr 14.02.03 10:45 
Jezt mal am Beispiel:

Ich will also theoretisch gerne sagen:

ausblenden Quelltext
1:
ebutton[i].OnClick:=ausfuehren(i);					


wobei ausfuehren(i) eine selbst geschriebene Funktion ist:

ausblenden Quelltext
1:
2:
3:
4:
5:
FUNCTION ausfuehren(a:INTEGER):BOOLEAN;
BEGIN
   WinExec(PChar(menudefinition[a,2]), SW_NORMAL);
   ausfuehren:=TRUE;
END;


menudefinition ist ein Array welches ich aus einer ini-Datei einlese.

Das geht so aber natürlich nicht weil bei OnClick ein TNotifiyEvent erwartet wird. Wie kann ich das machen?

Moderiert von user profile iconKlabautermann: Code-Tags hinzugefügt.
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Fr 14.02.03 10:54 
Hallo,
MasterHiggins hat folgendes geschrieben:
Aber für FondComponent müssen die Buttons doch erst existieren oder?

Ich erzeuge die Buttons erst zur Laufzeit, bzw. will sie mit dem Array/FindComponent erst erzeugen.

Wenn du deinen Dynamischen einen Name zuweist, dann kann FindComponent sie auch über diesen finden.
Wenn du sie aber sowiso Dynamisch erstellt würde ich ein ARRAY OF tButton vorschlagen, denn das macht den Zugriff einfacher (eben über das Array) und sollte auch schneller sein als FindComponent.
Das Stichwort hierfur lauter Dynamische(s) Array(s).


MasterHiggins hat folgendes geschrieben:
Jetzt muß ich nur noch wissen, wie ich ebutton[i].click genauso verallgemeinere, ich probiers gerade mit ebutton[i].Action (oder so), ist das der richtige Weg??

Der Parameter Sender der OnClick Procedure ist ein Zeiger auf das aufrufende Objekt, in deinen Fall also des BitButtons.
Du kannst also folgendermaßen damit arbeiten:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.BitBtn1Click(Sender: TObject);
  VAR
    btn : tBitBtn;
begin
  IF NOT (Sender IS tBitBtn) THEN // Sicherheitsabfrage
    Exit;
  btn := tBitBtn(Sender);
  // Hier arbeite mit dem Button
end;

Du musst nur den Button Identifizieren können. Hierfür kannst du z.B. seiner Eigenschaft Tag den Wert zuweisen, den er im Array hat.
Somit brauchst du nur noch ein OnClick ereignis für alle Buttons.

Gruß
Klabautermann
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Fr 14.02.03 10:58 
Ja genau, do brauchst ein NotifyEvent-Handler. Das ist einfach eine procedure in deinen object. zB.procedure ausfuehren(sender:TObject);// auf den korrekten parameter kommt es an!
... 'ausfuehren' kannst du dann einfach zuweisen(ohne parameter)! Du willst ja aber 'i' haben. Dazu würd ich in jedes button.tag property dein array index rein tun. Dann kannst du in dem handler folgendes tun:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
...
procedure TForm1.ausfuehren(sender:TObject);
var i:integer;
begin
   i := (sender as TBtnBla).tag;
   // oder direkt benutzen
   (sender as TBtnBla).caption := 'muku';
end;


viel spass
MasterHiggins Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Fr 14.02.03 11:22 
ähm zwei Fragen dazu:

Woher nehme ich das array index??

ebutton[i].index oder so gibts nicht!?

und was heißt in Deinem Quelltext "TBtnBla" ?

Habe ich noch nicht verstanden, bitte nochmal für mich Anfänger erklären!
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Fr 14.02.03 11:30 
MasterHiggins hat folgendes geschrieben:
Woher nehme ich das array index??
ebutton[i].index oder so gibts nicht!?

i ist dein Index:
ausblenden Quelltext
1:
ebutton[i].Tag := i;					


MasterHiggins hat folgendes geschrieben:
und was heißt in Deinem Quelltext "TBtnBla" ?

Er meinte tBitBtn.

Gruß
Klabautermann
MasterHiggins Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Fr 14.02.03 11:38 
Das mit dem Array Index habe ich dann zum Glück doch noch kapiert :oops:

Beim btnBla hatte ich es mir dann zwar so gedacht, aber durch einen Schreibfehler meinerseits hats dann nicht geklappt!

Ich probier jetzt mal damit rum und melde mich dann gleich wieder, weil mindestens eine Verständnisfrage habe ich noch dazu.


DANKE
MasterHiggins Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Fr 14.02.03 11:46 
GENIAL es funktioniert.

Ich hoffe Ihr verdient in eurem Berufsleben wenigstens einen Haufen Kohle mit euren Kentnissen :wink:


Jetzt aber allgemeiner:

Was macht denn bitteschön
(sender as TBitBtn).

In Sender steht z.B. "TBitBtn1" quasi als Klartext und (sender as TBitBtn) wandelt das dann wieder in einen "echten" Button um oder was?

heißt das ich könnte z.B. in die Caption z.B. eines Labels BitBtn1 reinschreiben und dann sagen: (label1.caption as TBitBtn) oder wie jetzt?
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Fr 14.02.03 12:08 
Hallo,
MasterHiggins hat folgendes geschrieben:

Was macht denn bitteschön
(sender as TBitBtn).

das Thema mit dem du dich hierzu auseinandersetzen solltest heißt Polimorphie (Vielgestaltigkeit).
Das hängt mit dem Objekt-Orientierten Prinzieb der Vererbung zusammen.
Das funktioniert so:
Nehmen wir an, Du erstellte ein Objekt tTemperatur Dieses kann Celsius in Fahrenheit werte umrechen.
Wenn du dies hast, wilst aber auch noch die Umrechnung in Kelvin haben, allerdings möchtest du tTemperatur nicht verändern, weil du es schon in dieser Form weiterverkauft hast und dein Kunde muss die Kelvin geschichte ja nicht bekommen ;).
Also erzeugst du einen Nachfahren von tTemperatur, welchen du tTemperatur2 nennst. Weil er ein nachfahte von tTemperatur ist, kann er automatisch auch alles, was tTemperatur kann und du kannst die gewünschte funktionalität dazuprogrammieren. Das ist Vererbung.
Die Polimorphie besagt jetzt, dass ein nachfahre eines Objektes, da er ja alles kann was der vorfahre kann, sich auch als vorfahre ausgeben darf.
Du kannst also in einer Variablen vom Typ tTemperatur auch ein Objekt vom Typ tTemperatur2 speichern, kannst dann aber nur auf die funtkionen zugreifen sie es auch schon in tTemperatur gab.

Genau das geschieht mit dem Parameter Sender. Dieser ist vom Typ TObject. Jede Delphi Klasse ist ein Nachfahre von tObjekt, deshalb kann auch alles in diesem Parameter drinstecken, du kommst aber eben nur an die Methoden und Eigenschaften ran, die auch tObjekt schon angeboten hat und das ist nicht wirklich viel.

Num gibt es aber glücklicherweise den IS operator. Dieser ermölicht dir herauszufinden was drinsteckt. Mit der bedingung
ausblenden Quelltext
1:
IF (Sender IS tBitBtn) THEN					

überprüfst du z.B. ob ein tBitBtn drin ist.
Wenn du jetzt aber auch auf die Funktionen von tBitBtn zugreifen willst musst du Delphi expliziet sagen, das es ein tBitButton ist.
Das kannst du auf diese Beiden Arten machen:
ausblenden Quelltext
1:
2:
tBitBtn(Sender).Caption := 'Hallo';
(sender as TBtnBla).caption := 'muku';


Wenn du nicht jedesmal einen solchen Typecast durchführen willst, dann dann kannst du sender auch einer Variable des entsprechendnen Typen zuweisen.
ausblenden Quelltext
1:
btn := tBitBtn(Sender);					

Auf jeden Fall solltest du aber die Sicherheitsabfrage nicht veressen.
Dann bisst du auch schon wieder bei meinem Beispiel:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.BitBtn1Click(Sender: TObject);
 VAR
  btn : tBitBtn;
begin
 IF NOT (Sender IS tBitBtn) THEN // Sicherheitsabfrage
  Exit;
 btn := tBitBtn(Sender);
 // Hier arbeite mit dem Button
 // Also mit der Variablen btn
end;


Gruß
Klabautermann
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Fr 14.02.03 12:08 
Im Sender steht drin, welches Objekt die Funktion aufgerufen hast. Damit kannst Du z.B. eine Prozedur für den klick von 5 verschiedenen Buttons machen, indem Du halt den Sender abfragst. Der Sender ist kein Klartext, sondern ist vom Typ TObject, Du vergleichst ja auch mit Sender=MyButton1 und nicht Sender='MyButton1'

TObject ist eine Urklasse, ich glaube von den Visuellen komponenten (bin grad zu faul, die Übersicht rauszukramen) und mit (Sender as TButton) findet eine Tyypumwandlung statt, damit Du auch auf die Eigenschaften eines Buttons zugreifen kannst und nicht nur von TObject (Das Stichwort heißt Vererbung).

Aber soweit ich weiß ist in Zukunft TButton(Sender) die richtigere Ausdrucksweise, oder nicht? Denn das as wird glaub ich für .NET als unsicherer Code gehandhabt. Oder lieg ich da falsch?.

Gruß