Autor Beitrag
Ratlos
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 07.05.03 16:52 
Hallo,

habe folgendes Problem und bitte meine Unkenntnis zu entschuldigen (bin noch Anfänger).

Ich habe mehrere Komponenten in einem Frame zusammengefasst. Allerdings habe ich eine neue Klasse vom Typ TFrame erzeugt, um hier schon ein paar Ereignissroutinen laufen zu lassen. In meiner Formular-Unit erzeuge ich nun zur Laufzeit mehrere Instanzen dieser Klasse mittels „Create“.

Der Aufruf einer Ereignisroutine einer der Komponenten des Frames, wenn die Instanz zur Entwicklungszeit erzeugt wird, sieht so aus und funktioniert:

ausblenden Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Frame21SpeedButton4Click(Sender: TObject);
begin
  Frame21.SpeedButton4Click(Sender);

end;

Nun das Problem: Wie erfolgt der Aufruf einer Ereignisroutine einer der Komponenten des Frames zur Laufzeit? Ich komme nicht dahinter.

Über konstruktive Hilfe würde ich mich sehr freuen.

_________________
Was wäre wenn...
ase
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 203

Gentoo, Windows 9X, ME, 2k, NT, XP
Delphi 7 Prof., PHP 5 (Eclipse 3 SDK)
BeitragVerfasst: Mi 07.05.03 20:39 
servus

ich bin mir nicht sicher ob ich dein problem genau verstehe. gehe ich recht in der annahme das du einen frame bestückt mit components auf dein form ziehst und dann doppelt auf deine speed buttons klickst um die ereignis prozeduren dafür zu schreiben?

wenn dem so ist, dann würde ich dir davon abraten. nimm dir dein frame vor und klicke darin doppelt auf die speedbuttons um die ereignishandler (OnClick) zu schreiben. quasi schreibst du den code im frame. des müsste dan ungefähr so aussehen:

ausblenden Quelltext
1:
2:
3:
4:
Procedure TMyFrame.SpeedButton1Click(Sender: TObject)
Begin
  // some code
End;


dann brauchst du nachher nur noch das fertige frame in deine form zu ziehen. wenn du aber (so wie ich es vermute) das so machst indem du den speedbutton im frame IM FORM doppelt anklickst, dann bekommst du das von der ide vorgesetzt:

ausblenden Quelltext
1:
2:
3:
4:
Procedure TMyForm.MyFrameSpeedButton1Click(Sender: TObject); 
begin 
  // some code
end;


ich denke das ist nicht der sinn und zweck von frames. wenn du den nämlich in ein anderes form nochmals plazierst, dann musst du da den code ebenfalls neu schreiben.


ich hoffe ich konnte helfen. wenn nicht, dann poste doch bitte mal nochmal was du genau machen willst.
Ratlos Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 08.05.03 09:24 
Hi Ase,

mein Problem ist leider etwas komplizierter, aber ich weiss auch nicht ob das für einen Anfänger wie mich überhaupt zu lösen ist.

Mein Frame enthält zwei Labels, eine ComboBox und einen Speedbutton.
In Form1, und nur dort, erzeuge ich in verschiedenen Tabsheets eines PageControls viele viele Instanzen dieses Frames. Alle Ereignisroutinen in denen sich die Instanzen gleichen sollen habe ich natürlich im Frame vorgenommen, um die Arbeit nicht 100 mal machen zu müssen.

Wenn ich nun aber bei jeder erzeugten Frameinstanz andere Ereignisroutinen aufrufen möchte, dann komme ich zu dem Code den du mir zuletzt geschrieben hast (wovon du mir ja abrätst). Aber das ist die einzige Möglichkeit, die ich sehe.

Jetzt wird es aber noch verrückter:

Nun platziere ich meine Frames aber nicht per Hand zur Entwicklungszeit, sondern durch Create und Schleifenprogrammierung: etwa so

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
var Combo1: Array [0..4] of TFrame2;

implementation

procedure TForm1.FormCreate(Sender: TObject)
var i: integer;
begin
i:=0;
x:=0;
for i:=0 to 4 do
begin
  Combo1[i]:=TFrame2.Create(TabSheet1);
  Combo1[i].Parent:=TabSheet1;
  Combo1[i].Top:=TabSheet1.Top+i*30;
  Combo1[i].Left:=TabSheet1.Left;
  Combo1[i].Name:='Combo'+IntToStr(i);
  Combo1[i].ComboBox1.Items.Add(IntToStr(x));
  Combo1[i].ComboBox1.Items.Add((MaxValue[i]));
end;
end;


Zur Entwicklungszeit existieren diese Frameinstanzen noch gar nicht.
Also kann ich auch nicht durch Doppelclick auf den Speedbutton eine Ereignisroutine schreiben lassen. Das muss ich nun selber tun, aber ich weiss nicht wie die sich von der herkömmlichen unterscheidet.

Denn so geht es nicht:
ausblenden Quelltext
1:
2:
3:
4:
procedure TForm1.Combo0SpeedButton1Click(Sender: TObject);
begin
//irgendwas
end;


Tja, entweder habe ich mich in Dimensionen vorgewagt, die ich noch nicht begreifen kann, oder es geht einfach nicht.

Ich bedanke mich für deine Bemühungen und hoffe ich konnte dir mein Problem etwas genauer schildern.

_________________
Was wäre wenn...
ase
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 203

Gentoo, Windows 9X, ME, 2k, NT, XP
Delphi 7 Prof., PHP 5 (Eclipse 3 SDK)
BeitragVerfasst: Do 08.05.03 09:49 
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:
ausblenden 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:
ausblenden 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:
ausblenden 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:

ausblenden Quelltext
1:
2:
  Private
    Procedure FrameSpeedButton(Sender: TObject);


im rumpf der methode dann das:

ausblenden 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

_________________
-EN
Ratlos Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 08.05.03 16:11 
Hi Ase,

ich habe deine Codes so übernommen und es funktioniert einwandfrei.
Habe die empfohlene Vorgehensweise auch auf andere Ereignisse der Komponenten des Frames angewendet und es läuft.

Hab vielen herzliche Dank, du hast mir damit sehr geholfen.

Ciao

_________________
Was wäre wenn...
ase
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 203

Gentoo, Windows 9X, ME, 2k, NT, XP
Delphi 7 Prof., PHP 5 (Eclipse 3 SDK)
BeitragVerfasst: Do 08.05.03 16:20 
bidde bidde, gern g'schehen


ase

_________________
-EN