Autor Beitrag
uli13
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 10.04.08 23:20 
Hallo Leute!

Aus einer Procedure heraus möchte ich einen Maus-Click simulieren:

ausblenden 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
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: Fr 11.04.08 00:51 
2 Vorschläge:
a)

ausblenden Delphi-Quelltext
1:
TButton.Click;					


b)

ausblenden Delphi-Quelltext
1:
TButton.OnClick(Sender:TObject);					
Erichgue
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 86

Win XP/2000/7
TurboPacal 7.0; Delphi 2/5/7; BDS 2006/2010/XE6; C#; MSSQl 2000
BeitragVerfasst: Fr 11.04.08 11:55 
user profile iconuli13 hat folgendes geschrieben:
Hallo Leute!

Aus einer Procedure heraus möchte ich einen Maus-Click simulieren:

ausblenden 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. :wink:

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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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:
ausblenden 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; // <<< Hier ist der betreffende Button
    ....

Aus dieser Proc heraus wird der MausClick auf 'AlleSpeichern' simuliert:
ausblenden volle Höhe 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:
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 // CD-SerienNr. /Name /Einträge in akt. Zeile
            begin
            SN:=copy(s,3,8); // SerienNr. auslesen
            for i:=1 to length(s) do // Name auslesen
                begin
                if (copy(s,12+i,1)<>']'then
                   N:=N+copy(s,12+i,1)
                   else break; // Name zu Ende, dann For-Schleife verlassen
                end;
            if (N=_sname) then // akt.Name(CDs.dat) = Name(akt.CD)?
               begin
               if (SN=_snummer) then // UND SerienNr.(CDs.dat) = SerienNr.(akt.CD)?
                  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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 478

Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: 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!