Autor Beitrag
turboPASCAL
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 193
Erhaltene Danke: 1

Win XP / Vischda
D6 PE / D2005 PE
BeitragVerfasst: Di 28.07.09 08:49 
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:
ausblenden 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:
ausblenden 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;

_________________
Nein, ich bin nicht der turboPASCAL aus der DP, ich seh nur so aus... :P
Tastaro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: Di 28.07.09 08:58 
ausblenden 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:

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

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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.)

_________________
We are, we were and will not be.
turboPASCAL Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 193
Erhaltene Danke: 1

Win XP / Vischda
D6 PE / D2005 PE
BeitragVerfasst: 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.

_________________
Nein, ich bin nicht der turboPASCAL aus der DP, ich seh nur so aus... :P
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 193
Erhaltene Danke: 1

Win XP / Vischda
D6 PE / D2005 PE
BeitragVerfasst: Di 28.07.09 09:37 
@jaenicke, das war's.

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


Sollte so aussehen. ;)

_________________
Nein, ich bin nicht der turboPASCAL aus der DP, ich seh nur so aus... :P