Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Geänderte Parameterliste in TIdIMAP4Server (https://www.delphipraxis.net/181972-geaenderte-parameterliste-tidimap4server.html)

Bowler 22. Sep 2014 10:20

Geänderte Parameterliste in TIdIMAP4Server
 
Hallo zusammen,

ich habe schon lange nichts mehr mit den INDY-Kompontenten gemacht, möchte nun aber in einem Projekt die Möglichkeit schaffen, dass sich ein User mit seinem E-Mail-Client über IMAP auf den Server verbindet und seine Nachrichten sehen/abrufen kann.
Dazu habe ich mit die TIdIMAP4Server-Komponente angeschaut.
Das Problem befindet sich in der Methode "DefMechListMailBox" des Servers. In der aktuellen Implementierung mit Delphi XE7 und auch XE6 ist dort folgender Prototyp definiert:

Delphi-Quellcode:
function TForm2.IdIMAP4Server1DefMechListMailBox(ALoginName, AMailBoxName:string; AMailBoxNamens, AMailBoxFlags:TStrings):boolean;


Soweit so gut, nun soll über diese Methode ja die Liste der aktuellen IMAP-Ordner, bzw. Mailboxes zurückgeliefert werden.

In dem Indy-Demo, was allerdings schon von ich glaube 2004 ist, ist diese Methode implementiert als Ableitung aus der Indy-IMAP-Klasse mit


Delphi-Quellcode:
function TIdIMAP4ServerDemo.ListMailBox(ALoginName, AMailBoxName:string; var AMailBoxNamens: TStringList; var AMailBoxFlags:TStringList):boolean;


Damit macht das ganze noch Sinn, denn in dieser Variante kann man in der Methode der StringList "AMailBoxNames" die Namen der Mailboxen einfügen, und sie wird zurück gegeben, da der Parameter durch var referenziert wird.

Ich habe dann auch in der Implementierung in der IMAP4Server-Klasse geschaut. Dort ist es eigentlich auch "richtig".
Es wird beim Aufruf dieser Methode vorher eine leere StringList erstellt. Diese wird als Parameter an diese Methode übergeben, und anschließen wird dessen Inhalt (der eigentlich in der der Methode befüllt werden soll) IMAP-konform an den Client geschickt.
Aber dadurch, dass das Schlüsselwort "var" in der Indy-Methode fehlt, wird dieser Parameter nicht referenziert und sein Inhalt nicht verändert.

Hat irgendjemand das gleiche Problem? Oder hat sich damit schonmal beschäftigt? Ich habe nun seit gestern Nachmittag gesucht und probiert, aber keinen Ansatz gefunden.

Einzige Möglichkeit wäre für mich, die Sourcen von der Indy-Komponente wieder zu ändern, sodass der Parameter referenziert wird. Aber das nur als letzte Möglichkeit. Ich frage mich, wie sonst die Ergebnisse zurückgeliefert werden sollen und suche nach dem Grund, warum die Parameter-Liste geändert wurde.

Oder habe ich bei der Entwicklung der INDY-Komponenten in den letzten Jahren was verschlafen.

Bin für jeden Ansatz dankbar.

Viele Grüße
Christian

DeddyH 22. Sep 2014 10:30

AW: Geänderte Parameterliste in TIdIMAP4Server
 
Objektinstanzen wie TStrings sind intern bereits Pointer, so dass sie als Var-Parameter nur in bestimmten Einzelfällen Sinn machen. Eigentlich dürfte sich am Aufruf der Methode nichts geändert haben (es sei denn, die alte hat die Instanz selbst erzeugt und im Var-Parameter zurückgegeben). Du brauchst also 2 Instanzen von TStrings-Nachfahren und kannst diese dann als Parameter übergeben, sie sollten dann befüllt zurückkommen.

Bowler 22. Sep 2014 10:50

AW: Geänderte Parameterliste in TIdIMAP4Server
 
Ich fasse es nicht. Vielen Dank, das war es. Es hat sich tatsächlich nichts geändert. :oops:

Ich hatte es so auch schon probiert, aber vergessen zusätzlich die TStrings "AMailBoxFlags" zu füllen. Und da ist der Server dann mit einer Schutzverletzung ausgestiegen. Was jetzt auch Sinn macht, da er pro Eintrag in der MailBox-Liste einen Eintrag in der MailBoxFlags-Liste erwartet.

Das Stichwort war:
Zitat:

Du brauchst also 2 Instanzen von TStrings-Nachfahren
Da habe ich an der falschen Stelle gesucht.
Jetzt funktioniert es tadellos!

Vielen Dank nochmal! :thumb:

Für alle die es interessiert, hier noch einmal die funktionierende Ereignisroutine (nur zum Test mit Demo-Daten):

Delphi-Quellcode:
function TForm2.IdIMAP4Server1DefMechListMailBox(ALoginName, AMailBoxName:string; AMailBoxNamens, AMailBoxFlags:TStrings):boolean;
begin
  AMailBoxNames.Add('INBOX');
  AMailBoxFlags.Add('\HasChildren');
  Result:=true;
end;


Viele Grüße
Christian


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz