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 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
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!