also ich denke ich versteh jetzt dein problem. ich gehe jetzt davon aus, dass du in deinem form "mitbekommen" willst, wenn ein speedbutton in frame X aktiviert wird.
dazu musst du tricksen. ich erklär dir des mal.
1.) wenn man ganz logisch an die sache rangeht, dann müsste man folgendes sagen: Mein Frame ist das einzige was mitbekommt, wann SEIN button gedrückt wird. du kannst ja dein frame zur entwicklungszeit einen ereignishandler für seinen knopf schreiben.
2.) daraus schließt du dann, dass der frame deinem form "sagen" muss: Hey, mein knopp wurde gedrückt. das heißt also dein frame muss wiederum ein ereignis auslösen.
3.) deine form weiß dann: ui, der knopp von frame X wurde gedrückt, jetzt muss ich dies und jenes machen.
dazu musst du dein frane ändern:
1) für eine
private variable hinzu: FButtonEvent: TNotifyEvent. schau in der hilfe unter TNotifyEvent nach und lies dir durch was das ist. Dann bei
Public noch folgendes:
Quelltext
1:
| Property OnSpeedButton: TNotifyEvent read FButtonEvent write FButtonEvent; |
damit stellst du die deklarierte variable anderen zum lesen und schreiben zur verfügung. somit kann die form sich nachher "anmelden" und sagen: hey framy, ich will wissen wann dein speed button gedrückt wurde.
2) im ereignishandler für den speed button dann folgendes:
Quelltext
1: 2: 3: 4: 5:
| Procedure TMyFrame.Spe... Begin If Assigned(FButtonEvent) then FButtonEvent(Self); End; |
das heißt, wenn der knopf gedrückt wird, dann löse das entsprechende ereignis aus wenn jemand (unsere form) daran interessiert daran ist. Assign ist ganz wichtig!
das wars.
3.) nun zur form. du hast da oben nen codebeispiel gepostet. das passt du wie folgt an:
Quelltext
1: 2: 3: 4: 5:
| Combo1[i].Name:='Combo'+IntToStr(i); Combo1[i].ComboBox1.Items.Add(IntToStr(x)); Combo1[i].ComboBox1.Items.Add((MaxValue[i]));
Combo1[i].OnSpeedButton := FrameSpeedButton; |
so, gibt noch nen fehler beim compiliern, also:
4.) ...deklarierst du dir eine form-interne private prozedur. wie die auszusehen hast siehst du in der hilfe wenn du unter TNotifyEvent nachschaust:
Quelltext
1: 2:
| Private Procedure FrameSpeedButton(Sender: TObject); |
im rumpf der methode dann das:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| Procedure TMyForm.FrameSpeedButton(Sender: TObject); Begin If Sender = Combo[0] then Begin ShowMessage('Frame 1'); End; If Sender = Combo[1] then Begin ShowMessage('Frame 2'); End; // ... End; |
das sollte gehn. zwar nicht getestet aber ich bin sehr zuversichtlich
das könnte man event-forwarding nennen. nicht das frame reagiert auf das ereignis, sondern die frame leitet das ereignis einfach weiter an ein anderes objekt, welches bei dir eine form ist.
ich hoffe das ist es was du willst!
ase