Event atama hakkında [Çözüldü]

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Event atama hakkında [Çözüldü]

Mesaj gönderen adelphiforumz »

Selamlar

Aşağıdaki şekilde ClientSocket nesne'sinin onWrite Events özelliğine atama yapmak istiyorum.
Fakat derlemede hata alıyorum nedeni hakkında yardımcı olabilirmisiniz.

Teşekkürler

Kod: Tümünü seç

unit untEntitys;

interface
uses
  Windows, Messages, Math, SysUtils, Variants, Classes, Graphics, Controls, TypInfo, Forms,
  Dialogs, Menus, DB, ADODB, StdCtrls, cxGridCustomView, Buttons, ComCtrls, clipbrd,  
  System.Win.ScktComp;
...
...
 ...
Type
  TEntitys = Class
  public
    procedure prc_Socket_Yazdir(_AForm:TForm; _iId: Integer);
  End;
implementation
...
...
...

procedure prc_Socket_Yazdir(_AForm:TForm; _iId: Integer);
var
  SC_OKC: TClientSocket;
  procedure prc_SC_OKCWrite(Sender: TObject; Socket: TCustomWinSocket);
  begin
      //
  end;
begin
  try
      SC_OKC := TClientSocket.Create(_AForm);
      SC_OKC.ClientType := ctNonBlocking;
      SC_OKC.Address := '127.0.0.1';
      SC_OKC.Port := 35782;
      SC_OKC.OnWrite := prc_SC_OKCWrite;
      SC_OKC.Active := True;
      ...
      ...
      ...
      SC_OKC.Active := False;
      SC_OKC.Free;
      SC_OKC := nil;
  except
       //
  end;
end;
En son adelphiforumz tarafından 30 Eyl 2016 10:54 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Event atama hakkında

Mesaj gönderen ertank »

Merhaba,

Sizin atama yapmak istediğiniz nesne bir sınıf (class) içinde tanımlı ve siz form içinde tanımlı "pointer procedure" e atama yapmak istiyorsunuz. Bu ikisi türleri farklı olduğu için birbirinin yerine kullanılamaz. Dolayısı ile atama yapmak istediğiniz prosedürü ya TForm içinde tanımlayacaksınız ya da TEntitys içinde tanımlayacaksınız.

Ancak TEntitys tanımlarınızda bir eksiklik var. procedure tanımlarının başına "class" ifadesini eklemeniz gerekiyor. Böylece Delphi bu tanımların "pointer procedure" olmadığını anlayacaktır. Kodunuzu aşağıdaki şekilde değiştirirseniz çalışacaktır.

TEntitys tanımı:

Kod: Tümünü seç

Type
  TEntitys = class
  private
    class procedure prc_SC_OKCWrite(Sender: TObject; Socket: TCustomWinSocket);
  public
    class procedure prc_Socket_Yazdir(_AForm:TForm; _iId: Integer);
  end;
Atama yapılacak private prosedür:

Kod: Tümünü seç

class procedure TEntitys.prc_SC_OKCWrite(Sender: TObject; Socket: TCustomWinSocket);
begin
    //
end;
TEntitys public procedure:

Kod: Tümünü seç

class procedure TEntitys.prc_Socket_Yazdir(_AForm:TForm; _iId: Integer);
var
  SC_OKC: TClientSocket;
begin
  try
    SC_OKC := TClientSocket.Create(_AForm);
    SC_OKC.ClientType := ctNonBlocking;
    SC_OKC.Address := '127.0.0.1';
    SC_OKC.Port := 35782;
    SC_OKC.OnWrite := prc_SC_OKCWrite;
    SC_OKC.Active := True;
    SC_OKC.Active := False;
    SC_OKC.Free;
    SC_OKC := nil;
  except
    //
  end;
end;
Bu noktada bir iki konuda dikkatinizi çekmek isterim.
1- Değişken tanımlama her ne kadar programcının kendi tasarrufunda olsa da programlama dilinin kabul görmüş genel kullanımlarına uymakta her zaman fayda vardır. Aşağıdaki birkaç örnek değişken isimi yerine alternatif önerileri kullanmanız hem okumasını hemde yazmasını kolaylaştıracaktır.

prc_SC_OKCWrite yerine prcScOkcWrite
_AForm yerine Form veya AForm
_iId yerine Iid


2- SC_OKC değişkenini aşağıdaki şekilde kullanmanızda fayda var. Aksi halde örnek kod bir hata oluşması durumunda hafıza kaçağına sebep olacaktır.

Kod: Tümünü seç

SC_OKC := TClientSocket.Create(_AForm);
try
  SC_OKC.ClientType := ctNonBlocking;
  SC_OKC.Address := '127.0.0.1';
  SC_OKC.Port := 35782;
  SC_OKC.OnWrite := prc_SC_OKCWrite;
  SC_OKC.Active := True;
  SC_OKC.Active := False;
finally
  FreeAndNil(SC_OKC);
end;

Eğer kullanıcıdan saklamak istediğiniz bir hata varsa bunu sadece ilgili bölümü try..except bloğu içine alarak yapmanız daha iyi olur.
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Event atama hakkında

Mesaj gönderen adelphiforumz »

ertank hocam benim amacım aynı procedure altında tüm tanımlamaları yaparak bir bütün halinde kullanmaya çalıştım
eğer global tanımlama ile yaparsam zaten sorun olmuyor.
kusura bakmayın sanırım sorunu eksik anlatmışım.
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Event atama hakkında

Mesaj gönderen ertank »

Bildiğim kadarıyla yapmak istediğinizi ancak TEntitys sınıfını kullanmazsanız yapabilirsiniz.
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Event atama hakkında

Mesaj gönderen adelphiforumz »

ertank hocam zaten ilk bahsettiğim örnekte bu sınıfı kullanmadanyapmaya çalışmıştım fakat hata almıştım nasıl olacağı konusunda bir fikriniz varmı
teşekkürler
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Event atama hakkında

Mesaj gönderen ertank »

Aşağıdaki gibi Form içi prosedürler tanımlayarak yapabilirsiniz.

Kod: Tümünü seç

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ClientSocket1: TClientSocket;
  private
    { Private declarations }
    procedure prc_Socket_Yazdir(_AForm:TForm; _iId: Integer);
    procedure prc_SC_OKCWrite(Sender: TObject; Socket: TCustomWinSocket);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.prc_SC_OKCWrite(Sender: TObject; Socket: TCustomWinSocket);
begin
  //
end;

procedure TForm1.prc_Socket_Yazdir(_AForm:TForm; _iId: Integer);
var
  SC_OKC: TClientSocket;
begin
  SC_OKC := TClientSocket.Create(_AForm);
  try
    SC_OKC.ClientType := ctNonBlocking;
    SC_OKC.Address := '127.0.0.1';
    SC_OKC.Port := 35782;
    SC_OKC.OnWrite := prc_SC_OKCWrite;
    SC_OKC.Active := True;
    SC_OKC.Active := False;
  finally
    FreeAndNil(SC_OKC);
  end;
end;

end.
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Event atama hakkında

Mesaj gönderen adelphiforumz »

ertank hocam

Dediğiniz gibi zaten yapılabiliyor.
Benim öğrenmeye çalıştığım bir Procedure içerisinde tüm tanımlamaları yaparak bu iş yapılabilirmi.
Yani type class yapısını aynı procedure içinde yapmama izin verirmi verirse nasıl yapılabilir.
Teşekkürler

Mesela aşağıdaki gibi birşey olabilirmi

Kod: Tümünü seç

procedure prcX;
type
  Tx = class
  public
      procedure prcY(.....);
   ...
  private
end;
var
   Evn : Tx;
begin
  Evn := TX;
...
...
  OnEvent...    := Evn.PrcY; 
end;
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Event atama hakkında

Mesaj gönderen ertank »

İlk mesajımın ilk paragrafında neden olmayacağını yazmaya çalışmıştım. Sizin yapmak istediğiniz şekilde tanımlanan prosedürler "pointer procedure" oluyor. Ancak Bir olaya atama yapmak istediğiniz zaman "method procedure" atayabiliyorsunuz. İkisi Delphi için farklı şeyler ve bildiğim kadarı ile birbirinin yerine kullanımı mümkün değil.

Sonuç olarak, ya TEntitys sınıfı içinde tüm tanımlamaları yapıp kullanacaksınız. Ya da TForm1 sınıfı içinde. İki alternatiften birisini seçmeniz gerekiyor.
Kullanıcı avatarı
csunguray
Üye
Mesajlar: 855
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Re: Event atama hakkında

Mesaj gönderen csunguray »

adelphiforumz yazdı:Fakat derlemede hata alıyorum
Hata mesajını da yazsaydınız keşke.
C. Sunguray
csunguray at netbilisim.kom
Net Bilişim Hizmetleri

Sıradan her programcı bilgisayarın anlayabileceği kodlar yazabilir.
Sadece iyi programcılar insanların da anlayabileceği kodlar yazarlar.
Martin Fowler (http://martinfowler.com/)
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Event atama hakkında

Mesaj gönderen adelphiforumz »

csunguray aldığım hata mesajıda aşağıdaki şekildedir
Hata mesajını da yazsaydınız keşke.
mesajın alındığı satır
SC_OKC.OnWrite := prc_SC_OKCWrite;

Hata mesajı
[dcc32 Error] untEntitys.pas(310): E2009 Incompatible types: 'method pointer and regular procedure'

Umarım bu yazdıklarımla çözüme ulaştırabilirsiniz.
Teşekkürler
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Kullanıcı avatarı
kimimben
Üye
Mesajlar: 129
Kayıt: 28 Oca 2016 04:41
Konum: İstanbul

Re: Event atama hakkında

Mesaj gönderen kimimben »

Kod: Tümünü seç

procedure TEntitys.prc_Socket_Yazdir(_AForm:TForm; _iId: Integer);
var
  SC_OKC: TClientSocket;
  m : TMethod;

  procedure prc_SC_OKCWrite(Sender: TObject; Socket: TCustomWinSocket);
  begin
    ShowMessage('test');
  end;
begin

  m.Data := nil;
  m.Code := @prc_SC_OKCWrite;
  try
      SC_OKC := TClientSocket.Create(_AForm);
      SC_OKC.OnWrite := TSocketNotifyEvent(m);
      //SC_OKC.OnWrite(nil,nil);
      SC_OKC.ClientType := ctNonBlocking;
      SC_OKC.Address := '127.0.0.1';
      SC_OKC.Port := 35782;
      SC_OKC.Active := True;
      SC_OKC.Active := False;
      SC_OKC.Free;
      SC_OKC := nil;
  except on E: Exception do

  end;

end;
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Event atama hakkında

Mesaj gönderen adelphiforumz »

Selam "kimimben" hocam
tamda istediğim buydu ellerine emeğine sağlık
teşekkürler
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Kullanıcı avatarı
kimimben
Üye
Mesajlar: 129
Kayıt: 28 Oca 2016 04:41
Konum: İstanbul

Re: Event atama hakkında

Mesaj gönderen kimimben »

adelphiforumz yazdı:Selam "kimimben" hocam
tamda istediğim buydu ellerine emeğine sağlık
teşekkürler
Aleykümselam.
Rica ederim çok bir emek harcamadım.
method pointer and regular procedure hatasını araştırdıktan sonra, gelen ilk linkte ki Ondrej Kelle'nin cevabını uyguladım.
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Event atama hakkında

Mesaj gönderen ertank »

Öğrenmenin sonu yok.
Cevapla