Autor |
Beitrag |
uli13
Hält's aus hier
Beiträge: 2
|
Verfasst: Do 10.04.08 23:20
Hallo Leute!
Aus einer Procedure heraus möchte ich einen Maus-Click simulieren:
Delphi-Quelltext 1: 2: 3:
| Button2.Perform(WM_LBUTTONDOWN,0,0); sleep(200); Button2.Perform(WM_LBUTTONUP,0,0); |
Hier erscheint: [Fehler] Unit 251.pas(518) Undefinerter Bezeichner: 'Button2'
Mal Fehler 518, mal 519...?
Unter TMain = class(TForm)
ist der Button eingetragen.
Aus der TMain.Proc FormCreate heraus klappt es einwandfrei.
Habe im www nach Delphi-Fehlercodes gesucht, ohne Erfolg.
Bitte, wenn mir jemand einen Tip geben könnte?
Vielen Dank im Voraus!
|
|
Tilo
      
Beiträge: 1098
Erhaltene Danke: 13
Win7 geg. WInXP oder sogar Win98
Rad2007
|
Verfasst: Fr 11.04.08 00:51
2 Vorschläge:
a)
Delphi-Quelltext
b)
Delphi-Quelltext 1:
| TButton.OnClick(Sender:TObject); |
|
|
Erichgue
      
Beiträge: 86
Win XP/2000/7
TurboPacal 7.0; Delphi 2/5/7; BDS 2006/2010/XE6; C#; MSSQl 2000
|
Verfasst: Fr 11.04.08 11:55
uli13 hat folgendes geschrieben: | Hallo Leute!
Aus einer Procedure heraus möchte ich einen Maus-Click simulieren:
Delphi-Quelltext 1: 2: 3:
| Button2.Perform(WM_LBUTTONDOWN,0,0); sleep(200); Button2.Perform(WM_LBUTTONUP,0,0); |
Hier erscheint: [Fehler] Unit 251.pas(518) Undefinerter Bezeichner: 'Button2'
Mal Fehler 518, mal 519...?
Unter TMain = class(TForm)
ist der Button eingetragen.
Aus der TMain.Proc FormCreate heraus klappt es einwandfrei.
Habe im www nach Delphi-Fehlercodes gesucht, ohne Erfolg.
Bitte, wenn mir jemand einen Tip geben könnte?
Vielen Dank im Voraus! |
Hallo,
die Zahl in der Klammer nach der Unit ist die Zeilennummer in der der Fehler auftritt.
Da wirst du vergeblich im Internet suchen.
Die Fehlermeldung selber ist "Undefinierter Bezeichner .."
Sie sagt eigentlich schon ganz klar, was dein Problem ist.
Der Compiler kann die Deklaration von Button2 in der Klasse oder in den eingebundenen Units nicht finden.
Zeig mal mehr Code!
Am besten die Klassendeklaration von deiner Form und die fehlerbehaftet Methode (Kannst ja unwichtige/vertrauliche Passagen rauslöschen).
Erich
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: Fr 11.04.08 12:14
Dein Button ist bestimmt in deiner Main-unit deklariert, oder ?
Und in der Main-unit haste ne Unit '251' eingebunden, in der du Button2 ansprichst.
Die Unit 251 kann aber den button nicht kennen, bis du den ihr bekannt machst:
entweder über eine qualifiziertere Ansprache (TMain.Button2.irgendwas) oder
du machst die
Main-Unit in der Unit 251 bekannt (Uses UMain)
oder du übergibst den Button der Funktion als Parameter so ala
function/Procedure machwas(xButton : TButton)
_________________ Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
|
|
uli13 
Hält's aus hier
Beiträge: 2
|
Verfasst: Fr 11.04.08 18:35
Hallo Leute!
Vorweg, das ist ja peinlich, das mit der Zeilennr.
Dass ich darauf nicht selbst kommen konnte.
Hier der betr. Code- hoffe, er zeigt das Richtige:
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:
| TMain = class(TForm) PageControl1: TPageControl; TabSheet1: TTabSheet; TabSheet2: TTabSheet; Label1: TLabel; Name: TEdit; Art: TEdit; Edit1: TEdit; Edit2: TEdit; GroupBox3: TGroupBox; GroupBox4: TGroupBox; Drive: TComboBox; ListBox1: TListBox; entfernen: TButton; neuLaden: TButton; ListClickDummy: TButton; invAuswahl: TButton; TabSheet2: TTabSheet; GroupBox2: TGroupBox; RadioGroup1: TRadioGroup; GroupBox1: TGroupBox; Monitor: TCheckBox; inDatei: TCheckBox; CheckBox1: TCheckBox; AuchDateien: TCheckBox; AlleVerz: TRadioButton; HauptVerz: TRadioButton; AuswahlSpeichern: TButton; AlleSpeichern: TButton; .... |
Aus dieser Proc heraus wird der MausClick auf 'AlleSpeichern' simuliert:
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:
| procedure check_double; var F: TextFile; i:integer; s,N0,N,SN:string; begin _overwrite:=False; assignFile(F,'C:\CDs.dat'); if FileExists('C:\CDs.dat') then begin reset(F); while not eof(F) do begin N:=''; readln(F,s); if (copy(s,1,2)='sn') then begin SN:=copy(s,3,8); for i:=1 to length(s) do begin if (copy(s,12+i,1)<>']') then N:=N+copy(s,12+i,1) else break; end; if (N=_sname) then begin if (SN=_snummer) then if MessageDlg('CD ['+N+'] schon vorhanden! Einträge Ersetzen?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin closeFile(F); > Hier der Fehler AlleSpeichern.Perform(WM_LBUTTONDOWN,0,0); Sleep(200); > beim compilieren AlleSpeichern.Perform(WM_LBUTTONUP,0,0); _overwrite:=True; end; exit; end; end; end; closeFile(F); end; end; |
zuma, die Deklaration ist oben im Quelltext 2_51(2_51.pas)
Wenn ich so aufrufe: 'TMain.AlleSpeichern.Perform(WM_LBUTTONDOWN,0,0);'
dann blinkt der Cursor vor dem 2. Punkt 'Methodenbezeichner erwartet'
Mit dem Uses UMain gibt es einen Fatalen Fehler: 'Datei UMain.dcu nicht gefunden'.
Wie sollte die Main-Unit denn heißen?
Kann doch keine Parameter übergeben, an den Aufruf 'AlleSpeichern.Perform(WM_LBUTTONDOWN,0,0);', oder?
Ich versuche schon seit langem, diese Art von Fehler zu verstehen.
Unbekannter Bezeichner usw., habe 2 Delphi Bücher, in denen suche ich auch.
Doch im Verzeichnis findet sich dieser Fehler nicht.
Werde versuchen, mehr zu lesen.
Denn selbst, wenn ich einen hilfreichen Tip bekomme,
so will ich doch verstehen, das warum und wieso...
Auf jeden Fall vielen Dank erstmal!!!
L.G.
|
|
Silas
      
Beiträge: 478
Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
|
Verfasst: Fr 11.04.08 19:09
Hallo!
Der Fehler ist folgender: Der AlleSpeichern-Button ist, weil er ja unter TMain deklariert ist, ein Objekt dieser Klasse. Deine check_double-Prozedur ist aber keine Klassenmethode von TMain sondern eine globale.
Das bedeutet du musst aus AllesSpeichern ein Main.AllesSpeichern machen (
Main ist die Instanz von TMain, die dein Programm verwendet.) oder check_double zu einer Klassenfunktion "umdeklarieren" (was IMHO die bessere Lösung wäre).
_________________ Religionskriege sind nur Streitigkeiten darüber, wer den cooleren imaginären Freund hat
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: Sa 12.04.08 10:26
ist, wie Silas geschrieben hat.
Ich versuchs dir nochmal anders zu erklären (am Beispiel deiner Maske):
zwischen Type TMain ... und dem nächsten end werden deine Objekte (Edit, Label, Button, etc.) deklariert.
In dem Block gibts noch andere Schlüsselwörter für 'Abschnitte' der Typendeklaration.
Private z.b. kennzeichnet den Bereich, der nur innerhalb der Klasse bekannt ist, Public enthält die
Methoden und Var's, die auch 'von aussen' genutzt werden können.
Nach dem end der Typendeklaration wird noch die Var Main vom Typ TMain deklariert, um einen Namen zu haben,
unter dem wir das Maskenobjekt ansprechen können (ala Main.Edit1.Text).
wenn du nun noch Methoden nach dem end von Type TMain ... deklarierst, gehören diese nicht mehr in den
Typ TMain (hast ja ein end geschrieben (bzw. die IDE für dich)). Darum sind
procedure machwas; // < global
oder
procedure TMain.machwas; // < objektzugehörig
2 verschiedene Dinge, auch wenn du das gleiche darin machst. Aber bei der 2ten Methode weiss der Compiler,
das die procedure zu dem Objekt TMain gehört und da er das Objekt Main mit allen Unterobjekten kennt,
weiss er dann auch, das dort z.b. ein Button und ein ButtonClick definiert wurde (also nix mehr mit undefinierter Bezeichner).
Was beim compilieren abläuft, ist ungefähr sowas:
Wenn du z.b
Button2.Enabled := True;
bei Button1Click schreibst, geht der Compiler bei Abarbeiten der TMain.Button1Click - procedure erstmal gucken,
(bei der Typendeklaration von TMain), ob er da was findet, das Button2 heisst. Findet er den da, guckt er bei dem Button2, ob der eine Eigenschaft/Methode 'Enabled' hat usw. Findet er den Button2 nicht, guckt er noch, ob er den Namen irgendwo (guckt in alles, was er 'used') global kennt (du den also in irgend einer eingebundenen Unit global deklariert hast). Findet er den da auch nirgends, sagt er dir das eben mit 'undefinierter Bezeichner';
Ich hoffe, das war verständlicher, wenn auch recht grob beschrieben.
Kann dir noch den Tipp geben:
Objekt-Methoden immer im private oder public bereich schreiben, dann Strg+shift+c während der cursor in der Zeile steht, dann sollte automatisch der Rumpf der Methode im Code eingetragen werden und man braucht 'nur' noch Leben reinbringen.
_________________ Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
|
|
|