Entwickler-Ecke

Windows API - [nonVCL] - Wie ohne TNotifyEvent eine Procedure aufrufen ?


turboPASCAL - Di 28.07.09 08:49
Titel: [nonVCL] - Wie ohne TNotifyEvent eine Procedure aufrufen ?
Hi,

wie stell man es an wenn man in einer Procedure eine Schleife hat, in der es eine Prozentberechnung gibt diese Global
auszulesen ohne globale Variablen zu verwenden ?

Der Grund ist ich habe kein TNotifyEvent im nonVCL und möche die Prozentwerte aus der Schleife.

Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
// Hauptprogramm:

procedure ProzentWerte(p: integer); stdcall;
begin
  writeln(p + '% geschrieben');
end;

procedure Main...
begin
  MachWas(X,Y, @ProzentWerte);
end;


So klappts irgend wie nicht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
//Unit mit der Berechnung:

procedure MachWas(X,Y: Byte; percentDone: pointer);
begin
  while ... do
  begin
    if @percentDone <> nil then percentDone(xyz);  
  end;
end;


Tastaro - Di 28.07.09 08:58


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
// Hauptprogramm:
procedure ProzentWerte(p: integer); stdcall;
begin  
   writeln(p + '% geschrieben');
end;

procedure Main...
begin
  MachWas(X,Y, ProzentWerte);
end;


Einen Typ für deine Prozedur basteln:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
type
   tmyproc = procedure(xyz: integer);


procedure MachWas(X,Y: Byte; percentDone: tmyproc);
begin  
   while ... do  
   begin    
      if assigned(percentDone) then 
         percentDone(xyz);    
   end;
end;


Beste Grüße


Gausi - Di 28.07.09 08:59

Oder du könntest per SendMessage eine Nachricht an das Hauptfenster schicken. Im wParam und lParam kannst du zwei Parameter reinpacken. Da SendMessage erst dann zurückkehrt, wenn die Nachricht abgearbeitet ist, ist der erreichte Effekt mit denen von Events identisch.

(Da es bei WinAPI drin ist, nehme ich an, dass du kein Konsolenprogramm schreibst.)


turboPASCAL - Di 28.07.09 09:24

@Tastaro, so habe ich es versucht. Das Problem ist in xyz in der Procedure ProzentWerte kommt nur Müll an. :gruebel:

@Gausi, für SendMessage brauche ich ein Windowhandle was ich in der Berechnungsunit nicht habe und oder übergeben möchte, weil
Aufrufende Programm oder was auch immer kein Fenster hat oder haben kann.


jaenicke - Di 28.07.09 09:27

user profile iconturboPASCAL hat folgendes geschrieben Zum zitierten Posting springen:
Das Problem ist in xyz in der Procedure ProzentWerte kommt nur Müll an. :gruebel:
Hast du zufällig in der Typdeklaration stdcall als Aufrufkonvention nicht drin und in der Deklaration der Prozedur schon? So ist es nämlich oben und das geht natürlich nicht. ;-)

Beides muss übereinstimmen, entweder beides stdcall oder beides nicht (letzteres wäre in Delphi ja üblich, wenn es nicht um DLLs geht).


Tastaro - Di 28.07.09 09:29

Hm, lass mal noch das stdcall weg. Vielleicht klappt das dann besser mit dir Parameterübergabe.

Beste Grüße
Tastaro


turboPASCAL - Di 28.07.09 09:37

@jaenicke, das war's.


Delphi-Quelltext
1:
2:
type
  TOnProcess = procedure(percent: integer); stdcall;


Sollte so aussehen. ;)