Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - 'Sender' Parameter bei ner Procedure *FERTIG*


G-McKree - Di 10.06.03 21:36
Titel: 'Sender' Parameter bei ner Procedure *FERTIG*
Ich hab nen Button, der ein paar Vierecke generiert und denen werden ein paar Parameter zugewiesen unter anderem:


Quelltext
1:
2:
Action:= QuadClick;
OnClick:= QuadClickExecute;


bei 'QuadClickExecute' hab ich dann folgendes:


Quelltext
1:
2:
with sender do
Visible: false;


Das Problem: 'Sender' müsste ja eigentlich das Viereck sein auf das man klickt, aber bei mir is es immer die Form. Ich brauch aber unbedingt, das 'sender' das Viereck is auf das man klickt.


Ex0rzist - Mi 11.06.03 01:40


Delphi-Quelltext
1:
2:
3:
4:
5:
Procedure TForm1.QuadClickExecute(Sender: TObject);
Begin
 With Sender as TImage do  // oder von welchem Typ dein Quadrat ist
   Visible := False;
end;


G-McKree - Mi 11.06.03 19:24

mein Sender is TQuad (selbstgebastelt), aber wenn ich deinen Source benutze funzt der zwar, aber Delphi kommt dann mit so ner Fehlermeldung von wegen EInavalidCast -> Sender und TQuad sind nich kompatibel. Hat das was damit zu tun, das die ganzen TQuad-Vierecke Elemente eines Arrays sind?


Ex0rzist - Do 12.06.03 08:49

Dann versuch mal das hier:

Delphi-Quelltext
1:
2:
3:
4:
5:
Procedure TForm1.QuadClickExecute(Sender: TObject); 
Begin 
 If Sender is TQuad then
   (Sender as TQuad).Visible := False;
end;


Damit sollte EInvalidCast nicht mehr auftreten.


AndyB - Do 12.06.03 09:14

Ex0rzist hat folgendes geschrieben:


Delphi-Quelltext
1:
2:
3:
4:
5:
Procedure TForm1.QuadClickExecute(Sender: TObject); 
Begin 
 If Sender is TQuad then
   (Sender as TQuad).Visible := False;
end;


Das Sender as TQuad kann man sich sparen und durch TQuad(Sender) ersetzen, das um einiges schneller ist als der as-Operator, da Sender ja bereits auf TQuad geprüft ist.


G-McKree - Do 12.06.03 19:09

funzt net
ich hab ma versucht mir den sender in ner message anzeigenzulassen. demnach war sender irgetwas mit nem total sinnlosem namen

ich poste ma den quelltext
vieleicht findet ihr ja den fehler


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:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Quad, ComCtrls, ActnList, ActnMan;

type
  TForm1 = class(TForm)
    SaveB: TButton;
    CreateB: TButton;
    Horizontal: TRichEdit;
    Vertical: TRichEdit;
    ActionManager1: TActionManager;
    QuadClick: TAction;

    procedure CreateBClick(Sender: TObject);
    procedure QuadClickExecute(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;
  Quads: array of array of TQuad;
  v: integer;
  h: integer;

implementation

{$R *.dfm}

procedure TForm1.CreateBClick(Sender: TObject);
Var i: integer;

begin
 SetLength(Quads, StrToInt(Horizontal.Text));
 for i:= 0 to High(Quads) do
  begin
   SetLength(Quads[i], StrToInt(Vertical.Text));
  end;

 for h:= 0 to High(Quads) do
 for v:= 0 to High(Quads[0]) do
 begin
  Quads[h,v]:= TQuad.Create(Self);
  with Quads[h,v] do
   begin
    Parent:= Form1;
    Width:= 24;
    Height:= 24;
    Left:= 112 + (32*h);
    Top:= 8 + (32*v);
    Picture.LoadFromFile(ExtractFilePath (ParamStr(0)) + 'Typ1.bmp');
    Typ:= 1;
    Action:= QuadClick;
    OnClick:= QuadClickExecute;
   end;
 end;
end;

procedure TForm1.QuadClickExecute(Sender: TObject);
begin
  If Sender is TQuad then
   TQuad(Sender).Visible := False;
end;



end.


AndyB - Do 12.06.03 19:24

G-McKree hat folgendes geschrieben:
vieleicht findet ihr ja den fehler

Wo ist die MessageBox/Dlg? Ich kann keinen Fehler entdecken, außer dem, dass du globale Variablen bei For-Schleifen einsetzt. Der Compiler gibt da doch entsprechende Meldungen aus. Und wenn du mir jetzt sagst, dass du alle Warnungen und Hinweise abgeschalten hast, dann sage ich dir: Dann geschieht es dir Recht.


Zitat:
SetLength(Quads, StrToInt(Horizontal.Text));
for i:= 0 to High(Quads) do
begin
SetLength(Quads[i], StrToInt(Vertical.Text));
end;

Wieso so umständlich, wenn es auch einfacher geht:

Delphi-Quelltext
1:
SetLength(Quads, StrToInt(Horizontal.Text), StrToInt(Vertical.Text));                    



Zitat:
Action:= QuadClick;
OnClick:= QuadClickExecute;

Setzt die Zuweisung an Action nicht auch gleich OnClick, wenn QuadClick.Execute einen Wert hat? Zumindest geht das so im Design-Modus.


G-McKree - Do 12.06.03 19:39

wegen den variablen hat delphi mich schon gewart, aber die werde eh nur einmal eigelesen, also was soll schon passieren

versuch doch mal den code zu benutzen, wenn du dann auf eins der vierecke klickst, passiert nix und das is das problem


hier gibts das komplette Teil:
http://www.volny.cz/jirka.krm/delphi/HS%20QUAD%20ED%20X1.rar[/url]


AndyB - Do 12.06.03 20:09

G-McKree hat folgendes geschrieben:
also was soll schon passieren

Der Compiler kann z.B. die Schleife nicht optmieren.

In der .rar Datei sind 575 KB unnötiges Zeug drinnen. Die .dcu und .exe Dateien kann ich selbst erstellen. :wink:


G-McKree - Do 12.06.03 20:12

AndyB hat folgendes geschrieben:
G-McKree hat folgendes geschrieben:
also was soll schon passieren

Der Compiler kann z.B. die Schleife nicht optmieren.


bei dem prog is das nich so wichtig, is ja nur n editor

mich würde aber mehr das 'sender'problem interressieren


AndyB - Do 12.06.03 20:20

G-McKree hat folgendes geschrieben:
mich würde aber mehr das 'sender'problem interressieren

Mit Hilfe des Debuggers habe ich das schon herausgefunden.
Man setze einen Breakpoint auf das with Sender as... und klicke dann auf ein TQuad. Danach öffnet man das Watch-Fenster [Strg]+[F5] und gibt Sender.ClassName ein. Was er dann ausspuckt ist TAction, womit der Fehler gefunden ist. Da es sich bei dem Ereignis um das Execute-Ereignis von QuadClick:TAction handelt, wird QuadClick als Sender übergeben. Du musst nur die Zuweisung an Quad.Action entfernen und das Click-Ereignis löst kein QuadClick.OnExecute mehr aus, sondern springt direkt in das OnClick-Ereignis, wobei Sender dann ein TQuad ist.


G-McKree - Do 12.06.03 20:26

thx, jez funz das prog