Autor Beitrag
jaenschi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 89

Win XP, Debian
D7
BeitragVerfasst: Fr 25.02.05 18:19 
Hallo,
ich erstelle in meinen Programm dynamisch Fenster. Dazu verwende ich diesen Code:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
with TForm.Create(Application) do
  begin
    Width := 347;
    Height := 320;
    name:='test';
    onclose:=testprocedure(name);
 end;

mit dem onclose-event rufe ich folgende procedure auf:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure testprocedure(id:string);
begin
 blablabla...
end;

Wenn ich das nun compile, sagt er mir "Incompatible types: 'TCloseEvent' and 'procedure, untyped pointer or untyped parameter'

Wie kann ich das nun passend machen?


Moderiert von user profile iconChristian S.: Topic aus VCL (Visual Component Library) verschoben am Fr 25.02.2005 um 18:30
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 25.02.05 18:31 
Hallo!

OnClose ist ein TCloseEvent, welches wie folgt definiert ist:
ausblenden Delphi-Quelltext
1:
TCloseEvent = procedure(Sender: TObject; var Action: TCloseAction) of object;					

Die Prozedur, welche Du OnClose zuweist, muss also die obigen Parameter besitzen und eine Methode sein.

MfG
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
jaenschi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 89

Win XP, Debian
D7
BeitragVerfasst: Fr 25.02.05 18:34 
Ehrlich gesagt, kann ich mir noch nicht vorstellen, wie dann meine procedure aussehen muss.
Kannst du mir vielleicht mal eine Beispiel-Procedure erstellen?
THX
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 25.02.05 18:44 
Hallo!

Deine Prozedur muss Teil einer Klasse sein, also eine Methode. Lass Dir doch von Delphi einfach mal eine OnClose-Methode erstellen, dann siehst Du ja, wie sie aussehen muss ;-)

MfG
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
jaenschi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 89

Win XP, Debian
D7
BeitragVerfasst: Fr 25.02.05 18:51 
Also meine Procedure sieht jetzt so aus:
ausblenden Delphi-Quelltext
1:
procedure TForm1.loeschefenster(Sender: TObject; var Action: TCloseAction; id:string);					

In der Private-Declaration hab ich das auch entsprechend eingefügt.
Nur wie rufe ich die Procedure jetzt auf? Ich muss ja auch Parameter für
Sender: TObject; var Action: TCloseAction; übergeben!?
jaenschi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 89

Win XP, Debian
D7
BeitragVerfasst: Fr 25.02.05 19:45 
Ich rufe das nun so auf:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var action:TCloseAction;
begin
with TForm.Create(Application) do
  begin
    Width := 347;
    Height := 320;
    name:='test';
    action:=caFree;
    onclose:=testprocedure(nil,action,name);

Jetzt sagt mir der Compiler aber "Incompatible types: 'TBasicAction' and 'TCloseAction'".
Wie kann ich das denn nun beheben?


Zuletzt bearbeitet von jaenschi am Fr 25.02.05 20:01, insgesamt 1-mal bearbeitet
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Fr 25.02.05 19:52 
Warum willst du das Ereignis OnClose selber aufrufen? Die VCL löst das Ereignis aus, wenn die VCL die Nachricht WM_CLOSE von Windows empfangen hat.

_________________
Ciao, Sprint.
jaenschi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 89

Win XP, Debian
D7
BeitragVerfasst: Fr 25.02.05 20:03 
Sorry, ich hab in meinem post eben ein Fehler eingebaut. Muss natürlich
onclose:=testprocedure(nil,action,name); heißen.
Ich will ja nicht das Ereignis aufrufen sondern eine Procedure beim OnClose-Ereignis!
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Fr 25.02.05 20:09 
jaenschi hat folgendes geschrieben:
Ich will ja nicht das Ereignis aufrufen sondern eine Procedure beim OnClose-Ereignis!

Tja... So sah dein Code aber nicht aus. Jetzt schon, nachdem du ihn geändert hast.

_________________
Ciao, Sprint.
jaenschi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 89

Win XP, Debian
D7
BeitragVerfasst: Fr 25.02.05 20:11 
Jetzt sieht er aber so aus und funktioniert trotzdem noch nicht ;)
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Fr 25.02.05 20:28 
Hallo,

das Ereignis hat eben ein bestimmtes Schema das du nicht erweitern kannst. Es sieht so aus, wie es Christian oben bereits geschrieben hat. Du möchtest folgendes haben:  procedure TForm1.loeschefenster(Sender: TObject; var Action: TCloseAction; id:string);Der letzte Parameter ist aber nicht vorgesehen und deshalb bekommst du eine Fehlermeldung. Wenn du tatsächlich was übergeben möchtest, dann musst du das zum Beispiel per globaler Variablen anstellen.

Achja, die Zuweisung sieht auch anders aus:  OnClose := LoescheFenster;Gruß Hape!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
jaenschi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 89

Win XP, Debian
D7
BeitragVerfasst: Fr 25.02.05 20:43 
Hab das jetzt mit einer globalen Variable gemacht.
Aber die optimalste und sauberste Möglichkeit ist das ja nicht gerade.
Könnte man ja fast als "Bug" von Delphi bezeichnen!(Betonung liegt auf "fast");)