Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Procedure zur Laufzeit erstellen
Grafix - Do 30.04.09 17:25
Titel: Procedure zur Laufzeit erstellen
Hey,
ich weiß, dass es solche Themen schon gibt, jedoch nicht SO:
Ich erstelle X Panels zur Laufzeit. Allen weise ich einen spezifischen Namen zu:
Delphi-Quelltext
1:
| Panel.Name := 'Panel' + IntToStr(i); |
Nun möchte ich, dass bei MouseOver über jedes eigene Panel etwas jeweils verschiedenes passiert.
Also kann ich prozeduren per Laufzeit erstellen?
Danke
Moderiert von
Narses: Delphi-Tags hinzugefügtModeriert von
Narses: Topic aus Datenbanken verschoben am Do 30.04.2009 um 17:31
Narses - Do 30.04.09 17:35
Moin!
Grafix hat folgendes geschrieben : |
ich weiß, dass es solche Themen schon gibt, jedoch nicht SO:
Ich erstelle X Panels zur Laufzeit. Allen weise ich einen spezifischen Namen zu: |
Ob das nun Panels oder Buttons sind, ist relativ egal; das Konzept bzw. das Vorgehen ist das gleiche:
BUTTON DYNAMISCH ONCLICK :les: :think: ;)
cu
Narses
Mitmischer 1703 - Do 30.04.09 17:38
Hi!
Du könntest beim OnMouseOver den Sender (bzw. das i) abfragen und dann in einer Procedure aufrufen. Also
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| OnMouseOver(Sender: TObject); begin Proc(Sender); end;
Proc(Sender:Tobject); begin if Sender.Name = '..' then ..... else if ... end; |
passiv - Do 30.04.09 17:50
@Mitmischer: wofür braucht man da bitte 2 Prozeduren? Und warum dann nicht einfach so wie von Narses vorgeschlagen mit dynamischem OnClick? Da spart man sich eine Menge Schreibarbeit und auch einige Vergleiche. Vor allem bei Strings ist da einiges an Zeit zu holen.
Grafix - Do 30.04.09 20:19
Mhm ok, jetzt weiß ich, wie ich dem Panel ein Onclick eriegnis zuweise. Das Problem ist aber, dass ich ja nicht nur ein Panel dynamisch erzeuge sonder X. Das heißt, ich weiß nicht, wie viele procedures ich brauche.
Gedacht hab ich mirs so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure anzeigen; begin <erzeuge X Panels> for k := 1 to i do begin procedure Panel + i + .onclick(Sender: TObject); begin <rufe Daten aus Datenbank ab> end; end; end; |
(Hab den Code gerade aus dem Kopf geschrieben --> wahrscheinlich Syntax-Fehler)
Aber eine procedure in einer procedure geht offensichtlich nicht... Ne Idee wie ich sowas hinbekommen kann???
jaenicke - Do 30.04.09 20:29
Die Beiträge aus der oben angegebenen Suche hast du dir offensichtlich nicht angeschaut... :roll:
Es reicht ja eine OnClick-Prozedur...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TFormX.PanelXClick(Sender: TObject); begin if Sender is TPanel then ShowMessage(IntToStr(TPanel(Sender).Tag)); end;
procedure TFormX.CreateAllPanels; var MyPanel: TPanel; begin for i := 0 to 9 do begin MyPanel := TPanel.Create(Self); MyPanel.Top ... MyPanel.Parent := Self;
MyPanel.OnClick := PanelXClick; end; end; |
Grafix - Do 30.04.09 20:32
Mhm doch, ich habe sie mir angeschaut, aber offensichtlich nicht verstanden... Ich werde mal deine Lösung ausprobieren... vll sollte ich mal eine Pause machen, blick gerade gar nicht mehr durch^^ Trotzdem danke dass dus nochmal extra rausgeschrieben hast.
jaenicke - Do 30.04.09 20:39
Grafix hat folgendes geschrieben : |
Trotzdem danke dass dus nochmal extra rausgeschrieben hast. |
Das habe ich jetzt kurz aus dem Kopf getippt, ich gehe einfach einmal davon aus, dass bei den Suchergebnissen ähnlicher Code zu finden ist. ;-)
Ich glaube es gab sogar welchen in der Library.
Mitmischer 1703 - Do 30.04.09 20:41
passiv hat folgendes geschrieben : |
@Mitmischer: wofür braucht man da bitte 2 Prozeduren? Und warum dann nicht einfach so wie von Narses vorgeschlagen mit dynamischem OnClick? Da spart man sich eine Menge Schreibarbeit und auch einige Vergleiche. Vor allem bei Strings ist da einiges an Zeit zu holen. |
Du kannst auch gerne das OnClick auf die Prozedur linken :roll:
Grafix - So 03.05.09 18:36
hm, aber jetzt zeigt er mir immer nur eine 0 wenn ich auf die Panel klicke.. immerhin funktioniert schon mal die onklick prozedur bei ALLEN Panels.
Mit dem TPanel(Sender).Tag sollte man ja herausfinden, welches Element den onklick ausgelöst hat oder?
jaenicke - So 03.05.09 18:38
Aber Tag weist du zu? Wie sieht der Quelltext denn aus?
Grafix - So 03.05.09 18:42
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| Panel := TPanel.Create(self); Panel.Parent := SBInhalt; Panel.Top := top; Panel.Left := 5; Panel.Name := 'Panel' + IntToStr(i); Panel.OnClick := PanelXClick; |
---
Moderiert von
Narses: Beiträge zusammengefasst---
achso, wusste nicht dass man das zuordnen muss. Alles klar, jetzt funktioniert es.
Gibt es auch eine möglichkeit statt integers Strings zu übermitteln?
jakobwenzel - So 03.05.09 18:50
Du kannst dir zB eine TStringList anlegen, die Strings dadrinne speichern und dann Tag als Index benutzen.
Oder: Du holst dir per AllocMem Speicher in passender Größe, packst den String darein, castest den Pointer nach Integer und schreibst ihn in Tag.
Grafix - So 03.05.09 19:00
geeeenau, ich glaube ich entscheide mich für die string list^^
---
Moderiert von
Narses: Beiträge zusammengefasst---
aber wie kann ich die StringList denn Prozedurübergreifend schreiben?
jaenicke - So 03.05.09 19:47
Deklariere die unter private oben im Formular. ;-)
Grafix - So 03.05.09 19:49
klappt, ich lerne dazu =)
ffgorcky - So 03.05.09 21:02
Der Punkt "Prozeduren zur Laufzeit erstellen" interessiert mich auch.
Ich wüsste nicht, wie man das kann.
Ich weiß nur, dass man ja einem OnClick-Ereignis per Zufall eine bestehende Prozedur zuweisen kann, mit
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| randomize; i:=random(hoechsterWert); case i of 0: machDiesesProcedure(); 1: machJenesProcedure(); 2: machNochWasAnderesProcedure(); end; |
...und so weiter, bis zum höchsten Wert (also hoesterWert-1 meine ich natürlich).
jaenicke - So 03.05.09 21:26
Es gibt auch Beispiele wie tatsächlich Code manuell erzeugt und ausgeführt wird, aber das ist allgemein nicht sinnvoll nutzbar.
An der Stelle sind vielleicht Skripte interessant:
http://www.remobjects.com/ps
Die Frage ist aber immer noch die nach dem Anwendungszweck.
jaenicke - Mo 04.05.09 12:34
Ja, sicher, sowas ist schon sehr interessant, aber da im Profil eine antikere Version steht... ;-)
Kha - Mo 04.05.09 13:26
jaenicke hat folgendes geschrieben : |
Ja, sicher, sowas ist schon sehr interessant, aber da im Profil eine antikere Version steht... ;-) |
...nicht bei dem, dem ich geantwortet habe :P ;) .
PS:
ffgorcky hat folgendes geschrieben : |
Ich weiß nur, dass man ja einem OnClick-Ereignis per Zufall eine bestehende Prozedur zuweisen kann, mit [...] |
Das macht dein Code aber nicht direkt ;) . Sollte aber auch so funktionieren, wie du es gesagt hast:
Delphi-Quelltext
1: 2: 3: 4:
| case i of 0: Button.OnClick := SomeHandler; 1: Button.OnClick := YetAnotherHandler; [...] |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!