Avatar billede blackbyte Nybegynder
26. april 2002 - 16:03 Der er 37 kommentarer og
1 løsning

Opret egen event?

Jeg har et projekt med to tilhørende 'dimser'..

En Unit1 som indeholder en form som bruges som interface, og Unit2 som indeholder en protokolspecifikation, Server/Client-specifikationer m.m.

Er det muligt at lave sin egen event til Unit2?
Dvs. hvis jeg f.eks. har en ServerRead()-Event på Unit2, kan jeg så omforme den, så det der sker i min even på Unit2 omformes som en Event på Unit1, samt der overføres nogle variabler?

Et hurtigt eksempen..

---- Unit2 ---

procedure ServerRead(bla, blabla: TBlabla);
var
  ID, Status: Integer;
begin
  ...
  ...
  ...
  if Status <> StatusX then
  begin
    ID := bla bla
    Status :=  bla bla
    { på en eller anden måde køre StatusChange-eventen }
  end;
end;

---- Unit1 ----

procedure ProtocolChangeStatus(ID, Status: Integer);
begin
  ...
  ...
  ...
end;

----------------------

Således at ProtocolChangeStatus() kørers hver gang at Status ændres...

Dette er bare et eksempel...

Avatar billede blackbyte Nybegynder
26. april 2002 - 16:05 #1
Faktisk som når et komponent har On-en-eller-anden-event...
Avatar billede blackbyte Nybegynder
26. april 2002 - 16:07 #2
Nu jeg ser det på skrift...:

kan jeg ikke bare

procedure ServerRead(bla, blabla: TBlabla);
var
  ID, Status: Integer;
begin
  ...
  ...
  ...
  if Status <> StatusX then
  begin
    ID := bla bla
    Status :=  bla bla
    AktuelForm.ProtocolChangeStatus(ID, Status);
  end;
end;
Avatar billede blackbyte Nybegynder
26. april 2002 - 16:07 #3
Men hvordan finder jeg ud af hvad AktuelForm er?
Det kan jo være Form1, MainForm, Form2 eller hvad ved jeg... Alt efter hvad funktionen kaldes fra...
Avatar billede blackbyte Nybegynder
26. april 2002 - 16:10 #4
Og funktionen ProtocolChangeStatus(ID, Status); skal kun køres hvis eventen er deklareret på AktuelForm
Avatar billede blackbyte Nybegynder
26. april 2002 - 16:19 #5
"Snakker med mig selv..."
Avatar billede hermandsen Juniormester
26. april 2002 - 16:22 #6
Du kan lave din egen event:

TMyEvent = procedure (I: Integer) of object;

Så opretter du den variabel som har typen TMyEvent. Den kalder du så på når den skal køres.

Den procedure som du selv skriver skal så være af samme type som din TMyEvent.

private
  Davs: TMyEvent;

procedure TForm1.Davs(I: Integer);
begin
  ShowMessage('Davs' + IntToStr(I));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MitEvent := Davs;
end;
Avatar billede hermandsen Juniormester
26. april 2002 - 16:23 #7
Ja, du snakker faktisk RET meget med dig selv!!! :)
Avatar billede blackbyte Nybegynder
26. april 2002 - 16:25 #8
Hedder den TMyEvent?
Avatar billede blackbyte Nybegynder
26. april 2002 - 16:26 #9
Sorry - jeg synes det ser lidt indviklet ud...
Avatar billede blackbyte Nybegynder
26. april 2002 - 16:26 #10
Hvis vi siger jeg har TO events... hvad så?
Avatar billede hermandsen Juniormester
26. april 2002 - 16:30 #11
Det hedder ikke TMyEvent
Det var bare en måde du kunne lave det på...

Der findes en der er lavet på forhånd der hedder TNotifyEvent

TNotifyEvent = procedure (Sender: TObject);

Det er den du kender fra når du trykker på en knap eller noget...

Du kan lige lades lave dine egen procedurere, alt efter hvilke parametre du skal bruge...

TMitEventMedMangeParametre = procedure(x, y, I, f, t: Integer; S, q, a, w: String; F, r, m: Real) of object;
Avatar billede blackbyte Nybegynder
26. april 2002 - 16:31 #12
Thx... Du har reddet min dag
Avatar billede hermandsen Juniormester
26. april 2002 - 16:32 #13
TMitFoersteEvent = procedure () of object;
TMitAndetEvent = procedure (Q: Real) of object;
TMitTiendeEvent = procedure (S: String) of object;
Avatar billede hermandsen Juniormester
26. april 2002 - 16:33 #14
Hehe... Selv tak! :)
Avatar billede blackbyte Nybegynder
26. april 2002 - 16:56 #15
Hvor skal jeg placere TMyEvent = procedure (I: Integer) of object;
Avatar billede hermandsen Juniormester
26. april 2002 - 17:13 #16
Under type
Avatar billede blackbyte Nybegynder
26. april 2002 - 17:15 #17
Avatar billede blackbyte Nybegynder
26. april 2002 - 17:16 #18
Jeg roder rundt i det - du sidder vel ikke tilfældigvis med et eksempel..
Jeg har forstået teorien, men det virker bare ikke praktisk
Avatar billede blackbyte Nybegynder
26. april 2002 - 17:17 #19
Hvordan trigger jeg Eventen til at gå af?
Avatar billede hermandsen Juniormester
26. april 2002 - 17:27 #20
Du skriver den bare ind.

Hvis du f.eks. starter en søgning efter en fil og vil have kørt din event når filen er fundet:

TFileFoundEvent = procedure (FileName: TFileName) of object;
TSearchCompleteEvent = procedure () of object;

public
  OnFileFound: TFileFoundEvent;
  OnSearchComplete: TSearchCompleteEvent;

procedure StartSearch(Dir: String);
begin
  .......
  OnFileFound;
  .......
  OnSearchComplete;
end;
Avatar billede hermandsen Juniormester
26. april 2002 - 17:31 #21
Prøv at smutte ind på:
http://www.borrisholt.com/FileIO/FileIO_MAIN.htm

Der kan du hente ThreadSearch. Den er faktisk RET god! :)
Avatar billede blackbyte Nybegynder
26. april 2002 - 17:32 #22
type
  TLoginAccept = procedure() of object;

public
  LoginAccept: TLoginAccept;

[Error] Unit2.pas(11): '=' expected but identifier 'LoginAccept' found
[Error] Unit2.pas(11): ';' expected but ':' found
[Error] Unit2.pas(11): '=' expected but ';' found
Avatar billede hermandsen Juniormester
26. april 2002 - 17:34 #23
Arh...

Det er selvfølgelig fordi det ikke ligge i en klasse!!!
Sorry! Læg den under var.
Avatar billede blackbyte Nybegynder
26. april 2002 - 17:37 #24
procedure SendServerCmd(UserID, Cmd, Param: String);
begin
  LoginAccept;

Når den læser denne komamndo, kommer den emd en "Access Violation"
Avatar billede hermandsen Juniormester
26. april 2002 - 17:42 #25
Access Violation kommer normalt hvis du f.eks. har glemt at Create'e din klasse...

Ligger LoginAccept i en klasse?
Avatar billede blackbyte Nybegynder
26. april 2002 - 17:42 #26
Hvad mener du?
Avatar billede blackbyte Nybegynder
26. april 2002 - 17:45 #27
unit Unit2;

interface

uses IdUDPClient, IdUDPServer, IdSocketHandle, Dialogs, SysUtils, Controls;

type
  TLoginAccept = procedure() of object;

procedure LogonToAsio(UserID, Pass: String);

var
  UDPClient: TIdUDPClient;
  HostAddr: String;
  Auth: Boolean;
  UDPServer: TIdUDPServer;
  LoginAccept: TLoginAccept;

implementation

procedure SendServerCmd(UserID, Cmd, Param: String);
begin
  LoginAccept;
  UDPClient := TIdUDPClient.Create(nil);
  if HostAddr = '' then
  begin
    ShowMessage('No Host');
    Exit;
  end
  else if pos(':',HostAddr) <= 1 then
  begin
    ShowMessage('Invalid Host');
    Exit;
  end
  else if UserID = '' then
  begin
    ShowMessage('Invalid account');
    Exit;
  end;
  UDPClient.Host := copy(HostAddr,0,pos(':',HostAddr)-1);
  UDPClient.Port := StrToInt(copy(HostAddr,pos(':',HostAddr)+1,4));
  if (Auth = False) and (Cmd <> '1000') then
  begin
    ShowMessage('Must be auth at server first');
    Exit;
  end;
  try
    UDPClient.Send(copy(UserID,0,7)+copy(Cmd,0,4)+Param);
  except
    ShowMessage('Connection Error')
  end;
  UDPClient.Destroy;
end;

procedure UDPServerUDPRead(Sender: TObject; ABinding: TIdSocketHandle);
var
  ServerQuery: String;
  Cmd: String;
  Param: String;
begin
  ServerQuery := UDPServer.ReceiveString();
  Cmd := copy(ServerQuery,0,4);
  Param := copy(ServerQuery,3,Length(ServerQuery)-4);
  if Cmd = '1000' then
  begin
    if Param <> '1' then
    begin
      ShowMessage('Login Error');
      Exit;
    end else
    begin
      Auth := True;
    end
  end
end;

procedure LogonToAsio(UserID, Pass: String);
begin
  SendServerCmd(UserID,'1000',Pass);
end;

initialization
  UDPServer := TIdUDPServer.Create(nil);
end.
Avatar billede blackbyte Nybegynder
26. april 2002 - 17:46 #28
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit2, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase,
  IdUDPServer, ExtCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Timer1: TTimer;
    IdUDPServer1: TIdUDPServer;
    procedure Button1Click(Sender: TObject);
    Procedure LoginAccept();
  private
    { Private declarations }
  public

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  HostAddr := Edit1.Text;
  LogonToAsio(Edit2.Text,Edit3.Text);
end;

procedure TForm1.LoginAccept();
begin
  SHowMEssage('haha');
end;

end.
Avatar billede hermandsen Juniormester
26. april 2002 - 17:52 #29
Unit1:
private
  LoginAccept: TLoginAccept;
Avatar billede hermandsen Juniormester
26. april 2002 - 17:52 #30
Sorry.. Der skulle ha' været noget mere... Resten er på vej! :)
Avatar billede hermandsen Juniormester
26. april 2002 - 17:57 #31
Unit1:

private
  procedure _LoginAccept;

procedure TForm1._LoginAccept();
begin
  SHowMessage('Weeeee!!!!');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Unit2.LoginAccept := _LoginAccept;
end;
Avatar billede hermandsen Juniormester
26. april 2002 - 18:04 #32
Hvorfor kan du ikke også have en klasse til den procedure? Jeg tror altså det vil gøre det noget nemmere!

Eller bare skrive koden til LoginAccept i Unit2...
Avatar billede blackbyte Nybegynder
26. april 2002 - 18:04 #33
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Unit2;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    procedure _LoginAccept;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  LoginAccept: TLoginAccept;

implementation

procedure TForm1._LoginAccept();
begin
  SHowMessage('Weeeee!!!!');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Unit2.LoginAccept := _LoginAccept;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  LogonToAsio('11','22');
end;

end.

Så langt, så godt...

Popop: "TForm1: Resource not found"
Avatar billede blackbyte Nybegynder
26. april 2002 - 18:06 #34
Jeg forstår ikke hvad du mener med en klasse
Avatar billede blackbyte Nybegynder
26. april 2002 - 18:16 #35
Nu virker det sq :)
takker
Avatar billede hermandsen Juniormester
26. april 2002 - 18:18 #36
Har du aldrig leget med klasser?

En klasser (class i Delphi) er faktisk noget du bruger hele tiden! Dine knapper er en klasse, tekstfelter er klasser, timeren er en klasse osv.

En klasse er noget der kan indeholde både variabler og procedurere. Din form er også en klasse. Som når du f.eks. skriver:
  Form1.Edit1.Text := 'Davs';
Så finder vi først Form1. Den har variablen Edit1 som så har property'en Text.

Du skriver f.eks. også
  Form1.Canvas.LineTo(15, 200);
Canvas er så en klasse som oprettes sammen med formen og har ligeledes nogle variabler og procedurere.

TMinKlasse = class(TObject) {Når du skriver TObject kan du arve fra den. Dette behøver du ikke ved TObject, men hvis du f.eks. skal lave en ny TButton, så er det jo smart at skrive TMinNyeKnap = class(TButton)}

private {skriv de variabler/procedurere/funktioner der kun skal være tilgængelige for din klasse}

public {skriv de variabler/procedurere/funktioner der skal være tilgængelige for dem der bruger din klasse som variabel}

Det er sådan set ikke så svært, og du vil få en meget bedre kode ud af det!

Prøv at slå ordet class op i hjælpen, det kunne være det kunne hjælpen! :)
Avatar billede hermandsen Juniormester
26. april 2002 - 18:21 #37
Hehe... Okay!

Du burde lege lidt med klasser en dag! Det gør det nemlig let at lave object orienteret programmering!
Avatar billede blackbyte Nybegynder
02. maj 2002 - 13:36 #38
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester