Incompatible types: 'method pointer and regular procedure

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Nemesis2005
Üye
Mesajlar: 136
Kayıt: 18 Oca 2005 05:24
Konum: İzmir

Incompatible types: 'method pointer and regular procedure

Mesaj gönderen Nemesis2005 »

Kod: Tümünü seç

unit uMailSender;

interface


uses Classes,IdMessage, IdSMTP,Dialogs;


function eMailSend(hostAdres,userName,passWord:string;GondereninAdi,GondereninAdresi,GonderilecekAdres,Konu:string;Mesaj:TStringList):Boolean;
procedure MyInitializeISO(var VHeaderEncoding: Char; var VCharSet: string);

implementation

function eMailSend(hostAdres,userName,passWord:string;GondereninAdi,GondereninAdresi,GonderilecekAdres,Konu:string;Mesaj:TStringList):Boolean;
var
  IdSMTP               : TIdSMTP;
  IdMessage            : TIdMessage;
begin
  Result := True;
  IdSMTP               := TIdSMTP.Create(Nil);
  IdMessage            := TIdMessage.Create( nil );
  try
    try
      // Mail Server Ayarları
      IdSMTP.AuthType                        := satDefault;
      IdSMTP.Host                            := hostAdres;  // smtp host
      IdSMTP.Username                        := userName;   // smtp user name
      IdSMTP.Password                        := passWord;   // smtp password
      IdSMTP.Port                            := 587;        // smtp port 25-587

      // Mail Body işlemleri
      IdMessage.OnInitializeISO              := MyInitializeISO;
      IdMessage.From.Name                    := GondereninAdi; //Alıcıda görünecek isim
      IdMessage.From.Address                 := GondereninAdresi; //Alıcıda görünen adres
      IdMessage.Recipients.EMailAddresses    := GonderilecekAdres; // Göndereceğin Adres
      IdMessage.Subject                      := Konu;
      IdMessage.ContentType                  := 'text/html';
      IdMessage.Body.Clear;
      IdMessage.Body.AddStrings(Mesaj);
      IdMessage.MessageParts.Clear;

      IdSMTP.Connect;
      IdSMTP.Authenticate;
      IdSMTP.Send(IdMessage);
      IdSMTP.Disconnect;
    except
      Result := False;
    end;
  finally
    IdMessage.Free;
    IdSMTP.Free;
  end;
end;

procedure MyInitializeISO(var VHeaderEncoding: Char; var VCharSet: string);
begin
    VCharSet := 'iso-8859-9';
end;

end.

IdMessage.OnInitializeISO := MyInitializeISO; atamasında hata veriyor . Bu satır hariç mail gönderme fonksiyonum çalışıyor. ama OnInitializeISO
metodunu tetikleyemedim. Yardımcı olursanız sevinirim.....
Her iyinin içinde bir Kötülük.Her Kötnün içide de bir iyilik vardır
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: Incompatible types: 'method pointer and regular procedur

Mesaj gönderen mkysoft »

procedürü gerekli pramatrelerle çağırmamışsınız. Öyle görünüyor. Kodları başka biryerden alarak bazı kısımlarını silmişsiniz sanırım.
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: Incompatible types: 'method pointer and regular procedur

Mesaj gönderen unicorn64 »

hatanın türkçesi "method adresi/işaretçisi ve normal prosedür farklı tiplerdir" gibi birşey oluyor, dilim döndüğünce ifade etmeye çalışayım, nesnelere ait eventlere genelde başka bir nesnede aynı yapıda tanımlı prosedür veya fonksiyonlar atanarak, event tetiklendiğinde atadığımız prosedürün çalışmasını sağlarız.

örneğin butona tıklandığında tetiklenen OnClick eventi TNotifyEvent tipindedir ve

Kod: Tümünü seç

TNotifyEvent = procedure (Sender:TObject) of object;
olarak tanımlıdır, yani bir nesneye ait bir prosedür olması gerekir. mesela forma koyduğumuz bir butona tasarım anında çift tıklarsak delphi bizim için formumuzun sınıf tanımına bir prosedür ekler ve butonun OnClick eventine de bu prosedürü atama yapar.

Kod: Tümünü seç

TForm1.Button1Click(Sender:TObject);
begin
end;

kendi tanımladığımız prosedürün çalışmasına da şöyle örnek vereyim;
boş bir proje açın, forma bir buton ekleyin ve kodları aşağıdaki gibi düzenleyin,

Kod: Tümünü seç

unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.BizimProcedure(Sender: TObject);
begin
  ShowMessage('deneme');
  Button1.OnClick:=IkinciProcedure;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button1.OnClick:=BizimProcedure;

end;

procedure TForm1.IkinciProcedure(Sender: TObject);
begin
  showmessage('ikinci');
end;

end.


butona ilk tıklamanızda "deneme" ikinci tıklamanızda "ikinci" yazdığını göreceksiniz...


yani uzun lafın kısası MyInitializeISO prosedürünüzün bir sınıf altında tanımlanmış olması gerekir, bir sınıf tanımlayın, eMailSend fonksiyonunu ve MyInitializeISO prosedürünü bu sınıf altında tanımlayın. email gönderimi için sınıfınızdan bir nesne oluşturup o nesne üzerinden eMailSend fonksiyonunu çağırın...
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
orhancc
Üye
Mesajlar: 585
Kayıt: 24 Ağu 2010 02:14
Konum: İstanbul / Kadıköy
İletişim:

Re: Incompatible types: 'method pointer and regular procedur

Mesaj gönderen orhancc »

Prosedürü çağıracağına bunu direk parametre vererek denedin mi ? Kodun eksik gibi duruyor. Kulllandığın prosedüre hiç parametere de göndermiyorsun.

Kod: Tümünü seç

VCharSet := 'iso-8859-9';
Nemesis2005
Üye
Mesajlar: 136
Kayıt: 18 Oca 2005 05:24
Konum: İzmir

Re: Incompatible types: 'method pointer and regular procedur

Mesaj gönderen Nemesis2005 »

Kod: Tümünü seç

unit uMailSender;

interface


uses Classes,IdMessage, IdSMTP;

type
TMailSend = Class
  fIdSMTP     : TIdSMTP;
  fIdMessage  : TIdMessage;
  private
    procedure MyInitializeISO(var VHeaderEncoding: Char; var VCharSet: string);
  public
    constructor Create(HostName,UserName,Password:string);
    destructor Destroy; override;
    function SendMesaj(SendUserName,EMailAdres,Subject:string;sMessage:TStringList):Boolean;
end;

implementation

{ TMailSend }

constructor TMailSend.Create(HostName,UserName,Password:string);
 begin
  fIdSMTP      := TIdSMTP.Create(nil);
  fIdMessage   := TIdMessage.Create(nil);
  fIdMessage.OnInitializeISO              := MyInitializeISO;
  // Mail Server Ayarları
  fIdSMTP.AuthType                        := satDefault;
  fIdSMTP.Host                            := HostName;   // smtp host
  fIdSMTP.Username                        := UserName;   // smtp user name
  fIdSMTP.Password                        := Password;   // smtp password
  fIdSMTP.Port                            := 587;         // smtp port 25-587
end;

destructor TMailSend.Destroy;
begin
  fIdSMTP.Free;
  fIdMessage.Free;
end;

procedure TMailSend.MyInitializeISO(var VHeaderEncoding: Char;
  var VCharSet: string);
begin
    VCharSet := 'iso-8859-9';
end;

function TMailSend.SendMesaj(SendUserName,EMailAdres,Subject:string;sMessage:TStringList):Boolean;
begin
  Result := True;
  try
    fIdMessage.From.Name                    := SendUserName; //Alıcıda görünecek isim
    fIdMessage.From.Address                 := fIdSMTP.Username ; //Alıcıda görünen adres
    fIdMessage.Recipients.EMailAddresses    := EMailAdres; // Göndereceğin Adres
    fIdMessage.Subject                      := Subject;
    fIdMessage.ContentType                  := 'text/html';
    fIdMessage.Body.Clear;
    fIdMessage.Body.AddStrings(sMessage);
    fIdMessage.MessageParts.Clear;

    fIdSMTP.Connect;
    fIdSMTP.Authenticate;
    fIdSMTP.Send(fIdMessage);
    fIdSMTP.Disconnect;
  except
    Result := False;
  end;
end;

end.
sınıf yaratarak problemi çözdüm.

Kod: Tümünü seç

    VCharSet := 'iso-8859-9';
Daha önce kullandığım bir uygulama aslında form içinde bir problem yoktu ama bir unit yapayım. Her projeden kullanırım isteğiyle böyle birşey yazdım ve bu problemle karşılaştım.

VCharSet := 'iso-8859-9'; satır ise mail' deki türkçe karakterlerin bozuk gözükmemesi için bir parametre ve çalışıyor. bir sıkıntı yok...

Cevap veren herkeze teşekkürler
Her iyinin içinde bir Kötülük.Her Kötnün içide de bir iyilik vardır
Cevapla