Autor |
Beitrag |
G-McKree
      
Beiträge: 178
|
Verfasst: Di 10.06.03 21:36
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.
Zuletzt bearbeitet von G-McKree am Do 12.06.03 20:30, insgesamt 1-mal bearbeitet
|
|
Ex0rzist
      
Beiträge: 550
Win XP Prof. Mandrake 10.0
D6
|
Verfasst: 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; |
_________________ If accidentally read, induce vomitting.
|
|
G-McKree 
      
Beiträge: 178
|
Verfasst: 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
      
Beiträge: 550
Win XP Prof. Mandrake 10.0
D6
|
Verfasst: 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.
_________________ If accidentally read, induce vomitting.
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: 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.
_________________ Ist Zeit wirklich Geld?
|
|
G-McKree 
      
Beiträge: 178
|
Verfasst: 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
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
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: 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.
_________________ Ist Zeit wirklich Geld?
|
|
G-McKree 
      
Beiträge: 178
|
Verfasst: 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:
www.volny.cz/jirka.k...20QUAD%20ED%20X1.rar[/url]
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: 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. 
_________________ Ist Zeit wirklich Geld?
|
|
G-McKree 
      
Beiträge: 178
|
Verfasst: 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
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: 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.
_________________ Ist Zeit wirklich Geld?
|
|
G-McKree 
      
Beiträge: 178
|
Verfasst: Do 12.06.03 20:26
|
|