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 user profile iconNarses: Ü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 user profile iconRegan ja schon etwas gesagt, das spare ich mir also. :mrgreen:


Regan - So 31.05.09 15:51

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:

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

user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:
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:

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
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 :) .

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
//Hier oben steht sicherlich irgendwo TForm1!?
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.

user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
Schien aber daran zu liegen, das ich die Procedure in einem Timer hatte.

Richtig :) .


Marc. - So 31.05.09 16:38

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconRegan hat folgendes geschrieben Zum zitierten Posting springen:
Und @Marc.: Bitte dort nochmal antworten.

Normalerweise folge ich auch der Regel, aber hier hatte ich es als Flüchtigkeitsfehler interpretiert. ;)