AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Geänderte Parameterliste in TIdIMAP4Server
Thema durchsuchen
Ansicht
Themen-Optionen

Geänderte Parameterliste in TIdIMAP4Server

Ein Thema von Bowler · begonnen am 22. Sep 2014 · letzter Beitrag vom 22. Sep 2014
Antwort Antwort
Benutzerbild von Bowler
Bowler

Registriert seit: 8. Sep 2003
Ort: Bochum
148 Beiträge
 
Delphi XE7 Enterprise
 
#1

Geänderte Parameterliste in TIdIMAP4Server

  Alt 22. Sep 2014, 11:20
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:

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


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
Christian Rüsken
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

AW: Geänderte Parameterliste in TIdIMAP4Server

  Alt 22. Sep 2014, 11:30
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Bowler
Bowler

Registriert seit: 8. Sep 2003
Ort: Bochum
148 Beiträge
 
Delphi XE7 Enterprise
 
#3

AW: Geänderte Parameterliste in TIdIMAP4Server

  Alt 22. Sep 2014, 11:50
Ich fasse es nicht. Vielen Dank, das war es. Es hat sich tatsächlich nichts geändert.

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!

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
Christian Rüsken
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:21 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