Entwickler-Ecke

Internet / Netzwerk - Mail aus FireMonkey-Programm erstellen


LuMa86 - Di 22.01.13 14:26
Titel: Mail aus FireMonkey-Programm erstellen
Hallo,
ich würde gerne eine Mail aus einem FireMonkey Programm erstellen. Ich benutze FireMonkey nur wegen dem Design und nicht weil ich das ganze in OSX umsetzen möchte. Daher kann ich auch VCL Komponenten manuell deklarieren. Unter VCL habe ich immer JvMail benutzt. Das ging auch super. Habe es unter Firemonkey versucht, aber das geht schief (Anwendungsfehler beim Button OnClick):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TfrmCheckOut.BtnCheckoutClick(Sender: TObject);
var
  i: Integer;
begin
  if frmSettings.ListMail.Items.Count > 0 then
    for i := 0 to frmSettings.ListMail.Items.Count do
      Mail.Recipient.AddRecipient(frmSettings.ListMail.Items[i]); // Empfänger aus der ListBox der Einstellungs-Form

   Mail.Subject := 'Trainingsprotokoll KW' + frmMain.KWS; //
   Mail.Body.Add(frmSettings.MailText.Text); //

  if MPath.Items.Count > 0 then
    for i := 0 to MPath.Items.Count do
      Mail.Attachment.Add(MPath.Items[i]); // Anhänge aus einer ListBox

  try
    Mail.SendMail(False);
  except
    ShowMessage('Beim erstellen der E-Mail ist ein Fehler aufgetreten.');
  end;
end;


Das interessante ist, das der Fehler nur kommt, wenn ich eine Eigenschaft wie Subject oder Body fülle. Lasse ich alles leer, kommt statt des Fehlers die ShowMessage im "try..except"-Block.

Hier nochmal der Fehler:
screenshot

Ich hoffe mir kann jemand helfen oder eine Alternative zeigen.


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 22.01.2013 um 16:26
Moderiert von user profile iconNarses: Bild als Anhang hochgeladen.


Nersgatt - Di 22.01.13 14:51

Wie und wo ist denn "Mail" deklariert und wo erzeugst Du die Instanz von Mail?


LuMa86 - Di 22.01.13 15:16

Mail ist die TJvMail-Komponente. Da sie nicht in der Komponentenliste am Rand steht, habe ich sie manuell unter public deklariert.
Hmm stimmt, eine Instanz habe ich garnicht erzeugt. Aber wie ist das mit andern Komponenten. Habe auf einer anderen Form die JvSerialMaker. Die läuft zwar unter OSX, ist aber auch nicht in der Komponentenliste aufgeführt. Habe sie auch unter public dekalriert. Deswegen habe ich auch kaine Instanz von Mail erzeugt.

Lukas


Nersgatt - Di 22.01.13 15:18

Die Instanz musst Du aber zwingend erstellen. Aber nur einmal, sonst baust Du dir ggf. ein Speicherleck. Also z.B. im FormCreate erstellen.


LuMa86 - Di 22.01.13 15:26


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
Mail := TJvMail.Create(Self);  // ist im FormCreate

  if frmMain.TPData.FindKey([1]) = true then
  begin
    frmMain.TPData.Edit;
    frmMain.TPDataGewicht.AsString := EdWeight.Text;
    frmMain.TPData.Post;
  end;

  if frmSettings.ListMail.Items.Count > 0 then
    for i := 0 to frmSettings.ListMail.Items.Count do
      Mail.Recipient.AddRecipient(frmSettings.ListMail.Items[i]);

  Mail.Subject := 'Trainingsprotokoll KW' + frmMain.KWS;
  Mail.Body.Add(frmSettings.MailText.Text);

  if MPath.Items.Count > 0 then
    for i := 0 to MPath.Items.Count do
      Mail.Attachment.Add(MPath.Items[i]);

  try
    Mail.SendMail(True);
  except
    ShowMessage('Beim erstellen der E-Mail ist ein Fehler aufgetreten.');
  end;

  Mail.Free;  // ist im FormCreate


So, jetzt geht es :)
Also der SerialMaker tut seine Arbeit auch ohne das erzeugen einer Instanz :D


Nersgatt - Di 22.01.13 15:31

Entweder ist das mit dem SerialMaker purer Zufall, oder das Dingen hat nur Klassenprozeduren. Aber das wäre wohl ein neues Thema.