Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Eigene Procedure verwenden
Robii - So 31.05.09 15:39
Titel: Eigene Procedure verwenden
Hallöchen,
mal wieder ich ;]
Ich habe eine eigene Procedure geschrieben
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| Procedure InfoSchild(Left: Integer;Width: Integer;Top: Integer; Height: Integer;X: Integer;Y: Integer;Name: String;Tooltip: String); var WP_Sh: TShape; Na_E: TEdit; X_E: TEdit; Y_E: TEdit; T_E: TEdit; begin WP_Sh := TShape.Create(nil); WP_Sh.left := Left+Width; WP_Sh.top := Top+Height; WP_SH.visible := true; Na_E := TEdit.Create(nil); Na_E.Text := Name; X_E := TEdit.Create(nil); Y_E := TEdit.Create(nil); X_E.Text := inttostr(X); Y_E.Text := inttostr(Y); T_E := TEdit.Create(nil); T_E.Text := Tooltip; end; |
Bestimmt mit ein paar geunreimtheiten aber darum geht es eigentlich nicht. Ich möchte gerne, das wenn ich per Auslöser ein Bild erstelle, ich das OnClick-Ereigniss gleich meiner Procedure setze, das heißt, wenn man auf das Bild klickt, meine Procedure abgespult wird.
Dazu habe ich noch folgendes:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| begin MyImage := TImage.Create(Self); MyImage.Name := Na; MyImage.Parent := Self; MyImage.Left := X; MyImage.Top := Y; MyImage.Height := WP_Mar.height; MyImage.Transparent:= true; MyImage.Picture := WP_Mar.picture; MyImage.OnClick := InfoSchild(MyImage.left,MyImage.Width,MyImage.Top,MyImage.Height,MyImage.Left,MyImage.Top,Na,Na); end |
Ich glaube, das ich das OnClick nicht = einer Procedure setzen kann, weiss aber leider nicht, wie ich es sonst machen soll.
Grüße.
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
Regan - So 31.05.09 15:48
Es liegt einfach daran, dass die Parameter der
OnClick-Procedure nicht mit deinen Parametern übereinstimmen. OnClick kennt nur den Parameter
Sender. Das ist die Komponente, die das Ereignis auslöst. Nur damit kannst du arbeiten. Du müsstest jetzt anfangen, den Sender zu casten. Dieser ist nämlich erstmal nur vom Typ
TObject und kann so nicht verwendet werden.
Deine Prozedur müsste also erstmal so aussehen, damit du sie einfügen könntest:
Delphi-Quelltext
1: 2: 3: 4:
| Procedure InfoSchild(Sender: TObject); begin
end; |
In der Prozedur musst du dann erstmal prüfen, ob der Sender auch ein Image ist:
Delphi-Quelltext
1:
| if (Sender is TImage) then |
Und an die Eigenschaften dieses Senders kommst du dann durch einfaches casten ran:
Delphi-Quelltext
1:
| (Sender as TImage).Name |
Damit kannst du alle Werte abfragen, die das Image hat.
jaenicke - So 31.05.09 15:49
Du musst die Prozedur als Methode deines Formulars deklarieren.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| TFormX = class(TForm) ... private procedure InfoSchild(ALeft, AWidth, ATop, AHeight, AX, AY: Integer; AName, ATooltip: String); end;
... implementation ...
procedure TFormX.InfoSchild(ALeft, AWidth, ATop, AHeight, AX, AY: Integer; AName, ATooltip: String); begin ... end; |
Das A solltest du vor die Parameternamen setzen, da diese sonst mit den gleichnamigen (!) Eigenschaften des Formulars verwechselt würden.
Was die Verwendung in OnClick angeht, dazu hat
Regan ja schon etwas gesagt, das spare ich mir also. :mrgreen:
Regan - So 31.05.09 15:51
Robii hat folgendes geschrieben : |
Ich glaube, das ich das OnClick nicht = einer Procedure setzen kann, weiss aber leider nicht, wie ich es sonst machen soll. |
Doch, das geht.
Eine Bitte hätte ich noch: Mach mal nicht so viele Zeilenumbrüche. Wirklich, auch meine rechte Bildschrimhälfte will etwas darstellen :wink: .
Robii - So 31.05.09 16:08
So, hoffe das ich Regan's Beitrag richtig verstanden habe.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| begin MyImage := TImage.Create(Self); MyImage.Name := Na; MyImage.Parent := Self; MyImage.Left := X; MyImage.Top := Y; MyImage.Height := WP_Mar.height; MyImage.Transparent:= true; MyImage.Picture := WP_Mar.picture; MyImage.OnClick := InfoSchild(MyImage); end |
&
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| Procedure InfoSchild(Sender: TObject); var Na: String; AX: Integer; AXB: Integer; AY: Integer; AYB: Integer; IST: TShape; begin If (Sender Is TImage) Then begin Na := (Sender as TImage).Name; AY := (Sender as TImage).Top; AYB:= (Sender as Timage).Height; AX := (Sender as TImage).Left; AXB:= (Sender as TImage).Width; Ist := TShape.Create(nil); Ist.Left := Ax-AXB; Ist.Top := AY-AYB; Ist.visible := true; end end; |
Allerdings bekomme ich jetzt immernoch folgende Fehlermeldung:
| Zitat: |
[Fehler] PU1.pas(444): Inkompatible Typen: 'TNotifyEvent' und 'procedure, untyped pointer or untyped parameter'
|
Kann damit leider nicht wirklich etwas anfangen. Wär dankbar für eine Erklärung, wo hier das Problem liegt.
Grüße.
Regan - So 31.05.09 16:11
Hier wird das ganze wie eine Eigenschaft behandelt (also nicht ganz :wink: ):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| begin MyImage := TImage.Create(Self); MyImage.Name := Na; MyImage.Parent := Self; MyImage.Left := X; MyImage.Top := Y; MyImage.Height := WP_Mar.height; MyImage.Transparent:= true; MyImage.Picture := WP_Mar.picture; MyImage.OnClick := InfoSchild; end |
Aber sonst: vorbildlich :zustimm: .
jaenicke - So 31.05.09 16:12
Zudem muss das eine Methode des Formulars sein (siehe oben), sonst kann man das nicht an OnClick zuweisen.
ffgorcky - So 31.05.09 16:22
Die letzten beiden übergebenen Werte (2 Mal na) sehen mir nicht so unbedingt nach String-Variablen oder direkten Strings aus.
Wenn das direkte Strings sein sollen1, dann fehlen dort ja noch ein ' davor und ein ' dahinter, also dann müsste das ja so aussehen: 'na'.
Das gleiche gilt natürlich auch für diese Zeile: MyImage.Name := Na;
Robii - So 31.05.09 16:23
Jetzt ist es mir peinlich. Ich glaube ich bin nicht in der Lage euren Anweisungen zu folgen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| private Procedure InfoSchild(Sender: TObject); ... procedure TForm1.Timer1Timer(Sender: TObject);
Procedure TFormX.InfoSchild(Sender: TObject); var Na: String; AX: Integer; AXB: Integer; AY: Integer; AYB: Integer; IST: TShape; begin If (Sender Is TImage) Then begin Na := (Sender as TImage).Name; AY := (Sender as TImage).Top; AYB:= (Sender as Timage).Height; AX := (Sender as TImage).Left; AXB:= (Sender as TImage).Width; Ist := TShape.Create(nil); Ist.Left := Ax-AXB; Ist.Top := AY-AYB; Ist.visible := true; end end; .... begin MyImage := TImage.Create(Self); MyImage.Name := Na; MyImage.Parent := Self; MyImage.Left := X; MyImage.Top := Y; MyImage.Height := WP_Mar.height; MyImage.Transparent:= true; MyImage.Picture := WP_Mar.picture; MyImage.OnClick := InfoSchild; end ... |
Fehlermeldung:
| Zitat: |
| [Fehler] PU1.pas(332): ';' erwartet, aber '.' gefunden |
Der Fehler zeigt immer auf:
Delphi-Quelltext
1:
| Procedure TFormX.InfoSchild(Sender: TObject); |
Mensch, so doof kann ich doch nicht sein, achso und wegen dem Bildschirm, entschuldigt mich das ist eine meiner schlechten Marotten.
Grüße.
jaenicke - So 31.05.09 16:24
Das muss außerhalb anderer Routinen wie Timer1Timer stehen und das TFormX musst du durch deinen richtigen namen ersetzen, also TForm1. ;-)
ffgorcky - So 31.05.09 16:26
Das klingt mir eher danach, als ob Du irgendwo ein end; zuwenig gesetzt hast, so dass er dann noch gar nicht mit dem Programmende rechnet.
Es muss ja zu jedem begin auch irgendwo ein end stehen...
Regan - So 31.05.09 16:28
ffgorcky hat folgendes geschrieben : |
Die letzten beiden übergebenen Werte (2 Mal na) sehen mir nicht so unbedingt nach String-Variablen oder direkten Strings aus.
Wenn das direkte Strings sein sollen1, dann fehlen dort ja noch ein ' davor und ein ' dahinter, also dann müsste das ja so aussehen: 'na'. |
Natürlich sind das Strings. Er weißt doch vorher den Namen explizit zu. :motz:
Robii hat folgendes geschrieben : |
| Jetzt ist es mir peinlich. Ich glaube ich bin nicht in der Lage euren Anweisungen zu folgen. |
Naja, bisher ging es ja schon sehr gut :) .
Robii hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| private Procedure InfoSchild(Sender: TObject);
Procedure TForm1.InfoSchild(Sender: TObject);
procedure TForm1.Timer1Timer(Sender: TObject); | |
Zur Erklärung: Du fügst deinem Formular eine neue Prozedur hinzu. Das ist wie bei FormCreate, bloß, dass dort die Zuweisung automatisch passiert, wobei du hier die Zuweisung manuell machst. Du kannst im Objektinspektor deine Prozedur jeder Komponente zuweisen. Probier es einfach mal.
ffgorcky hat folgendes geschrieben : |
| Das klingt mir eher danach, als ob Du irgendwo ein end; zuwenig gesetzt hast, so dass er dann noch gar nicht mit dem Programmende rechnet. |
Nein, hat er nicht, er hat bisher alles richtig gemacht.
ffgorcky - So 31.05.09 16:30
Ich hoffe, Du hast auch meinen Beitrag eben mitbekommen und nicht durch Regans gleichzeitige Antwort übersehen...
Robii - So 31.05.09 16:35
Danke. Immerhin bekomme ich jetzt keinen Fehler mehr beim compilen. Aber der gwünschte Effekt tritt trotzdem nicht ein. Wenn ich das, was ich geschrieben habe richtig deute, müsste doch eigentlich, wenn man auf das erstellte Bild klickt, ein Shape an der oberen rechten Ecke des Bildes erscheinen, oder nicht?
Grüße.
| Zitat: |
Antworten mit Zitat
BeitragVerfasst am: So 31.05.09 16:30
Ich hoffe, Du hast auch meinen Beitrag eben mitbekommen und nicht durch Regans gleichzeitige Antwort übersehen...
|
Ja, den habe ich auch wahrgenommen. Schien aber daran zu liegen, das ich die Procedure in einem Timer hatte.
Regan - So 31.05.09 16:37
Robii hat folgendes geschrieben : |
| Danke. Immerhin bekomme ich jetzt keinen Fehler mehr beim compilen. Aber der gwünschte Effekt tritt trotzdem nicht ein. Wenn ich das, was ich geschrieben habe richtig deute, müsste doch eigentlich, wenn man auf das erstellte Bild klickt, ein Shape an der oberen rechten Ecke des Bildes erscheinen, oder nicht? |
Neue Frage, neuer Thread.
Robii hat folgendes geschrieben : |
| Schien aber daran zu liegen, das ich die Procedure in einem Timer hatte. |
Richtig :) .
Marc. - So 31.05.09 16:38
Robii hat folgendes geschrieben : |
| Wenn ich das, was ich geschrieben habe richtig deute, müsste doch eigentlich, wenn man auf das erstellte Bild klickt, ein Shape an der oberen rechten Ecke des Bildes erscheinen, oder nicht? |
Soweit ich das richtig sehe, hast du vergessen Parent zu setzen. ;)
Robii - So 31.05.09 16:45
Muss ich jetzt einen neuen Thread starten? Was ist ein Parent?
Grüße.
Regan - So 31.05.09 16:47
Robii hat folgendes geschrieben : |
Muss ich jetzt einen neuen Thread starten? Was ist ein Parent?
Grüße. |
Ja, bitte.
Und @Marc.: Bitte dort nochmal antworten.
Marc. - So 31.05.09 16:47
Regan hat folgendes geschrieben : |
| Und @Marc.: Bitte dort nochmal antworten. |
Normalerweise folge ich auch der Regel, aber hier hatte ich es als Flüchtigkeitsfehler interpretiert. ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!